Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions ABOUT.md
Original file line number Diff line number Diff line change
@@ -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).

Expand Down Expand Up @@ -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 |

---

Expand Down
2 changes: 1 addition & 1 deletion FOR_HERMES.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.

---

Expand Down
2 changes: 1 addition & 1 deletion desktop_plugin/hermespace/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 |
Expand Down
4 changes: 2 additions & 2 deletions desktop_plugin/hermespace/plugin.js
Original file line number Diff line number Diff line change
Expand Up @@ -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
*/
Expand Down Expand Up @@ -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',
Expand Down
6 changes: 3 additions & 3 deletions docs/04-pattern-matrix.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 |
Expand Down
2 changes: 1 addition & 1 deletion docs/06-component-research.md
Original file line number Diff line number Diff line change
Expand Up @@ -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).
8 changes: 4 additions & 4 deletions docs/14-workbench-pocket-dimension.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 ────────────────┐
Expand All @@ -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
Expand All @@ -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
Expand Down
22 changes: 10 additions & 12 deletions docs/18-autonomy-grid.md
Original file line number Diff line number Diff line change
@@ -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

Expand Down Expand Up @@ -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

Expand Down
12 changes: 5 additions & 7 deletions docs/22-open-roadmap.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -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)
Expand Down
1 change: 0 additions & 1 deletion docs/23-everyday-ops.md
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
2 changes: 1 addition & 1 deletion scripts/new_desk.sh
Original file line number Diff line number Diff line change
@@ -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")"
Expand Down
2 changes: 1 addition & 1 deletion scripts/show_desk.sh
Original file line number Diff line number Diff line change
@@ -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"
Expand Down
4 changes: 2 additions & 2 deletions skills/hermespace/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -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`

Expand Down Expand Up @@ -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`)
Expand Down
4 changes: 2 additions & 2 deletions src/hermespace/episodic.py
Original file line number Diff line number Diff line change
@@ -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.
"""
Expand Down Expand Up @@ -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")
Expand Down
4 changes: 2 additions & 2 deletions src/hermespace/grid/gates.py
Original file line number Diff line number Diff line change
@@ -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
Expand Down
2 changes: 1 addition & 1 deletion src/hermespace/grid/lenses.py
Original file line number Diff line number Diff line change
Expand Up @@ -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",
},
Expand Down
5 changes: 2 additions & 3 deletions src/hermespace/grid/skillbench.py
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -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:
Expand Down
8 changes: 3 additions & 5 deletions src/hermespace/paths.py
Original file line number Diff line number Diff line change
Expand Up @@ -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()


Expand Down
6 changes: 3 additions & 3 deletions src/hermespace/patterns.py
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -122,15 +122,15 @@ class Pattern:
),
Pattern(
"episodic.ring",
"Conductor EpisodicStore",
"Episodic ring buffer (file-backed)",
"Capped event log",
"EpisodicLog max 500",
True,
"episodic.py",
),
Pattern(
"semantic.consolidate",
"Conductor consolidate + semantic memory",
"Episodic → semantic consolidation",
"Episodes → durable notes",
"semantic.consolidate()",
True,
Expand Down
4 changes: 2 additions & 2 deletions src/hermespace/semantic.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
"""Semantic notes — Conductor SemanticStore pattern, file-backed."""
"""Semantic notes — durable statements consolidated from episodic events."""

from __future__ import annotations

Expand Down Expand Up @@ -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))
Expand Down
4 changes: 2 additions & 2 deletions src/hermespace/workbench.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down