v0.25.1 foundation: scaffolds + manifests + filing-doctrine update

Foundation commit for v0.25.1 skills wave (book-mirror flagship + 8 research
pairings). All content is scaffold-stage; subsequent commits port wintermute
SKILL.md content into pure gbrain idiom.

Version bumps:
- VERSION 0.24.0 -> 0.25.1
- package.json: version + engines.bun >= 1.3.10 (D14 PTY harness)
- openclaw.plugin.json inner version 0.19.0 -> 0.25.1
- bun.lock refreshed

9 skill scaffolds via `gbrain skillify scaffold` (frontmatter + RESOLVER row +
routing-eval seed): book-mirror, article-enrichment, strategic-reading,
concept-synthesis, perplexity-research, archive-crawler, academic-verify,
brain-pdf, voice-note-ingest. Stub .mjs scripts and stub .test.ts files
deleted; these are pure-markdown skills, not deterministic-script skills.
Real tests will return when src/commands/book-mirror.ts and the other
runtime pieces land.

skills/manifest.json + openclaw.plugin.json skills[]: 9 new entries
(codex T6 fix; required by test/skillpack-sync-guard.test.ts).

D13 filing-doctrine update:
- skills/_brain-filing-rules.md: carve out media/<format>/<slug> as a
  sanctioned exception for sui-generis synthesized output.
- skills/_brain-filing-rules.json: add media/books/ and media/articles/
  as `synthesis-output` kind, distinct from raw-ingest filing.
- skills/media-ingest/SKILL.md: refine anti-pattern callout to clarify
  that format-prefixed paths are anti-pattern for raw ingest only,
  sanctioned for one-of-one synthesis.

Privacy guard hardening (codex T7):
- scripts/check-privacy.sh: extended for /data/brain/ and
  /data/.openclaw/ wintermute-specific path patterns. 7 historical
  files allow-listed (frozen migrations, test fixtures, env-var
  fallbacks). PRIVACY OK passes.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Garry Tan
2026-05-01 14:45:20 -07:00
co-authored by Claude Opus 4.7
parent 4fc1246606
commit b438a7c4dd
27 changed files with 434 additions and 5 deletions
+1 -1
View File
@@ -1 +1 @@
0.24.0
0.25.1
+10 -1
View File
@@ -1,6 +1,6 @@
{
"name": "gbrain",
"version": "0.19.0",
"version": "0.25.1",
"description": "Personal knowledge brain with Postgres + pgvector hybrid search",
"family": "bundle-plugin",
"configSchema": {
@@ -24,9 +24,15 @@
}
},
"skills": [
"skills/academic-verify",
"skills/archive-crawler",
"skills/article-enrichment",
"skills/book-mirror",
"skills/brain-ops",
"skills/brain-pdf",
"skills/briefing",
"skills/citation-fixer",
"skills/concept-synthesis",
"skills/cross-modal-review",
"skills/cron-scheduler",
"skills/daily-task-manager",
@@ -39,6 +45,7 @@
"skills/media-ingest",
"skills/meeting-ingestion",
"skills/minion-orchestrator",
"skills/perplexity-research",
"skills/query",
"skills/reports",
"skills/repo-architecture",
@@ -47,7 +54,9 @@
"skills/skillify",
"skills/skillpack-check",
"skills/soul-audit",
"skills/strategic-reading",
"skills/testing",
"skills/voice-note-ingest",
"skills/webhook-transforms"
],
"shared_deps": [
+4 -1
View File
@@ -1,6 +1,6 @@
{
"name": "gbrain",
"version": "0.24.0",
"version": "0.25.1",
"description": "Postgres-native personal knowledge brain with hybrid RAG search",
"type": "module",
"main": "src/core/index.ts",
@@ -77,5 +77,8 @@
"trustedDependencies": [
"@electric-sql/pglite"
],
"engines": {
"bun": ">=1.3.10"
},
"license": "MIT"
}
+28
View File
@@ -26,6 +26,14 @@
set -euo pipefail
BANNED_NAME='wintermute'
# v0.25.1 (codex T7): additional patterns from wintermute-specific filesystem
# layouts that would leak private fork context if they slipped through a port.
# `wintermute_only` already matches via the case-insensitive `wintermute` regex
# above; this list is for orthogonal patterns.
BANNED_PATHS=(
'/data/brain/'
'/data/.openclaw/'
)
usage() {
cat <<EOF
@@ -92,6 +100,18 @@ ALLOW_LIST=(
'llms-full.txt'
'docs/UPGRADING_DOWNSTREAM_AGENTS.md'
'test/integrations.test.ts'
# v0.25.1 (codex T7) BANNED_PATHS allow-list:
# Historical docs, frozen migration files, test fixtures, and env-var
# fallbacks where /data/brain/ or /data/.openclaw/ appears legitimately.
# New skills/, src/, and tests must NOT slip onto this list — extend the
# banned check above instead.
'docs/GBRAIN_RECOMMENDED_SCHEMA.md'
'docs/GBRAIN_V0.md'
'docs/guides/minions-shell-jobs.md'
'scripts/smoke-test.sh'
'skills/migrations/v0.9.0.md'
'skills/migrations/v0.14.0.md'
'test/storage-status.test.ts'
)
is_allowed() {
@@ -119,6 +139,14 @@ while IFS= read -r file; do
grep -in "$BANNED_NAME" "$file" | sed 's|^| |' >&2
FOUND=1
fi
# Banned wintermute-specific filesystem paths (codex T7).
for path in "${BANNED_PATHS[@]}"; do
if grep -nF "$path" "$file" >/dev/null 2>&1; then
echo "[check-privacy] BANNED PATH '$path' in $file:" >&2
grep -nF "$path" "$file" | sed 's|^| |' >&2
FOUND=1
fi
done
;;
esac
done <<< "$FILES"
+22
View File
@@ -103,3 +103,25 @@ These apply to ALL brain-writing skills:
- `skills/conventions/subagent-routing.md` — when to use Minions vs inline work
- `skills/_brain-filing-rules.md` — where files go
- `skills/_output-rules.md` — output quality standards
## Uncategorized
| Trigger | Skill |
|---------|-------|
| "personalized version of this book" | `skills/book-mirror/SKILL.md` |
| "enrich this article" | `skills/article-enrichment/SKILL.md` |
| "strategic reading" | `skills/strategic-reading/SKILL.md` |
| "concept synthesis" | `skills/concept-synthesis/SKILL.md` |
| "perplexity research" | `skills/perplexity-research/SKILL.md` |
| "crawl my archive" | `skills/archive-crawler/SKILL.md` |
| "verify this academic claim" | `skills/academic-verify/SKILL.md` |
| "make pdf from brain" | `skills/brain-pdf/SKILL.md` |
| "voice note" | `skills/voice-note-ingest/SKILL.md` |
+12
View File
@@ -86,6 +86,18 @@
"directory": "openclaw/",
"examples": ["agent-state notes"],
"description": "Notes about the host OpenClaw agent itself, not the underlying entities."
},
{
"kind": "synthesis-output",
"directory": "media/books/",
"examples": ["personalized book mirrors", "two-column chapter analyses"],
"description": "Sanctioned exception to 'file by primary subject' for sui generis synthesized output that is one-of-one to a single book and a specific reader. Format-prefixed under media/<format>/ is allowed for synthesis output only, never for raw ingest. See _brain-filing-rules.md."
},
{
"kind": "synthesis-output",
"directory": "media/articles/",
"examples": ["personalized article reads", "long-form content tailored to reader"],
"description": "Same sanctioned exception as media/books/. One-of-one synthesis output of an article personalized for the reader. Distinct from raw article ingest, which goes to the article's primary-subject directory."
}
],
"sources_dir": {
+18
View File
@@ -23,6 +23,24 @@ not the source, not the skill that's running.
| Reusable framework/thesis -> `sources/` | -> `concepts/` | It's a mental model |
| Tweet thread about policy -> `media/` | -> `civic/` or `concepts/` | media/ is for content ops |
## Sanctioned exception: synthesis output is sui generis
The "file by primary subject" rule is for raw ingest. Synthesized output that
is one-of-one to a single source AND a specific reader (a personalized book
mirror, a strategic-reading playbook tied to one problem) does not fit any
subject directory cleanly: filing by topic loses the "this is the book"
dimension; filing by author muddles authorship pages with synthesis pages.
Format-prefixed paths under `media/<format>/<slug>` are the sanctioned
exception:
- `media/books/<slug>-personalized.md` (book-mirror output)
- `media/articles/<slug>-personalized.md` (long-form article personalization)
If you find yourself wanting `media/<format>/` for raw ingest, that is still
the anti-pattern in the table above. The exception is narrow: synthesized,
one-of-one, sui generis to a single source.
## What `sources/` Is Actually For
`sources/` is ONLY for:
+28
View File
@@ -0,0 +1,28 @@
---
name: academic-verify
version: 0.1.0
description: Verify academic citations and research claims against current literature; routes through perplexity-research for the actual web search and formats results as a citation-checked brain page.
triggers:
- "verify this academic claim"
- "check this study"
- "academic verify"
- "validate citation"
- "is this study real"
mutating: true
writes_pages: true
writes_to:
- concepts/
---
# academic-verify
Verify academic citations and research claims against current literature; routes through perplexity-research for the actual web search and formats results as a citation-checked brain page.
## The rule
<!-- SKILLIFY_STUB: replace before running check-resolvable --strict -->
Replace this stub with the hard rule that prevents recurrence of the failure that triggered this skill.
## How to use
Run the deterministic script: `bun scripts/academic-verify.mjs` (or whatever your harness prefix is).
@@ -0,0 +1,4 @@
// Routing eval fixtures for skills/academic-verify.
{"intent":"please verify this academic claim for me now","expected_skill":"academic-verify"}
{"intent":"please check this study for me now","expected_skill":"academic-verify"}
{"intent":"please academic verify for me now","expected_skill":"academic-verify"}
+30
View File
@@ -0,0 +1,30 @@
---
name: archive-crawler
version: 0.1.0
description: Universal archivist for personal file archives (Dropbox/B2/email exports). Filters for high-value content within an explicit gbrain.yml allow-list scan_paths gate.
triggers:
- "crawl my archive"
- "find gold in my archive"
- "archive crawler"
- "scan my dropbox for"
- "mine my old files for"
mutating: true
writes_pages: true
writes_to:
- originals/
- personal/
- ideas/
---
# archive-crawler
Universal archivist for personal file archives (Dropbox/B2/email exports). Filters for high-value content within an explicit gbrain.yml allow-list scan_paths gate.
## The rule
<!-- SKILLIFY_STUB: replace before running check-resolvable --strict -->
Replace this stub with the hard rule that prevents recurrence of the failure that triggered this skill.
## How to use
Run the deterministic script: `bun scripts/archive-crawler.mjs` (or whatever your harness prefix is).
@@ -0,0 +1,4 @@
// Routing eval fixtures for skills/archive-crawler.
{"intent":"please crawl my archive for me now","expected_skill":"archive-crawler"}
{"intent":"please find gold in my archive for me now","expected_skill":"archive-crawler"}
{"intent":"please archive crawler for me now","expected_skill":"archive-crawler"}
+27
View File
@@ -0,0 +1,27 @@
---
name: article-enrichment
version: 0.1.0
description: Transform raw article text dumps in the brain into structured pages with executive summaries, verbatim quotes, key insights, why-it-matters, and cross-references.
triggers:
- "enrich this article"
- "enrich brain pages"
- "batch enrich"
- "make brain pages useful"
mutating: true
writes_pages: true
writes_to:
- media/articles/
---
# article-enrichment
Transform raw article text dumps in the brain into structured pages with executive summaries, verbatim quotes, key insights, why-it-matters, and cross-references.
## The rule
<!-- SKILLIFY_STUB: replace before running check-resolvable --strict -->
Replace this stub with the hard rule that prevents recurrence of the failure that triggered this skill.
## How to use
Run the deterministic script: `bun scripts/article-enrichment.mjs` (or whatever your harness prefix is).
@@ -0,0 +1,4 @@
// Routing eval fixtures for skills/article-enrichment.
{"intent":"please enrich this article for me now","expected_skill":"article-enrichment"}
{"intent":"please enrich brain pages for me now","expected_skill":"article-enrichment"}
{"intent":"please batch enrich for me now","expected_skill":"article-enrichment"}
+28
View File
@@ -0,0 +1,28 @@
---
name: book-mirror
version: 0.1.0
description: Take any book (EPUB/PDF), produce a personalized chapter-by-chapter analysis with two-column tables: left = chapter summary, right = how it applies to you based on brain context. Output: brain page + PDF.
triggers:
- "personalized version of this book"
- "mirror this book"
- "two-column book analysis"
- "apply this book to my life"
- "how does this book apply to me"
mutating: true
writes_pages: true
writes_to:
- media/books/
---
# book-mirror
Take any book (EPUB/PDF), produce a personalized chapter-by-chapter analysis with two-column tables: left = chapter summary, right = how it applies to you based on brain context. Output: brain page + PDF.
## The rule
<!-- SKILLIFY_STUB: replace before running check-resolvable --strict -->
Replace this stub with the hard rule that prevents recurrence of the failure that triggered this skill.
## How to use
Run the deterministic script: `bun scripts/book-mirror.mjs` (or whatever your harness prefix is).
+4
View File
@@ -0,0 +1,4 @@
// Routing eval fixtures for skills/book-mirror.
{"intent":"please personalized version of this book for me now","expected_skill":"book-mirror"}
{"intent":"please mirror this book for me now","expected_skill":"book-mirror"}
{"intent":"please two-column book analysis for me now","expected_skill":"book-mirror"}
+24
View File
@@ -0,0 +1,24 @@
---
name: brain-pdf
version: 0.1.0
description: Generate a publication-quality PDF from any brain page via the gstack make-pdf binary; strips frontmatter, sanitizes emoji, applies running headers.
triggers:
- "make pdf from brain"
- "brain pdf"
- "convert brain page to pdf"
- "publish this page as pdf"
- "export brain page"
---
# brain-pdf
Generate a publication-quality PDF from any brain page via the gstack make-pdf binary; strips frontmatter, sanitizes emoji, applies running headers.
## The rule
<!-- SKILLIFY_STUB: replace before running check-resolvable --strict -->
Replace this stub with the hard rule that prevents recurrence of the failure that triggered this skill.
## How to use
Run the deterministic script: `bun scripts/brain-pdf.mjs` (or whatever your harness prefix is).
+4
View File
@@ -0,0 +1,4 @@
// Routing eval fixtures for skills/brain-pdf.
{"intent":"please make pdf from brain for me now","expected_skill":"brain-pdf"}
{"intent":"please brain pdf for me now","expected_skill":"brain-pdf"}
{"intent":"please convert brain page to pdf for me now","expected_skill":"brain-pdf"}
+28
View File
@@ -0,0 +1,28 @@
---
name: concept-synthesis
version: 0.1.0
description: Deduplicate and synthesize raw concept stubs into a tiered intellectual map (T1 Canon to T4 Riff), tracing idea evolution across sources over time.
triggers:
- "concept synthesis"
- "synthesize my concepts"
- "find patterns across my notes"
- "build my intellectual map"
- "trace idea evolution"
mutating: true
writes_pages: true
writes_to:
- concepts/
---
# concept-synthesis
Deduplicate and synthesize raw concept stubs into a tiered intellectual map (T1 Canon to T4 Riff), tracing idea evolution across sources over time.
## The rule
<!-- SKILLIFY_STUB: replace before running check-resolvable --strict -->
Replace this stub with the hard rule that prevents recurrence of the failure that triggered this skill.
## How to use
Run the deterministic script: `bun scripts/concept-synthesis.mjs` (or whatever your harness prefix is).
@@ -0,0 +1,4 @@
// Routing eval fixtures for skills/concept-synthesis.
{"intent":"please concept synthesis for me now","expected_skill":"concept-synthesis"}
{"intent":"please synthesize my concepts for me now","expected_skill":"concept-synthesis"}
{"intent":"please find patterns across my notes for me now","expected_skill":"concept-synthesis"}
+46 -1
View File
@@ -1,6 +1,6 @@
{
"name": "gbrain",
"version": "0.10.0",
"version": "0.25.1",
"conformance_version": "1.0.0",
"description": "Personal knowledge brain with hybrid RAG search \u2014 GStack mod for agent platforms",
"skills": [
@@ -153,6 +153,51 @@
"name": "smoke-test",
"path": "smoke-test/SKILL.md",
"description": "Post-restart smoke tests + auto-fix for gbrain and OpenClaw environments"
},
{
"name": "book-mirror",
"path": "book-mirror/SKILL.md",
"description": "Take any book (EPUB/PDF), produce a personalized chapter-by-chapter analysis with two-column tables: left = chapter summary, right = how it applies to you based on brain context. Output: brain page + PDF."
},
{
"name": "article-enrichment",
"path": "article-enrichment/SKILL.md",
"description": "Transform raw article text dumps in the brain into structured pages with executive summaries, verbatim quotes, key insights, why-it-matters, and cross-references."
},
{
"name": "strategic-reading",
"path": "strategic-reading/SKILL.md",
"description": "Read a book/article/case study through the lens of a specific strategic problem; produce an applied playbook (do/avoid/watch for) with short/medium/long-term recommendations."
},
{
"name": "concept-synthesis",
"path": "concept-synthesis/SKILL.md",
"description": "Deduplicate and synthesize raw concept stubs into a tiered intellectual map (T1 Canon to T4 Riff), tracing idea evolution across sources over time."
},
{
"name": "perplexity-research",
"path": "perplexity-research/SKILL.md",
"description": "Brain-augmented web research via Perplexity plus Opus; surfaces what is NEW vs already-known about a topic by cross-referencing against the brain first."
},
{
"name": "archive-crawler",
"path": "archive-crawler/SKILL.md",
"description": "Universal archivist for personal file archives (Dropbox/B2/email exports). Filters for high-value content within an explicit gbrain.yml allow-list scan_paths gate."
},
{
"name": "academic-verify",
"path": "academic-verify/SKILL.md",
"description": "Verify academic citations and research claims against current literature; routes through perplexity-research for the actual web search and formats results as a citation-checked brain page."
},
{
"name": "brain-pdf",
"path": "brain-pdf/SKILL.md",
"description": "Generate a publication-quality PDF from any brain page via the gstack make-pdf binary; strips frontmatter, sanitizes emoji, applies running headers."
},
{
"name": "voice-note-ingest",
"path": "voice-note-ingest/SKILL.md",
"description": "Ingest voice notes with exact-phrasing preservation (never paraphrased); routes content based on a decision tree across originals/concepts/people/companies/ideas/personal/voice-notes."
}
],
"dependencies": {
+1 -1
View File
@@ -113,6 +113,6 @@ Brain page created with summary, highlights, and entity cross-links. Report to u
- Dumping raw transcripts without analysis
- Skipping entity extraction ("I'll do that separately")
- Filing by format (all videos in `media/videos/`) instead of by subject
- Filing **raw ingest** by format (all videos in `media/videos/`) instead of by subject. Note: format-prefixed paths under `media/<format>/<slug>` ARE sanctioned for **synthesized one-of-one output** like book-mirror's `media/books/<slug>-personalized.md`. The anti-pattern is for raw ingest, not for sui generis synthesis. See `skills/_brain-filing-rules.md` "Sanctioned exception: synthesis output is sui generis."
- Not preserving raw source files
- Creating stub pages without meaningful content
+28
View File
@@ -0,0 +1,28 @@
---
name: perplexity-research
version: 0.1.0
description: Brain-augmented web research via Perplexity plus Opus; surfaces what is NEW vs already-known about a topic by cross-referencing against the brain first.
triggers:
- "perplexity research"
- "what's new about"
- "current state of"
- "web research"
- "what changed about"
mutating: true
writes_pages: true
writes_to:
- research/
---
# perplexity-research
Brain-augmented web research via Perplexity plus Opus; surfaces what is NEW vs already-known about a topic by cross-referencing against the brain first.
## The rule
<!-- SKILLIFY_STUB: replace before running check-resolvable --strict -->
Replace this stub with the hard rule that prevents recurrence of the failure that triggered this skill.
## How to use
Run the deterministic script: `bun scripts/perplexity-research.mjs` (or whatever your harness prefix is).
@@ -0,0 +1,4 @@
// Routing eval fixtures for skills/perplexity-research.
{"intent":"please perplexity research for me now","expected_skill":"perplexity-research"}
{"intent":"please what's new about for me now","expected_skill":"perplexity-research"}
{"intent":"please current state of for me now","expected_skill":"perplexity-research"}
+29
View File
@@ -0,0 +1,29 @@
---
name: strategic-reading
version: 0.1.0
description: Read a book/article/case study through the lens of a specific strategic problem; produce an applied playbook (do/avoid/watch for) with short/medium/long-term recommendations.
triggers:
- "strategic reading"
- "read this through the lens of"
- "apply this to my problem"
- "what can I learn from this about"
- "extract a playbook from"
mutating: true
writes_pages: true
writes_to:
- concepts/
- projects/
---
# strategic-reading
Read a book/article/case study through the lens of a specific strategic problem; produce an applied playbook (do/avoid/watch for) with short/medium/long-term recommendations.
## The rule
<!-- SKILLIFY_STUB: replace before running check-resolvable --strict -->
Replace this stub with the hard rule that prevents recurrence of the failure that triggered this skill.
## How to use
Run the deterministic script: `bun scripts/strategic-reading.mjs` (or whatever your harness prefix is).
@@ -0,0 +1,4 @@
// Routing eval fixtures for skills/strategic-reading.
{"intent":"please strategic reading for me now","expected_skill":"strategic-reading"}
{"intent":"please read this through the lens of for me now","expected_skill":"strategic-reading"}
{"intent":"please apply this to my problem for me now","expected_skill":"strategic-reading"}
+34
View File
@@ -0,0 +1,34 @@
---
name: voice-note-ingest
version: 0.1.0
description: Ingest voice notes with exact-phrasing preservation (never paraphrased); routes content to originals/concepts/people/companies/ideas/personal/voice-notes/ based on a decision tree.
triggers:
- "voice note"
- "ingest this voice memo"
- "transcribe and file"
- "voice note ingest"
- "save this audio note"
mutating: true
writes_pages: true
writes_to:
- voice-notes/
- originals/
- concepts/
- people/
- companies/
- ideas/
- personal/
---
# voice-note-ingest
Ingest voice notes with exact-phrasing preservation (never paraphrased); routes content to originals/concepts/people/companies/ideas/personal/voice-notes/ based on a decision tree.
## The rule
<!-- SKILLIFY_STUB: replace before running check-resolvable --strict -->
Replace this stub with the hard rule that prevents recurrence of the failure that triggered this skill.
## How to use
Run the deterministic script: `bun scripts/voice-note-ingest.mjs` (or whatever your harness prefix is).
@@ -0,0 +1,4 @@
// Routing eval fixtures for skills/voice-note-ingest.
{"intent":"please voice note for me now","expected_skill":"voice-note-ingest"}
{"intent":"please ingest this voice memo for me now","expected_skill":"voice-note-ingest"}
{"intent":"please transcribe and file for me now","expected_skill":"voice-note-ingest"}