Watch
0
0
Fork
You've already forked hyperhive
0

ruth is created from a ruth archetype that runs sonnet

This commit is contained in:
atlas 2026-11-11 01:54:01 +01:00
commit 5233259b3b
4 changed files with 236 additions and 115 deletions

View file

@ -57,4 +57,28 @@
prompt = builtins.readFile ./prompts/reverse-engineer.md;
};
};
ruth = {
module =
{ lib, ... }:
{
services.hyperhive.agent.icon = lib.mkDefault ./icons/ruth.svg;
};
meta = {
icon = builtins.readFile ./icons/ruth.svg;
description = "The manager agent the setup assistant creates. It runs on sonnet and holds the default permissions plus manage_root_agent (it recovers the other agents), logs and metrics.";
permissions = [
"messaging"
"meta"
"inbox"
"execution"
"manage_root_agent"
"logs"
"metrics"
];
prompt = builtins.readFile ./prompts/ruth.md;
inference = {
model = "sonnet";
};
};
};
}

View file

@ -0,0 +1,18 @@
<svg width="300" height="300" viewBox="0 0 300 300" role="img" xmlns="http://www.w3.org/2000/svg">
<title>ruth</title>
<desc>Ruth archetype icon: a hub linked to three nodes, amber on dark</desc>
<defs>
<clipPath id="clip"><circle cx="150" cy="150" r="140"/></clipPath>
</defs>
<g clip-path="url(#clip)">
<rect width="300" height="300" fill="#0a0600"/>
<line x1="150" y1="150" x2="150" y2="70" stroke="#ffb300" stroke-width="10" stroke-linecap="round"/>
<line x1="150" y1="150" x2="80" y2="190" stroke="#ffb300" stroke-width="10" stroke-linecap="round"/>
<line x1="150" y1="150" x2="220" y2="190" stroke="#ffb300" stroke-width="10" stroke-linecap="round"/>
<circle cx="150" cy="150" r="26" fill="#ffb300"/>
<circle cx="150" cy="64" r="16" fill="none" stroke="#ffb300" stroke-width="10"/>
<circle cx="74" cy="194" r="16" fill="none" stroke="#ffb300" stroke-width="10"/>
<circle cx="226" cy="194" r="16" fill="none" stroke="#ffb300" stroke-width="10"/>
</g>
<circle cx="150" cy="150" r="140" fill="none" stroke="#ffb300" stroke-width="3" opacity="0.6"/>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View file

@ -0,0 +1,19 @@
# Ruth
You are the swarm's manager: the agent the operator asks first, and the one who
recovers the others when they break. You hold the wide permissions so that the
rest of the swarm can run with narrow ones, and you treat that as a duty, not
a license.
You read before you act. When an agent misbehaves, look at its state, its logs
and its recent turns, and say what you found before you change anything. A
repair you can't explain is a second problem.
You change as little as the fix needs. Changes to other agents' configuration go
through a pull request the operator reviews, not around it. For your own
configuration, ask the operator for changes. When a
request would reach beyond what the operator asked, stop and ask.
You keep the operator informed in short, plain messages: what you looked at,
what you did, what is left. You say so when you don't know, and when something
you did didn't work.

View file

@ -291,7 +291,7 @@ let
# output and prints it as JSON. A derivation or a path in `meta` would
# make that evaluation build or copy something; a function would not
# print at all.
name = "the built-in archetypes carry a module and a meta of plain data, and reviewer can run commands and android-dev installs its toolchain and reverse-engineer turns rea on, and each sets an svg icon as a default, and each has a non-empty prompt under the 64 KiB cap";
name = "the built-in archetypes carry a module and a meta of plain data, and reviewer can run commands and android-dev installs its toolchain and reverse-engineer turns rea on, and each sets an svg icon as a default, and each has a non-empty prompt under the 64 KiB cap, and ruth runs sonnet with manage_root_agent, logs and metrics";
ok =
let
plain =
@ -325,7 +325,19 @@ let
(archetypes.reviewer.module { inherit lib; }).services.hyperhive.agent.icon
(archetypes.android-dev.module { inherit pkgs lib; }).services.hyperhive.agent.icon
(archetypes.reverse-engineer.module { inherit lib; }).services.hyperhive.agent.icon
];
(archetypes.ruth.module { inherit lib; }).services.hyperhive.agent.icon
]
&& metas.ruth.inference.model == "sonnet"
&& lib.all (p: lib.elem p metas.ruth.permissions) [
"messaging"
"meta"
"inbox"
"execution"
"manage_root_agent"
"logs"
"metrics"
]
&& !(lib.elem "web_tools" metas.ruth.permissions);
}
{
# `docs.enable` reads `docs.source`, whose default builds from the