Status: planned. Pick: omparc (plugin id) Β· display omptale Β· sole human command /arc.
Hub: πŸ”Œ OMP Extensions Β· Contract: 🧭 Extension UX Contract Β· Hermes ref: ~/.hermes/hermes-agent/agent/learning_graph.py

1. πŸ’Ž Why this name

CandidateVerdictWhy
omparc βœ…ChosenLearning arc β€” timeline + graph; short; /arc; no clash with ompfuse traces
omptaleTaglineNarrative hook β€” β€œyour agent’s learning tale”
ompthriveAltGrowth vibe; less visual/timeline-specific
ompersist❌Sounds like persistence layer only (ompkeep already owns that)
ompmnemeAltNerdy tie to mnemopi; harder to say
omp_gnosis❌Too mystical; overlaps skill/guru tone

Not ompjourney β€” Hermes owns the word; omparc is OMP-native with compatible UX.

2. 🎯 What Hermes /journey does (enticing baseline)

Three slash aliases β†’ one overlay:

/journey  |  /learning  |  /memory-graph

Data model (build_learning_graph()):

Node kindSourceFilter
skill ●SKILL.md under profile + baseNon-base AND (agent-created OR use_count > 0)
memory β—†MEMORY.md / USER.md chunks (Β§ separators)All chunks surfaced

Edges: related_skills (declared) + lexical memory↔skill overlap (top 4 per card).

UI: Desktop starmap constellation · TUI timeline bars (oldest→newest) · age gradient ink · CRUD (learning.edit / delete / detail).

One-liner: Learning made visible β€” not just storage, but how the agent grew over time.

3. 🧠 What OMP already has (build on, don’t duplicate)

Your ~/.omp/agent/config.yml today:

autolearn:
  enabled: true
  autoContinue: true
memory:
  backend: mnemopi
advisor:
  enabled: true
  syncBacklog: "1"
LayerSystemRole for omparc
Retain/recallmnemopi SQLite banksMemory β—† nodes + timestamps
Governed memoryompkeep L1/L2 JSONL + inboxHigh-trust β—† nodes + patch history
Skills~/.omp/agent/managed-skills/ + project skillsSkill ● nodes + usage
Autolearnautolearn.* configFuture: auto-skill proposals β†’ arc events
Advisoradvisor.syncBacklogBacklog items as arc milestones

Gap: OMP has memory + skills + autolearn but no unified visual journey β€” that’s omparc.

4. πŸ’Ž Blueprint

id: omparc
display: omptale
path: ~/.omp/agent/extensions/omparc.ts
status: planned
human_command: /arc
command_owner: omparc
human_ui: "overview β†’ lane β†’ drill-down; no registered aliases"
widget: pi.setWidget("omparc:timeline") | TUI overlay
data_sources:
  skills: managed-skills + project .omp/skills + usage from sessions
  memory_mnemopi: mnemopi bank stats + /memory view export
  memory_ompkeep: L2.playbooks + reinforcement timestamps
  sessions: stats.db message counts (optional density)
graph:
  nodes: [skill, memory, milestone]
  edges: [related_skills, lexical_overlap, retain_link, skill_created]
render:
  terminal: timeline frames (port learning_graph_render.py ideas)
  widget: compact sparkline + node list (phase 1)
mutations: []
runtime: omp only
deps: "@oh-my-pi/pi-tui", optional ompkeep read-only API
scope: "read-only MVP; drill-down delegates to the owning system"

5. πŸ—οΈ Architecture

flowchart TB
  subgraph sources["Data sources"]
    SK[Skills + usage]
    MN[mnemopi banks]
    OK[ompkeep L2/L1]
    ST[stats.db optional]
  end
  subgraph omparc["omparc extension"]
    G[build_learning_graph]
    R[render timeline / widget]
    C[/arc command]
  end
  subgraph ui["OMP TUI"]
    W[Widget overlay]
    T[Terminal frames]
  end
  SK --> G
  MN --> G
  OK --> G
  ST --> G
  G --> R
  C --> R
  R --> W
  R --> T

6. πŸ“‹ Implementation phases

PhaseDeliverableEffort
P0buildOmpLearningGraph() β€” skills + mnemopi recall metadataRead-only graph JSON
P1/arc TUI β€” ASCII timeline (Hermes learning_graph_render port)Slash command
P2Widget mode above editor (like ompbar)setWidget
P3Node drill-down β†’ /memory view, skill path openMutations delegate
P4Autolearn events on arc (new skill retained β†’ β—† on timeline)Hook agent_end

OmpKeep lane

OmpKeep is the governed-memory lane, not a second memory store. Render only safe aggregate/change metadata by default:

lane: governed_memory
source: "public persistent-intelligence read adapter"
nodes: [candidate, patch, approved_l2, reinforcement, deprecation, tombstone]
default_detail: "counts, timestamps, scope, and status"
private_content: "explicit drill-down only; obey record scope/status"
mutations: "none β€” /arc delegates to /ok"

The MVP must not import private components from ompkeep.ts, edit its JSONL, or duplicate OmpKeep’s graph/timeline commands.

7. πŸ”Œ OMP extension sketch

// ~/.omp/agent/extensions/omparc.ts β€” skeleton
export default function omparc(pi: ExtensionAPI) {
  pi.setLabel("omptale");
 
  pi.registerCommand("arc", { /* status-first menu + focused lanes */ });
  pi.on("session_start", async (_, ctx) => {
    // optional: arm widget like ompbar
  });
  // buildGraph(): merge skill scan + mnemopi stats + ompkeep L2 timestamps
}

Reuse from Hermes (Python β†’ TS port, same contracts):

  • build_skill_nodes + filter learned signal
  • _memory_cards chunking pattern (OMP: mnemopi export or ompkeep statements)
  • _memory_skill_edges lexical scoring
  • render_frames timeline layout

8. πŸ†š Hermes vs omparc

Hermes /journeyomparc /arc
MemoryMEMORY.md prose chunksmnemopi + ompkeep + optional markdown
Skills~/.hermes/skillsmanaged-skills + project skills
Graph UIDesktop starmap + TUI timelineTUI timeline β†’ widget (phased)
CRUDedit/delete nodesRead-only MVP; delegate to owning system
TelemetryseparateLangfuse via ompfuse

9. βœ… Done when (MVP)

  • /arc opens timeline in omp TUI
  • Shows β‰₯1 skill ● and β‰₯1 memory β—† from real data
  • Edges between related skills visible
  • OmpKeep lane shows governed-memory lifecycle summaries without text leakage
  • No write path yet β€” read-only is fine for v0

10. πŸ§ͺ Smoke (post-build)

/arc
/memory stats
# create/use a skill β†’ re-run /arc β†’ new ● appears
Hermes learning graph~/.hermes/hermes-agent/agent/learning_graph.py
OMP ↔ Hermes memory bridgeomp.0rk.de
ompbarShared widget patterns
ompfuseTrace retention alongside learning arc