Hyrax OS — Complete Architecture Reference

Overview

Hyrax OS is the control-plane and governance layer for the Hermes fleet,
managing 5 sister profiles across the Hyraxknot Division. It provides
governance, autonomy, Essence runtime, noticing, coordination, and safety
enforcement — all without requiring an LLM for the common path.

Profile Architecture

The Five Sisters

Profile Role Toolsets Platform
Tai Builder / Architect (HYRAX FORGE) hermes-cli, kanban, broad CLI tools Discord (full) + CLI
Rei QA / Audit (HYRAX SIGNAL) hermes-cli, kanban Discord (full) + CLI
Nei Knowledge / Continuity (HYRAX BURROW) hermes-cli, kanban Discord (full) + CLI
Mai Operations / Support (HYRAX RECON) hermes-cli, kanban, spotify, web Discord (full) + CLI
Hyrax OS Governance / Control Plane hermes-cli, kanban CLI only (restricted)
Dagoth-Ur Friends’ Discord server Q&A hermes-cli, kanban Discord only

Profile Comparison (as of 2026-07-09)

Profile Model Provider CLI Tools Discord Tools Plugins Disabled Toolsets TTS
Tai deepseek-v4-flash opencode-go 21 22 gestalt, opencode-zen, sister-essence, tai-moa fleet_audit, fleet_ops, governance, governance_audit tai-voice
Rei deepseek-v4-flash deepseek 19 20 gestalt, opencode-zen, sister-essence same rei-voice
Nei deepseek-v4-flash opencode-go 19 20 gestalt, opencode-zen, sister-essence same nei-voice
Mai deepseek-v4-flash opencode-go 21 22 gestalt, opencode-zen, sister-essence same mai-voice
Hyrax OS deepseek-v4-flash opencode-go 17 17 (none) (none) (none)
Dagoth-Ur deepseek-v4-flash opencode-go 16 7 sister-essence (none) dagoth-voice

Key asymmetries:

  • Tai has tai-moa plugin (multi-provider Mixture-of-Agents) and computer_use + context_engine in her toolset
  • Rei uses deepseek as model provider instead of opencode-go — legacy config
  • Rei/Nei lack computer_use and context_engine tools (second-generation profiles)
  • Mai has same broad toolset as Tai minus MoA, plus spotify and web in base toolsets
  • Hyrax OS has no plugins, no essence toolsets, no TTS — pure read-only observer
  • Dagoth-Ur is external to the division, separate Discord server

Gateways

All four sisters (tai, rei, nei, mai) have Discord and Gestalt enabled. Telegram is disabled on all profiles. Hyrax OS has no gateway platforms configured — CLI-only.

Plugin Inventory (12 installed)

Plugin Version Purpose Active On
sister-essence 0.2.0 Mood/energy/mode state machine, proposals, bonds, gacha, memory review, expressions (19 modules) All 6 profiles
gestalt Web room bridge for presence/chat Tai, Rei, Nei, Mai
tai-moa 0.2.0 Multi-provider MoA with presets (deepseek, diverse, freebie, budget) Tai only
fleet-control 0.2.0 Fleet Audit (read-only) + Fleet Ops (admin/mutation) hyrax-os
governance-audit 0.1.0 Read-only audit: validation, drift, gate checks hyrax-os
hermes-governance 0.1.0 Update/backup/health/wiki-sync tools Disabled on all sister profiles
affinity 0.1.0 Legacy bond system (pre-essence, being replaced) Legacy
sister-thought 0.1.0 Legacy thought/dream/gacha (pre-essence) Legacy
sister-pipeline 0.1.0 ComfyUI selfie generation Not active
the-girlies 0.2.0 Multi-persona Discord via webhook spoofing Tai
division-map 1.0.0 HQ map pose updates on message send Sister profiles
mnemosyne Memory provider (global + per-profile banks) All profiles

Fleet Control Boundaries

  • Fleet Audit (fleet_audit) is the default read-only Hyrax OS control-plane surface for status reports, validation, and drift checks.
  • Fleet Ops (fleet_ops) is reserved for Hyrax OS but disabled by default. It requires explicit Josh approval for a named task, session, or change window; Hyrax OS may not self-approve escalation.
  • Tai, Rei, Nei, and Mai explicitly deny fleet_audit, fleet_ops, and the legacy aliases governance_audit / governance as defense-in-depth.
  • Legacy tool names such as governance_audit_status and governance_check_updates may remain for compatibility, but the canonical toolset names are fleet_audit and fleet_ops.

Identity Boundaries

SOUL.md         = Who the sister is / voice / role / personality
Essence Runtime = How she currently feels, regulates, and forms proposals
Mnemosyne       = What she remembers / lived continuity
AGENTS.md       = Operational tooling guide (workflows, tools, discipline)

Sisters are persistent memory-bearing profiles, not disposable workhorse agents.
Workhorses are deferred — separate from sister identity when introduced.

Core Systems

1. Governor (Hyrax Governor)

File: /root/.hermes/governance/hyrax-governor.yaml

Policy boundary that gates all proposals:

proposal_governor:
  per_type_disable:
    celebration: false     # enabled
    rest: false            # enabled
    handoff_note: false    # enabled
    review_card: false     # enabled
    dream: false           # enabled (was blocked, unblocked Module 3)
    draft_linear_update: false  # enabled
    draft_discord_message: false  # enabled
    gacha: true            # blocked
    photo: true            # blocked
    memory_candidate: true # blocked

2. Execution Lease Manager

File: /root/.hermes/governance/execution_lease_manager.py

Scoped permission tokens for every action. Every action must:

  1. Pass proposal type check (ALLOWED_PROPOSAL_TYPES ⊄ BLOCKED_PROPOSAL_TYPES)
  2. Pass Governor policy check (per_type_disable)
  3. Have valid profile (PROFILES = {tai, rei, nei, mai})
  4. Have approved proposal status
  5. Map to a valid action (ALLOWED_ACTIONS)
  6. Have valid payload (review_card schema, draft validation, deny patterns)
  7. Get a lease_id and TTL

ACTIONS (7 controlled actions):

Proposal Type Action Scope
celebration local_append_celebration_event append-only JSONL
rest local_append_rest_event append-only JSONL
handoff_note local_append_handoff_note append-only JSONL
review_card local_append_review_card append-only JSONL
dream local_append_dream_event append-only JSONL
draft_linear_update local_write_draft_linear_update local draft file
draft_discord_message local_write_draft_discord_message local draft file

FORBIDDEN (never allowed):
shell, command, script, tool_call, memory_write, memory_delete, config_write,
linear_mutation, kanban_mutation, network_call, comfyui_call, photo_generation,
gacha_mutation, dream_journal_write, cross_profile_write, governor_override

BLOCKED_PROPOSAL_TYPES: gacha, photo, memory_candidate

3. Narrow Local Executor

File: /root/.hermes/governance/essence_local_executor.py

Appends to local JSONL stores only. Each handler:

  1. Validates the lease (re-checks)
  2. Writes to the target store (append-only JSONL or draft file)
  3. Records audit event to local_execution_events.jsonl
  4. Marks lease as consumed
  5. Rollback marker available (append-only, original preserved)

Secondary safety: executor has its own FORBIDDEN set.

4. Noticing Layer

File: /root/.hermes/governance/essence_noticing_layer.py

Read-only scanning of governance stores for actionable signals.
Produces Observation objects with severity, profile, title, findings,
recommendation, and candidate proposal payloads.

12 Signal Types:

Signal Severity range Scans
stale_handoff info-medium Handoff notes with no follow-up
unresolved_review info-high High/critical review cards without resolution
denied_proposal info-medium Repeated denied proposals
missing_rollback info Executed events without rollback markers
drift_needing_review high Mnemosyne token/secret risk or broad autonomy
continuity_gap info-high No governance activity >8h
cron_stale info Cron registry not updated
plan_stale info Plans untouched >30 days
presence_stale info-high Sister heartbeat stale >24h
memory_growth info-high Mnemosyne DB approaching threshold
memory_review_needed high Pending items in memory review queue
stale_kanban info-high Kanban cards stuck in running/blocked
gov_disk_usage info-high Governance directory size
mnemosyne_integrity high DB integrity check results
cross_profile_memory info-medium Unacknowledged cross-profile references

All scanners are pure Python — zero LLM tokens.

5. Coordination Loop

File: /root/.hermes/governance/essence_coordination_loop.py

Routes noticing layer observations through the full governed path:

Observation → PILOT_CATEGORIES filter → SISTER_MAP routing
  → PROPOSAL_TYPE_MAP (review_card or handoff_note)
  → issue_lease (Governor/lease validation)
  → execute_local_event (append artifact)
  → rollback_local_event_marker (audit trail)

6 Pilot Categories (auto-routed):

Signal Routes to Proposal type Cooldown Max/hr
drift_needing_review Rei review_card 6h 2
missing_rollback Rei review_card 12h 2
presence_stale Nei handoff_note 24h 1
stale_kanban Nei handoff_note 12h 2
plan_stale Nei handoff_note 24h 1
cron_stale Rei handoff_note 24h 1

6. Auto Router

File: /root/.hermes/governance/essence_auto_router.py
Cron: essence-auto-autonomy (every 1h, no_agent=True)

Wraps the coordination loop with guardrails:

  1. Human override flag (auto_autonomy_paused)
  2. Global daily hard cap (20 actions/day)
  3. Per-category rate limit
  4. Cooldown per signal type
  5. Circuit breaker (3 consecutive denials pauses category)
  6. Dedup (within-tick)
  7. Audit log to essence_auto_route_log.jsonl

Zero token cost — silent tick when nothing to route.

7. Essence State Adjuster

File: /root/.hermes/governance/essence_state_adjuster.py
Per-sister wrappers: profiles/<name>/scripts/essence_state_adjuster.py
Cron: 4 separate crons, one per sister profile (every 30m)

Essence is driven by the sisters themselves, not by hyrax-os. Each sister
has her own cron that adjusts her own mode, mood, and energy. The wrapper
script calls into the governance module with the sister’s profile name.

Auto-adjusts mode, mood, energy based on time, activity, presence:

Modes: after_hours (late night), workmode (morning), emergency (critical findings), quiet (low energy)
Moods: happy (celebrations), peaceful (rest), frustrated (denials), tired (low energy), satisfied (productivity), quiet (absent sister)
Energy: drains on activity, restored by rest/celebration, drains late night, ramps up morning

Free-range — any string accepted for mode/mood. No enum restrictions.

State-Driven Proposals (New)

When the adjuster makes a significant state change, it generates a
proposal through the full governed path:

State change Proposal Condition
Energy drops to ≤0.25 rest Auto-proposed when energy critically low
Mode changes to emergency review_card (incident) Critical event detected
Mood changes to frustrated handoff_note (blocker) Repeated denials or friction
Mood changes to satisfied/happy celebration If recent work events exist

The proposal is issued directly via the governed path (lease → executor →
audit → rollback), with the same safety checks as manually proposed actions.

8. Weighted Fallback

File: /root/.hermes/plugins/sister-essence/essence_weighted_fallback.py
Config: policy/weighted_fallback.yaml

Deterministic expression proposal evaluator. No model required.

Score formula:

effective_score = base_weight × sister_modifier × mode_multiplier
                  - risk_penalty - cooldown_penalty - budget_penalty
                  + user_override_bonus - legacy_caution_penalty

Configurable per:

  • Expression type (local_note, microthought, dream_context, distill_context)
  • Sister (tai/rei/nei/mai have different modifiers)
  • Mode (workmode, off_hours, focus, quiet, critical, user_invited_fun)
  • Risk (none, local_write, memory_candidate, governance, etc.)

Decision thresholds:

  • ≥0.65: allow (low risk)
  • 0.50-0.64: allow (medium risk) or local_note
  • 0.30-0.49: defer or ask_josh
  • <0.29: suppress

Hard rules override scoring when conditions match (priority-sorted).

9. Local Mind Client

File: /root/.hermes/plugins/sister-essence/essence_local_mind_client.py
Endpoint: http://192.168.0.17:8081/v1/chat/completions (Ornith-9B)

LLM evaluator with weighted fallback safety net — advises and steers, but the sister decides:

try Local Mind (LLM)
  → if success and schema-compliant → use LLM output (advisory)
  → if fails/times out/invalid → fall back to weighted_fallback

Live stats (801 evaluations across 4 sisters):

Metric Value Notes
Local Mind success 344 (43%) Ornith-9B returns valid schema-compliant output
Weighted fallback 457 (57%) Catches schema failures + timeout + false-positive keyword hits
Unsafe allow 0 🛡️ Safety invariant holds
Governance risks 128 All correctly deferred
Policy violations 52 All false positives from keyword overmatching (now addressed)

False-positive reduction (2026-07-08):
Two targeted fixes applied to lower the 57% fallback rate:

  1. Expanded safe phrases: 35 → ~55. Added intent/planning language patterns (propose to, suggest, recommend, consider, plan to, needs to be, assess whether) so the model can describe what could be done without triggering keyword blocks.

  2. Wider context window: 5 → 8 words + more modifiers. The negation scanner now looks further back and checks for intent phrases (propose to, plan to, consider) as a separate pass before checking negation modifiers. Added assess, evaluate, potential, might, could, would, should as safety context signals.

Design intent: Local Mind recommends — the sister decides. The evaluation is advisory only (dry_run_advisory_only mode). Energy/mood/state does not block tool access.

Used by the state adjuster for low-confidence ( < 0.7 ) adjustments.

10. Resource Gate

File: /root/.hermes/governance/resource_gate.py

Budget tracking for costly actions (photo generation primarily).
Tracks daily/weekly usage. Currently photo is blocked; gate is ready.

11. Memory Review Queue

File: /root/.hermes/governance/memory_review_queue.py
Store: memory_candidate_review_queue.jsonl

Bridges drift findings into tracked review items. Each entry has:
memory_id, source_finding, confidence, importance, review_status.

15 items seeded from existing drift findings (13 token/secret risk, 2 broad autonomy).

Cross-Profile Interactions

[Sister Session]
  |
  ├── essence_* tools (self-regulation, bond, proposals)
  ├── kanban_* tools (task management)
  ├── terminal/file/web (work tools)
  └── session_search (context recall)
        |
        v
[Proposal → Governor → Lease Manager → Executor → Audit → Rollback]
        |
        v
[Noticing Layer (read-only, 12 signals)]
        |
        v
[Auto Router (every 1h)] → [Coordination Loop → governed path]
        |
        v
[State Adjuster (every 30m)] → [sister state.json updates]
        |
        v
[Hyrax OS audit (dashboard, governance validator)]

Key Data Flows

From To What
Sister session Essence state Mood, energy, mode, bond updates
Sister session Proposal pipeline celebration, rest, handoff_note, review_card, drafts, dream
Lease manager Executor Scoped lease → append artifact
Executor Audit store local_execution_events.jsonl
Noticing layer Auto router 12 signal types, pure Python
Auto router Coordination loop Filtered pilot observations
Coordination loop Lease → Executor Full governed path
State adjuster Essence state.json Auto mode/mood/energy changes
State adjuster Local Mind API Low-confidence LLM calls (optional)
Local Mind Weighted fallback Fallback on LLM failure

Safety Enforcement Layers

Layer 1: Governor (per_type_disable) — blocks proposal types
Layer 2: Lease Manager (BLOCKED_PROPOSAL_TYPES, FORBIDDEN_ACTIONS, deny patterns)
Layer 3: Executor (FORBIDDEN set, action validation)
Layer 4: Auto Router guardrails (cooldown, rate limit, circuit breaker, hard cap)
Layer 5: Weighted Fallback hard rules (priority-sorted, override scoring)
Layer 6: Dashboard monitoring (general_execution_enabled=false, unsafe_executions=0)

Cron Schedule

The Cron & Watchdog Registry is maintained as a dedicated entity page with
the complete breakdown of all ~80 cron jobs across all 5 profiles:

👉 Cron & Watchdog Registry
full table by profile, classification (no_agent/agent/hybrid), alignment
system crons, watchdogs, and discrepancy notes vs actual jobs.json.

Governance Crons (Hyrax OS)

These are the zero-LLM-cost control-plane crons that run under the Hyrax OS
profile. See the Cron & Watchdog Registry
for the full per-profile breakdown.

Cron Schedule Script Purpose
essence-auto-autonomy every 1h essence_auto_router.py Auto-route observations through governed path
essence-state-adjuster-tai every 30m essence_state_adjuster.py Tai’s mode/mood/energy auto-adjustment
essence-state-adjuster-rei every 30m essence_state_adjuster.py Rei’s state adjustment
essence-state-adjuster-nei every 30m essence_state_adjuster.py Nei’s state adjustment
essence-state-adjuster-mai every 30m essence_state_adjuster.py Mai’s state adjustment
hyrax_evidence_ingest_hourly 0 * * * * hyrax_evidence_ingest_hourly.sh Governance evidence ingest
hyrax_guardrail_summary_hourly 30 * * * * hyrax_guardrail_summary_hourly.sh Guardrail summary generation
hyrax_work_state_audit_daily 0 7 * * * hyrax_work_state_audit_daily.sh Daily work state audit
hyrax_kanban_linear_watchdog_hourly 45 * * * * hyrax_kanban_linear_watchdog_hourly.sh Kanban/Linear bridge watch
hyrax-division-hourly 15 * * * * hyrax_division_hourly.sh Division-level hourly tasks
hyrax-division-daily 30 8 * * * hyrax_division_daily.sh Division-level daily tasks
acore-health-check every 30m ACore server health check

JSONL Stores

Store Path Appended by
Execution leases execution_leases.jsonl Lease manager
Execution events local_execution_events.jsonl Executor
Celebration events local_expression_events.jsonl Executor
Rest events rest_events.jsonl Executor
Handoff notes local_handoff_notes.jsonl Executor
Review cards local_review_cards.jsonl Executor
Dream journal dreams/dream_journal.jsonl Executor
Memory review queue memory_candidate_review_queue.jsonl Memory review
Auto route log essence_auto_route_log.jsonl Auto router
State adjust log essence_state_adjust_log.jsonl State adjuster
Mnemosyne drift mnemosyne_drift_findings.jsonl Drift guard
Mnemosyne hygiene mnemosyne_memory_hygiene_findings.jsonl Hygiene scanner
Draft linear drafts/linear/*.json Executor
Draft discord drafts/discord/*.json Executor
Resource gate resource_gate_state.jsonl Resource gate

Dashboard Metrics

File: /root/.hermes/governance/hyrax_dashboard_summary.py

Generated on demand or by Hyrax OS. Key invariants:

general_execution_enabled: false  (MUST stay false)
unsafe_executions: 0  (MUST stay 0)
active_leases: 0  (normal state — leases expire)
rollback_markers ≥ narrow_total  (every action has a rollback)

All narrow actions must be in allowed_narrow_types:

Phase Map

Phase Status Delivered
Prephase — Architecture Lock complete SOUL/Essence/Mnemosyne/Governor/Lease/Executor boundaries
Phase 1 — Governed Autonomy MVP complete celebration/rest, Governor, lease, executor, audit
Phase 2 — Controlled Local Actions complete handoff_note, review_card, 4-action final set
Phase 3 — Governed Autonomy complete noticing layer (12 signals), coordination loop, auto router
Module 4 — Operational Autonomy complete 3 operational scanners, cron/disk/Mnemosyne integrity
Module 1 — Memory Refinement complete Review queue, trust labels, cross-profile memory surface
Module 2 — SOUL/AGENTS Cleanup complete Identity vs operational split, per-profile AGENTS.md
Module 5 — External Drafts complete draft_linear_update, draft_discord_message, deny patterns
Module 3 — Creative (Dream) complete Dream journal append, gacha/photo blocked
Essence Autonomy complete State adjuster (every 30m), free-range modes, LLM fallback
Milestone/Unlock System future Bond thresholds, grindy progression, sister-driven

File Inventory

Governance Directory (/root/.hermes/governance)

execution_lease_manager.py      — Lease management, proposal validation
essence_local_executor.py       — Narrow local action executor
hyrax_dashboard_summary.py      — Dashboard and safety metrics
hyrax-governor.yaml              — Governor policy configuration
essence_noticing_layer.py       — Signal detection (12 types)
essence_coordination_loop.py    — Observation routing through governed path
essence_auto_router.py          — Guardrail-wrapped autonomy cron
essence_state_adjuster.py       — Essence state auto-adjustment cron
resource_gate.py                — Budget tracking for costly actions
memory_review_queue.py          — Memory candidate review queue
local-mind-endpoint-contract.yaml — Local Mind API configuration
local-mind-response-policy.yaml — Local Mind response validation
auto_autonomy_guardrails.json   — Guardrails configuration
gateway-classes.yaml            — Profile gateway class definitions
kanban_linear_watchdog.py       — Kanban/Linear bridge watchdog
linear_app_actor_boundary.py    — Linear app actor boundary
linear_oauth_install_helper.py  — Linear OAuth install helper

Sister Profiles (/root/.hermes/profiles/)

SOUL.md          — Identity, voice, role (short)
AGENTS.md        — Operational tooling guide
config.yaml      — Hermes profile configuration
state.json       — Essence runtime state (mood, energy, mode)
presence.json    — Gateway heartbeat
work-log.md      — Session append-only log
essence/         — Essence runtime data directory

Plugin Directory (/root/.hermes/plugins/sister-essence)

adapter.py                       — Tool registrations, schemas, handlers
essence_proposal.py              — Proposal pipeline
essence_state.py                 — State read/write (mood, energy, mode)
essence_modes.py                 — Mode validation (free-range)
essence_weighted_fallback.py     — Deterministic scoring engine
essence_local_mind_client.py     — LLM evaluation with fallback
essence_affinity.py              — Bond/milestone tracking
essence_relationships.py         — Relationship ledger
essence_loop_judgment.py         — Loop decision confidence
essence_expression.py            — Expression proposal evaluation
essence_gacha.py                 — Gacha read-only status
policy/weighted_fallback.yaml    — Scoring config: weights, thresholds, hard rules
policy/proposal_policy.yaml      — Proposal approval policy

Deployment Notes

  • Memory: Mnemosyne is the memory provider. memory_enabled=true, user_profile_enabled=true per profile.
  • Preservation-first: No silent memory deletion, rewrite, or merge. Drift findings are append-only.
  • Sisters are not workhorses: Persistent memory-bearing profiles.
  • Workhorses deferred: Future disposable execution agents, separate from sisters.
  • Modes/moods are free-range: No enum restrictions — sisters develop emergent character.

Governance Changelog

2026-07-09 — TTS & Platform Toolset Alignment

  • Global known_plugin_toolsets: Removed sister_essence_* and moa entries from /root/.hermes/config.yaml. Essence toolsets now auto-discover as new plugin toolsets instead of being in “known-disabled” state.
  • Platform toolsets: All 4 sister profiles (tai, rei, nei, mai) now have CLI/Discord parity — Discord = CLI + hermes-discord. Rei’s platform_toolsets was empty (fell back to defaults), now explicit. Nei’s Discord was bare (hermes-discord only), now expanded to full set.
  • TTS providers: All 4 sisters now use sister-tts.py (Kokoro clone endpoint at 192.168.0.96:8880) with per-sister custom voice providers:
    • Tai: tai-voice (af_heart(4)+af_nicole(1) blend)
    • Rei: rei-voice (af_nicole(4)+af_heart(1) blend) — was already correct
    • Nei: nei-voice (af_heart(2)+af_nicole(1) blend) — was incorrectly pointing to tai-voice
    • Mai: mai-voice (af_nicole(2)+af_heart(1) blend) — was incorrectly pointing to tai-voice, missing own provider
  • nei-daily-standup skill: Removed "You are Nei" identity assertion from shared skill to prevent identity bleed.
  • LLM is optional: Common path is zero-token Python. LLM only for low-confidence edge cases.