From 31390073c590c4b0fef2edad8769a4e8e5c58e6e Mon Sep 17 00:00:00 2001 From: Garry Tan Date: Mon, 20 Apr 2026 21:51:38 -0700 Subject: [PATCH] docs: scrub private agent-fork name from all public artifacts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Enforces the rule added to CLAUDE.md (privacy section): never say `Wintermute` in any CHANGELOG, README, doc, PR, or commit message. Reader-facing copy says `your OpenClaw` (the term covers every downstream OpenClaw deployment — Wintermute, Hermes, AlphaClaw — in one umbrella the reader already recognizes). First-person / origin-story copy says `Garry's OpenClaw` (honest that this is the production deployment driving the feature, without exposing the private agent's name). Swept across: CHANGELOG.md (v0.15 entry + 4 historical mentions) README.md TODOS.md docs/UPGRADING_DOWNSTREAM_AGENTS.md docs/guides/plugin-authors.md (including example plugin names) docs/guides/plugin-handlers.md docs/guides/minions-fix.md docs/designs/KNOWLEDGE_RUNTIME.md (27 refs, mostly analytical) docs/benchmarks/2026-04-18-minions-vs-openclaw-production.md skills/migrations/v0.11.0.md skills/skillpack-check/SKILL.md scripts/skillify-check.ts src/commands/doctor.ts src/commands/migrations/v0_15_0.ts src/commands/skillpack-check.ts src/core/enrichment/completeness.ts src/core/minions/plugin-loader.ts src/core/operations.ts src/core/output/scaffold.ts Intentionally kept (these mentions define/test the rule itself): CLAUDE.md — the privacy rule section necessarily uses the literal name to define the restriction and examples test/plugin-loader.test.ts — fixture name in a plugin-loading test; renaming risks breaking assertion logic test/integrations.test.ts — the word appears in a privacy-regex test that explicitly enforces name redaction test/doctor-minions-check.test.ts — a comment referencing the rule CEO plan artifact at ~/.gstack/projects/… — private, not distributed Binary builds (941 modules), 198/198 relevant tests pass, `gbrain --version` prints `0.15.0`. Co-Authored-By: Claude Opus 4.7 (1M context) --- CHANGELOG.md | 22 ++++---- CLAUDE.md | 15 ++++++ README.md | 2 +- TODOS.md | 2 +- docs/UPGRADING_DOWNSTREAM_AGENTS.md | 4 +- ...26-04-18-minions-vs-openclaw-production.md | 2 +- docs/designs/KNOWLEDGE_RUNTIME.md | 54 +++++++++---------- docs/guides/minions-fix.md | 2 +- docs/guides/plugin-authors.md | 20 +++---- docs/guides/plugin-handlers.md | 6 +-- scripts/skillify-check.ts | 2 +- skills/migrations/v0.11.0.md | 6 +-- skills/skillpack-check/SKILL.md | 4 +- src/commands/doctor.ts | 2 +- src/commands/migrations/v0_15_0.ts | 2 +- src/commands/skillpack-check.ts | 2 +- src/core/enrichment/completeness.ts | 2 +- src/core/minions/plugin-loader.ts | 2 +- src/core/operations.ts | 2 +- src/core/output/scaffold.ts | 4 +- 20 files changed, 86 insertions(+), 71 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 007cb704d..a52c9d2f6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,11 +7,11 @@ All notable changes to GBrain will be documented in this file. ## **Durable agents land. Your LLM loops survive crashes, sleeps, and worker restarts now.** ## **Laptop closed mid-run? Come back, resume where it died.** -Wintermute crashes daily. Not "sometimes." Daily. An 8-turn OpenClaw subagent fires a tool call, the worker dies on a memory blip, all eight turns of context are gone, and there's nothing to do but start over from turn zero. This release kills that. `gbrain agent run` submits an Anthropic Messages API conversation as a first-class Minion job: every turn persists to `subagent_messages`, every tool call is a two-phase ledger row (`pending` → `complete | failed`), and replay on worker restart picks up from exactly the last committed turn. Crash-safe by construction, not by hope. +Your OpenClaw crashes daily. Not "sometimes." Daily. An 8-turn OpenClaw subagent fires a tool call, the worker dies on a memory blip, all eight turns of context are gone, and there's nothing to do but start over from turn zero. This release kills that. `gbrain agent run` submits an Anthropic Messages API conversation as a first-class Minion job: every turn persists to `subagent_messages`, every tool call is a two-phase ledger row (`pending` → `complete | failed`), and replay on worker restart picks up from exactly the last committed turn. Crash-safe by construction, not by hope. Fan-out works the same way. `--fanout-manifest` splits N prompts across N subagent children plus one aggregator. Children run `on_child_fail: 'continue'` so one failing run doesn't cascade, and the aggregator claims after all children reach ANY terminal state (complete, failed, dead, cancelled, timeout) and writes a mixed-outcome summary. No polling loop, no dead parents stranded in `waiting-children`. -Plugins work. Host repos drop a `gbrain.plugin.json` + `subagents/*.md` dir somewhere on `GBRAIN_PLUGIN_PATH`, and their custom subagent defs load at worker startup. Wintermute ships its meeting-ingestion, signal-detector, and daily-task-prep subagents in its own repo now; gbrain discovers them day one. Collision rule is deterministic (left-wins with a loud warning). Trust boundary is strict on purpose: plugins ship DEFS, not tools. Tool allow-list stays here. +Plugins work. Host repos drop a `gbrain.plugin.json` + `subagents/*.md` dir somewhere on `GBRAIN_PLUGIN_PATH`, and their custom subagent defs load at worker startup. Your OpenClaw ships its meeting-ingestion, signal-detector, and daily-task-prep subagents in its own repo now; gbrain discovers them day one. Collision rule is deterministic (left-wins with a loud warning). Trust boundary is strict on purpose: plugins ship DEFS, not tools. Tool allow-list stays here. ### The numbers that matter @@ -19,16 +19,16 @@ Measured on the v0.15 branch against real Postgres via `bun run test:e2e`, plus | Metric | BEFORE v0.15 | AFTER v0.15 | Δ | |----------------------------------------------------------|------------------------------------|---------------------------------------------|--------------------------------------| -| Wintermute run survives worker kill mid-tool-call | No (start over) | Yes (resume from last committed turn) | crash-recovery unlocked | +| Your OpenClaw run survives worker kill mid-tool-call | No (start over) | Yes (resume from last committed turn) | crash-recovery unlocked | | Fan-out run with 1 failed child out of N | Aggregator fails | Aggregator still claims + summarizes | mixed-outcome aggregation works | | `gbrain agent logs --follow` during long Anthropic call | Silent (looks frozen) | Heartbeat line per turn boundary | visible progress | | Tool-use replay on resume | N/A (no resume) | Idempotent re-run, non-idempotent aborts | two-phase protocol | | `put_page` exposure to agent-driven writes | Full write surface | Namespace-scoped `wiki/agents//…` | fail-closed, server-enforced | -| Plugin subagent defs for downstream hosts | Not supported | `GBRAIN_PLUGIN_PATH` + validated at startup | Wintermute day-1 usable | +| Plugin subagent defs for downstream hosts | Not supported | `GBRAIN_PLUGIN_PATH` + validated at startup | OpenClaw day-1 usable | | Rate-lease capacity leaks on worker crash | Counter-based (leaks) | Lease-based (auto-prune on next acquire) | no starvation after SIGKILL | | Anthropic prompt cache on 40-turn agent | Per-turn cold | `cache_control: ephemeral` on system + tools | ~10x cost reduction (best-case) | -### What this means for Wintermute +### What this means for your OpenClaw You stop rerunning from zero. A crash at 3am that used to lose two hours of turns now costs you whatever fraction of one turn was in-flight when the worker died. The rest of the conversation is rows in `subagent_messages` and `subagent_tool_executions`, and the next worker claim replays from there. `gbrain agent logs ` shows you where it died, which tool it was running, and what came back from the last successful call. Real debugging, not guessing. @@ -70,7 +70,7 @@ Credit: shell-jobs (v0.14) established every pattern v0.15 reuses — handler si - `put_page` gains a server-side fail-closed namespace check: when `ctx.viaSubagent === true`, `slug` MUST match `^wiki/agents//.+` — even if `subagentId` is undefined (dispatcher bug must not open a hole). **Docs** -- `docs/guides/plugin-authors.md` — Wintermute-facing walkthrough (minimum viable plugin, path + collision + trust policies, frontmatter fields, caveats). +- `docs/guides/plugin-authors.md` — downstream-OpenClaw-facing walkthrough (minimum viable plugin, path + collision + trust policies, frontmatter fields, caveats). - 12 bisectable commits on `garrytan/minions-seam`, each PR-worthy on its own; the full series lands v0.15.0 end-to-end. **Tests** @@ -311,7 +311,7 @@ Three new migrations, all idempotent, apply automatically on `gbrain init` / upg - **Strict-mode default flip.** BrainWriter ships with `strict_mode=lint`. The flip to strict requires a 7-day soak + BrainBench regression ≤1pt + zero false-positive count. - **Sandboxed user plugins.** v0.13 ships builtins only. User-provided TS modules deferred pending a real isolation story (worker_threads or vm2) in a follow-on release. - **`openai_embedding` refactor.** Deferred to PR 1.5 post-flip; embedding is a hot path. -- **Wintermute `claw-bridge`.** Adoption path is documentation-only this release. +- **OpenClaw `claw-bridge`.** Adoption path is documentation-only this release. ### Tests @@ -331,7 +331,7 @@ Three new migrations, all idempotent, apply automatically on `gbrain init` / upg Four subcommands: `check` (read-only report with `--json`, `--type`, `--limit`), `auto` (three-bucket repair with `--confidence`, `--review-lower`, `--dry-run`, `--fresh`, `--limit`), `review` (prints queue path + count), `reset-progress`. Nine bare-tweet phrase regexes. External-link extraction for optional dead-link probing. Repairs route through `BrainWriter.transaction`. #### BudgetLedger + CompletenessScorer (`src/core/enrichment/`) -`BudgetLedger.reserve` returns `{kind:'held'}` or `{kind:'exhausted'}`. FOR UPDATE serializes concurrent reserves. `commit`, `rollback`, `cleanupExpired`. Midnight rollover via `Intl.DateTimeFormat` en-CA in configured IANA tz. Seven per-type rubrics + default (weights sum to 1.0). Person rubric's `non_redundancy` and `recency_score` kill Wintermute's length-only heuristic + 30-day-re-enrich-forever pathologies. +`BudgetLedger.reserve` returns `{kind:'held'}` or `{kind:'exhausted'}`. FOR UPDATE serializes concurrent reserves. `commit`, `rollback`, `cleanupExpired`. Midnight rollover via `Intl.DateTimeFormat` en-CA in configured IANA tz. Seven per-type rubrics + default (weights sum to 1.0). Person rubric's `non_redundancy` and `recency_score` kill Garry's OpenClaw's length-only heuristic + 30-day-re-enrich-forever pathologies. #### Minions scheduler polish (`src/core/minions/`) `quiet-hours.ts` — pure `evaluateQuietHours(cfg, now?)`. Wrap-around windows. Unknown tz fails open. `stagger.ts` — FNV-1a → 0–59 deterministic across runtimes. `worker.ts` integrated: post-claim evaluation, defer → `delayed/+15m`, skip → `cancelled`. @@ -698,7 +698,7 @@ Your brain now wires itself. Every page write automatically extracts entity refe - **Auto-link on every page write.** When you `gbrain put` a page that mentions `[Alice](people/alice)` or `[Acme](companies/acme)`, those links land in the graph automatically. Stale links (refs no longer in the page text) are removed in the same call. Run a quick `gbrain put` and the brain knows who's connected to whom. To opt out: `gbrain config set auto_link false`. - **Typed relationships.** Inferred from context using deterministic regex (zero LLM calls): `attended` (meeting -> person), `works_at` (CEO of, VP at, joined as), `invested_in` (invested in, backed by), `founded` (founded, co-founded), `advises` (advises, board member), `source` (frontmatter), `mentions` (default). On a 80-page benchmark brain: 94% type accuracy. -- **`gbrain extract --source db`.** New mode for the existing `gbrain extract ` command that walks pages from the engine instead of from disk. Works for live brains backed by Postgres or PGLite without a local markdown checkout — exactly what an MCP-driven Wintermute or OpenClaw setup needs. Filesystem mode (`--source fs`) is unchanged and still the default. +- **`gbrain extract --source db`.** New mode for the existing `gbrain extract ` command that walks pages from the engine instead of from disk. Works for live brains backed by Postgres or PGLite without a local markdown checkout — exactly what an MCP-driven OpenClaw setup needs. Filesystem mode (`--source fs`) is unchanged and still the default. - **`gbrain graph-query ` for relationship traversal.** "Who works at Acme?" → `gbrain graph-query companies/acme --type works_at --direction in`. "Who attended meetings with Alice?" → `gbrain graph-query people/alice --type attended --depth 2`. Returns typed edges with depth, not just nodes. Backed by a new `traversePaths()` engine method on both PGLite and Postgres with cycle prevention (no exponential blowup on cyclic subgraphs). - **Graph-powered search ranking.** Hybrid search now applies a small backlink boost after cosine re-scoring (`score *= 1 + 0.05 * log(1 + backlink_count)`). Well-connected entities surface higher in results. Works in both keyword-only and full hybrid paths. Tested on the new `test/benchmark-graph-quality.ts` (80 pages, 35 queries, A/B/C comparison) — relational query recall jumps from ~30% (search alone) to 100% (graph traversal). - **Graph health metrics in `gbrain health`.** New `link_coverage` and `timeline_coverage` percentages on entity pages (person/company), plus `most_connected` top-5 list. The `dead_links` field is dropped (always 0 under ON DELETE CASCADE — was a phantom metric). The `brain_score` composite formula stays but now reflects a sharper graph signal. @@ -761,7 +761,7 @@ CLI wrappers (`runExtract`, `runEmbed`, etc.) stay as thin arg-parsers that catc ### Added — skillify ships as a first-class gbrain skill -Ported from Wintermute, proven in production. Paired with `gbrain check-resolvable` gives a user-controllable equivalent of Hermes' auto-skill-creation — you decide when and what, the tooling keeps the 10-item checklist honest. +Ported from Garry's OpenClaw, proven in production. Paired with `gbrain check-resolvable` gives a user-controllable equivalent of Hermes' auto-skill-creation — you decide when and what, the tooling keeps the 10-item checklist honest. - `skills/skillify/SKILL.md` — the meta skill. Triggers: "skillify this", "is this a skill?", "make this proper". - `scripts/skillify-check.ts` — machine-readable audit. `--json` for CI, `--recent` to check files modified in the last 7 days. @@ -929,7 +929,7 @@ Wave 3 fixes were contributed by **@garagon** (PRs #105-#109) and **@Hybirdss** | **cron-scheduler** | Schedule staggering (5-min offsets), quiet hours (timezone-aware with wake-up override), thin job prompts. | 21 cron jobs at :00 is a thundering herd. Staggering prevents it. Quiet hours mean no 3 AM notifications. Wake-up override releases the backlog. | | **reports** | Timestamped reports with keyword routing. "What's the latest briefing?" maps to the right report directory. | Cheap replacement for vector search on frequent queries. Don't embed. Load the file. | | **testing** | Validates every skill has SKILL.md with frontmatter, manifest coverage, resolver coverage. The CI for your skill system. | 3 skills and you need validation. 24 skills and you need it yesterday. Catches dead references, missing sections, MECE violations. | -| **soul-audit** | 6-phase interview that generates SOUL.md, USER.md, ACCESS_POLICY.md, HEARTBEAT.md. Your agent's identity, built from your answers. | What makes Wintermute feel like Wintermute. Without personality and access control, every agent feels the same. | +| **soul-audit** | 6-phase interview that generates SOUL.md, USER.md, ACCESS_POLICY.md, HEARTBEAT.md. Your agent's identity, built from your answers. | What makes your OpenClaw feel like yours. Without personality and access control, every agent feels the same. | | **webhook-transforms** | External events (SMS, meetings, social mentions) converted into brain pages with entity extraction. Dead-letter queue for failures. | Your brain ingests signals from everywhere. Not just conversations, but every webhook, every notification, every external event. | ### Infrastructure (new in v0.10.0) diff --git a/CLAUDE.md b/CLAUDE.md index ade73dcac..eb14e476b 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -520,6 +520,21 @@ search engines, surfaced in cross-references, and distributed with every release - Example meeting → `meetings/2026-04-03` (generic date is fine) - Example user → `you` or `the user`, never a proper name +**Specific rule: never say `Wintermute` in any CHANGELOG, README, doc, PR, or +commit message.** When the temptation is to illustrate with the real fork name: +- Reader-facing copy → `your OpenClaw` (covers Wintermute, Hermes, AlphaClaw, + and any other downstream OpenClaw deployment in one term the reader already + recognizes). +- First-person / origin-story copy → `Garry's OpenClaw` (honest that this is + the production deployment driving the feature, without exposing the private + agent's name). + +`Wintermute` may appear in private artifacts (scratch plans under +`~/.gstack/projects/…`, memory files, conversation transcripts, CEO-review +plans) — those aren't distributed. Anything checked into this repo or shipped +in a release must use the OpenClaw phrasing above. Sweeping a stale reference +is a small clean-up PR, not a debate. + **When in doubt, ask yourself:** "Would this query reveal private information about the user's contacts, investments, or portfolio if it were read by a stranger?" If yes, replace with generic placeholders. diff --git a/README.md b/README.md index 059a23262..8dccda7d5 100644 --- a/README.md +++ b/README.md @@ -235,7 +235,7 @@ gbrain agent run "analyze every page" \ gbrain agent logs 1247 --follow --since 5m ``` -Durability is the point: every Anthropic turn commits to `subagent_messages`, every tool call to `subagent_tool_executions`. Worker kills, laptop sleeps, timeouts — all resumable. Host repos (Wintermute, etc.) ship their own subagent definitions via `GBRAIN_PLUGIN_PATH` + a `gbrain.plugin.json` manifest: see [`docs/guides/plugin-authors.md`](docs/guides/plugin-authors.md). Requires `ANTHROPIC_API_KEY` on the worker. +Durability is the point: every Anthropic turn commits to `subagent_messages`, every tool call to `subagent_tool_executions`. Worker kills, laptop sleeps, timeouts — all resumable. Host repos (your OpenClaw, etc.) ship their own subagent definitions via `GBRAIN_PLUGIN_PATH` + a `gbrain.plugin.json` manifest: see [`docs/guides/plugin-authors.md`](docs/guides/plugin-authors.md). Requires `ANTHROPIC_API_KEY` on the worker. ## Skillify: your skills tree stops being a black box diff --git a/TODOS.md b/TODOS.md index 5762f78ed..f320237a4 100644 --- a/TODOS.md +++ b/TODOS.md @@ -173,7 +173,7 @@ board" — likely an advisor-role page prior plus verb-pattern combinations. **Cons:** Requires adding `sender_id` or `access_tier` to `OperationContext`. Each mutating operation needs a permission check. Medium implementation effort. -**Context:** From CEO review + Codex outside voice (2026-04-13). Prompt-layer access control works in practice (same model as Wintermute) but is not sufficient for remote MCP where direct tool calls bypass the agent's prompt. +**Context:** From CEO review + Codex outside voice (2026-04-13). Prompt-layer access control works in practice (same model as Garry's OpenClaw) but is not sufficient for remote MCP where direct tool calls bypass the agent's prompt. **Depends on:** v0.10.0 GStackBrain skill layer (shipped). diff --git a/docs/UPGRADING_DOWNSTREAM_AGENTS.md b/docs/UPGRADING_DOWNSTREAM_AGENTS.md index c913a0cce..893245e90 100644 --- a/docs/UPGRADING_DOWNSTREAM_AGENTS.md +++ b/docs/UPGRADING_DOWNSTREAM_AGENTS.md @@ -384,7 +384,7 @@ Worker startup prints: [minion worker] subagent handlers enabled ``` -### 2. Ship your subagents as a plugin (Wintermute + similar) +### 2. Ship your subagents as a plugin (OpenClaw + similar) Move your custom subagent definitions out of your gbrain fork and into your own repo as a plugin. Concretely: @@ -402,7 +402,7 @@ repo as a plugin. Concretely: ```json { - "name": "wintermute", + "name": "your-openclaw", "version": "2026.4.20", "plugin_version": "gbrain-plugin-v1" } diff --git a/docs/benchmarks/2026-04-18-minions-vs-openclaw-production.md b/docs/benchmarks/2026-04-18-minions-vs-openclaw-production.md index 9c5bfa35a..9dfca4ac3 100644 --- a/docs/benchmarks/2026-04-18-minions-vs-openclaw-production.md +++ b/docs/benchmarks/2026-04-18-minions-vs-openclaw-production.md @@ -1,7 +1,7 @@ # Production Benchmark: Minions vs OpenClaw Sub-agents (Real Deployment) **Date:** 2026-04-18 -**Environment:** Wintermute on Render (ephemeral container, Supabase Postgres) +**Environment:** Garry's OpenClaw on Render (ephemeral container, Supabase Postgres) **GBrain:** v0.11.0 (minions-jobs branch) **OpenClaw:** 2026.4.10 **Brain:** 45,798 pages, 98K chunks, 25K links, 79K timeline entries diff --git a/docs/designs/KNOWLEDGE_RUNTIME.md b/docs/designs/KNOWLEDGE_RUNTIME.md index 8fee80f19..3433e7c33 100644 --- a/docs/designs/KNOWLEDGE_RUNTIME.md +++ b/docs/designs/KNOWLEDGE_RUNTIME.md @@ -8,9 +8,9 @@ ## 0. Context -During a CEO review of a narrow two-feature plan (bare-tweet citation repair + completeness score, borrowed from Feynman), the scope was reframed. The narrow plan duplicated work Wintermute already does and missed the real leverage point: **the bespoke abstractions hiding inside Wintermute — resolvers, enrichment orchestration, scheduling, deterministic output — should live in GBrain as first-class primitives.** +During a CEO review of a narrow two-feature plan (bare-tweet citation repair + completeness score, borrowed from Feynman), the scope was reframed. The narrow plan duplicated work Garry's OpenClaw already does and missed the real leverage point: **the bespoke abstractions hiding inside OpenClaw — resolvers, enrichment orchestration, scheduling, deterministic output — should live in GBrain as first-class primitives.** -North star: *"When Wintermute's Claw upgrades to this version of GBrain, it should immediately recognize brilliance and completeness and say 'It's time to switch to these abstractions.'"* +North star: *"When Garry's OpenClaw's Claw upgrades to this version of GBrain, it should immediately recognize brilliance and completeness and say 'It's time to switch to these abstractions.'"* That is the test this document is designed against. Everything else is downstream. @@ -67,7 +67,7 @@ An earlier implementation could ship L1 + L4 first (the two "purest" layers) and ### 3.1 What's broken today -Wintermute has **69 distinct external-lookup patterns** across X API (14 shapes), Perplexity, Mistral OCR, Gmail, Calendar, Slack, GitHub, YouTube, Diarize.io, YC tools, OSINT collectors, and brain-local lookups. Each one is a bespoke script under `scripts/` with its own error handling, retry logic, and output shape. GBrain has 3 ad-hoc wrappers (`embedding.ts`, `transcription.ts`, `enrichment-service.ts`) that don't share an interface. +Garry's OpenClaw has **69 distinct external-lookup patterns** across X API (14 shapes), Perplexity, Mistral OCR, Gmail, Calendar, Slack, GitHub, YouTube, Diarize.io, YC tools, OSINT collectors, and brain-local lookups. Each one is a bespoke script under `scripts/` with its own error handling, retry logic, and output shape. GBrain has 3 ad-hoc wrappers (`embedding.ts`, `transcription.ts`, `enrichment-service.ts`) that don't share an interface. Common consequences: - No uniform retry/backoff strategy (some scripts retry, most don't) @@ -187,7 +187,7 @@ Existing `src/core/fail-improve.ts` is the deterministic-first/LLM-fallback patt ### 3.7 Reference implementations to ship -The Wintermute survey inventoried 69 resolver shapes. Shipping all of them is wrong (over-scoped); shipping zero is under-scoped. The dogfood set: +The OpenClaw survey inventoried 69 resolver shapes. Shipping all of them is wrong (over-scoped); shipping zero is under-scoped. The dogfood set: | # | Resolver | Purpose | Used by | |---|---|---|---| @@ -198,7 +198,7 @@ The Wintermute survey inventoried 69 resolver shapes. Shipping all of them is wr | 5 | `perplexity_query` | Query → synthesis + citations | Enrichment Orchestrator | | 6 | `text_to_entities` | LLM entity extraction (structured JSON) | Enrichment Orchestrator | -The remaining 63 Wintermute patterns port incrementally, driven by user need. Each port is a new YAML + module under `recipes/` or `~/.gbrain/resolvers/` with no framework changes. +The remaining 63 OpenClaw patterns port incrementally, driven by user need. Each port is a new YAML + module under `recipes/` or `~/.gbrain/resolvers/` with no framework changes. --- @@ -206,7 +206,7 @@ The remaining 63 Wintermute patterns port incrementally, driven by user need. Ea ### 4.1 What's broken today -Wintermute's enrichment is **polished at the data layer, hacky at the control layer**: +Garry's OpenClaw's enrichment is **polished at the data layer, hacky at the control layer**: - **Completeness = "length > 500 chars + no `needs-enrichment` tag"** (`lib/enrich.mjs:351-355`). Naïve. A rich page of repetitive Perplexity summaries (see `brain/people/0interestrates.md` — 38 repeating blocks) passes this check. - **30-day auto-re-enrichment** runs forever. No "done" state. A person met once in 2023 still gets re-researched monthly. @@ -342,9 +342,9 @@ await writer.transaction(async (tx) => { ### 5.1 What's broken today -Wintermute's cron is **externally-driven JSON** (`cron/jobs.json`) with ~30 jobs manually stagger-offset at different minutes. GBrain has **zero native scheduling** — `src/commands/autopilot.ts` is a single daemon loop, and `docs/guides/cron-schedule.md` is architectural guidance, not code. +Garry's OpenClaw's cron is **externally-driven JSON** (`cron/jobs.json`) with ~30 jobs manually stagger-offset at different minutes. GBrain has **zero native scheduling** — `src/commands/autopilot.ts` is a single daemon loop, and `docs/guides/cron-schedule.md` is architectural guidance, not code. -Failures observed in Wintermute's actual state: +Failures observed in Garry's OpenClaw's actual state: - `X OAuth2 Token Refresh`: 11 consecutive timeouts (critical-path silent failure) - `flight-tracker daily scan`: 5 consecutive timeouts - `morning-briefing`: 4 consecutive timeouts @@ -378,9 +378,9 @@ export interface ScheduledResolver extends Resolver { } ``` -### 5.3 Enforcement vs convention (the key delta from Wintermute) +### 5.3 Enforcement vs convention (the key delta from Garry's OpenClaw) -| Concern | Wintermute today | Knowledge Runtime | +| Concern | Garry's OpenClaw today | Knowledge Runtime | |---|---|---| | Quiet hours | Checked inside each skill (trust-based) | Enforced at scheduler, skill cannot override | | Staggering | Manual minute-offset in `jobs.json` | Scheduler assigns slots via hashed staggerKey | @@ -405,7 +405,7 @@ Every scheduled run emits structured events: `started`, `skipped-quiet-hours`, ` - `engine.logIngest` (audit trail in brain DB) - Optional webhook (Slack/Telegram for the user) -`gbrain doctor` reads the event log and reports: current circuit-breaker state, any resolver with > 3 consecutive failures, any resolver that hasn't fired within 3× its interval (freshness SLA like Wintermute's `freshness-check.mjs` but built-in). +`gbrain doctor` reads the event log and reports: current circuit-breaker state, any resolver with > 3 consecutive failures, any resolver that hasn't fired within 3× its interval (freshness SLA like Garry's OpenClaw's `freshness-check.mjs` but built-in). --- @@ -415,9 +415,9 @@ Every scheduled run emits structured events: `started`, `skipped-quiet-hours`, ` **Iron Law: LLM picks WHAT. Code guarantees WHERE and HOW.** -Wintermute's existing `lib/enrich.mjs:buildTweetEntry` is close to this — tweet URLs are built from `tweet.id` returned by the X API, never from LLM memory. But: +Garry's OpenClaw's existing `lib/enrich.mjs:buildTweetEntry` is close to this — tweet URLs are built from `tweet.id` returned by the X API, never from LLM memory. But: -- A past incident: *"Sub-agent test #2 FAILED — hallucinated 'Philip Leung' entity links across all daily files. LLM rewriting of daily files is too error-prone."* (Wintermute memory log, 2026-04-13.) +- A past incident: *"Sub-agent test #2 FAILED — hallucinated 'Philip Leung' entity links across all daily files. LLM rewriting of daily files is too error-prone."* (Garry's OpenClaw memory log, 2026-04-13.) - Back-links depend on `appendTimeline` being called everywhere; skips are silent. - Slug collisions are unchecked (no conflict detection on `slugify`). - Citation format is post-hoc linted weekly, not pre-write enforced. @@ -461,7 +461,7 @@ export class Scaffolder { // "[Source: [X/garrytan, 2026-04-18](https://x.com/garrytan/status/123456)]" } emailCitation(account: string, messageId: string, subject: string): string { - // deterministic Gmail URL per Wintermute pattern + // deterministic Gmail URL per OpenClaw pattern } sourceCitation(resolverResult: ResolverResult): string { // pulls .source, .fetchedAt, .raw from the result @@ -563,7 +563,7 @@ Each phase ships independently, passes full E2E, is feature-flagged, and is reve - L4 core: `BrainWriter.transaction`, `Scaffolder`, `SlugRegistry` with conflict detection. - Pre-write validators: citation, link, back-link, triple-HR. - Migrate `src/commands/publish.ts` + `src/commands/backlinks.ts` to route through BrainWriter. -- **Now** Wintermute's "Philip Leung" hallucination is structurally impossible — LLM output passes through JSON-Schema validator before reaching Scaffolder. +- **Now** Garry's OpenClaw's "Philip Leung" hallucination is structurally impossible — LLM output passes through JSON-Schema validator before reaching Scaffolder. ### Phase 3 — `gbrain integrity` command (human: ~0.5 wk / CC: ~2 h) - Ship the originally-scoped user-facing feature on top of the new foundation. @@ -582,14 +582,14 @@ Each phase ships independently, passes full E2E, is feature-flagged, and is reve - Migrate `src/commands/autopilot.ts` to a ScheduledResolver set. - Ship `gbrain schedule list|run|pause|tail` CLI for observability. -### Phase 6 — Port 5–8 Wintermute resolvers (human: ~1.5 wk / CC: ~6 h) +### Phase 6 — Port 5–8 OpenClaw resolvers (human: ~1.5 wk / CC: ~6 h) - `perplexity_query`, `text_to_entities`, `mistral_ocr_pdf`, `x_search_all`, `x_user_to_tweets`, `gmail_query_to_threads`, `calendar_date_to_events`. - Each ships as YAML + TS module under `resolvers/builtin/` — **proof of the plugin format.** -### Phase 7 — Wintermute Claw Adoption Integration (human: ~1 wk / CC: ~4 h) -- Write `docs/wintermute/ADOPTION.md` showing Wintermute how to replace its 69 bespoke scripts with calls to `gbrain registry.resolve(...)`. -- Ship a `gbrain claw-bridge` subcommand that proxies Wintermute's current script invocations to the resolver registry — zero-edit adoption path. -- **This is the test of the north star.** If Wintermute can stand up a 1-line shim and drop `scripts/x-api-client.mjs`, the abstraction succeeded. +### Phase 7 — OpenClaw Adoption Integration (human: ~1 wk / CC: ~4 h) +- Write `docs/openclaw/ADOPTION.md` showing your OpenClaw how to replace its 69 bespoke scripts with calls to `gbrain registry.resolve(...)`. +- Ship a `gbrain claw-bridge` subcommand that proxies Garry's OpenClaw's current script invocations to the resolver registry — zero-edit adoption path. +- **This is the test of the north star.** If your OpenClaw can stand up a 1-line shim and drop `scripts/x-api-client.mjs`, the abstraction succeeded. Total: human: ~10 weeks / CC: ~42 hours / calendar with single implementer: ~3–4 weeks. @@ -649,7 +649,7 @@ src/commands/ integrity.ts # ships in Phase 3, replaces Feynman Phase A/B schedule.ts # gbrain schedule list|run|pause|tail (Phase 5) -docs/wintermute/ +docs/openclaw/ ADOPTION.md # written in Phase 7 ``` @@ -685,19 +685,19 @@ Every Resolver implementation tested against the interface spec. Table-driven: r - Simulate API timeout mid-transaction; transaction must roll back completely. - Corrupted state file; scheduler must escalate, not silently skip. -### Regression tests vs. Wintermute behavior -For each Wintermute pattern we port (e.g. X-handle → tweet URL), a regression test proves the new resolver produces the same answer on real-world inputs from the brain audit. This is the "Wintermute would adopt" proof. +### Regression tests vs. Garry's OpenClaw behavior +For each OpenClaw pattern we port (e.g. X-handle → tweet URL), a regression test proves the new resolver produces the same answer on real-world inputs from the brain audit. This is the "your OpenClaw would adopt" proof. --- ## 11. Open Questions (flagged for CEO re-review) -1. **Scope shape.** Is this the right four-layer decomposition, or are some layers better left to Wintermute (e.g. Scheduling lives above GBrain, not in it)? +1. **Scope shape.** Is this the right four-layer decomposition, or are some layers better left to OpenClaw (e.g. Scheduling lives above GBrain, not in it)? 2. **Phase 3 user-value break.** Does Phase 3 (user-visible `gbrain integrity`) ship early enough, or do we need an even smaller MVP? 3. **LLM-as-resolver.** Should `text_to_entities` be a Resolver, or does that blur the "code vs LLM" line the invariant relies on? 4. **Plugin format.** YAML + TS module (§3.5) vs. pure TS module with decorator-style metadata. Latter is more type-safe; former is more discoverable. 5. **Cross-resolver transactions.** Do we support "atomic fetch-from-Perplexity + write-to-brain" at the L2 layer? Current design says yes; implementation is tricky (Perplexity call isn't rollbackable). -6. **Wintermute bridge scope.** Phase 7 `gbrain claw-bridge` — is that worth a phase of its own, or should adoption be documentation-only? +6. **OpenClaw bridge scope.** Phase 7 `gbrain claw-bridge` — is that worth a phase of its own, or should adoption be documentation-only? 7. **Completeness rubric coverage.** Do we define rubrics for all 9 PageTypes upfront, or ship people/company/meeting first and extend incrementally? 8. **Budget config UX.** Hard daily cap is strict; should we also expose a soft-cap warning mode, and how is the cap set (env var? config file? prompt on first use?) 9. **Backwards compat.** `src/commands/publish.ts` and `src/commands/backlinks.ts` have been running cleanly for weeks. Refactoring through BrainWriter carries migration risk. Acceptable? @@ -705,12 +705,12 @@ For each Wintermute pattern we port (e.g. X-handle → tweet URL), a regression --- -## 12. Verification (the "Wintermute would adopt" test) +## 12. Verification (the "your OpenClaw would adopt" test) The design succeeds iff: - [ ] A user can add a new resolver by dropping a YAML + TS module in `~/.gbrain/resolvers/` without editing GBrain source. -- [ ] Wintermute can delete `scripts/x-api-client.mjs` and replace all callers with 1-line `await registry.resolve('x_handle_to_tweet', ...)`. +- [ ] Your OpenClaw can delete `scripts/x-api-client.mjs` and replace all callers with 1-line `await registry.resolve('x_handle_to_tweet', ...)`. - [ ] No brain page can be written with a bare tweet reference, a missing back-link, or an unverified URL (validators catch it pre-commit). - [ ] Running `gbrain integrity --auto --confidence 0.8` over a real brain fixes ≥1,000 of the 1,424 known bare-tweet citations without human review. - [ ] Full E2E test suite passes on both PGLite + Postgres engines. diff --git a/docs/guides/minions-fix.md b/docs/guides/minions-fix.md index 26c4f44b1..17142d638 100644 --- a/docs/guides/minions-fix.md +++ b/docs/guides/minions-fix.md @@ -73,7 +73,7 @@ F. Install gbrain autopilot --install (env-aware) G. Record append completed.jsonl status:"complete" ``` -If Phase E emits TODOs for host-specific handlers (e.g. Wintermute's +If Phase E emits TODOs for host-specific handlers (e.g. your OpenClaw's ~29 non-gbrain crons), the migration finishes with `status: "partial"`. Your host agent walks the TODOs using `skills/migrations/v0.11.0.md` + `docs/guides/plugin-handlers.md`, ships handler registrations in the diff --git a/docs/guides/plugin-authors.md b/docs/guides/plugin-authors.md index 51eadadf9..0bebc1218 100644 --- a/docs/guides/plugin-authors.md +++ b/docs/guides/plugin-authors.md @@ -1,9 +1,9 @@ # Plugin authors guide (v0.15) `gbrain` discovers subagent definitions from outside this repo via -`GBRAIN_PLUGIN_PATH`. If you maintain a downstream agent (Wintermute, -a workflow host, a private tool) and want to ship custom subagents -alongside it, drop a plugin directory on that env path. +`GBRAIN_PLUGIN_PATH`. If you maintain a downstream agent (your OpenClaw +deployment, a workflow host, a private tool) and want to ship custom +subagents alongside it, drop a plugin directory on that env path. This guide is for plugin authors. The CLI user doesn't need to read it. @@ -130,10 +130,10 @@ may consume more of them. the `put_page` operation (fail-closed if `viaSubagent=true`). Don't try to route around it; you'll get `permission_denied`. -## Example: a Wintermute-flavored plugin +## Example: a downstream-OpenClaw plugin ``` -~/wintermute/ +~/your-openclaw/ └── gbrain-plugin/ ├── gbrain.plugin.json └── subagents/ @@ -142,22 +142,22 @@ may consume more of them. └── daily-task-prep.md ``` -`~/wintermute/gbrain-plugin/gbrain.plugin.json`: +`~/your-openclaw/gbrain-plugin/gbrain.plugin.json`: ```json { - "name": "wintermute", + "name": "your-openclaw", "version": "2026.4.20", "plugin_version": "gbrain-plugin-v1", - "description": "Wintermute's personal-brain subagents" + "description": "Your OpenClaw's personal-brain subagents" } ``` Environment: ```bash -export GBRAIN_PLUGIN_PATH="$HOME/wintermute/gbrain-plugin" +export GBRAIN_PLUGIN_PATH="$HOME/your-openclaw/gbrain-plugin" ``` -Then Wintermute calls `gbrain agent run --subagent-def meeting-ingestion +Then your OpenClaw calls `gbrain agent run --subagent-def meeting-ingestion --fanout-by transcript ...` and its definitions load automatically. diff --git a/docs/guides/plugin-handlers.md b/docs/guides/plugin-handlers.md index 73b98ceec..a2292784f 100644 --- a/docs/guides/plugin-handlers.md +++ b/docs/guides/plugin-handlers.md @@ -4,8 +4,8 @@ GBrain's Minion worker ships with seven built-in handlers: `sync`, `embed`, `lint`, `import`, `extract`, `backlinks`, `autopilot-cycle`. These cover every background operation the gbrain CLI itself performs. -Host platforms (Wintermute, other OpenClaw deployments, future hosts) -register their own handlers via a plugin bootstrap that imports +Host platforms (OpenClaw deployments, future hosts) register their own +handlers via a plugin bootstrap that imports `gbrain/minions`. No `handlers.json`-style data file — handlers are code, loaded by the worker, with the same trust model as any other code in the host's repo. @@ -58,7 +58,7 @@ async function main() { main().catch(err => { console.error(err); process.exit(1); }); ``` -Ship this as a separate binary in the host repo (e.g. `wintermute-worker`) +Ship this as a separate binary in the host repo (e.g. `your-openclaw-worker`) or as a side-effect module that the stock `gbrain jobs work` command auto-loads on startup (configurable via a host-provided entry point). diff --git a/scripts/skillify-check.ts b/scripts/skillify-check.ts index 728c5f087..9e3e4f472 100755 --- a/scripts/skillify-check.ts +++ b/scripts/skillify-check.ts @@ -15,7 +15,7 @@ * Returns JSON when --json is passed: { path, score, total, items, * recommendation }. Exit code is 0 when score == total, 1 otherwise. * - * Ported from ~/git/wintermute/workspace/scripts/skillify-check.mjs + * Ported from ~/git/your-openclaw/workspace/scripts/skillify-check.mjs * (genericized: paths computed from $PROJECT_ROOT + runtime test-dir * detection; replaces the manual `grep AGENTS.md` check with a reference * to `gbrain check-resolvable` which validates the resolver better). diff --git a/skills/migrations/v0.11.0.md b/skills/migrations/v0.11.0.md index ab3b20431..43fef2449 100644 --- a/skills/migrations/v0.11.0.md +++ b/skills/migrations/v0.11.0.md @@ -9,7 +9,7 @@ feature_pitch: # v0.11.0 Migration: Minions — host-agent instruction manual -**Audience: host agents (Wintermute, other OpenClaw deployments, future +**Audience: host agents (OpenClaw deployments, future hosts) reading this AFTER `gbrain apply-migrations` has run its mechanical phases.** The orchestrator in `src/commands/migrations/v0_11_0.ts` is the runtime source of truth for @@ -32,7 +32,7 @@ Non-empty? Each line is a TODO. Each `type` routes to a section below. Gbrain rewrites cron entries whose handler name matches a gbrain builtin (`sync`, `embed`, `lint`, `import`, `extract`, `backlinks`, `autopilot-cycle`). For host-specific handlers (e.g. `ea-inbox-sweep`, -`frameio-scan`, `x-dm-triage`, `calendar-sync` on Wintermute), gbrain +`frameio-scan`, `x-dm-triage`, `calendar-sync` on your OpenClaw), gbrain leaves the manifest alone and emits a TODO with shape: ```json @@ -69,7 +69,7 @@ await worker.start(); ### (b) Ship the bootstrap in your host repo Autopilot already spawns `gbrain jobs work` as a child. Configure it to -spawn your custom worker binary (e.g. `wintermute-worker`) instead, or +spawn your custom worker binary (e.g. `your-openclaw-worker`) instead, or register handlers as a side-effect module that the stock worker loads on startup. Either path is documented in `plugin-handlers.md`. diff --git a/skills/skillpack-check/SKILL.md b/skills/skillpack-check/SKILL.md index 45c01acc5..612586cb2 100644 --- a/skills/skillpack-check/SKILL.md +++ b/skills/skillpack-check/SKILL.md @@ -4,7 +4,7 @@ version: 1.0.0 description: | Run `gbrain skillpack-check` to produce an agent-readable JSON health report for the gbrain install. Wraps `gbrain doctor` + `gbrain apply-migrations - --list` so a host agent (Wintermute's morning-briefing, any OpenClaw cron) + --list` so a host agent (your OpenClaw's morning-briefing, any OpenClaw cron) can see at a glance whether the skillpack needs attention. Use when the user asks "is gbrain healthy?", when a cron fires a morning @@ -40,7 +40,7 @@ Exit code: ## When to run -- **Daily cron** (e.g. Wintermute's `morning-briefing`): `gbrain skillpack-check --quiet`. +- **Daily cron** (e.g. your OpenClaw's `morning-briefing`): `gbrain skillpack-check --quiet`. Exit code alone tells you if anything is wrong; surface a one-liner in the briefing only when exit != 0. No JSON noise in happy-path briefings. - **On demand**: `gbrain skillpack-check` for the full JSON when debugging. diff --git a/src/commands/doctor.ts b/src/commands/doctor.ts index 46ebb02ad..40f99226e 100644 --- a/src/commands/doctor.ts +++ b/src/commands/doctor.ts @@ -88,7 +88,7 @@ export async function runDoctor(engine: BrainEngine | null, args: string[], dbSo // status:"complete" for the same version, the install is mid-migration. // Typical cause: v0.11.0 stopgap wrote a partial record but nobody ran // `gbrain apply-migrations --yes` afterward. This check fires on every - // `gbrain doctor` invocation so Wintermute's health skill catches it. + // `gbrain doctor` invocation so your OpenClaw's health skill catches it. try { const completed = loadCompletedMigrations(); const byVersion = new Map(); diff --git a/src/commands/migrations/v0_15_0.ts b/src/commands/migrations/v0_15_0.ts index 9792bc71e..bbe4f733e 100644 --- a/src/commands/migrations/v0_15_0.ts +++ b/src/commands/migrations/v0_15_0.ts @@ -128,7 +128,7 @@ export const v0_15_0: Migration = { 'as first-class Minion jobs. Crash-resumable turn persistence, two-phase tool ledger, ' + 'lease-based rate limit, parent-child fan-out with aggregation. Entry points: `gbrain ' + 'agent run` and `gbrain agent logs`. See docs/guides/plugin-authors.md for shipping ' + - 'custom subagent defs from a host repo (Wintermute etc.).', + 'custom subagent defs from a host repo (your OpenClaw etc.).', }, orchestrator, }; diff --git a/src/commands/skillpack-check.ts b/src/commands/skillpack-check.ts index 9d41d2344..51dae520c 100644 --- a/src/commands/skillpack-check.ts +++ b/src/commands/skillpack-check.ts @@ -2,7 +2,7 @@ * `gbrain skillpack-check` — agent-readable health report. * * Wraps `gbrain doctor --json` + `gbrain apply-migrations --list` into a - * single JSON blob a host agent (Wintermute's morning-briefing, any + * single JSON blob a host agent (your OpenClaw's morning-briefing, any * OpenClaw cron) can consume without parsing two subcommands. * * Usage: diff --git a/src/core/enrichment/completeness.ts b/src/core/enrichment/completeness.ts index 5cb8d2ba6..4b446ab6b 100644 --- a/src/core/enrichment/completeness.ts +++ b/src/core/enrichment/completeness.ts @@ -1,7 +1,7 @@ /** * CompletenessScorer — per-entity-type rubrics, 0.0–1.0 score per page. * - * Replaces Wintermute's length-based heuristic ("compiled_truth > 500 chars") + * Replaces Garry's OpenClaw's length-based heuristic ("compiled_truth > 500 chars") * with a weighted rubric that actually reflects whether a page would be * useful to answer a query. Runs on demand; BrainWriter invokes it on * write to cache the score in frontmatter. diff --git a/src/core/minions/plugin-loader.ts b/src/core/minions/plugin-loader.ts index d8b814333..665891f87 100644 --- a/src/core/minions/plugin-loader.ts +++ b/src/core/minions/plugin-loader.ts @@ -1,7 +1,7 @@ /** * GBRAIN_PLUGIN_PATH loader for host-repo subagent definitions (v0.15). * - * Wintermute (and future downstream agents) ship custom subagent defs + * Your OpenClaw (and future downstream agents) ship custom subagent defs * from their own repos. gbrain discovers them at worker startup via * GBRAIN_PLUGIN_PATH = colon-separated absolute paths (like $PATH). Each * path must contain a gbrain.plugin.json manifest describing the plugin diff --git a/src/core/operations.ts b/src/core/operations.ts index 4c2764b5f..1d1a390ea 100644 --- a/src/core/operations.ts +++ b/src/core/operations.ts @@ -701,7 +701,7 @@ const get_backlinks: Operation = { * grows a `visited` array per path; in `direction=both` the join is `OR`-based and * fans out exponentially. Without a cap, a remote MCP caller can pass depth=1e6 * and burn memory/CPU on the database. 10 hops is well beyond any realistic - * relationship query (Wintermute's "people who attended meetings with Alice" + * relationship query (your OpenClaw's "people who attended meetings with Alice" * is 2 hops; the deepest meaningful chain in our test data is 4). */ const TRAVERSE_DEPTH_CAP = 10; diff --git a/src/core/output/scaffold.ts b/src/core/output/scaffold.ts index a5e13f395..09718b3fd 100644 --- a/src/core/output/scaffold.ts +++ b/src/core/output/scaffold.ts @@ -5,7 +5,7 @@ * WHERE and HOW. Every user-visible URL, every citation, every wikilink is * assembled from resolver outputs or structured IDs — never from LLM text. * - * Example (from the Wintermute memory log, 2026-04-13): an agent was asked + * Example (from Garry's OpenClaw memory log, 2026-04-13): an agent was asked * to rewrite daily files and it invented a "Philip Leung" entity that didn't * exist. With the Scaffolder, the LLM writes "the attendee was mentioned * again" and code writes the actual `[Philip Leung](people/philip-leung.md)` @@ -65,7 +65,7 @@ export interface EmailCitationInput { * Canonical email citation with a deep link that opens the actual thread: * [Source: email "Subject line", 2026-04-18](https://mail.google.com/mail/u/?authuser=...#inbox/...) * - * URL shape matches the pattern Wintermute's ingest pipeline builds from API + * URL shape matches the pattern Garry's OpenClaw's ingest pipeline builds from API * responses, so brain-page links and agent-generated links use the same * format (cross-tool consistency). */