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
| Candidate | Verdict | Why |
|---|---|---|
| omparc β | Chosen | Learning arc β timeline + graph; short; /arc; no clash with ompfuse traces |
| omptale | Tagline | Narrative hook β βyour agentβs learning taleβ |
| ompthrive | Alt | Growth vibe; less visual/timeline-specific |
| ompersist | β | Sounds like persistence layer only (ompkeep already owns that) |
| ompmneme | Alt | Nerdy 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 kind | Source | Filter |
|---|---|---|
| skill β | SKILL.md under profile + base | Non-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"| Layer | System | Role for omparc |
|---|---|---|
| Retain/recall | mnemopi SQLite banks | Memory β nodes + timestamps |
| Governed memory | ompkeep L1/L2 JSONL + inbox | High-trust β nodes + patch history |
| Skills | ~/.omp/agent/managed-skills/ + project skills | Skill β nodes + usage |
| Autolearn | autolearn.* config | Future: auto-skill proposals β arc events |
| Advisor | advisor.syncBacklog | Backlog 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
| Phase | Deliverable | Effort |
|---|---|---|
| P0 | buildOmpLearningGraph() β skills + mnemopi recall metadata | Read-only graph JSON |
| P1 | /arc TUI β ASCII timeline (Hermes learning_graph_render port) | Slash command |
| P2 | Widget mode above editor (like ompbar) | setWidget |
| P3 | Node drill-down β /memory view, skill path open | Mutations delegate |
| P4 | Autolearn 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_cardschunking pattern (OMP: mnemopi export or ompkeep statements)_memory_skill_edgeslexical scoringrender_framestimeline layout
8. π Hermes vs omparc
Hermes /journey | omparc /arc | |
|---|---|---|
| Memory | MEMORY.md prose chunks | mnemopi + ompkeep + optional markdown |
| Skills | ~/.hermes/skills | managed-skills + project skills |
| Graph UI | Desktop starmap + TUI timeline | TUI timeline β widget (phased) |
| CRUD | edit/delete nodes | Read-only MVP; delegate to owning system |
| Telemetry | separate | Langfuse via ompfuse |
9. β Done when (MVP)
-
/arcopens timeline inompTUI - 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
11. π Links
| Hermes learning graph | ~/.hermes/hermes-agent/agent/learning_graph.py |
| OMP β Hermes memory bridge | omp.0rk.de |
| ompbar | Shared widget patterns |
| ompfuse | Trace retention alongside learning arc |