CEO Plan: v0.38 Schema Packs — Bring Your Own Shape
Generated by /plan-ceo-review on 2026-05-19 Branch: garrytan/houston-v1 | Mode: EXPANSION Repo: thebuildceo/modusbrainDefinitions (terms used throughout)
- Primitive — a named bundle of (default link verbs, default
frontmatter fields, expert-routing flag, enrichment rubric slot).
Five built-in:
entity,media,temporal,annotation,concept. A pack type extends one primitive by name, inheriting its defaults, then optionally overriding specific fields. Not a table shape, not a schema in the SQL sense — a behavioral template the engine consults at inference and search time. - Alias closure — for read paths, when a pack declares type
researcheraliases base typeperson, queries forresearcherexpand the WHERE clause totype IN ('researcher','person', + any other type aliasing person). The closure is computed once at pack load, cached on the pack object, and inlined into search SQL. Aliasing is one-directional (researcher → person; queryingpersondoes NOT surfaceresearcherrows unless the inverse is declared). - Pack resolution chain (7 tiers) — extends model-config’s
6-tier pattern. Order: (1) per-call
schema_packopt, (2)MODUSBRAIN_SCHEMA_PACKenv, (3) per-source--source <id>override via DB config keyschema_pack:source:<id>, (4) brain-wide DB config keyschema_pack, (5)modusbrain.yml schema:section, (6)~/.modusbrain/config.json schema_pack, (7) defaultgbrain-base. Tier 3 is the new tier introduced in v0.38; tiers 1, 2, 4-7 mirror existing patterns.
Vision
10x Check
The plan as accepted ships a self-EXPANDING engine, not just a self-describing one. The differences from the baseline plan:- The brain watches what you create and proposes schema refinements
you didn’t think to ask for (
schema suggest) - Schema is per-source (ISOLATED reads), so ~/git/brain and ~/git/zion-brain hold different mental models in the same engine without renames. Cross-source federated reads still see per-source packs in isolation — a query joining results across mounts does NOT compute a closure across both packs. Federation (closure across mounts) is explicitly deferred to v0.39.
- The pack is inspectable: ASCII graph, plain-English explanation, consistency lint against actual content
- First unknown-type write asks “Add to pack?” with a primitive inference, instead of silently logging
- Schema packs distribute as
.modusbrain-schematarballs through the v0.37 skillpack pipeline; skillpacks rename to.modusbrain-skillpackfor symmetry. Community schema packs propagate the same way community skillpacks do.
Platonic Ideal
A new user clones modusbrain and typesmodusbrain init. Within 30 seconds
modusbrain has read their existing markdown anywhere on disk, proposed a
schema matching their organic shape, asked 3-5 yes/no questions to
refine, and the brain is live. They never author YAML unless they
want to. They can publish their pack as a .modusbrain-schema tarball
for anyone to install and fork.
The 12-month state: modusbrain init runs schema detect automatically,
proposes a primitive structure, and 90% of users never see the
manifest format. The 10% who want to customize see a clean YAML they
can edit. Community packs cover the long tail of domains.
Scope Decisions
Total budget: revised 9-11 weeks (vs ~6.5-7 initial estimate;
spec review surfaced LLM prompt-tuning loops for
schema suggest,
primitive-inference heuristics for auto-prompt, 7-tier × federated-
read interaction edges, full rename-migration surface, and 400-600
test cases at v0.36/v0.37 scope precedent). If budget pressure
emerges, the safest cuts in order are: D5 auto-prompt (~2 days),
D4 inspect triad (~2 days), reduce examples 7→3 (~3 days), defer
suggest LLM polish to v0.38.1 (~1 week).
Accepted Scope (added to this plan)
- Engine layer: gbrain-base universal starter pack; 5 composable primitives (entity, media, temporal, annotation, concept); alias closure for read paths; lenient-by-default with audit for write paths; strict mode opt-in.
- Detect layer:
modusbrain schema detectSQL-driven heuristic clustering proposing a pack manifest matching brain shape. - Suggest layer:
modusbrain schema suggestLLM-powered refinement via gateway.chat() over a bounded sample. - Inspect layer:
modusbrain schema graph(ASCII viz),modusbrain schema lint(consistency check),modusbrain schema explain <type>(plain English). - Author layer:
modusbrain schema init/use/fork/edit/validate/ diff/review-candidatesCLI. - Source layer: per-source schema-pack resolution; pack
resolution gets a 7th tier (per-source override before per-brain);
--source <id>flag on every relevant command. - Auto-prompt layer: TTY-gated interrupt on first unknown-type
put_pagewith primitive inference; per-type “always silent” escape hatch. - Distribution layer:
.modusbrain-schematarball format; rename skillpacks to.modusbrain-skillpack; v0.37 skillpack pipeline parameterized on artifact type (manifest discriminator drives type-specific validation); both extensions accepted on install for back-compat. - Examples: 7 example packs in-tree (minimal, person-first, media-archive, temporal-archive, research-notebook, founder-ops, personal-archive) explicitly framed as sketches not products.
- gbrain-base: byte-for-byte reproduces today’s hardcoded behavior so existing brains see zero change after upgrade.
- Migrations: v76 drops
takes.kindCHECK constraint; validation moves to runtime against active pack’s declared kinds. - Doctor checks: schema_pack_active, schema_pack_consistency, per-source pack drift.
- Engine refactor coverage: the v0.38 plan parameterizes EVERY
hardcoded type-coupling site listed in the original exploration,
not just
takes.kind. Concretely:inferTypepath-prefix table,inferLinkTyperegex bank,FRONTMATTER_FIELD_OVERRIDEStable,find_expertsSQL (type IN (…)),whoknowsDEFAULT_TYPES,enrichment-serviceperson/company restriction,completeness.tsrubric map, dream-cycle entity-type prompts. gbrain-base reproduces today’s values for each. - Cache + rollback story:
query_cache.knobs_hash(v0.32.3 column) foldsschema_packname + version into the hash so a cache row written undervcis unreachable whenresearch-stateis active. Cross- pack contamination structurally impossible.eval_candidatesrows (v0.25.0) gain aschema_packcolumn somodusbrain eval replayreproduces the same retrieval space. Migration v77 adds the column NULL-tolerant; pre-v0.38 rows fall back to active pack during replay.- HNSW indexes are pack-agnostic (vector columns don’t change shape across packs); no reindex needed on pack switch.
- Rollback: every
modusbrain schema useoperation writes the previous pack name to~/.modusbrain/schema-pack-history.jsonlsomodusbrain schema use --previousis one keystroke. Strict- mode failures on switch surface the offending pages with paste-ready “rename type to X” hints before any data mutation runs. Soft-deletes from autopilot purge are NOT triggered by pack changes.
- Test budget: ~400-600 cases across unit + e2e per the
v0.36/v0.37 precedent. Specifically: ~150 cases for engine layer
- alias closure, ~50 for detect heuristic accuracy, ~50 for
suggest LLM prompts (hermetic via stubbed gateway), ~30 for per-
source resolution × 7-tier matrix, ~40 for auto-prompt UX
states, ~30 for inspect triad output stability, ~30 for tarball
type-detection + parameterized install, ~50 for migration v76 +
v77 + bootstrap parity, ~50 for examples × byte-for-byte
gbrain-base equivalence regression. gbrain-base byte-for-byte
parity is a CI gate, not a hope — pinned by
test/regressions/gbrain-base-equivalence.test.tsasserting the pre-v0.38 hardcoded behavior reproduces from the pack-driven paths on a fixture brain.
- alias closure, ~50 for detect heuristic accuracy, ~50 for
suggest LLM prompts (hermetic via stubbed gateway), ~30 for per-
source resolution × 7-tier matrix, ~40 for auto-prompt UX
states, ~30 for inspect triad output stability, ~30 for tarball
type-detection + parameterized install, ~50 for migration v76 +
v77 + bootstrap parity, ~50 for examples × byte-for-byte
gbrain-base equivalence regression. gbrain-base byte-for-byte
parity is a CI gate, not a hope — pinned by
Deferred to TODOS.md (v0.39+)
- Live-brain
fork-from <brain-path>(rejected for privacy; revisit if a sandboxed schema-only extraction path is designed) - Per-source pack FEDERATION across mounts (a query crossing multiple sources can use closure over each source’s schema; right now per-source is isolated reads only)
- Schema versioning + semver compatibility checks between pack versions
- Skillpack ↔ schema-pack cross-reference (a skillpack can declare “I work best with these primitives present in your pack”)
- Live schema migration helpers (when you add a type, auto-suggest backfill of existing pages)
- Schema diff in PR review (rendering pack changes as human-readable diffs for community pack PRs)
Reviewer Concerns (from spec review loop, partially addressed)
- Quality score on first pass: 6.5/10. Issues addressed in this revision: definitions block (primitive, alias closure, 7-tier resolution chain), per-source isolation vs federation contradiction clarified, skillpack extension framing changed from rename to expansion, full hardcoded-site coverage enumerated, cache + rollback story added, test budget enumerated, budget revised to 9-11 weeks honestly.
- Issues NOT fully addressed, surfaced for the 11-section review:
schema suggestLLM prompt-tuning iteration budget remains a range estimate, not a measured number. The 11-section review should pin a specific eval fixture set (size + diversity) and a target accuracy threshold before code lands.- 7-tier resolution × v0.34.1 federated_read OAuth scoping has edge cases at the intersection that the 11-section review must enumerate (specifically: an OAuth client with read scope across federated sources but no source-specific pack override — which pack drives the alias closure for cross-source queries?).
- The 7→3 example pack reduction is a real cut consideration. The 11-section review should decide whether 7 examples is the right number or whether 3 + community-derived is more honest.
Cathedral risks worth surfacing in 11-section review
- The 7-week budget vs 4-week original ask. If pressure emerges, D5 (auto-prompt) and D4 (inspect triad) are the safest cuts.
- v0.37 skillpack registry currently has zero published packs.
The
.modusbrain-schemarename and tarball reuse doubles down on a distribution layer with no usage signal. - Per-source pack resolution adds a 7th tier to the resolution chain. The model-config 6-tier pattern is already cognitively dense; tier 7 is an inflection point.
schema suggestintroduces ongoing LLM cost per invocation. Bounded by sampling, but sets a precedent for “modusbrain commands that cost money.”- Auto-prompt UX is novel. TTY gate + per-type silencing helps, but bulk-import flows could hit unexpected interruption patterns.