Personal Intelligence Layer System Registry

A corrected systems view of the current personal intelligence stack. This version separates useful architecture from accidental complexity, makes Postgres/GBrain/embedding storage explicit, and spells out what actually moves from Gmail, audio memory, Context Ledger, HCP, proposals, Open Tabs, and GBrain.

Generated 2026-05-24T18:00:43+00:00Active GBrain DB: gbrain_repair_2026051021534029 active crons36 total crons

TL;DR: what should be simpler

Keep

Hermes as interface/orchestrator; GBrain as durable memory/search/graph; Audio Memory as raw evidence capture; Open Tabs as the operational attention cockpit.

Question / simplify

Context Ledger + HCP Control Plane currently add a second staging/proposal layer. They are useful only if they reliably convert source evidence into approved actions. Right now the evidence shows mostly pending Open Tabs proposals, not a mature approval loop.

Boundary

Raw evidence should flow automatically. Candidate interpretation should be source-backed and reviewable. Derived mutations — Open Tabs changes, compiled GBrain truth, outbound actions — need a clear approve/apply surface.

Missing before

The old page under-described active Postgres DBs, GBrain tables/embeddings/facts, audio transcript → GBrain slugs, exact Gmail extraction fields, and cross-system write-back.

199GBrain pages
630GBrain chunks
630Text chunks embedded1536 dims
9GBrain active facts
772Audio transcript segments
21Audio GBrain writes
59Context Ledger events
59HCP pending proposals

Actual system interaction model

InputsRaw evidence storesInterpretationGovernance / mutationInterfaces / outputs Telegram/SMSPhone audioGmail/CalendarOpen TabsMarket/media Hermes transcriptAudio Memory DBContext LedgerOpen Tabs DB/root/brain Hermes Agentskills + toolsSTT + digestaudio candidatesHCP extractionloops/evidenceGBrain Proposal queueapprove/rejectApplied mutationOpen Tabs/GBrainPostgres + vectors Telegram UIOpen Tabsdocs/pagesSearch/recall Governance rule: raw evidence can auto-land; derived writes need policy; risky external actions need explicit confirmation.

GBrain and Postgres storage

Active brain database

gbrain_repair_20260510215340 from /root/.gbrain/config.json. The older gbrain Postgres DB exists but is not the active populated brain.

  • Engine: Postgres + pgvector.
  • Source repo: /root/brain.
  • CLI stats:
    Pages:     199
    Chunks:    630
    Embedded:  630
    Links:     381
    Tags:      324
    Timeline:  92
    
    By type:
      original: 43
      concept: 38
      source: 35
      project: 21
      idea: 16
      inbox: 14
      person: 10
      personal: 7
      company: 6
      meeting: 3
      original_thinking: 3
      investment-research: 1
      report: 1
      note: 1

Embedding/search reality

  • Model: text-embedding-3-large
  • Dimensions: 1536
  • Coverage: 630/630 text chunks embedded.
  • Image embedding column exists/indexed, but current embedded image chunks: 0.
  • Hybrid retrieval uses vector indexes plus search_vector GIN indexes.

Stored GBrain data

  • pages: compiled markdown/frontmatter records.
  • content_chunks: chunk text + language/symbol metadata + text/image embeddings.
  • facts: hot memory claims with expiry/supersession and embedding index.
  • links/tags/timeline_entries: graph and temporal structure.
  • raw_data/files/page_versions: attached structured source data, file storage, audit history.
  • minion_jobs/query_cache/search_telemetry: agent/retrieval operations.

Doctor status

Status: unhealthy; health score: 45.

The page intentionally publishes architecture-level storage shape, not credential rows.

Postgres databases on host

cloop_db9183 kB
gbrain9879 kB
gbrain_repair_202605102153319775 kB
gbrain_repair_2026051021534033 MBactive GBrain
ontology_api16 MB
ontology_api_staging9867 kB
postgres7503 kB
trader_api_staging8639 kB
trader_db8903 kB

Vector/search indexes

  • idx_chunks_embedding
    CREATE INDEX idx_chunks_embedding ON public.content_chunks USING hnsw (embedding vector_cosine_ops)
  • idx_chunks_embedding_image
    CREATE INDEX idx_chunks_embedding_image ON public.content_chunks USING hnsw (embedding_image vector_cosine_ops) WHERE (embedding_image IS NOT NULL)
  • idx_chunks_embedding_null
    CREATE INDEX idx_chunks_embedding_null ON public.content_chunks USING btree (page_id, chunk_index) WHERE (embedding IS NULL)
  • idx_chunks_search_vector
    CREATE INDEX idx_chunks_search_vector ON public.content_chunks USING gin (search_vector)
  • idx_facts_embedding_hnsw
    CREATE INDEX idx_facts_embedding_hnsw ON public.facts USING hnsw (embedding vector_cosine_ops) WHERE ((embedding IS NOT NULL) AND (expired_at IS NULL))
  • idx_pages_search
    CREATE INDEX idx_pages_search ON public.pages USING gin (search_vector)
  • idx_query_cache_embedding_hnsw
    CREATE INDEX idx_query_cache_embedding_hnsw ON public.query_cache USING hnsw (embedding vector_cosine_ops) WHERE (embedding IS NOT NULL)
  • idx_takes_embedding_hnsw
    CREATE INDEX idx_takes_embedding_hnsw ON public.takes USING hnsw (embedding vector_cosine_ops) WHERE (active AND (embedding IS NOT NULL))

Active GBrain table inventory

TableSize
budget_ledger16 kB
budget_reservations24 kB
calibration_profiles48 kB
code_edges_chunk48 kB
code_edges_symbol48 kB
code_traversal_cache96 kB
config64 kB
content_chunks16 MB
dream_verdicts16 kB
drift_decisions32 kB
eval_candidates24 kB
eval_capture_failures24 kB
eval_contradictions_cache24 kB
eval_contradictions_runs48 kB
eval_takes_quality_runs32 kB
facts1120 kB
file_migration_ledger24 kB
files112 kB
gbrain_cycle_locks64 kB
ingest_log88 kB
links200 kB
mcp_request_log32 kB
mcp_spend_log32 kB
mcp_spend_reservations32 kB
minion_attachments32 kB
minion_inbox32 kB
minion_jobs104 kB
op_checkpoints24 kB
page_versions344 kB
pages4256 kB
query_cache136 kB
raw_data80 kB
search_telemetry48 kB
sources56 kB
subagent_messages40 kB
subagent_rate_leases24 kB
subagent_tool_executions40 kB
synthesis_evidence16 kB
tags240 kB
take_grade_cache32 kB
take_nudge_log40 kB
take_proposals40 kB
takes96 kB
think_ab_results24 kB
timeline_entries152 kB

Audio Memory → GBrain

Current runtime

  • Backend: sqlite at /root/audio-memory/data/audio-memory.sqlite3.
  • Capture: Twilio Voice Media Streams via capture.cloopos.com.
  • STT: faster-whisper / CPU int8.
  • Queue pending/running: {'pending': 0, 'pending_running': 0, 'running': 0}

What gets written to GBrain automatically

  1. Raw transcript page: sources/audio/YYYY-MM-DD/<session> with exact segment evidence, timestamps, confidence, STT model, capture audit.
  2. Digest/review page: personal/audio-digests/YYYY-MM-DD/<session> with deterministic themes, explicit action candidates, representative quotes, and source link.
  3. Candidate/value rows: source-backed candidates. GBrain-bound candidates can enter inbox/candidate layer; non-GBrain mutations are proposal-gated.

What does not need proposals

Raw audio transcripts are evidence. They should not wait for Telegram approval or proposal review before GBrain ingestion.

What still needs review

Open Tabs mutations, compiled truth rewrites, outbound actions, and sensitive/public publishing. Background media/other speakers can be searchable evidence, but not Connor’s belief without attribution.

Audio DB counts

{
  "active_sessions": 0,
  "audio_chunks": 262085,
  "gbrain_writes": 21,
  "memory_candidates": 5,
  "notifications": 42,
  "sessions": 12,
  "transcript_segments": 772,
  "twilio_errors": 1
}

Audio → GBrain write rows

  • dry_run: 6
  • error: 2
  • success: 13

Audio value proposal rows

  • concept_candidate · auto_apply · applied: 4
  • entity_mention · auto_apply · applied: 15
  • gbrain_fact · auto_apply · applied: 10
  • open_tab_add · review_required · rejected: 2
  • open_tab_update · review_required · rejected: 6
  • original_thinking · auto_apply · applied: 10

Gmail / Google Workspace extraction clarity

Current Gmail policy

  • Gmail enabled: True.
  • Full bodies: False.
  • Attachments: False.
  • Current stored event type: google.gmail.message_metadata.

Fields actually stored

For Gmail, the collector stores subject/title, sender/from, recipient/to as entities when present, date, labels, snippet/text, raw readonly wrapper metadata, privacy=highly_sensitive, and computed importance. It does not send mail, modify mail, download attachments, or intentionally promote full raw bodies to GBrain.

Current filters

  • newer_than:2d -category:promotions -category:social
    recent_non_promo: max=5, base importance=3
  • is:unread newer_than:7d -category:promotions -category:social
    unread_week: max=5, base importance=8
  • is:starred newer_than:30d
    starred_month: max=5, base importance=8

Calendar

Enabled=True; calendar=primary; days ahead=7; max=10; importance=7. Stores summary/title, organizer, attendees, start time, location, and first 500 chars of description.

Google rows currently in Context Ledger

  • google.calendar.event: 5
  • google.gmail.message_metadata: 54

Important simplification: Google Workspace should probably feed GBrain only as curated summaries or reviewed canonical claims, not as unbounded email mirroring. The live code matches that: metadata/snippets in Context Ledger, no body/attachment ingestion.

Context Ledger and HCP Control Plane: what they are helping with

Context Ledger

A narrow local staging ledger for source events before interpretation. Current meaningful use: Google Workspace readonly events. It has 59 context_events total.

Value if kept: dedupe, provenance, privacy labels, source-neutral event schema.

Risk: if it becomes another vague database between source and GBrain without reliable downstream use, it is accidental complexity.

HCP Control Plane

Interprets evidence into events/evidence/open_loops/proposals. Current rows: 213 events, 99 open loops, 70 proposals.

CLI supports proposals generate/list/approve/reject/apply/explain/inbox/decide.

Proposal reality

  • pending · ask_for_credentials_or_api_keys: 1
  • pending · capture_memory: 2
  • pending · capture_signal_radar: 10
  • pending · create_open_tab: 46
  • rejected · create_open_tab: 11

The current successful approval loop is not yet proven by the data: the proposal table is dominated by pending create_open_tab rows. The UI needs to show “why this proposal exists”, source quotes, approve/reject/apply, and post-apply verification.

Simpler rule

Use Context Ledger/HCP only for sources that need staging before action. Do not route every memory through HCP. Audio raw transcripts should go straight to GBrain; HCP can observe or propose derived Open Tabs changes later.

Open Tabs cockpit cross-system inputs

Direct human inputs

Connor can add/list/review via Telegram-facing flows and /root/open-tabs/open_tabs.py. This is the primary operational cockpit for attention, decisions, deadlines, and One Thing.

System-proposed inputs

HCP proposals currently target open-tabs as create_open_tab. These should not silently write; they need a clean approve/apply interface and verification of the created item.

GBrain promotion

Open Tabs → GBrain promotion creates review-required packets, because not every live cockpit item deserves durable compiled memory.

Operational model

Open Tabs is not a source of truth about the whole person. It is the live workbench. GBrain is durable meaning; Open Tabs is current attention.

Crons and automation loops

36 total Hermes crons; 29 active. Class names below are operational labels, not hidden product boundaries.

JobClassScheduleDeliverScript/agentLast run
hermes-auto-update
77e060f64351 · paused
Other0 4 * * *localhermes_self_heal.py2026-05-14T04:00:20.234987+00:00 ok
gbrain-sync
b8fd45d8211b · active
GBrain maintenance*/15 * * * *localgbrain_sync_verify.sh2026-05-24T17:45:56.804919+00:00 error: Script exited with code 1
gbrain-maintenance
c4f325651101 · paused
GBrain maintenance0 3 * * 0localagent2026-05-17T03:00:20.076106+00:00 ok
gbrain-auto-update
7e7edea448a5 · active
GBrain maintenance0 5 * * 0localgbrain_auto_update.sh2026-05-24T05:01:05.580072+00:00 ok
morning-briefing
93af2f4c49f8 · paused
Other0 8 * * *telegramagent2026-05-13T08:01:02.308102+00:00 ok
system-health-monitor
fb2730affff2 · paused
Health/watchdog0 */6 * * *telegramagent2026-05-14T06:02:10.081356+00:00 ok
weekly-gbrain-value-report
523bada9c3c5 · active
GBrain maintenance0 18 * * 5telegram:5899070081agent2026-05-22T18:01:02.482635+00:00 ok
gbrain-dream-cycle
4e93af342913 · active
GBrain maintenance0 2 * * *localgbrain_dream_audit.sh2026-05-24T02:08:01.318192+00:00 ok
morning-systems-briefing
87276d5f8036 · active
Other5 8 * * *telegram:5899070081agent2026-05-24T08:07:00.467119+00:00 ok
daily-gbrain-what-changed-brief
b64f4779389b · active
GBrain maintenance20 8 * * *telegram:5899070081gbrain_what_changed_brief.py2026-05-24T08:20:40.354383+00:00 ok
audio-memory-watchdog
1e7ac4edfa0b · active
Audio memoryevery 15mtelegramaudio_memory_watchdog.py2026-05-24T17:59:40.310846+00:00 ok
codex-usage-brief
e1849f491cb4 · active
Other0 9 * * *telegramcodex_usage_brief.py2026-05-24T09:00:11.480676+00:00 ok
market-awareness-digest
6e07bda94389 · active
External signal ingestion30 7 * * *localmarket_awareness_digest.sh2026-05-24T07:30:53.513424+00:00 ok
audio-memory-live-worker-watchdog
3de12437c495 · paused
Audio memoryevery 5mtelegramaudio_memory_live_worker_watchdog.py2026-05-20T17:05:37.025425+00:00 ok
audio-memory-daily-brief
466ff68fd418 · active
Audio memory15 8 * * *telegramaudio_memory_daily_brief.py2026-05-24T08:15:32.544221+00:00 ok
audio-memory-alerts
17d265ba819c · active
Audio memoryevery 5mtelegramaudio-memory-alerts.sh2026-05-24T17:49:57.633693+00:00 ok
daily-audio-reflection
2b06653e1a75 · active
Audio memory0 20 * * *telegramagent2026-05-23T20:00:58.498620+00:00 ok
gbrain-compound-maintenance
6a5b9729e05f · active
GBrain maintenance17 */6 * * *localgbrain_compound_maintenance.sh2026-05-24T12:17:46.584729+00:00 ok
hermes-critical-self-heal
ddea5929d5ae · active
Health/watchdog*/30 0-5,23 * * *telegramhermes_self_heal.py2026-05-24T11:27:30.626925+00:00 ok
sendblue-gateway-watchdog
1441d4dcc63b · active
Health/watchdogevery 5moriginensure-sendblue-gateway.sh2026-05-24T17:49:57.117446+00:00 ok
signal-radar-digest
510e8d30ee84 · active
External signal ingestion45 7 * * *telegramsignal_radar_digest.sh2026-05-24T07:50:49.278295+00:00 ok
spotify-transcription-worker
8b8473d28f49 · paused
Otherevery 120mtelegramspotify_transcription_worker.sh2026-05-17T21:07:15.696079+00:00 error: Script exited with code -9
open-tabs-daily-focus
890607e62816 · active
Open Tabs35 8 * * *telegram:5899070081open_tabs_daily.sh2026-05-24T08:35:44.903330+00:00 ok
open-tabs-evening-capture
c1ec506baf78 · active
Open Tabs15 21 * * *telegram:5899070081open_tabs_capture_prompt.sh2026-05-23T21:15:11.995320+00:00 ok
open-tabs-weekly-review
ad2bedaa7920 · active
Open Tabs30 18 * * 0telegram:5899070081open_tabs_weekly.sh2026-05-17T18:30:52.574692+00:00 ok
cron-meta-audit
dbb0e17ba826 · active
Other0 19 * * 0telegram:5899070081cron_meta_audit.py2026-05-17T19:00:06.193481+00:00 ok
open-tabs-gbrain-promotion
0c8cb9ad0e8c · active
GBrain maintenance45 18 * * 0telegram:5899070081open_tabs_gbrain_proposal.sh2026-05-17T18:47:03.749569+00:00 ok
gbrain-contradiction-probe
70d7c29f9344 · active
GBrain maintenance10 3 * * 1localgbrain_contradiction_probe.sh
signal-radar-hourly-last-hour
7eab9e35ef58 · active
External signal ingestionevery 60moriginsignal_radar_hourly.sh2026-05-24T17:58:40.039883+00:00 ok
daily-pulse-synthesis
9605cf2e83e8 · active
Control plane / proposals50 8 * * *telegram:5899070081pulse_context.py2026-05-24T08:51:03.158628+00:00 ok
audio-proposal-inbox
cd0db34901ff · active
Audio memoryevery 120mtelegram:5899070081audio_proposal_inbox.py2026-05-24T17:29:46.398960+00:00 ok
control-plane-runtime
e047d4aa9190 · paused
Control plane / proposalsevery 240mtelegram:5899070081control_plane_runtime.py2026-05-24T15:00:28.828016+00:00 ok
personal-system-registry-doc-refresh
0859b21f5146 · active
Other0 */6 * * *localpersonal_system_registry_doc.py2026-05-24T12:00:22.793315+00:00 ok
personal-intelligence-orchestrator-local
076afe055a88 · active
Otherevery 240mlocalpersonal_orchestrator_local.sh2026-05-24T15:52:47.704292+00:00 ok
moving-through-midday-checkin
37d3efc66eb9 · active
Other0 12 * * *originmoving_through_midday.sh
personal-orchestrator-reactive-loop
cbedc4f819ba · active
Otherevery 5mlocalpersonal_orchestrator_reactive.sh2026-05-24T17:59:40.264893+00:00 ok

Database schemas

Focused schema view: the fields that explain data movement. Full table inventories are included where useful, but secrets/tokens are not expanded.

Context Ledger

Path: /root/hermes-control-plane/data/context-ledger.sqlite3 · tables: 3

sources · 6 rows
idTEXT
labelTEXT
layerTEXT
statusTEXT
policy_jsonTEXT
updated_atTEXT
capabilities · 5 rows
idTEXT
labelTEXT
sourceTEXT
statusTEXT
policy_jsonTEXT
updated_atTEXT
context_events · 59 rows
idINTEGER
sourceTEXT
external_idTEXT
event_typeTEXT
occurred_atTEXT
ingested_atTEXT
actorTEXT
entities_jsonTEXT
titleTEXT
textTEXT
raw_jsonTEXT
privacyTEXT
importanceREAL
hashTEXT
interpretation_statusTEXT
gbrain_statusTEXT
proposal_statusTEXT

HCP Control Plane

Path: /root/hermes-control-plane/data/control-plane.sqlite3 · tables: 9

sources · 14 rows
source_idTEXT
source_typeTEXT
display_nameTEXT
owner_productTEXT
enabledINTEGER
connector_modeTEXT
privacy_tierTEXT
raw_store_policyTEXT
gbrain_policyTEXT
allowed_actionsTEXT
approval_required_forTEXT
notification_policyTEXT
health_check_commandTEXT
last_checked_atTEXT
last_success_atTEXT
last_errorTEXT
events · 213 rows
event_idTEXT
source_idTEXT
source_typeTEXT
occurred_atTEXT
ingested_atTEXT
actorTEXT
titleTEXT
summaryTEXT
raw_refTEXT
canonical_urlTEXT
content_hashTEXT
privacy_tierTEXT
event_kindTEXT
labelsTEXT
confidenceREAL
thread_keyTEXT
entity_refsTEXT
evidence · 197 rows
evidence_idTEXT
event_idTEXT
source_idTEXT
visibilityTEXT
quoteTEXT
redacted_quoteTEXT
raw_refTEXT
retrieval_hintTEXT
open_loops · 99 rows
loop_idTEXT
titleTEXT
laneTEXT
kindTEXT
statusTEXT
ownerTEXT
source_refsTEXT
evidence_refsTEXT
gbrain_refsTEXT
open_tabs_refTEXT
signal_radar_refTEXT
why_it_mattersTEXT
current_realityTEXT
desired_resultTEXT
next_actionTEXT
definition_of_doneTEXT
due_atTEXT
review_atTEXT
priority_scoreREAL
urgency_scoreREAL
confidenceREAL
sensitivityTEXT
created_atTEXT
updated_atTEXT
closed_atTEXT
closure_evidence_refsTEXT
proposals · 70 rows
proposal_idTEXT
proposal_typeTEXT
source_event_idsTEXT
target_refTEXT
proposed_change_jsonTEXT
reasonTEXT
confidenceREAL
risk_levelTEXT
approval_stateTEXT
created_atTEXT
approved_atTEXT
rejected_atTEXT
applied_atTEXT
applied_refTEXT
decision_reasonTEXT
jobs · 0 rows
job_idTEXT
presetTEXT
objectiveTEXT
source_loop_idTEXT
spec_pathTEXT
workdirTEXT
allowed_pathsTEXT
forbidden_pathsTEXT
verification_commandsTEXT
statusTEXT
attemptsINTEGER
last_errorTEXT
evidence_pathsTEXT
summaryTEXT
confidenceREAL
started_atTEXT
finished_atTEXT
exit_codeINTEGER
output_pathTEXT

Open Tabs

Path: /root/open-tabs/open-tabs.sqlite3 · tables: 7

items · 31 rows
idINTEGER
titleTEXT
laneTEXT
kindTEXT
statusTEXT
deadlineTEXT
importanceINTEGER
urgencyINTEGER
impactINTEGER
effortINTEGER
identity_alignmentINTEGER
values_jsonTEXT
next_actionTEXT
definition_of_doneTEXT
questionTEXT
notesTEXT
created_atTEXT
updated_atTEXT
objective_idTEXT
horizonTEXT
current_realityTEXT
desired_resultTEXT
tensionTEXT
leverage_pointTEXT
zoneTEXT

Audio Memory

Path: /root/audio-memory/data/audio-memory.sqlite3 · tables: 11

sessions · 12 rows
idTEXT
providerTEXT
provider_call_sidTEXT
statusTEXT
started_atTEXT
ended_atTEXT
sample_rateINTEGER
audio_pathTEXT
metadata_jsonTEXT
audio_chunks · 262085 rows
idINTEGER
session_idTEXT
sequenceINTEGER
timestamp_msINTEGER
payload_formatTEXT
byte_countINTEGER
rmsREAL
created_atTEXT
audio_windows · 218 rows
idINTEGER
session_idTEXT
window_indexINTEGER
start_msINTEGER
end_msINTEGER
chunk_start_sequenceINTEGER
chunk_end_sequenceINTEGER
audio_pathTEXT
statusTEXT
transcript_segment_idINTEGER
errorTEXT
created_atTEXT
updated_atTEXT
jobs · 218 rows
idINTEGER
kindTEXT
session_idTEXT
window_idINTEGER
statusTEXT
attemptsINTEGER
max_attemptsINTEGER
errorTEXT
created_atTEXT
updated_atTEXT
locked_atTEXT
completed_atTEXT
transcript_segments · 772 rows
idINTEGER
session_idTEXT
chunk_start_sequenceINTEGER
chunk_end_sequenceINTEGER
textTEXT
start_msINTEGER
end_msINTEGER
confidenceREAL
modelTEXT
created_atTEXT
memory_candidates · 5 rows
idINTEGER
session_idTEXT
transcript_segment_idINTEGER
kindTEXT
textTEXT
source_quoteTEXT
confidenceREAL
statusTEXT
created_atTEXT
metadata_jsonTEXT
value_proposals · 47 rows
idINTEGER
session_idTEXT
transcript_segment_idINTEGER
source_slugTEXT
digest_slugTEXT
kindTEXT
destinationTEXT
source_quoteTEXT
start_msINTEGER
end_msINTEGER
confidenceREAL
riskTEXT
policyTEXT
rationaleTEXT
payload_jsonTEXT
statusTEXT
applied_atTEXT
errorTEXT
created_atTEXT
gbrain_writes · 21 rows
idINTEGER
session_idTEXT
candidate_idINTEGER
slugTEXT
statusTEXT
errorTEXT
created_atTEXT
notifications · 42 rows
idINTEGER
session_idTEXT
targetTEXT
messageTEXT
statusTEXT
errorTEXT
created_atTEXT
events · 262351 rows
idINTEGER
session_idTEXT
event_typeTEXT
payload_jsonTEXT
created_atTEXT

UI/control-plane implication

Needed UI panels

  • Evidence inbox: source, privacy, age, storage destination.
  • Proposal inbox: source quote → proposed mutation → approve/reject/apply → verification.
  • Audio sessions: call → STT → raw GBrain page → digest page → candidates.
  • GBrain health: pages/chunks/embeddings/facts/errors.
  • Open Tabs cockpit: direct items plus proposed items awaiting approval.

Design doctrine

One interface should make the whole path legible: input → raw store → interpretation → proposal → applied state → feedback. If a layer cannot explain its contribution in that path, simplify or remove it.

Approval should feel successful

Approval must produce an observable artifact: an Open Tabs item id, GBrain slug, applied timestamp, and verification check. Without this, proposal systems feel like pending limbo.

Current watch item

Context Ledger/HCP need either a sharper role as the action/proposal control plane, or they should be bypassed for simple evidence→GBrain paths.