diff --git a/ABOUT.md b/ABOUT.md index b01f909..b0ad5e3 100644 --- a/ABOUT.md +++ b/ABOUT.md @@ -1,4 +1,4 @@ -**Hermespace is a functional J-Space workbench for Hermes agents** — FOA desk, dual decode, and an append-only world projection. Not [J-Space](https://github.com/anomalyco/j-space) neural weights. Not a second runtime. A harness-level global workspace inside Hermes that runs **standalone** and is **powered by [HermesCube](https://github.com/PabloTheThinker/hermescube)** when present. +**Hermespace is a functional J-Space workbench for Hermes agents** — FOA desk, dual decode, and an append-only world projection. Not neural-weight J-space. Not a second runtime. A harness-level global workspace inside Hermes that runs **standalone** and is **powered by [HermesCube](https://github.com/PabloTheThinker/hermescube)** when present. Alongside the desk: skills+MEMORY fabric, neural FOA, autonomy grid, Cube heart/center cable (soft-fail). @@ -37,11 +37,11 @@ Hermespace solves this with two systems: | Project | Relation | |---------|----------| -| [ActiveGraph](https://github.com/anomalyco/ActiveGraph) | Event log is the agent, graph is the world — influenced the archive-first design | -| [J-Space](https://github.com/anomalyco/j-space) | Verbal workspace, ~25 concepts, broadcasting hub — inspired the `concepts` system and `_refresh_concepts()` | +| Anthropic J-space research | Verbal workspace, reportability, selective mediation — inspired desk concepts and dual decode | | [Missing Knowledge Layer](https://arxiv.org/abs/2405.10697) | Knowledge = supersession, Memory = decay, Wisdom = evidence-gated — inspired the epoch progression from unfiltered archive → evidence-gated wisdom | | [Vygotsky](https://en.wikipedia.org/wiki/Inner_speech) | Inner speech, signs as instruments of thought — influenced the dual decode architecture (report to human vs context to model) | | [Hermes Agent](https://github.com/NousResearch/hermes-agent) | The agent that grows with you, by Nous Research | +| [HermesCube](https://github.com/PabloTheThinker/hermescube) | Optional heart/center cable — powers dream/warehouse path when present | --- diff --git a/FOR_HERMES.md b/FOR_HERMES.md index 54397bd..9601451 100644 --- a/FOR_HERMES.md +++ b/FOR_HERMES.md @@ -65,7 +65,7 @@ When the plugin directory is a **symlink into this checkout**, import auto-resol ## Autonomy grid (v0.14) Missions, lenses, dream, self-talk, skillbench (hot-swap / merge / mutate), title tree. -Ground-up for Hermespace — not a port of AgentDrive or Conductor. +Native Hermespace grid — built for this surface. ```bash hs grid status diff --git a/README.md b/README.md index d24db2d..2a31932 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,7 @@ **Hermespace is an append-only persistent world for Hermes agents.** Every session, every belief, every landmark, every evolution is recorded in an archive that never prunes, never decays, never caps. The agent builds a deepening model of itself and its environment across sessions — and it outlives the user. -Not [J-Space](https://github.com/anomalyco/j-space). Not a second agent runtime. A room inside Hermes that remembers everything. +Not a neural-weight J-space. Not a second agent runtime. A room inside Hermes that remembers everything. --- diff --git a/desktop_plugin/hermespace/README.md b/desktop_plugin/hermespace/README.md index d3646c5..f9db944 100644 --- a/desktop_plugin/hermespace/README.md +++ b/desktop_plugin/hermespace/README.md @@ -8,7 +8,7 @@ ## Surfaces (v0.17.1) | Surface | How | |---------|-----| -| **Pane** `hermespace` | `area: panes` — dockable like ilo-ops | +| **Pane** `hermespace` | `area: panes` — dockable Hermes Desktop pane | | **Page** `/hermespace` | `ROUTES_AREA` | | **Sidebar** Hermespace | `SIDEBAR_NAV_AREA` → openRouteTile | | **Chip** `hs` | statusBar → navigate page | diff --git a/desktop_plugin/hermespace/plugin.js b/desktop_plugin/hermespace/plugin.js index 41fc690..8035e23 100644 --- a/desktop_plugin/hermespace/plugin.js +++ b/desktop_plugin/hermespace/plugin.js @@ -10,7 +10,7 @@ * (symlink to another tree breaks some Desktop/remote read paths) * * Surfaces: - * 1) panes tile — immediate, dockable (like ilo-ops; users find this) + * 1) panes tile — immediate, dockable (users find this) * 2) full page /hermespace + sidebar.nav (first-class) * 3) status chip + palette → navigate /hermespace */ @@ -722,7 +722,7 @@ export default { name: 'Hermespace', defaultEnabled: true, register: function (ctx) { - // 1) Dockable pane — same class as working ilo-ops (always visible if plugins load) + // 1) Dockable pane — always visible if plugins load ctx.register({ id: 'pane', area: 'panes', diff --git a/docs/04-pattern-matrix.md b/docs/04-pattern-matrix.md index 01a8850..f6a8cd9 100644 --- a/docs/04-pattern-matrix.md +++ b/docs/04-pattern-matrix.md @@ -8,15 +8,15 @@ | `wm.episodic_buffer` | Baddeley 2000 episodic buffer | Bind multimodal chunks | `bind_episode → [bind] concept` | yes | | `wm.central_executive` | Baddeley central executive | Control: update/select/protect (inhibit, shift) | `executive_mode + do_not_say inhibit` | yes | | `gwt.competition` | Baars/Dehaene GWT ignition/competition | Salience competition for broadcast | `compete_for_focus by salience` | yes | -| `gwt.broadcast` | GWT global broadcast + Conductor inject | Winning contents available to speech/control | `build_inject_block focus-first` | yes | +| `gwt.broadcast` | GWT global broadcast + Hermespace inject | Winning contents available to speech/control | `build_inject_block focus-first` | yes | | `load.sweller` | Sweller cognitive load theory | Intrinsic / extraneous / germane | `classify_message_load` | yes | | `load.protect` | Monotropism + high load / EF tax (ops layer) | Under high load shrink options and menus | `executive=protect + inject compression` | yes | | `desk.verbalizable` | Anthropic J-space reportability | Contents poised for report/speech | `required say field; cli say` | yes | | `desk.modulable` | J-space modulation + attention set | Task shifts workspace contents | `enter CLEAR + recompute_cognition(user_message)` | yes | | `desk.pre_output` | J-space silent deliberation | Workspace before user-visible speech | `save_desk + pre_llm inject` | yes | | `gate.selectivity` | J-space selective mediation | Not all cognition uses workspace | `gate.should_inject` | yes | -| `episodic.ring` | Conductor EpisodicStore | Capped event log | `EpisodicLog max 500` | yes | -| `semantic.consolidate` | Conductor consolidate + semantic memory | Episodes → durable notes | `semantic.consolidate()` | yes | +| `episodic.ring` | Episodic ring buffer (file-backed) | Capped event log | `EpisodicLog max 500` | yes | +| `semantic.consolidate` | Episodic → semantic consolidation | Episodes → durable notes | `semantic.consolidate()` | yes | | `meta.tribe_encode` | Meta TRIBE v2 multi-stream encoding | Stimulus streams → neural prediction (reversed: → desk slots) | `streams.encode_stimulus text/audio/visual/production` | yes | | `meta.b2q_decode` | Meta Brain2Qwerty brain→text decode | Internal state → linguistic report | `streams.decode_to_report → Say draft` | yes | | `meta.production_hierarchy` | Meta thought-to-action language production | Intention → semantics → report | `production_stages in desk.meta` | yes | diff --git a/docs/06-component-research.md b/docs/06-component-research.md index d2a186f..14f367c 100644 --- a/docs/06-component-research.md +++ b/docs/06-component-research.md @@ -11,7 +11,7 @@ Each component mapped to a published pattern, then implemented. 7. Selectivity — J-space-style gate 8. Multi-stream encode — Meta TRIBE-class reverse 9. Decode to report — Brain2Qwerty-class reverse -10. Episodic/semantic memory — Conductor-style stores +10. Episodic/semantic memory — file-backed stores 11. Eval harness — falsifiable metrics **Gap:** neural Jacobian-lens readout (not implemented). diff --git a/docs/14-workbench-pocket-dimension.md b/docs/14-workbench-pocket-dimension.md index 75ea29d..41cc470 100644 --- a/docs/14-workbench-pocket-dimension.md +++ b/docs/14-workbench-pocket-dimension.md @@ -9,7 +9,7 @@ It is the **internal room** a Hermes agent works in: - When an **order** arrives — run encode → desk/neural → decode user + model - Between jobs — monotropic FOA; park the rest instead of thrashing -Same spirit as Conductor’s old “pocket dimension,” named and built as **Hermespace**. +Built as **Hermespace** — the agent's durable internal room inside Hermes. ``` ┌──────────────── Hermespace ────────────────┐ @@ -27,7 +27,7 @@ Same spirit as Conductor’s old “pocket dimension,” named and built as **He ```python from hermespace.workbench import Workbench -wb = Workbench(agent_id="ilo", session_id="main") +wb = Workbench(agent_id="my-agent", session_id="main") wb.enter() # into the pocket dimension wb.park_goal("Later: write docs") # monotropic park wb.idle_tick() # while waiting @@ -46,11 +46,11 @@ model_ctx = result["model_context"] CLI: ```bash -hs workbench enter --agent-id ilo +hs workbench enter --agent-id my-agent hs workbench park --goal "Later: docs" hs workbench idle hs workbench order -m "Fix auth" --goal "Fix auth" --say "On it." --force -hs workbench status --agent-id ilo +hs workbench status --agent-id my-agent ``` ## Idle vs order diff --git a/docs/18-autonomy-grid.md b/docs/18-autonomy-grid.md index 4a9e0ef..7edfce4 100644 --- a/docs/18-autonomy-grid.md +++ b/docs/18-autonomy-grid.md @@ -1,7 +1,7 @@ # Hermespace autonomy grid (v0.14) -Ground-up grid inside the pocket dimension — **not** a port of AgentDrive or Conductor. -Roles inspired by those systems; security and data models rebuilt for Hermespace. +Ground-up grid inside the Hermespace pocket dimension. +Security and data models are native to this surface. ## Thesis @@ -77,18 +77,16 @@ print(g.context_block()) # also folded into inject when load not high | skills_guard idea | `gates.check_skill_promote` | | learning loop | merge/mutate + title tree | -## AgentDrive / Conductor +## Grid building blocks -**Not vendored.** Principles remade: - -| Foreign idea | Hermespace rebuild | -|--------------|-------------------| +| Idea | Hermespace module | +|------|-------------------| | Experience graph | missions + scars + dream log + study DB | -| Growth merge / fused skills | `skill-merge` proposals | -| Learned skills | `skill-mutate` proposals | -| DNA/title | `title_tree` | -| Overseer gates | `gates` budget + intent | -| Pillars/scars | grid scars (typed), not Conductor plugin dual-load | +| Skill fusion | `skill-merge` proposals | +| Skill evolution | `skill-mutate` proposals | +| Title / self-model | `title_tree` | +| Autonomy gates | `gates` budget + intent | +| Failure memory | grid scars (typed) | ## Meta-brain diff --git a/docs/22-open-roadmap.md b/docs/22-open-roadmap.md index 877f037..c0b3747 100644 --- a/docs/22-open-roadmap.md +++ b/docs/22-open-roadmap.md @@ -24,12 +24,10 @@ Snapshot after v0.17 desktop-detach + pulse API. Host-agnostic. |---|------|-----|--------| | 1 | **Event-driven pulse** (access_approved → immediate tick) | Faster than 1m wake | M | | 2 | **Propose-order path** (gated self-order when autonomy on) | True unattended loop | M | -| 3 | **AgentDrive bridge** (optional experience write/read) | Long terrain without fork | L | -| 4 | **Conductor adapter** (optional ethics/scar when present) | Unattended law | M | -| 5 | **Fudoshin eval note** with/without grid under load | Research capital | M | -| 6 | Desktop **start socket** helper from palette (spawn serve) | UX when offline | S | -| 7 | Pulse job enable/disable toggles in Desktop UI | Operator control | S | -| 8 | Multi-agent pulse boards in one page | Multi-agent hosts | M | +| 3 | **Fudoshin eval note** with/without grid under load | Research capital | M | +| 4 | Desktop **start socket** helper from palette (spawn serve) | UX when offline | S | +| 5 | Pulse job enable/disable toggles in Desktop UI | Operator control | S | +| 6 | Multi-agent pulse boards in one page | Multi-agent hosts | M | ## Open — polish @@ -40,7 +38,7 @@ Snapshot after v0.17 desktop-detach + pulse API. Host-agnostic. ## Not doing (by design) -- Porting AgentDrive/Conductor trees into Hermespace +- Porting foreign product trees into Hermespace - Character kits as lenses - Unbounded autonomy / money / public post - Right-rail-only HS panel (removed — page is SoT) diff --git a/docs/23-everyday-ops.md b/docs/23-everyday-ops.md index aa14e37..187cc5d 100644 --- a/docs/23-everyday-ops.md +++ b/docs/23-everyday-ops.md @@ -18,7 +18,6 @@ export HERMESPACE_ROOT=…/hermespace export HERMESPACE_HOME="${HERMESPACE_HOME:-$HOME/.hermespace}" export HERMES_HOME="${HERMES_HOME:-$HOME/.hermes}" export PYTHONPATH="$HERMESPACE_ROOT/src${PYTHONPATH:+:$PYTHONPATH}" -# Optional ILO_HOME if desk lives under an operator home tree ``` ## Daily boot (2 commands) diff --git a/scripts/new_desk.sh b/scripts/new_desk.sh index 77a84dd..a26ea46 100755 --- a/scripts/new_desk.sh +++ b/scripts/new_desk.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash set -euo pipefail -HOME_ROOT="${HERMESPACE_HOME:-${ILO_HOME:-$HOME/.hermespace}}" +HOME_ROOT="${HERMESPACE_HOME:-$HOME/.hermespace}" DEST="$HOME_ROOT/memory/hermespace/ACTIVE.md" TEMPLATE="$(cd "$(dirname "$0")/.." && pwd)/runtime/ACTIVE.template.md" mkdir -p "$(dirname "$DEST")" diff --git a/scripts/show_desk.sh b/scripts/show_desk.sh index 90a1ea9..40a6ffb 100755 --- a/scripts/show_desk.sh +++ b/scripts/show_desk.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash set -euo pipefail -HOME_ROOT="${HERMESPACE_HOME:-${ILO_HOME:-$HOME/.hermespace}}" +HOME_ROOT="${HERMESPACE_HOME:-$HOME/.hermespace}" DEST="$HOME_ROOT/memory/hermespace/ACTIVE.md" if [[ ! -f "$DEST" ]]; then echo "no active desk at $DEST" diff --git a/skills/hermespace/SKILL.md b/skills/hermespace/SKILL.md index 563ed82..19d1cc8 100644 --- a/skills/hermespace/SKILL.md +++ b/skills/hermespace/SKILL.md @@ -14,7 +14,7 @@ description: >- **What it is not:** A second LLM runtime · Claude J-space weights · a SaaS brand · a replacement for Hermes skills/MEMORY. **Package SoT:** `$HERMESPACE_ROOT` (git checkout) · https://github.com/PabloTheThinker/hermespace -**State:** `$HERMESPACE_HOME` default `~/.hermespace` (optional `ILO_HOME`) +**State:** `$HERMESPACE_HOME` default `~/.hermespace` **Hermes:** `$HERMES_HOME` default `~/.hermes` **Version:** align `src/hermespace/__init__.py` · `pyproject.toml` · `hermes_plugin/plugin.yaml` @@ -373,7 +373,7 @@ Never end on only a verify table / `ADHOC_PASS`. - `hermespace-ops` · `hermespace-grid` · `hermespace-everyday` · `hermespace-runtime-ops` - `pocket-dimension-security` - `hermes-agent` · `hermes-desktop-surface` · `hermes-local-ops` -- Finish: `ilo-finish-report` / `material-finish-review` / `session-closeout` when those exist +- Finish: `session-closeout` / `material-finish-review` / `professional-messaging` when those exist **Package skill path:** `$HERMESPACE_ROOT/skills/hermespace/SKILL.md` **Profile install:** `$HERMES_HOME/skills/.../hermespace/SKILL.md` (via `install_hermes.sh`) diff --git a/src/hermespace/episodic.py b/src/hermespace/episodic.py index c47e1f8..7da4e86 100644 --- a/src/hermespace/episodic.py +++ b/src/hermespace/episodic.py @@ -1,4 +1,4 @@ -"""Episodic ring buffer for Hermespace events — strip inspired by Conductor EpisodicStore. +"""Episodic ring buffer for Hermespace events. Capped newest-retained log so the workspace compounds without unbounded growth. """ @@ -31,7 +31,7 @@ class Episode: class EpisodicLog: - """File-backed episodic log (no Conductor SessionStore dependency).""" + """File-backed episodic log for Hermespace events.""" def __init__(self, path: Path | None = None) -> None: self.path = path or (default_state_dir() / "episodes.jsonl") diff --git a/src/hermespace/grid/gates.py b/src/hermespace/grid/gates.py index 1dd3322..c884f8d 100644 --- a/src/hermespace/grid/gates.py +++ b/src/hermespace/grid/gates.py @@ -1,6 +1,6 @@ -"""Autonomy / safety gates — ground-up for Hermespace (not a Conductor port). +"""Autonomy / safety gates for Hermespace. -Principles borrowed as *ideas*, rebuilt for this surface: +Principles: - Budget limits unattended action - Risk classes - No irreversible money/public without human diff --git a/src/hermespace/grid/lenses.py b/src/hermespace/grid/lenses.py index c0a239c..5093b26 100644 --- a/src/hermespace/grid/lenses.py +++ b/src/hermespace/grid/lenses.py @@ -55,7 +55,7 @@ "partner": { "title": "Partner", "bias": "Monotropism, finish reports, high-load short say", - "fabric_boost": ["professional-messaging", "ilo-finish-report", "hermes-agent"], + "fabric_boost": ["professional-messaging", "session-closeout", "hermes-agent"], "inhibit": ["option menus under high load", "leave hanging with only verify table"], "report_style": "closeout", }, diff --git a/src/hermespace/grid/skillbench.py b/src/hermespace/grid/skillbench.py index 9146b98..270f436 100644 --- a/src/hermespace/grid/skillbench.py +++ b/src/hermespace/grid/skillbench.py @@ -1,10 +1,9 @@ """Skillbench — hot-swap skill modules + merge/mutate evolution on the workbench. -Ground-up (AgentDrive *roles* only: learned/fused skills, growth merge): - Modules live under HERMESPACE_HOME grid (not auto-installed to Hermes) - Merge two skill bodies → draft proposal - Mutate a skill with a delta note → draft proposal -- Promote requires explicit call + static gate (Hermes skills_guard *idea*) +- Promote requires explicit call + static gate """ from __future__ import annotations @@ -185,7 +184,7 @@ def merge_skills( new_name: str | None = None, note: str = "", ) -> Proposal: - """Fuse two module bodies into a draft (AgentDrive fused-* *role*).""" + """Fuse two module bodies into a draft proposal.""" a = get_module_body(name_a, agent_id=agent_id) b = get_module_body(name_b, agent_id=agent_id) if not a or not b: diff --git a/src/hermespace/paths.py b/src/hermespace/paths.py index 1317193..11c7a2d 100644 --- a/src/hermespace/paths.py +++ b/src/hermespace/paths.py @@ -11,13 +11,11 @@ def hermespace_home() -> Path: Order: HERMESPACE_HOME - ILO_HOME (compat) ~/.hermespace """ - for key in ("HERMESPACE_HOME", "ILO_HOME"): - raw = os.environ.get(key, "").strip() - if raw: - return Path(raw).expanduser().resolve() + raw = os.environ.get("HERMESPACE_HOME", "").strip() + if raw: + return Path(raw).expanduser().resolve() return (Path.home() / ".hermespace").resolve() diff --git a/src/hermespace/patterns.py b/src/hermespace/patterns.py index 9e9e134..94a617e 100644 --- a/src/hermespace/patterns.py +++ b/src/hermespace/patterns.py @@ -66,7 +66,7 @@ class Pattern: ), Pattern( "gwt.broadcast", - "GWT global broadcast + Conductor inject", + "GWT global broadcast + Hermespace inject", "Winning contents available to speech/control", "build_inject_block focus-first", True, @@ -122,7 +122,7 @@ class Pattern: ), Pattern( "episodic.ring", - "Conductor EpisodicStore", + "Episodic ring buffer (file-backed)", "Capped event log", "EpisodicLog max 500", True, @@ -130,7 +130,7 @@ class Pattern: ), Pattern( "semantic.consolidate", - "Conductor consolidate + semantic memory", + "Episodic → semantic consolidation", "Episodes → durable notes", "semantic.consolidate()", True, diff --git a/src/hermespace/semantic.py b/src/hermespace/semantic.py index 023d2df..5291847 100644 --- a/src/hermespace/semantic.py +++ b/src/hermespace/semantic.py @@ -1,4 +1,4 @@ -"""Semantic notes — Conductor SemanticStore pattern, file-backed.""" +"""Semantic notes — durable statements consolidated from episodic events.""" from __future__ import annotations @@ -85,7 +85,7 @@ def add(self, statement: str, *, tags: list[str] | None = None, confidence: floa def consolidate(limit: int = 40) -> dict[str, Any]: - """Deterministic consolidation from episodic → semantic (Conductor pattern).""" + """Deterministic consolidation from episodic → semantic notes.""" eps = EpisodicLog().recent(limit=limit) # recent() returns newest first; reverse for chrono entries = list(reversed(eps)) diff --git a/src/hermespace/workbench.py b/src/hermespace/workbench.py index 4f4c964..e759b71 100644 --- a/src/hermespace/workbench.py +++ b/src/hermespace/workbench.py @@ -7,8 +7,8 @@ - **Idle tick** — maintain memory/neural while waiting for orders - **Order turn** — when a user/system order arrives, run through Hermespace -This is the Conductor-era "pocket dimension" idea, realized as Hermespace -state + API — not a separate product brand. +Hermespace's pocket workbench: durable FOA desk + park stack + idle/order +turns — state and API for Hermes agents, not a second product brand. """ from __future__ import annotations