First-time setup and onboarding fixes.
/cyberbrain:configskill — guided setup slash command that walks new users through vault discovery, configuration, and first extraction- Vault scaffolding —
cb_configure(create_vault=True)creates vault directory structure with inbox folder and starter CLAUDE.md
- First-run config guard — MCP tools return actionable setup instructions instead of cryptic errors when config is missing
- Silent error handling — hooks and CLI now surface errors to stderr instead of swallowing them silently
- Plugin manifest error handler — SKILL.md and plugin.json fixes for edge cases
cb_configure/cb_statusfresh install — handle missing config gracefully with guided next stepsuvavailability check — hooks verifyuvis on PATH before attempting extraction; augment PATH with common install locationscb_configureprefs path —ConfigErrorcaught in manage.py prefs path and resources.py- SKILL.md phase ordering —
cb_setupruns beforereset_prefsin config skill create_vaultordering — fixed sequencing; catchJSONDecodeErrorin manage.py and resources.py
- Updated QUICKSTART.md and README.md for new onboarding flow
Transcript noise filtering, full audit fixes, and vocabulary separation.
- Transcript noise filtering —
transcript.pynow strips skill prompts, command messages, task notifications, system reminders, and usage blocks before extraction. Sessions dominated by tooling output (e.g., ideate skills at 65% noise) now produce beats from actual conversation content instead of returning 0 beats. - Transcript truncation limit raised —
MAX_TRANSCRIPT_CHARSincreased from 150K to 190K. Safe because noise filtering removes bulk before truncation applies. - Beat type / entity type vocabulary split — extraction uses beat types (
decision,insight,problem,reference); vault notes use entity types (project,note,resource,archived) with automatic mapping via_resolve_entity_type() - Domain tag inference —
_infer_domain_tag()auto-tags notes withwork,personal, orknowledgebased on vault folder path beat_typefrontmatter field — vault notes carry bothtype(entity) andbeat_type(extraction) for traceability
- YAML frontmatter safety — all string fields in
write_beat()usejson.dumps()quoting; prevents YAML corruption from project names with colons or special characters - SQLite connection leak —
_find_note_by_titleusestry/finallyforconn.close(); LIKE wildcards (%,_) escaped in user input - Search backend cache invalidation —
vault_pathchanges incb_configurenow invalidate the cached backend - Incremental reindex metadata —
incremental_refreshparses frontmatter instead of passing empty dict toindex_note - C-06 vault write abstraction — routed
pipeline.py(4),enrich.py(1),format.py(1) throughwrite_vault_note()/update_vault_note() - Lazy import in vault.py — replaced module-scope
GLOBAL_CONFIG_PATHwith lazyconfig_path()call - move_vault_note overwrite guard — raises
FileExistsErrorif destination exists - cb_configure config path — uses
state.config_path()instead of hardcoded literal - Updated relation predicates —
causes/caused-by/implements/contradictsreplacebroader/narrower/wasDerivedFrom - Dead status branch removed — both branches returned
"active"
- Added
session-end-extract.sh,session-end-reindex.shhooks to CLAUDE.md - Added
synthesize-system/user.md,evaluate-system.md,quality-gate-system.mdprompts to CLAUDE.md - Added
resources.pyMCP resource/prompts to CLAUDE.md - Updated QUICKSTART.md install instructions (removed
install.shreferences) - Fixed README.md
uncertain_filing_thresholddefault (0.7 → 0.5) - Updated error messages to reference plugin install /
uv sync - Added
bedrock_region,claude_path,search_db_pathtoCyberbrainConfigTypedDict - Removed dead
EXTRACTORS_DIRconstant inscripts/import.py
Full audit fixes — correctness, constraint enforcement, and documentation.
- YAML frontmatter safety — all string fields in
write_beat()now usejson.dumps()quoting; prevents YAML corruption from project names with colons or special characters - SQLite connection leak —
_find_note_by_titleinrecall.pynow usestry/finallyforconn.close(); also escapes LIKE wildcards (%,_) in user input - Search backend cache invalidation —
vault_pathchanges incb_configurenow call_invalidate_search_backend()(previously onlysearch_backend/embedding_modelchanges did) - Incremental reindex metadata —
incremental_refreshnow parses frontmatter and passes it toindex_noteinstead of empty dict; reindexed notes no longer lose title/tags/summary - C-06 vault write abstraction — routed
pipeline.py(4 calls),enrich.py(1 call),format.py(1 call) throughwrite_vault_note()/update_vault_note(); CLAUDE.md metadata writes inmanage.py/setup.pyexempt by design - Lazy import in vault.py — replaced module-scope
GLOBAL_CONFIG_PATHbinding with lazyconfig_path()call fromstate.py - move_vault_note overwrite guard — raises
FileExistsErrorif destination already exists instead of silently overwriting - cb_configure config path — uses
state.config_path()instead of hardcodedPath.home() / ... - Dead status branch — removed
"active" if durability == "durable" else "active"ternary
- Added
session-end-extract.shandsession-end-reindex.shhooks to key files table and data flow diagram - Added
synthesize-system/user.md,evaluate-system.md,quality-gate-system.mdprompts to key files table - Added
resources.py(MCP resource + prompts) to key files table - Updated QUICKSTART.md install instructions (removed
install.shreferences) - Fixed README.md
uncertain_filing_thresholddefault (0.7 → 0.5) - Updated error messages in
shared.py/server.pyto reference plugin install - Removed dead
EXTRACTORS_DIRconstant and stale docstring inscripts/import.py - Added
bedrock_region,claude_path,search_db_pathtoCyberbrainConfigTypedDict
Vocabulary separation and frontmatter model update.
- Beat type / entity type split — extraction uses beat types (
decision,insight,problem,reference); vault notes use entity types (project,note,resource,archived). Mapping is automatic via_resolve_entity_type()invault.py beat_typefrontmatter field — vault notes now carry bothtype(entity type) andbeat_type(original extraction type) for traceability- Domain tag inference —
_infer_domain_tag()auto-tags notes withwork,personal, orknowledgebased on vault folder path - Updated relation predicates — replaced
broader/narrower/wasDerivedFromwithcauses/caused-by/implements/contradicts CyberbrainConfigTypedDict — all known config fields now have typed definitions inconfig.pycb_extractusesrun_extraction()— MCP tool now shares the unified orchestration path, gaining dedup checking- Enrichment prompt updated —
enrich-system.mdnow enforces entity type vocabulary and domain tagging rules - Extraction prompt updated —
extract-beats-system.mdclarifies beat types are fixed regardless of vault CLAUDE.md entity types
- Fixed
_get_valid_types()inenrich.pyreturning beat types instead of entity types when parsing vault CLAUDE.md - Fixed
parse_valid_types_from_claude_md()matching## Beat Typessections as entity type definitions
- Added
test_vault.pywith coverage for entity type mapping, domain tag inference, and relation predicates - Expanded
test_extract_beats.pywithrun_extraction()integration tests - Expanded
test_manage_tool.pywith additional config and status scenarios - Added
test_dependency_map.pyfor the test infrastructure mapper
Code quality and constraint enforcement patch.
- Extraction orchestration unified —
run_extraction()now acceptsconfigandbeatsparameters;_write_beats_and_log()removed (eliminated duplicate orchestration path) - Lazy state paths —
state.pyconstants converted to functions;Path.home()no longer evaluated at import time (fixes test isolation fragility) - C-06 enforced —
cb_reviewandcb_restructurevault writes routed throughwrite_vault_note()/update_vault_note()/move_vault_note()abstraction layer invault.py _is_within_vaultconsolidated — single implementation invault.py, re-exported viashared.py; duplicate inshared.pyremoved
- Fixed
run_extraction()ignoring passedconfigparameter (always re-loaded from disk) - Fixed 2 basedpyright type errors (
CyberbrainConfigassignability inshared.pyandevaluate.py) - Removed dead code in
--beats-jsonCLI path (unreachableresult["skipped"]check)
- Architecture tensions T5, T6, T7 marked as resolved
Architecture and code quality release. No new features or breaking changes.
- restructure.py decomposed — 2,832-line god module split into 11-file sub-package (
restructure/pipeline.py,collect.py,cluster.py,cache.py,audit.py,decide.py,generate.py,execute.py,format.py,utils.py) - Centralized state paths — all
~/.claude/cyberbrain/file paths defined instate.py(12 constants) - Eliminated re-export hub —
extract_beats.pyis now a pure CLI script; all callers use direct imports from source modules - Direct imports in shared.py — MCP shared module imports from source modules, not via re-export hub
- TypedDict config —
CyberbrainConfiginconfig.pydefines all known config fields with types - Exception handlers — ~10 narrowed to specific types, ~40 documented with
# intentional:rationale - Test infrastructure —
conftest.pysys.modules mock injection removed; test sys.modules patterns documented and consolidated via_clear_module_cache()helper;_dependency_map.pyrestored with repo-root anchoring
- ruff — linter and formatter configured (
[tool.ruff]in pyproject.toml) - basedpyright — type checker configured, 0 errors in basic mode
- pre-commit — enforces ruff format + lint on every commit
- Python 3.11+ —
requires-pythonupdated from>=3.8to>=3.11; constraint C1 updated
- Fixed broken import in
autofile.py(from search_index→from cyberbrain.extractors.search_index) — autofile now correctly updates the search index after creating notes - Fixed
enrich.pyfrontmatter delimiter inconsistency ("\n---"→"\n---\n") — prevents mis-parsing notes with--- headingpatterns in the body
- CLAUDE.md updated: restructure package, state.py, TypedDict config, quality tooling section
- README.md config table expanded with all config keys
- Constraint C1 updated to Python 3.11+
- Fix hook permissions, move .mcp.json out of project root
- Fix: use sh wrapper for MCP server to handle PATH
- Initial release