Brain health checks: back-link enforcement, citation audit, filing validation, stale info detection, orphan pages, and benchmarks. Use when asked to check brain
复制下面这句话,粘贴给 Claude Code、Codex、Cursor 等 AI 编程工具,它会读取安装说明并在你确认后完成安装。
请阅读 https://ai.atlankj.com/install/asset/gh-maintain-b2508b07f11b ,按照其中的说明把「maintain」安装到你(当前 AI 工具)中。执行前先告诉我将运行的命令和写入的位置,等我确认。
查看 AI 将读取的安装说明正在读取 GitHub 原文…
内容来自 GitHub 原始文件,由原作者维护。在 GitHub 查看
Periodic brain health checks and cleanup.
This skill guarantees:
Routine maintenance, startup checks, doctor --fix, and a request to "fix what's
broken" do not authorize writer topology changes. On owner_unavailable or a
writer coordination refusal, inspect gbrain sources writer status --brain <id> --json on the selected host first and report the owner, epoch, enabled state and
blocked recovery to the operator. Do not claim a checkout, activate managed mode,
transfer an owner, replace identities, or remove ownership markers as a repair.
Deliberate administration requires a separately approved topology change and the
action-specific intent plus reviewed state precondition described in
docs/architecture/topologies.md. Neither a TTY nor --yes nor
--confirm-quiesced substitutes for that decision. Remote credentials remain
ineligible for local writer administration.
If the user asks "get my brain to 90/100" or "fix what's broken", prefer the one-command loop over walking each dimension by hand:
gbrain doctor --remediation-plan --json # preview what would run
gbrain doctor --remediate --yes --target-score 90 --max-usd 5
--remediation-plan prints a dependency-ordered list (sync before extract,
embed after consolidate, etc.) with per-step est_seconds and est_usd_cost.
--remediate walks the plan, submitting each step as a Minion job, re-checking
score between every step. --max-usd N is a hard cost cap — submission refuses
when the plan would exceed the cap (prevents synthesize loops from burning
Anthropic credits unattended).
When the target score is unreachable for the brain (empty brain with no entity
pages → graph_coverage caps at 70; unconfigured embedding key → caps at 60),
the command bails with a list of what's missing rather than looping.
Use the per-dimension walk below (Phase 2 onward) when:
--remediate's ceilingPages where compiled_truth is older than the latest timeline entry. The assessment hasn't been updated to reflect recent evidence.
Pages with zero inbound links. Nobody references them.
Links pointing to pages that don't exist.
Pages that mention entity names but don't have formal links.
If link_count is 0 or low relative to page_count, run batch extraction:
gbrain extract links --dir ~/brain
This scans all markdown files for entity references, See Also sections, and frontmatter fields, then creates typed links in the database.
If timeline_entry_count is 0, extract structured timeline from markdown:
gbrain extract timeline --dir ~/brain
gbrain dream runs the full maintenance cycle (core phases shown; opt-in
phases like atoms/concepts/drift slot in between):
lint -> backlinks -> sync -> synthesize -> extract -> patterns -> embed -> orphans
The two new phases consolidate yesterday's conversations into long-term memory:
Synthesize phase (two-stage cascade): reads transcripts from
dream.synthesize.session_corpus_dir, then triages before it spends: a cheap
utility-tier judge (models.dream.triage) scores every new file 0–1 for
salience and pre-extracts candidate quotes + entities, cached in
dream_verdicts with the judging model + prompt version (bounded per cycle
by dream.triage.max_ms, default 5 min — deferred files retry next cycle,
never silently rejected). A file passes the gate two ways: it scores at or
above dream.triage.threshold (default 0.5), OR the verified-segment
rescue fires — a score in [dream.triage.rescue_floor, threshold) still
passes when at least dream.triage.rescue_min_segments (default 2; 0
disables) of the judge's own quoted segments verify as substrings of the
transcript AND the content type is in dream.triage.rescue_content_types
(default mixed,reflection,idea,strategy,people — never routine/technical).
The rescue costs nothing (no extra LLM calls, it re-reads the cached verdict)
and it is what recovers real signal buried in an otherwise mundane transcript.
The whole gate is applied at READ time, so retuning the threshold or the
rescue knobs re-gates with zero new LLM calls. Files that pass fan out one
synthesis subagent per transcript chunk, each primed with the triage map. By default
each child runs in oneshot mode (dream.synthesize.mode, default oneshot):
ONE tool-less completion against a prompt carrying a pre-retrieved LINK
CANDIDATES manifest (dream.synthesize.link_manifest, default on) and the
write allow-list, validated end-to-end (slug fences, task shapes, wikilinks)
before any page is written programmatically. A response that fails validation
falls back to the classic agentic loop in the same job, where the
dream.synthesize.max_turns cap (default 16) applies; revert dial:
gbrain config set dream.synthesize.mode agentic. Each child writes reflections
(wiki/personal/reflections/...) and originals (wiki/originals/ideas/...);
people timeline entries are written only on the agentic path (fallback or
mode agentic), where the child has the add_timeline_entry tool. The orchestrator collects the slugs from
subagent_tool_executions (NOT pages.updated_at — that would pick up
unrelated writes), runs the quote verify pass over them (below), and
reverse-renders each new page from DB → markdown on disk. To re-apply the
gate after retuning the threshold or the rescue knobs, or to drain a queued
backlog, run gbrain dream retriage --dry-run (zero LLM calls, cached
scores only) then gbrain dream retriage --reconcile-queue;
re-judges everything from scratch. Retriage reads the SAME gate the cycle
does, so a reconcile sweep never cancels a job the rescue admitted.
Quote verify/repair (post-write, zero LLM): after slug collection and
before the reverse-write, dream.synthesize.quote_verify (default on) checks
every quoted span on the pages this phase just created against the transcript
it came from. An exact match is kept; a span that differs only in whitespace,
curly quotes, dashes, or case is replaced with the verbatim transcript slice;
a near match is repaired the same way; anything that still can't be grounded
keeps its TEXT but loses its quotation marks. Nothing is ever fabricated and
no content is deleted. Numeric and date claims absent from the transcript are
counted as warnings, not edits. Telemetry lands in
details.synthesis.quote_verify; the config key is the incident off switch.
Patterns phase: runs after extract (so the graph state is fresh).
Reads recent reflections within dream.patterns.lookback_days (default 30),
runs a single Sonnet pass to surface recurring themes, and writes pattern
pages to wiki/personal/patterns/<theme> when ≥dream.patterns.min_evidence
(default 3) reflections support a pattern. A completed run records the newest
reflection it consumed (dream.patterns.last_evidence_ts); until a reflection
in the window is newer than that, re-runs skip with no_new_evidence instead
of paying for another model pass — gbrain dream --phase patterns --once
forces one.
Quality bar (Iron Law for synthesis):
Trust boundary (allowed_slug_prefixes): the synthesis subagent runs with an
explicit allow-list of write paths sourced from _brain-filing-rules.json's
dream_synthesize_paths.globs. Even on prompt-injection success, the subagent
cannot write outside that list. Trust comes from PROTECTED_JOB_NAMES — MCP
cannot submit subagent jobs at all. Editing the JSON is the only way to add
a new directory the synthesizer can write to.
Idempotency + privacy: transcripts are keyed by (file_path, content_hash),
so re-running on the same content is a no-op. dream.synthesize.exclude_patterns
(default ["medical", "therapy"]) filters out transcripts before any LLM call.
Each entry is auto-wrapped as a word-boundary regex (e.g. medical matches
"medical advice" but NOT "comedical"). Power users may pass full regex.
Cooldown: the cycle's spend cap. dream.synthesize.cooldown_hours (default
12) means at most ~2 synthesize runs per day under autopilot. The completion
timestamp is stored in dream.synthesize.last_completion_ts and is written
ONLY on successful runs (not on skipped/failed). Explicit --input /
--date / --from / --to invocations bypass cooldown.
--dry-run semantics: runs the scored triage pass (judges + caches
verdicts for new files) but skips the synthesis subagents. NOT zero LLM
calls — for a zero-call preview from cached scores use
gbrain dream retriage --dry-run instead.
Configure synthesize on a fresh brain:
gbrain config set dream.synthesize.session_corpus_dir /path/to/transcripts
gbrain config set dream.synthesize.enabled true
gbrain dream --phase synthesize --dry-run --json # preview
gbrain dream # full cycle
Invocation patterns:
gbrain dream # full cycle
gbrain dream --phase synthesize # just synthesize
gbrain dream --phase patterns # just patterns
gbrain dream --input ~/transcripts/2026-04-25.txt # ad-hoc one transcript
gbrain dream --from 2026-04-01 --to 2026-04-25 # backfill range
gbrain dream --json # CycleReport JSON
Auto-commit deferred to v1.1: v1 writes files to brain_dir but does NOT
git add / commit / push. Either commit yourself or let gbrain autopilot
handle it.
Parses - **YYYY-MM-DD** | Source — Summary and ### YYYY-MM-DD — Title formats.
Note: extracted entries improve structured queries (gbrain timeline), not vector search.
Verify autopilot is running:
gbrain autopilot --status
The exit code is trustworthy for gating: 0 fresh (or nothing installed),
1 needs attention (stale heartbeat, never ran, or paused by a migration),
2 the daemon disabled itself (its repo path vanished). --json emits the
full report (state, heartbeat_age_seconds, paused_reason,
disabled_reason). Status reads only the filesystem, so it works even
when the database is down.
If not running, install it:
gbrain autopilot --install --repo ~/brain
Autopilot runs sync, extract, and embed in a continuous loop with adaptive scheduling.
In v0.11.1+, autopilot dispatches each cycle as a single autopilot-cycle
Minion job and supervises the worker child — one install step gives you
sync + extract + embed + backlinks + durable job processing.
A v0.11.0 install where the migration skill never fired leaves Minions
partially set up: schema is applied, but ~/.gbrain/preferences.json
doesn't exist, autopilot runs inline, host manifests still reference
agentTurn. Repair:
# Check migration status
gbrain apply-migrations --list
# Apply pending migrations (idempotent; safe on healthy installs)
gbrain apply-migrations --yes
# If host-specific handlers are flagged in ~/.gbrain/migrations/pending-host-work.jsonl:
# walk them per skills/migrations/v0.11.0.md + docs/guides/plugin-handlers.md,
# ship handler registrations in the host repo, then re-run apply-migrations.
Full troubleshooting guide: docs/guides/minions-fix.md.
Check that the back-linking iron law is being followed:
- **YYYY-MM-DD** | Referenced in [page title](path) -- brief contextCheck for common misfiling patterns (see skills/_brain-filing-rules.md):
sources/ instead of the
appropriate directory (people/, companies/, concepts/, etc.)sources/ that reference specific
people, companies, or concepts -- these may be misfiledSpot-check pages for missing [Source: ...] citations:
Inconsistent tagging (e.g., "vc" vs "venture-capital", "ai" vs "artificial-intelligence").
The links and timeline_entries tables are the structured graph layer.
Populate them periodically or after major imports:
gbrain extract links --source db — backfill structured links by walking pages
from the engine. Reads [Name](people/slug) / [Name](companies/slug) references
and infers relationship types (attended, works_at, invested_in, founded,
advises, mentions, source). Idempotent. Use --source fs --dir <brain>
if you have a markdown checkout to walk instead.gbrain extract timeline --source db — backfill structured timeline entries.
Parses - **YYYY-MM-DD** | summary lines from page content. Idempotent (DB
UNIQUE constraint).gbrain extract all --source db — both in one run.gbrain graph-query <slug> --depth 2 — verify connectivity (use any well-known
entity slug as a probe).gbrain stats — verify link_count > 0 and timeline_entry_count > 0 after extraction.gbrain health — review link_coverage and timeline_coverage percentages
on entity pages (person/company). Below 50% means more extraction is needed.
On brains with very few entity pages these report "too few to grade"
(null in JSON, with entity_page_count carrying the denominator) instead
of a misleading 0%/100% — grow the entity set before acting on coverage.Available link types (use with gbrain graph-query --type):
attended, works_at, invested_in, founded, advises, mentions, source.
Going forward, every gbrain put call auto-creates and reconciles links via the
auto-link post-hook (default on; disable: gbrain config set auto_link false).
So link-extract is mostly a one-time backfill. timeline-extract should be re-run
after bulk imports or content edits that add new dated entries.
gbrain features --json # scan for underused features + recommendations
Run weekly alongside lint. Surfaces missing embeddings, unused integrations, and configuration improvements.
Chunks without embeddings, or chunks embedded with an old model.
nohup gbrain embed refresh > /tmp/gbrain-embed.log 2>&1 &tail -1 /tmp/gbrain-embed.logRun gbrain doctor --json and check the RLS status.
All tables should show RLS enabled. If not, run gbrain init again.
Check that the schema version is up to date. gbrain doctor --json reports
the current version vs expected. If behind, gbrain init runs migrations
automatically.
Check the integrity of stored files and redirect pointers:
gbrain files verify to check all DB records have valid datagbrain files status to see migration state (local, mirrored, redirected).redirect.yaml pointers that reference missing storage filesTimeline items older than 30 days with unresolved action items.
Periodically verify search quality hasn't regressed. Run a battery of test queries across difficulty tiers:
Compare results from gbrain search (keyword) vs gbrain query (hybrid).
Quality matters more than speed (2.5s right > 200ms wrong).
When to run benchmarks:
For production agents running on a schedule, integrate gbrain health checks into your operational heartbeat.
Run gbrain doctor --json and check for degradation. Report any failing checks
to the user. Key signals: connection health, schema version, RLS status, embedding
staleness.
Run gbrain embed --stale to refresh embeddings for pages that have changed since
their last embedding. For large brains (>5000 pages), run this with nohup:
nohup gbrain embed --stale > /tmp/gbrain-embed.log 2>&1 &
Run gbrain backup status and relay anything red. It verifies every knowledge
repo (and the agent workspace) has a git remote — local-only means a disk loss
loses it. Fixes are printed inline (gbrain bootstrap repo, git remote add,
gbrain sources harden <id>).
Verify sync is running: check gbrain stats and confirm last_sync is within
the last 24 hours. If sync has stopped, the brain is drifting from the repo.
Flag pages where compiled truth is >30 days old but the timeline has recent entries. This means new evidence exists that hasn't been synthesized. These pages need a compiled truth rewrite (see the maintain workflow above).
After maintenance runs, save a report:
This creates an audit trail for brain health over time.
The maintenance report follows this structure:
## Brain Health Report — YYYY-MM-DD
| Dimension | Issues Found | Fixed | Remaining |
|----------------------|-------------|-------|-----------|
| Stale pages | N | N | N |
| Orphan pages | N | N | N |
| Dead links | N | N | N |
| Missing cross-refs | N | N | N |
| Back-link violations | N | N | N |
| Citation gaps | N | N | N |
| Filing violations | N | N | N |
| Tag inconsistencies | N | N | N |
| Embedding staleness | N | N | N |
| Security (RLS) | N | N | N |
| Schema health | N | N | N |
| File storage | N | N | N |
| Open threads | N | N | N |
### Details
[Per-dimension breakdown with specific pages and actions taken]
### Benchmark Results (if run)
[Tier 1-4 query results with pass/fail]
### Outstanding Issues
[Items requiring user attention or confirmation]
--force