← → to move
SimplifyGenAISimplifyGenAIMain deck · Technical brief · September 2026
For your technical and security team

How SAGE works, from the runtime up.

This is the deep version of the main deck. It covers the architecture, how context and memory work, what each core agent does, the operating contract every employee follows, the channels, the security model and what a deployment on your infrastructure includes. Every claim points at a file, a command or a setting on the host. The reference deployment described here is SimplifyGenAI's own: one SAGE box (sage-1) running an employee named Trejon, so unit, mailbox and path names carry that employee's name.

Describes the fleet as it ran on 2 September 20261
Technical · ContentsWhat this brief covers

Contents.

3 to 5

Architecture

The system map, the engine, and how an employee is invoked.

6 to 9

Context and memory

Retain blocks, the bank, hooks, the nightly curator and the work graph.

10 to 14

Core agents

The ten roles that run the office, and the HQ listener, Inspector and Governor in detail.

15 to 17

Operating contract and channels

The thirteen rules every employee follows, WhatsApp, Telegram and Google Workspace.

18 to 22

Security model

Threat model, layers, privilege, gates and switches, the self-audit.

23 to 26

Host, data, deployment, comparison

What the box looks like, what leaves your cloud, what we set up for you, and how this compares with open-source frameworks.

Source references are in the footer of each page2
Technical · ArchitectureThe system map

One engine, one memory, one supervised fleet.

Messages come in at the top and pass through a listener. Work happens in the middle on one runtime. Anything going out passes a code gate at the bottom.

Where people talk

WhatsApp groupsTelegram botGmail, Calendar, SheetsOffice dashboard :8940
Listenertrejon-hq.service runs hq-listener.py all day. It reads the HQ group, transcribes voice notes, downloads images and documents, and starts a run for named owners. Replies carry the result, never an acknowledgement.
starts a run with a model and a tool list
EngineClaude Code CLI 2.1.x, called as claude -p from systemd units and shell wrappers. Hooks, skills, the memory bank and the work graph sit around it as plain files.
28 employees on timers, plus the listener
FleetEach employee is a systemd unit with a timer, a memory cap, a failure hook, its own state directory and a row in roster.json. The dashboard reads that roster.
checked before and after every run
SupervisorsGovernor (usage caps), Budget keeper (tokens per day), Inspector (health), the send allowlist, the email approval gate and the memory guard.
only approved destinations, only approved content
OutboundWhatsApp needs the allowlist and a flag file. Email needs a single-use approval hash. Deploys need a written go. Money is a hard stop.

Operator laptop

Same repository, same memory, same hooks. Interactive sessions and reviews. Syncs with the server through git push and pull.

Model provider

A Claude subscription seat. Fable, Opus and Sonnet in a chain with cap detection, and a light provider when the seat is capped.

Host

Ubuntu 24.04, 3.7 GB RAM, reachable over a private mesh (Tailscale). Dashboard served through an outbound tunnel.

Source: /root/sage-server, roster.json, systemd units, hq-listener.py3
Technical · ArchitectureWhat an employee is made of

Six layers, all of them files in a git repository.

Nothing here is a hosted black box. The model is the only thing rented. The same six layers run on the operator's laptop and on the server, from one repository, so the fleet and its owner read from a single source of truth.

IdentityIDENTITY.md and USER.md hold the role, the voice, the hard rules and who the employee works for. An onboarding interview writes them; run it again to change them.
MemoryA curated bank (world, opinions, experience, contacts) plus an inbox and a nightly curator. The index is injected at every session start.
HooksScripts that fire on session start, before and after tool use, before compaction and on stop. They load context, deny secret reads, redact leaks and persist memory without the model having to remember.
SkillsPackaged procedures loaded when a task matches: research, build loop, design pre-flight, email formatting. Installed from pinned sources only.
Work graphbeads, a dependency-aware issue tracker on Dolt, synced through git. Work items never live in prose.
RuntimeClaude Code CLI 2.1.197, invoked as claude -p "<prompt>" --model <model> --allowedTools ... with an explicit model and tool list for every run.
Source: ~/trejon/CLAUDE.md, identity/, hooks/, skills/, .beads/4
Technical · ArchitectureOne scheduled run, step by step

What happens when a timer fires.

1Timersystemd fires the unit, e.g. 09:30 IST, Persistent=true so a missed run catches up
2Budget checkbudget.py check, exit 3 means over the 24-hour cap, run skipped
3Tier checkmodel-state.json says paid or degraded; heavy runs skip when degraded
4Model chainFable, then Opus, then Sonnet; a cap-shaped error moves down, any other error stops
5Runclaude -p with the prompt, the model and the tool list; MemoryMax 2 GB from the unit
6Exit code0 shipped or queued for review, 1 real failure which wakes the Inspector

Where the cap regex lives

Every wrapper matches the same pattern: usage limit, limit reached, reached your ... limit, /model to switch, out of usage, credit balance, resets at. A match is a cap, anything else is a bug.

What gets logged

state/last-run.log per employee, append-only jsonl logs in each state directory, governor.log for cap transitions, ops-report.json for health.

What the dashboard sees

org3d/server.py reads systemd, the governor and the transcripts and serves /api/status. It is read-only and never mutates anything.

Source: cherry-loop/bin/loop.sh, model-governor/budget.py, governor.py, AGENT-GUIDELINES.md s2 and s65
Technical · Context and memoryHow an employee remembers

Memory is written by hooks.

A hosted model keeps nothing between sessions. Here, the agent writes typed facts while it works, a hook files them when the session stops, a nightly job curates them, and the next session starts with the index and the last handover already loaded.

Retain blocks, written during work

- W @Client: contract signed 2026-08-26
- O(c=0.80) @Market: US-first is the right bet
- B @Deploy: build failed on the CDN step
- C @Daksh: approves SEO ships in the group

W is a verified fact, O an opinion with a confidence score, B an experience, C a contact update. Every line carries an @Entity tag, which is the retrieval key across sessions.

SessionLearnsemits Retain blocks as it works
Stop hookSavesroutes lines to inbox/ by prefix, rewrites handover.md, commits, pushes
04:30Curatespromotes inbox lines into the bank under a guard
Session startRecallsindex, handover, work brief injected in priority order

The bank

memory/bank/ with world/ for facts, opinions/ for scored judgements, experience/ for dated events, contacts/ one file per person, inbox/ as the landing zone. index.md maps entities to files and is kept under 40 lines because it is injected whole.

Two more stores

state/handover.md carries the last session's mechanical summary and an optional written reflection. Daily memory files decay on purpose; only bank-promoted content lasts.

Source: skills/context-engine/SKILL.md, hooks/state-persist.sh, hooks/context-loader.sh, memory/bank/index.md6
Technical · Context and memoryThe mechanical layer

Hooks run outside the model and can deny a call.

Registered in the workspace's Claude Code settings, gated on the project directory so they never fire in unrelated sessions.

HookEventWhat it doesWhy it is there
context-loaderSessionStartInjects bank index, handover, today's memory tail, inbox tails and flags, most important firstThe session starts with context instead of a blank page
block-secretsPreToolUseDenies reads of .env, id_rsa and id_ed25519, .pem, .key, AWS and netrc files; blocks printenv and export dumps; blocks curl or wget with a secret variable; blocks base64-decoded payloads piped to an interpreterThe security floor. Exit 2 denies the call outright
content-redactPostToolUseScans tool results for Anthropic and OpenAI keys, GitHub tokens, AWS keys, long bearer tokens and JSON password fields, and warns before they reach the modelA second net if a secret slips past the first
agent-model-gatePreToolUse (Agent)Denies any subagent launch without an explicit model tierCost control; cheap work goes to cheap models
discipline-trackerPostToolUseNudges a memory write at 8 tool calls and a handover checkpoint at 15; soft break at 150, hard warning past 200Bounds an unattended session
pre-compactPreCompactExtracts retain, decision and todo markers from the transcript and forces a memory flush before the context window is truncatedLong jobs survive compaction
state-persistStopExtracts Retain blocks and decisions, appends to today's memory, routes to the bank inbox, rewrites handover.md, commits and pushes. Never abortsPersistence with no user action
should-sandbox, edit-watcherPostToolUse, StopAdvisory only: nudges large outputs to a file, and logs later edits to emitted artifacts with a diffToken hygiene and an edit trail
Source: ~/trejon/config/hooks.json and ~/trejon/hooks/*7
Technical · Context and memoryNightly curation

Dreaming: the bank gets tidier while the company sleeps.

At 04:30 a Sonnet run reads the inbox and the index, promotes what deserves a permanent file, merges duplicates, and logs every change. Its prompt scopes it to memory/bank only. It cannot touch identity, state or skills, and it cannot push, message or reach the network; the wrapper script does the commit.

  • Conflicting facts are kept side by side and the older one is marked superseded with a date. Nothing verified is deleted for being unused.
  • A recall counter scans real transcripts for which bank files get read, so promotion follows use. Low recall can mark a file cold, never delete it.
  • Before the commit, dream-guard.sh rejects any deleted curated file and any file that lost more than 40 percent of its lines. A rejection wakes the Inspector.

From the real DREAMS.md log

2026-08-21
promoted: 27 lines into 9 new curated files
merged: 8 duplicate lines
superseded: 1 conflicting fact
left in inbox: 0

2026-08-24
nothing to promote

Where the design comes from

The guard pattern (snapshot before rewrite, keep and cite, a separate diary) follows OpenClaw's published Grounded Dreaming design. The usage-weighted recall signal is ours.

Source: bin/dream.sh, workflows/DREAM.md, tools/recall-count.py, dream-guard.sh, memory/bank/DREAMS.md8
Technical · Context and memoryWork tracking

Knowledge in the bank, work in the graph.

Work items live in beads, a dependency-aware issue tracker stored in Dolt and synced through the same git remote. The boundary is a written rule in both directions: identity, contacts and lessons never move into the tracker, and tasks never live in prose.

Session start

bd ready

The hook injects what is unblocked right now, so the employee resumes instead of re-deriving the plan.

On discovery

bd create

Found work is filed the moment it turns up, with a priority and a reason.

Dependencies

bd dep add

Blockers and epics are edges. The tracker knows what is waiting on a human.

Every stop

snapshot and push

Issues are exported to a diffable jsonl file and the Dolt data is pushed, so the history survives any one machine.

Source: .beads/, state/beads-issues.jsonl, docs/agents/issue-tracker.md9
Technical · Core agentsThe roles that run the office itself

Ten core roles.

👑

always on

Trejon

The HQ listener. Full-agency runs for named owners, replies with results.

🔎

every 30 min

Inspector

Fleet health watchdog and the target of every failure hook.

every 10 min

Governor

Detects usage caps, flips the fleet tier, probes for recovery.

💸

before each run

Budget keeper

24-hour output-token caps per employee and per fleet.

🌙

04:30

Dreamer

Nightly memory curation under the shrink guard.

🧹

Sunday 08:00

Caretaker

Log truncation, digest cleanup, weekly Drive link sweep.

🔌

always on

Switchboard

The WhatsApp sync daemon; downloads media for every employee.

📥

every 3 min

Secretary

Triages the trejon@ inbox and keeps the CRM sheet.

📋

4 shifts

Standup crew

Morning, midday, end of day and night digests.

🥋

Sunday 05:30

Sensei

Reviews the week's transcripts and proposes skill improvements.

All ten are rows in roster.json with a unit, a model, a memory cap and an OnFailure escalation. The dashboard flags any timer that is not on the roster.

Source: /root/sage-server/org3d/roster.json, systemctl list-timers10
Technical · Core agentsThe HQ listener in detail

Trejon, the boss employee of this deployment.

hq-listener.py v3 runs as trejon-hq.service with Restart=always. It reads the HQ WhatsApp group through the local sync database and turns messages from named owners into full-agency Claude runs on the box.

Result-only replies

A command runs on a worker thread. The reply is what the work produced, checked against logs. A heartbeat "on it" only appears if the job passes 75 seconds.

Trust tiers

Two named senders map to a full-tools run. Anyone else in a team group gets a read-only Sonnet run with Read, Glob and Grep. Messages the agent wrote itself carry a prefix and are skipped, so it cannot loop on its own output.

Media is mandatory

The sync daemon downloads media. wait_media() polls the database row for the local file path for up to 25 seconds, transcribe_audio() handles voice notes, and the path goes into the prompt so the model reads the file natively.

Light mode

When the seat is capped, the same claude binary is pointed at a free provider through ANTHROPIC_BASE_URL, with read-only tools and an instruction never to claim work it cannot do.

Deferred restart

When it changes its own code it compiles the file, touches hq/RESTART-PENDING and exits when idle. systemd brings it back on the new code. It never kills a run in progress.

Send gate

A send needs the destination in send-allowlist.yaml and the standup/ENABLED flag to exist. The check is in the send function, not in the prompt.

Source: /root/sage-server/standup/hq-listener.py, trejon-hq.service, AGENT-GUIDELINES.md s1011
Technical · Core agentsThe watchdog

The Inspector.

  • Runs every 30 minutes as ops-sentinel.timer, and immediately whenever one of about 20 units fails, through an OnFailure=ops-sentinel.service drop-in.
  • Checks failed systemd units, roster employees whose last run failed, enabled timers with no next run, a governor stuck degraded for more than 6 hours, disk above 85 percent, available RAM under 300 MB, and the dashboard API.
  • Writes ops-report.json and announces to the HQ group only on a state change, at most once an hour, with a three-line diagnosis from a read-only Sonnet run, or a canned line if the seat is capped.
  • Read-only apart from its own state directory. It can see everything and change nothing.
The office tour step introducing the Inspector, the watchdog that patrols every desk
Source: ops-sentinel.py, ops-sentinel.timer, /etc/systemd/system/*.service.d/onfail.conf12
Technical · Core agentsCost and capacity control

The Governor and the Budget keeper.

Any employeeHits a capthe wrapper's regex matches a cap-shaped error
governor.py report-limitOne probe firsta tiny real call confirms the cap before the tier flips, so a transient error can't degrade the fleet
model-state.jsontier: degradedheavy runs skip or downgrade; the flip is announced to HQ
Every 10 minProbeonly while degraded, so probing costs nothing in normal operation
Recoverytier: paidannounced, and the next runs use the full chain again

budgets.json

window_h 24, default_out_cap 500,000, fleet_out_cap 6,000,000, and per-employee overrides between 300,000 and 3,000,000 output tokens. Sized at roughly three times observed peaks, so only a runaway trips.

budget.py check

Called in the shell wrapper before claude starts. Exit 3 means over budget and the run is skipped. Any internal error exits 0, on purpose, so a broken sentinel can never stop the fleet. State refreshes every 10 minutes from transcript tails; it is an estimate, not billing.

Live at capture

Fleet at 3.56 million of 6 million output tokens in the trailing 24 hours. The HQ listener at 55 percent of its 3 million cap, the SEO engine at 57 percent of 2.5 million. No employee over budget.

Source: model-governor/governor.py, budget.py, budgets.json, budget-state.json, model-state.json13
Technical · Core agentsModels and process limits

Which model, and how much memory.

DefaultSonnet for most employees. Fable and Opus are reserved for three flagship runs: the SEO engine, the outbound desk and the grant scout.
Chainclaude-fable-5, then claude-opus-5, then sonnet. Each attempt is logged; a cap moves down the chain, any other failure stops the run and reports.
Other providersThe daily leads digest runs on a free GLM model and never touches the Claude seat. Light mode points the same CLI at a free provider through an environment override.
SeatsOne subscription seat per product line, with its own config directory. Never one token relayed across workloads.

Memory caps on every AI unit

MemoryHigh 1600M and MemoryMax 2000M in a systemd drop-in, up to 2400M for the heaviest run. Enforced by the kernel's cgroup controller. Bot units get much smaller caps sized to the job, down to 48M for the public feed server.

14of 14AI units with a cap, per the latest self-audit
20units wired to the Inspector through OnFailure

Restart policy

Long-running services use Restart=always with a 10 to 15 second delay. Timers use Persistent=true so a missed run catches up after downtime.

Source: /etc/systemd/system/*.service.d/memcap.conf, roster.json model column, AGENT-GUIDELINES.md s2, s6, s714
Technical · Operating contractThe rules every employee follows

The operating contract, in thirteen sections.

AGENT-GUIDELINES.md is the checklist any session deploying an employee follows top to bottom. The self-audit script checks the host against it.

SectionRuleSectionRule
s1 UnitOne systemd unit per employee, named by product, with an EnvironmentFile for secrets and its own working directorys8 Trust checkPin exact versions, vet the publisher, read install hooks, prefer official registries, audit after install
s2 ModelsSonnet by default, the Fable to Opus to Sonnet chain for flagship runs, the shared cap regex, governor checks before heavy works9 BudgetsPer-employee 24-hour token caps, checked before dispatch
s3 RosterEvery employee is a row in roster.json with id, role, org, unit, type and model. Unregistered timers are a bugs10 MediaAny employee that reads a human channel must handle voice, images, video and documents. Deferred restart pattern
s4 MessagingNever send to anyone outside the allowlist, and only while the ENABLED flag existss11 Email formatEvery outbound body passes the formatter before the approval check
s5 HygieneIdempotent runs, state in the employee's own directory, append-only capped logs, no secrets in code or logss12 LinksEvery Google link is run through the share check before it leaves
s6 ReliabilitySmoke test by hand before enabling a timer, OnFailure to the Inspector, exit code conventions13 DesignVisual output loads the design skills and passes a pre-flight
s7 Memory capsMemoryHigh and MemoryMax on any unit that runs claude
Source: /root/sage-server/AGENT-GUIDELINES.md15
Technical · ChannelsWhatsApp and Telegram

Inbound is open. Outbound is 24 destinations.

wacli 0.15.2 runs as wacli-sync.service with media download on. Employees read from its local SQLite store. Sending is a code path with two conditions and no model in the loop.

Allowlist

send-allowlist.yaml holds 24 approved destinations, each with a comment on its role. Client-facing groups are deliberately excluded. The same file is read by the listener, the governor and every messaging employee.

Group per role

The SEO engine posts only to the SEO group, the outbound desk only to the outreach group, the leads digest only to the BD group. Each employee's settings scope its send permission to its own group id.

Approval patterns

The outbound desk waits for an explicit go on each send batch. Production deploys wait for the marketing owner's written go in the group. The leads digest holds any batch with fewer than two verified leads.

Telegram

The Coach runs on the official Bot API with no third-party dependencies. It sends to a single private chat pinned the first time the operator writes to it, re-checked mechanically on every send, and it refuses any other chat id even if its state file is edited.

Client channels

Customer-facing deployments use the WhatsApp Business API or Slack and Teams apps. The self-hosted sync client stays for internal operations only.

Voice both ways

Outbound voice uses edge-tts through a shared script, transcoded to Opus. Inbound voice notes are transcribed locally. If the voice path fails, the text still goes.

Source: wacli-sync.service, send-allowlist.yaml, standup/ENABLED, trejon-coach/coach.py, tts.sh, transcribe.sh16
Technical · ChannelsA named seat in Google Workspace

trejon@simplifygenai.com has exactly five permissions.

The employee holds its own Workspace identity through a delegated service account with domain-wide delegation. Each scope was granted on its own and tested end to end from both machines.

gmail.modifycalendarcontactsspreadsheetsdrive.file

drive.file covers files the app itself created or opened, not the company Drive. There is no Docs scope and no admin scope.

Helpergw.py, a Python script with no pip dependencies that signs its own JWT with the openssl CLI. Subcommands: token, api, send, env-set.
SecretaryActs only on senders in an allowlist file. Replies in thread. Files client threads into the CRM sheet's Pipeline and Activity Log tabs. For an external thread it drafts the reply and sends the draft to the requester, never to the client.
Formatting and linksmailfmt.py normalises every outbound body before the approval check. gshare.py sets every shared link to anyone-with-link, editor, not discoverable, and a weekly sweep covers every file the account owns.
NeverThis mailbox does not send cold outreach. Cold email runs on a separate sending fleet with its own gate.
KeyThe service-account key sits in a 600-mode file in a 700-mode directory on each machine, loaded through the environment. Enterprise deployments keep it in a secrets manager with rotation.
Source: tools/gw.py, bin/mailfmt.py, bin/gshare.py, trejon-mail/allowlist.txt, AGENT-GUIDELINES.md s11 and s1217
Technical · Security modelWhat we design against

The threat model.

An agent becomes exploitable when three things meet: access to private data, exposure to untrusted content, and a channel to send things out. Every employee here has the first two by definition, because that is the job. So the control sits on the third: nothing goes out unless code says it can.

  • OWASP's 2026 list names prompt injection (LLM01), excessive agency (LLM03), supply chain (LLM04) and unbounded consumption (LLM06). The gates, tool scoping, pinned skills and budgets map onto those four directly.
  • Anthropic's own data shows people approve about 93 percent of permission prompts regardless of content. So approvals here attach to destinations and content, not to every keystroke.
Private dataRepository, CRM, inbox, storefront. Needed for the work.
Untrusted inputWeb pages, incoming email, chat messages. Also needed for the work.
Outbound, cut hereWhatsApp: allowlist plus flag file. Email: content-hash approval. Deploys: written go. Money: hard stop. Injected text can change what the model wants to do; it cannot add a line to a YAML file or mint an approval hash.
References: Willison, "The lethal trifecta"; OWASP Top 10 for LLM Applications 2026; Anthropic engineering on permission fatigue18
Technical · Security modelDefence in depth

Eight layers, none of them a prompt.

Read from the outside in. Each one can be verified with a file path or a command on the host.

PerimeterPrivate mesh with two named peers. The dashboard is fronted by an outbound tunnel, so no inbound port is opened for it. A host firewall is part of the deployment baseline.
ProcessKernel memory caps on every AI unit, OnFailure escalation, deferred restarts so an employee never kills its own run.
ModelUsage-cap governor, per-employee 24-hour budgets, an explicit model per unit, subagent launches denied without a model tier.
ToolsTool scope fixed at launch per trust tier. Read-only for non-owners and in degraded mode. The model cannot widen its own scope.
OutboundAllowlist plus flag file, hash-bound single-use email approvals, written go for deploys, hard stops on fees and signatures.
Secrets600-mode env files loaded by systemd. A pre-tool hook denies reads of key files; a post-tool hook flags credential-shaped strings before they reach the model.
MemoryShrink guard before every curated commit, curation scoped to the bank, full git history.
Supply chainNo marketplace. Five installed skills, zero plugins, every source pinned and read before install, an audit script after any change.
Source: security-audit.sh, AGENT-GUIDELINES.md s5 to s9, hooks/block-secrets.py, hooks/content-redact.py19
Technical · Security modelWho can make an employee do what

Permissions attach to the run, not to what the model believes.

Who or whatModelToolsCan it send?Set by
Named owners in HQOpus, Sonnet as fallbackFull tools on the hostOnly to the 24 approved destinationsA sender map in the listener and the allowlist in the send function
Team members in a groupSonnetRead, Glob, Grep onlyInto that groupA fixed --allowedTools list on the command line
Unknown numbernonenonenoNot matched, so never processed
Degraded modeA light providerRead, Glob, GrepStatus onlyAn environment override in the wrapper
Scheduled employeeAs set in roster.jsonAs set in its unit and settingsIts own group onlyThe systemd unit and per-employee settings
Nightly curatorSonnetEdit inside memory/bankNo network, no git, no messagesThe workflow scope and the memory guard
Weekly caretakerSonnetBash, Read, Write, Glob, GrepOne exception report to HQThe unit's tool list
Source: standup/hq-listener.py, maint.sh, workflows/DREAM.md, roster.json20
Technical · Security modelGates on the way out, switches to stop

Before anything goes out.

MessagesDestination in send-allowlist.yaml and standup/ENABLED present. A Python membership test.
Emailoutbound_gate.require_go() needs an approval keyed by sha256 of recipient, subject and body in state/email-approvals.json. Single use, 24-hour expiry, formatter first.
ProductionA written go from the owner in the group. Until then the change stays on a branch.
MoneyFees, signatures, NDAs, interviews and repeated CAPTCHAs are hard stops. The employee records a blocker and exits cleanly.

Stopping things.

Quiet

Remove the ENABLED flag file. All outbound messaging stops fleet-wide.

Step down

Set the governor tier to degraded. Heavy runs skip until a probe clears it.

Starve

Lower one budget in budgets.json. The wrapper skips the next run within ten minutes.

Stop

systemctl stop on any of the 52 units. There is no hidden runtime.

Email is default deny: with no approval token present, nothing leaves. The memory guard exits non-zero and blocks the nightly commit if a rewrite would shrink the bank.

Source: hq-listener.py send gate, bin/outbound_gate.py, model-state.json, budget.py, dream-guard.sh21
Technical · Security modelChecking the host against the rules

The self-audit, and what gets installed.

security-audit.sh is a read-only script that prints PASS, WARN or FAIL per check and exits non-zero on any FAIL. It runs after any install and before a new employee goes live. The latest run returned 0 FAIL.

agent-reachtaste-skillredesign-skillsoft-skillminimalist-skill0 plugins

1 Network exposure

Lists every listening socket and flags any bind that is not loopback or the mesh interface.

2 Send guard

Confirms the allowlist file and the ENABLED flag exist and are intact.

3 Secret file modes

Requires 600 or 400 on the environment file, the dashboard viewer key and the SSH keys.

4 Fleet compliance

Cross-checks every AI row in the roster against live systemd for MemoryMax and OnFailure, and checks every timer on the box traces back to a roster row.

5 Third-party inventory

Lists installed skills and plugins so the footprint is enumerable and reviewable.

6 Budget report

Confirms the budget keeper runs cleanly and prints the per-employee state.

Source: /root/sage-server/security-audit.sh, AGENT-GUIDELINES.md s8. Marketplace incident reporting: Koi Security, Unit 42, Antiy CERT.22
Technical · HostThe box, as measured

What the host looks like.

The whole office runs on one small virtual machine. A client deployment uses the same layout on a host in your cloud.

29registered employees and bots on the roster
52systemd timers on the box, including OS housekeeping
Operating systemUbuntu 24.04.4 LTS
Memory and disk3.7 GB RAM, 38 GB disk with 14 GB free at capture
Uptime at capture29 days, load average about 1.4
RuntimeClaude Code CLI 2.1.197, Node 20, Python 3.12, wacli 0.15.2
NetworkTailscale mesh with two peers; dashboard on port 8940 through a Cloudflare tunnel; the internal trading dashboard bound to the mesh address only
Secrets.claude-env, the dashboard viewer key and the deploy key at mode 600, root-owned, referenced only through EnvironmentFile
StateOne directory per employee under /root/<employee>/state with append-only logs; the shared memory bank at /root/trejon/memory/bank, committed nightly
Other workloadsTwo Docker containers for a mailing list tool and a rank tracker, bound to loopback only
Backupstrejon-backup.timer nightly at 03:30; the repository itself is on a remote
Source: /etc/os-release, free -h, df -h, uptime, claude --version, tailscale status, ss -tlnp, stat23
Technical · HostWhat leaves your cloud and what stays

Data flows.

LeavesPrompts and tool outputs go to the model provider for each run, under that provider's data terms. Google API calls go to Google under the five scopes. WhatsApp and Telegram messages go through their networks. Nothing goes to SimplifyGenAI.
StaysThe memory bank, the work graph, every log, every state file and every secret stay on the host and in your git remote. The dashboard reads from the host and is served through your tunnel.
AccessThe host accepts SSH only over the private mesh from named peers. Operator sessions run the same hooks, so a laptop session cannot read a key file either.

Retention.

Logs

Append-only per employee in its state directory. Two high-volume files are truncated to their last 2 MB weekly by the Caretaker. OS logs rotate weekly.

Memory

Committed to git nightly. Every prior version is in the history. The curator marks facts superseded instead of deleting them.

Approvals

Email approvals are single use and expire after 24 hours. The governor log keeps every tier change. The Inspector keeps its last report and last announcement.

Media

Voice notes, images and documents from chat are downloaded to the host by the sync daemon and referenced by path. They stay on the host.

Enterprise deployments add SIEM export with 90-day retention and a secrets manager, per the baseline on the next page.

Source: per-employee state directories, maint.sh, dream.sh, outbound_gate.py, governor.log24
Technical · DeploymentWhat we set up in your cloud, and how you keep it

The baseline we deploy with.

Everything on the running fleet, plus the controls a security review expects. We walk your team through the evidence before the first employee goes live.

You keep everything

Identity, memory, schedules and rules are files in a repository you own. A bootstrap script restores a machine from a clone: dependencies, the work graph, the schedules, the plugins. Secrets are restored by hand, on purpose. The first session on a new machine runs the onboarding interview.

Network

Host firewall on, mesh interface only, no public inbound ports, dashboards behind authenticated tunnels.

Isolation

One service user or one container per employee, with the same memory caps and failure hooks.

Secrets

Your vault (HashiCorp, AWS or GCP) with rotation, and short-lived tokens where the provider allows.

Audit trail

Structured, tamper-evident logs exported to your SIEM and kept for 90 days.

Inbound scanning

Injection and exfiltration pattern checks on channel text and on memory writes, on top of the code gates.

Channels and assurance

WhatsApp Business API, Slack or Teams apps for anything customer-facing. A third-party penetration test on the deployed host, and a SOC 2 path if procurement asks.

Needs: a Linux host with 4 GB of RAM or more in your cloud, a model seat, a chat channel, one owner25
Technical · ComparisonOpenClaw 2.0, Hermes Agent, SAGE

Compared with the open-source frameworks.

AreaOpenClaw 2.0Hermes AgentSAGE
Spend caps per agent Requested March 2026, draft PR still blocked on review No hard cap. Its estimator under-counted spend by 3 to 5x (issue 94408) Budget checked before each run, per employee and per fleet
Third-party code Open marketplace. 1,184 malicious packages in one campaign, CVE-2026-25253 Skills ecosystem with a write-approval queue No marketplace. Pinned skills, audit after install
Memory tidying Grounded Dreaming Capped files, manual review Same guard pattern, plus recall-weighted curation
Work tracking None apart from memory Cron tasks and a queue Dependency graph, synced through git
Fleet operations Workspace per agent Bot mode and a scheduler Roster, timers, watchdog, failure hooks, memory caps
Outbound approval A config setting Approval modes and a blocklist Destination and content gates in code
Google Workspace Google Chat channel Email channel Delegated service account, five named scopes
Sandboxing Docker sandbox, off by default Seven execution backends Cgroup caps today, containers in the deployment baseline

shipped   partial   missing. Sources: openclaw/openclaw issue 42475 and PR 104060, docs.openclaw.ai, NousResearch/hermes-agent issues 94222 and 94408, Unit 42 and Koi Security research, all read on 2 September 2026. The memory guard design and the audit-script idea came from OpenClaw. Reviewer questions go to trejon@simplifygenai.com and get an answer from the operator, not from an agent.

End of the technical brief26