Problem
The dashboard's self-improvement view reads reflections.jsonl, the store's reflections/execution_reflection tables, and .stella/skills files — but nothing reads context.db, where the actual self-improvement machinery leaves its audit trail:
context_records (crates/stella-context/src/store/schema.rs, v8; kinds in crates/stella-core/src/context_record/kind.rs): append-only observation → record_proposal → promotion_event lineage — the full story of how a recurring lesson became a skill, with ABORT triggers guaranteeing immutability.
episode rows (summary, files_touched, outcome, salience) — episodic memory with no dashboard surface.
- Selection health / retirement (
crates/stella-cli/src/memory/uses.rs::selection_health, retirement.rs) — which injected context is earning its tokens.
The Sessions tab now shows skills used per session; the lifecycle that created those skills is invisible.
Build
A read-only context.db module in the observatory (same SQLITE_OPEN_READ_ONLY + is_missing_schema degradation as db.rs; path <root>/.stella/private/context.db): a promotions timeline (context_records folded by lineage_id), an episodes list, and a proposals/cooldown view. Surface on the Self-improve tab. Note schema_conformance.rs gains a second real-schema gate: build context.db through stella-context's real migration path (dev-dependency, same bargain as stella-store).
Verify
Witness: seed an observation → proposal → promotion_event lineage via the real write API, assert the route returns the lineage — fails on main (route absent). Empty/missing context.db degrades to empty payloads.
Constraints
Episode↔execution linkage is by summary-tag convention only (see crates/stella-cli/src/memory.rs #1042 trace pointer note) — do not invent a join that does not exist; render what is there.
Problem
The dashboard's self-improvement view reads
reflections.jsonl, the store'sreflections/execution_reflectiontables, and.stella/skillsfiles — but nothing readscontext.db, where the actual self-improvement machinery leaves its audit trail:context_records(crates/stella-context/src/store/schema.rs, v8; kinds incrates/stella-core/src/context_record/kind.rs): append-onlyobservation→record_proposal→promotion_eventlineage — the full story of how a recurring lesson became a skill, with ABORT triggers guaranteeing immutability.episoderows (summary, files_touched, outcome, salience) — episodic memory with no dashboard surface.crates/stella-cli/src/memory/uses.rs::selection_health,retirement.rs) — which injected context is earning its tokens.The Sessions tab now shows skills used per session; the lifecycle that created those skills is invisible.
Build
A read-only
context.dbmodule in the observatory (sameSQLITE_OPEN_READ_ONLY+is_missing_schemadegradation asdb.rs; path<root>/.stella/private/context.db): a promotions timeline (context_recordsfolded bylineage_id), an episodes list, and a proposals/cooldown view. Surface on the Self-improve tab. Noteschema_conformance.rsgains a second real-schema gate: buildcontext.dbthroughstella-context's real migration path (dev-dependency, same bargain as stella-store).Verify
Witness: seed an observation → proposal → promotion_event lineage via the real write API, assert the route returns the lineage — fails on main (route absent). Empty/missing context.db degrades to empty payloads.
Constraints
Episode↔execution linkage is by summary-tag convention only (see
crates/stella-cli/src/memory.rs#1042 trace pointer note) — do not invent a join that does not exist; render what is there.