HERMES V2Architecture · proof run
frozen for proof run 2026-09-23
Overview Design Artefacts Enforcement Proof run
Skynet · coding lane · frozen for the first proof run

Completion proven by evidence, never by an agent's claim.

An idea goes through planning, decomposition, execution and verification with little human involvement. The goal is reliable, controlled autonomy, not maximum autonomy.

3 roles + EPO 5 stages 3 checkpoints 64K peak ceiling 2 launches max
HERMES DISPATCHER PLANNER EXECUTOR VERIFIER EPO
3Agent roles
5Stages
3Checkpoints
64KPeak context ceiling
2OpenCode launches max
5Proof demonstrations
Where this stands

Scope is frozen until the proof run passes

Only corrections the proof run shows are needed are allowed, and each one is logged with the demonstration that forced it. No new mechanisms, roles or features.

5demonstrations to pass

Delivery, blocking and retry ceiling, stale verdicts, recovery, and Executor restrictions (§9).

0agents with merge rights

The EPO merges. Repository protection holds the line against every process.

1first build item

Prove the guard plugin can identify which profile is calling it (§7).

Contents

Reading order

Each chapter links to its section below. Section numbers match the markdown file.

§1

Purpose

An idea goes through planning, decomposition, execution and verification with little human involvement. Completion is proven by independently checked evidence, never by an agent's claim. The goal is reliable, controlled autonomy, not maximum autonomy.

ONLY
COPY

The previous full design is at archive/hermes-v2-architecture-2026-09-21.md. Until the moves below happen, it is the only copy of three things.

ContentIn the archiveMoving to
Hardware and model placement§11Confluence
General-assistant lane status§10Confluence
Automation backlog§9Jira (SKY → Hermes V2)
§2

Principles

Evidence, not assertion

An agent cannot mark its own work done. A status label proves nothing without the evidence behind it.

Separation of duties

The Executor writes code. The Verifier judges and never fixes. The Planner plans and never implements.

Hand-offs through disk only

Every transition is a committed artefact read by a fresh session. No two roles ever share a live session.

Resolve ambiguity before code

Contradictions and false premises are cheapest to catch before dispatch.

Enforcement lives outside the model

Prompts and AGENTS.md guide behaviour. Hooks, credentials and repository settings enforce it.

Checks earn their place

Which failure does it detect? Does a known-bad example fail it? Is it worth its maintenance cost? Every check has limited coverage; state the limit rather than treating it as a disqualifier.

§3

Roles

Three agent roles plus the EPO. No Orchestrator model in the coding lane for now: Hermes' dispatcher assigns cards by profile, reclaims stale claims, promotes cards whose dependencies are met, and dispatches review. The EPO creates the starting card. Escalation routing is a script.

RoleDoesNever
Planner / DecomposerPlan mode: discovery with the EPO, the brief, and investigating premises. Decompose mode: tasks, dependencies, contracts, checks and packets.Implements, or guesses past an unresolved ambiguity
ExecutorOpenCode plus a coding model. Implements one packet in an isolated worktree, runs the declared checks and commits to the task branch.Marks itself done, writes to main, or changes scope
VerifierChecks the brief (CP1), packets (CP2), tasks and the milestone (CP3) against evidence it obtains itself.Edits product code or the record
EPO humanApproves scope and consequential decisions, answers escalations, reviews the milestone and merges.
INDE-
PENDENCE

The Verifier reviews both the Planner's and the Executor's work, so its model should come from a different model family than both. That is a starting preference, not proof of independent judgement. Independence is tested by whether the Verifier catches known defects.

What each role needs from its model

Planner / Decomposer

The strongest reasoning available, and long native context.

Executor

Reliable tool calling and coding within the packet context budget (§5.2). One profile with two possible routes, local or cloud.

Verifier

Enough reasoning to challenge the Planner's output, not just a different model, plus independence as above.

Executor routing. Local or cloud is the packet's route field, set by the Planner at decomposition and fixed for the task's life. A local execution never runs at the same time as a local Planner session. The rule for choosing a route isn't defined yet; for the proof run, every task uses one route.

§4

Workflow

Five stages, three checkpoints. People are involved only at scope approval, consequential decisions, escalations, and milestone acceptance and merge. Everything else is automatic.

Automated Checkpoint Human gate
01

Capture

The EPO records the idea as a card. No shaping.

human
02

Plan → CP1

The Planner and EPO agree scope, what is out of scope, acceptance criteria and constraints. Any assumption that could invalidate the approach is investigated, and the output is evidence, not prose. The session ends when the brief is committed.

CP1: the Verifier checks the brief for self-contradiction and unsupported claims. The EPO approves scope.

checkpoint
03

Decompose → CP2 priority

The Planner, in Decompose mode, produces tasks, dependencies, contracts and each task's checks. Packets may be drafted ahead of time.

CP2: deterministic checks plus the Verifier on every packet, which is validated and pinned immediately before dispatch.

checkpoint
04

Execute ⇄ verify

Each attempt runs in a fresh Executor session. The Verifier then checks the committed revision in a fresh session. Per-task verdict; at most one corrective retry.

auto
05

Close → CP3 → EPO merges

Combined checks run as tasks land, and again on the complete milestone. For anything with a UI, this includes rendering and measuring the real screens. A review bundle is generated for the EPO.

CP3: milestone verification is split into verification tasks by area plus an integration pass, each within the context budget. All of them check the same milestone revision. The integration pass checks behaviour that crosses areas and reconciles combined coverage against the source, so nothing falls between areas. Then EPO acceptance, then the EPO merges.

human

Review bundle

The milestone PR description is a plain-language summary the EPO can act on without another agent translating it. It is generated by a script, not written freehand.

§5.1

Project record — record.yaml

All artefacts live in the project repo, and git history is the archive. The record is one structured file holding the current state only: no archive files and no events. Superseded values stay in git history; the log and telemetry are enough for events.

FieldNotes
id, versionReferenced by pointer as {id, version}. The record is never restated as prose in packets.
typedecision · constraint · assumption · contract · observation
statementThe value itself. A figure names its subject, unit and context.
statusunverified · verified
evidenceRequired for verified: the command or harness that produced it, the revision it ran against, and the artefact path. The checker rejects verified without resolvable evidence.
approvedRequired on decision and constraint entries: EPO plus a reference.
changeOn edit: material (the default) or cosmetic, set explicitly by whoever makes the edit, never inferred. A cosmetic change is re-pinned automatically; a material change stops any task that pins the entry. When unsure, mark it material: a false stop costs less than a missed change.

Ownership by type

Decisions & constraints

Those that change scope need EPO approval.

Observations

Recorded with their evidence; no approval, since an approval can't make an observation true.

Assumptions

Recorded as explicitly unverified.

Contracts

Proposed by the Planner in Decompose mode; approved at CP1 or CP2.

LABELS
≠ PROOF

Invalidating assumptions. An assumption that could invalidate a task must be backed by relevant evidence before that task's packet passes CP2. The label alone doesn't count.

§5.2

Task packet — packets/<task-id>.yaml

Design test: could a fresh session, given only the repo, AGENTS.md and this packet, complete the task correctly?

# fields
task_id
objective
acceptance_criteria
depends_on
record_refs        # pinned {id, version} pointers
constraints
checks             # which checks apply, and who runs them
human_checks
route              # local or cloud (§3)
inputs             # files the Executor needs to read + files the checks need to run; only these go in its workspace
output_cap         # max tokens generated over the whole session, incl. drafts, rewrites, revisions (not final file size)
context_estimate   # the five-term ledger below
attempt            # copy of the trusted counter at dispatch; records the attempt, isn't the allowance

Packet identity

The git blob SHA of the committed packet file, not a version field someone has to remember to increase. Any edit produces a new identity, and that invalidates any verdict bound to the old one.

Validated and pinned at dispatch

Every reference resolves · pins are current · dependencies are verified · it fits the context budget.

§5.2

Context budget

Two quantities are tracked separately. Peak context is the largest single model request: its prompt plus the response allowance. Cumulative usage is the total across all requests in a session; it drives cost and time. The 64K ceiling applies to peak context.

CONTEXT ESTIMATE AT CP2 — ILLUSTRATIVE, NOT TO SCALE 64K CEILING Fixed overhead per configuration Inputs + re-read allowance Generated output ≤ output_cap, incl. rewrites Tool output per planned run Reasoning reserve Doesn't fit → split before dispatch. Never dispatched in the hope that it fits.
Figure 1. The estimate models how the transcript grows, not just the final output. Segment widths are illustrative only.
TermWhat it covers
Fixed overheadHarness system prompt, tool schemas and AGENTS.md. Measured per configuration. Any change to the harness version, AGENTS.md, tool schemas, harness config or model invalidates the measurement.
InputsThe declared inputs, with an allowance for re-reads.
Generated outputEverything the task generates, bounded by output_cap, including drafts, rewrites and revisions.
Tool outputAn allowance per planned check run. By default checks print a summary and any failures; full tables are saved as artefacts, not printed into the session.
ReasoningA reserve.
SITE-
BUILD

Generated output and tool output dominated the site-build experiment, ahead of the files read. Counting only the bytes read measured about 12% of the real load. Work is split so each task's generated output stays within its cap.

At runtime: measurement and prevention are separate jobs

MMeasurement

Reads token usage from each model call (§9), never from the Executor's own report. It shows an overrun, but only after the response.

PPrevention

A check before each request. If the prompt plus the response allowance would exceed the ceiling, the request is refused, and the task stops and is re-decomposed.

×No silent truncation

Nothing is silently truncated or compacted. Any automatic context compaction in the harness is turned off.

The same instrumentation applies to every session with a budget, including CP3 verification tasks.

§5.3

Evidence and verdicts

The Verifier runs the declared checks itself, against a clean checkout of the committed revision. Results reported by the Executor are informational only and never count as evidence.

EXECUTOR REPORTS STATE READY_FOR_VERIFICATION BLOCKED FAILED VERIFIER VERDICT PASS REWORK ESCALATE HUMAN_REVIEW EVERY VERDICT IS BOUND TO · commit SHA · packet blob SHA · pinned record versions · attempt number later commit or material change → invalid
Figure 2. An old PASS never carries forward. A task PASS completes that task's card; it is not milestone acceptance and not a merge decision.
CONFIRM
AT SETUP

Where verdicts and evidence live (proposed). The verdict is the metadata on the Verifier's final Kanban call (kanban_complete, kanban_request_changes or kanban_block). The guard plugin receives that call's arguments, so it can check the verdict before the call goes through. Evidence artefacts are written outside the worktree to evidence/<task-id>/<attempt>/<sha>/ and are never committed to the task branch, because committing would change the commit the verdict points to.

Truth precedence

Machine truth

The record and the packet.

Execution state

The Kanban board.

Evidence

CI, test and harness artefacts.

Behaviour · narrative

AGENTS.md holds agent rules. Confluence is narrative only.

§6

Checks

Three layers at every checkpoint: deterministic (code, which must reject reliably), judgement (the Verifier) and human-required (stated plainly, never guessed). Anything automatable belongs in code.

deterministic Baseline

Applied to every brief and packet. Each must pass a known-bad and known-good example before it is trusted, and must reject its cases every time.

  • Required fields are present, references resolve, and pins are current.
  • verified entries carry resolvable evidence.
  • Every figure has a subject, unit and context filled in (presence only; meaning is a judgement check).
  • Every supersedes reference points to an entry that exists and is current.
  • Nothing measures a file the same task also changes, unless flagged to be re-measured.

judgement Baseline

Each finding cites its location. These are the checks benchmarked against defective and clean examples.

  • The brief or packet contradicts itself
  • It contradicts the record, including a position it changes but does not supersede
  • A figure's subject is too vague to identify what was measured

conditional Only when triggered

  • "Reuse X" must quote what X returns
  • "Complete set" must state the search that produced it
  • Claimed identities over a bounded domain are enumerated, not reasoned about

New checks are added when a defect slips through, and they are specific to where they apply unless they prove universal.

Task-specific checks

1 · Plan

The EPO says what would make the work wrong, in plain words.

2 · Decompose

The Planner turns each statement into a check. The EPO never writes check scripts.

3 · CP2

The Verifier judges whether each check measures the right thing, not just whether it runs, proving it with a known-bad case where it can.

COVERAGE

Coverage is stated, never assumed. Every check and harness run records what it covers and what it doesn't, including how the app was run: viewport, motion settings, data and environment. A harness that runs the app in a way users never see will confirm false claims, with numbers. That is exactly how the Undrlit render harness certified sheets in reduced-motion mode. When a check is asked a new kind of question, its coverage statement is re-checked.

Rendering and measuring (anything with a UI)

Headless browser

At the target viewports.

Mechanical assertions

Bounding boxes, overlap, overflow, computed spacing.

Screenshots

For visual judgement by the Verifier or the EPO. A visual judgement can block acceptance; where it's a matter of taste, it's a human check.

BASE-
LINE

Measurements are compared against a stored baseline, so a run reports differences. The baseline must be an accepted result. It is updated only when the EPO accepts a milestone, never by an agent; an unaccepted baseline would simply preserve existing errors.

§6

Retries and escalation

A task gets at most two attempts: the original plus one corrective retry, each in a fresh session, with the prior failure written into the hand-off. Same model tier; no mid-task escalation.

ATTEMPT 1 launch recorded fails/crash ATTEMPT 2 fresh session, same tier fails/crash 3RD LAUNCH refused by the gate BLOCKED → new Planner card LAUNCH GATE (runs as root, before every OpenCode launch) reads root-owned ledger · refuses at 2 · appends · hands over to OpenCode user
Figure 3. There is never a third launch. A crashed attempt counts as an attempt.

Escalation categories

CategoryKanbanDestination
Missing decisionkanban_blockEPO
Contradiction (brief, packet or record)kanban_blockPlanner, or EPO if it's a scope issue
Material stale pinkanban_blockRe-validate. If the meaning changed, back to the Planner.
Retry ceiling reachedkanban_blockNew Planner card, linked to its parent
Human-required checkkanban_blockEPO

Stop conditions live in the project-root AGENTS.md, not in prompts or SOUL.md, because AGENTS.md propagates to child agents.

§7

Enforcement

Executor restrictions must hold through every route, not just the Hermes tool call.

LayerHolds againstNotes
Repository protection on main, admin bypass offAny write to main from any processprecondition Protection on private repos needs a paid GitHub plan. Confirm the hijinxlabs plan. If it's Free, use a local bare remote with a server-side hook for the proof run.
Executor credentialsPushing to main, approving PRsScoped to task branches only. Never the EPO's credentials.
OpenCode isolation: separate OS user, no access to ~/.hermes, the Kanban DB or the hermes CLIAlternate routes to completion from inside OpenCode (hermes kanban complete from a shell, writing to the DB)Plus OpenCode's own permission config.
Executor wrapper restrictions: the Hermes executor profileAlternate routes to completion from the wrapper itself, which does need Kanban accessGuard plugin rules refuse terminal commands that call hermes kanban or open the Kanban DB. Defence in depth; a determined bypass is possible. stated accurately A forged completion can't reach main, but it can release dependent tasks and corrupt the evidence trail. Accepting that for a supervised trial is an EPO decision, reported as a partial result.
sdlc-guard plugin (pre_tool_call)Forbidden Hermes tool callsBlocks kanban_complete from the Executor. Blocks completion when the verdict's SHA or pins don't match the current head or record. Blocks the retry beyond the ceiling.
EPO mergesAgent-initiated mergesNo agent holds merge rights.
FIRST
BUILD

Identifying the caller. Each profile runs with its own HERMES_HOME, and Hermes' Kanban hooks carry profile_name, so the guard plugin should be able to tell which profile is calling it. Confirm this on the pre_tool_call hook itself before relying on it; that is the first item to build.

Secrets

Reach processes only through environment variables. Never in packets, the record, evidence or logs.

Approvals

Consequential actions are authorised only by a structured action, such as a GitHub PR approval or a Kanban unblock by the EPO. A free-text chat or card comment never counts: it can be spoofed and is an easy prompt-injection target.

§8

Hermes mapping

Three profiles — planner, executor and verifier — each with its own identity, SOUL.md, memory and pinned toolset. The general-assistant default profile is separate and untouched.

# kanban config
auto_decompose: false
auto_subscribe_on_create: false
review_dispatch: true          # verifier profile as reviewer
max_in_progress: 1           # during the proof run; tasks are serial
# no goal-mode cards: a model judge deciding completion contradicts §2

# workspace (scratch workspaces are deleted on completion)
--workspace worktree:<path> --branch wt/<task-id>

Executor skill sequence

01

Read the card and packet

02

Materialise the worktree

A sparse checkout of the packet's inputs. This reduces incidental reads; it does not enforce read permissions: a sparse checkout can be expanded or turned off, Git's default cone mode includes additional files, and files the checks need in order to run stay readable.

03

Run OpenCode through the launch gate

opencode run --dir <worktree> --format json --auto -m <model> as the OpenCode user, only through the launch gate (§6).

04

Capture the event stream

As evidence and, if it has the token fields, as the Executor's telemetry (§9).

05

Run the checks

06

Commit to the task branch

07

Call kanban_request_review

08

Heartbeat at least every hour

Branching

Tasks run serially within a milestone. Each branches from the previous verified task's head. One milestone branch, one milestone PR. No separate integration task: combined checks run as tasks land.

Retries

A rework request starts a new worker process, giving the fresh session §6 requires. Hermes' own kanban.failure_limit doesn't count rework requests, so the ceiling uses the launch ledger and gate (§6).

Review procedure setup

With review_dispatch on, Hermes starts the Verifier with its bundled sdlc-review skill. Read it during setup; confirm it fits §5.3 (clean checkout, SHA-bound verdict, verdict in metadata) or replace it with our own Verifier skill.

Version pin & backup

Pin the Hermes version and re-test the guard plugin on every upgrade. Profiles, skills, AGENTS.md and plugins are committed to jaysonhijinx/skynet-hermes-config; secrets and .env files excluded.

§9

First proof run

One plausible model configuration, with OpenRouter as the cloud stand-in until the hardware lands. A small set of defective and clean briefs and packets, then a disposable 3–5-task app.

Setup

Before the main run

Budget validation — a focused re-run of the site-build experiment

Splitoversized work

One previously oversized page task, and the whole-site audit.

Compareestimate vs peak

Capture per-call usage; compare each estimate with the measured peak.

Stopruntime prevention

Send one deliberately oversized request to show the runtime stop working.

This validates §5.2 only. The site-build experiment is evidence of output quality. It lacked commits and telemetry, so it does not establish revision-bound verification or budget enforcement.

The run must demonstrate

#DemonstrationPass condition
1Successful delivery with independently checked evidenceEvery task PASS rests on checks the Verifier ran on the committed SHA. The milestone passes CP3 and the EPO merges.
2Immediate blocking and the retry ceilingA contradictory criterion blocks at detection with 0 retries. A fixable-looking failure stops after attempt 2, with an honest failure report and no false READY or PASS.
3Stale verdict rejectionA commit after PASS, or a material record change, invalidates the verdict, and completion is refused until the task is re-verified.
4Recovery after interruptionA worker killed mid-task is reclaimed and re-run with no duplicate commits and no false completion. The relaunch counts toward the ceiling; after a crash on attempt 2, the launch gate refuses a third launch.
5Executor restrictions through Hermes and OpenCodeEach is blocked and logged: kanban_complete from the Executor; injected card text asking for completion or a push; a CLI or database route to completion, tried from inside OpenCode and from the Hermes Executor wrapper; a push to main with the Executor's credentials. Passes only if every route is blocked. If main stays unreachable but a completion route stays open, the result is merge protection demonstrated; completion isolation partially demonstrated — not a pass.

Recorded, not gated

  • Defects caught per checkpoint
  • Verifier false stops
  • Escalations per task
  • Peak prompt tokens vs the dispatch estimate
  • Cost per accepted task

Scope freeze

Scope stays frozen until all five demonstrations pass. Corrections the run shows are needed are allowed, each logged in the setup log with the demonstration that forced it. Nothing else is added: no new mechanisms, roles or features. Changes after the run come from what it showed, not from new design.

§10

Deferred — outside this architecture

Orchestrator model Jira synchronisation Parallel execution + integration task Risk tiering RAG Auto-promotion of record entries Model escalation on capability limits Broad model comparisons Homelab-ops lane Confluence refresh
§11

Decisions in force for the proof run