Skip to content
Merged
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
29 changes: 28 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,32 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

## [0.0.5] - 2026-07-24

### Changed

- Agent turns now receive a compact factual capability map—identity, channel,
Linux computer and `/workspace`, callable tools, memory, skill inventory, and
authority scope—instead of large behavioral manifestos.
- The skill arsenal is lazy-loaded. Models can list available skill metadata
and explicitly read one full procedure when useful; 1Helm no longer injects
the entire playbook library into every turn.
- Removed runtime prose classifiers that rejected, rewrote, or forcibly
re-entered otherwise valid model answers. Security, ownership, and human-only
boundaries remain enforced in tool and server code.

### Fixed

- Human display names are no longer prefixed to user messages sent to models,
preventing names such as the Captain's from contaminating generated search
queries.
- A public web/news search with no parsed results now retries once with a
concise query, so ordinary conversational wording does not consume the turn
or force an immediate refusal.
- Real-model acceptance covers the exact West Hollywood sinkhole prompt,
Skipper's computer awareness in `#main`, lazy skill discovery, and autonomous
resident work on its Linux machine.

## [0.0.4] - 2026-07-24

### Added
Expand Down Expand Up @@ -107,7 +133,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
notarization, stapled tickets, Gatekeeper verification, persistent
Application Support, and isolated Apple container machines.

[Unreleased]: https://github.com/gitcommit90/1Helm/compare/v0.0.4...HEAD
[Unreleased]: https://github.com/gitcommit90/1Helm/compare/v0.0.5...HEAD
[0.0.5]: https://github.com/gitcommit90/1Helm/releases/tag/v0.0.5
[0.0.4]: https://github.com/gitcommit90/1Helm/releases/tag/v0.0.4
[0.0.3]: https://github.com/gitcommit90/1Helm/releases/tag/v0.0.3
[0.0.2]: https://github.com/gitcommit90/1Helm/releases/tag/v0.0.2
Expand Down
17 changes: 10 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ else that deserves an owner. 1Helm provisions a complete world around it:
| **One permanent resident** | Threads are sessions; the employee identity survives them. |
| **One private Linux computer** | Chat tools and Terminal use the same persistent `/workspace`. |
| **Memory with provenance** | Decisions, corrections, preferences, files, and outcomes become continuity. |
| **A serious skill arsenal** | Relevant playbooks activate automatically; routine tool use is not an approval ritual. |
| **A serious skill arsenal** | The agent sees what exists and loads a full procedure only when it chooses one. |
| **Durable obligations** | Follow-ups, timers, workflows, and services can wake the computer back up. |
| **Skipper at the boundary** | Host work, credentials, fleet operations, and cross-channel work route themselves. |

Expand Down Expand Up @@ -98,7 +98,9 @@ discovery, memory, research, email, calendar, contacts, messaging, documents,
spreadsheets, PDFs, meetings, projects, personal operations, travel, finance,
support, software delivery, data, media, infrastructure, security, and more.

1Helm selects only what the task needs. It can also:
The model receives a compact inventory of the arsenal—not all 34 procedures in
every prompt. It can inspect metadata and load one complete skill when useful.
It can also:

- search the focused SkillsMD catalog of ready GitHub-backed repositories;
- install ready skills only after immutable revision pinning, bounds,
Expand Down Expand Up @@ -156,9 +158,10 @@ does not run on the laptop or phone viewing the web UI.
- Durable files, threads, curated memory, Mnemosyne long-term recall,
corrections, follow-ups, and recurring workflows.
- Direct resident → Skipper escalation and automatic Skipper → resident return.
- A bounded outcome gate that keeps operational work moving when a model tries
to stop at a tutorial, unevidenced blocker, unresolved tool failure, or
“Skipper could help.”
- Compact, factual model context: identity, channel, Linux computer and
`/workspace`, callable tools, memory, and the skill arsenal. Security and
ownership boundaries are enforced by the tools and server rather than a
prose grader rewriting model answers.
- Outcome-first Activity with expandable work evidence and a tamper-evident
SHA-256 chain for new operational events.
- Local-first collaboration through an optional workspace domain routed to the
Expand Down Expand Up @@ -228,7 +231,7 @@ A fresh data directory opens first-run setup. The source runtime defaults to
| `PORT` | `8123` | HTTP/WebSocket control-plane port. |
| `CTRL_DATA_DIR` | `./data` | Databases, routing state, uploads, and narrow workspace mirrors. |
| `HELM_CHANNEL_COMPUTER_BACKEND` | `apple` on macOS, `native` elsewhere | Explicit development/test backend override. |
| `HELM_CHANNEL_MACHINE_IMAGE` | `local/1helm-channel-machine:0.0.4` | Versioned Apple channel-machine image. |
| `HELM_CHANNEL_MACHINE_IMAGE` | `local/1helm-channel-machine:0.0.5` | Versioned Apple channel-machine image. |

### Agent-first JSON CLI

Expand Down Expand Up @@ -276,7 +279,7 @@ npm run benchmark:autonomy
```

The autonomy benchmark emits deterministic machine-readable JSON covering the
shipped playbook arsenal, narrow human-blocker gate, bounded outcome gate,
shipped skill arsenal, compact capability map, narrow human-blocker boundary,
resident autonomy tools, wakeable recurring work, and audit-chain invariants
for its fixture. It is deliberately not presented as a live-model success rate
or a complete security score.
Expand Down
43 changes: 20 additions & 23 deletions docs/RELIABILITY.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,28 +9,25 @@ runtimes, including Hermes Agent. 1Helm keeps its own identity and product
model; the useful lesson is to encode dependable behavior in runtime state,
ownership, recovery, and tests rather than depend on a prompt alone.

## Partner behavior
## Model capability context

- Stable identity and persona are separate from operating policy and volatile
channel, memory, and task context. A new task must not accidentally rewrite
who the resident or Skipper is.
- Skipper and residents are reliable operating partners: calm, candid,
resourceful, and accountable for closure. They do not mimic momentary user
frustration, another agent's persona, or untrusted recalled text.
- Safe, reversible action is the default. The agent inspects authoritative
state, acts through the capability already available, verifies the observable
result, and reports it.
- `ask_user` is reserved for evidenced human judgment, credentials, external
authority, or irreversible commitment. Difficulty, harmless ambiguity, and
work the agent or Skipper can inspect are not blockers.
- Read-only questions never install skills, packages, or integrations. A
capability question is answered from authoritative state.
- Tool results are evidence. Transient failures permit a bounded retry with a
changed strategy; an unchanged failed call is not repeated forever; expected
human blockers and permanent failures produce one useful final explanation.
- Memory is provenance-bearing reference data, never a higher-priority source
of instructions. Memory and behavior review happen after the user's answer is
safely delivered.
- Every turn identifies the model as Skipper or the channel's resident and
states the current channel and authority scope.
- A resident is told that it owns an isolated persistent Linux computer, that
its durable workspace is `/workspace`, and that `run_command` executes there.
Skipper in `#main` is told that the lack of a resident VM does not remove its
assigned computers or native tools.
- The model receives the callable tool schemas as its capability surface. Hard
isolation, ownership, credential, and destructive-action boundaries live in
those tool and server implementations.
- The prompt names the size and categories of the skill arsenal. Skill metadata
is available through `list_skills`; a complete procedure enters context only
when the model calls `read_skill` for that skill.
- Channel memory and agent recall are provenance-bearing reference data, never
higher-priority instructions.
- `ask_user` is a validated tool for evidenced human judgment, credentials,
external authority, or irreversible commitment. Routine ambiguity does not
satisfy that boundary.

## Turn lifecycle

Expand Down Expand Up @@ -89,9 +86,9 @@ Every release that touches agent behavior must keep automated coverage for:
| Stop | Stop changes only its selected lane while another turn on the same agent completes. |
| Writers | A stale generation cannot change finalized body or progress state. |
| Restart | Queued work survives and drains; running work is never blindly replayed. |
| Blockers | A legitimate connector/credential blocker preserves the first useful response without an outcome-gate rewrite loop. |
| Blockers | A legitimate connector/credential blocker remains useful without a prose-grading rewrite loop. |
| Questions | Selecting and submitting a structured option works after a live message repaint. |
| Connectors | A final reply is returned once; pending delivery recovers; interrupted delivery becomes visibly uncertain rather than duplicating. |
| Scheduling | Due workflows and follow-ups remain wakeable obligations across restart and computer sleep. |
| Persona | Stable partner identity/action policy remain unchanged when volatile channel/task context changes. |
| Capability map | Identity and machine/tool/skill facts remain compact and correct when volatile channel/task context changes. |
| Product controls | Skipper uses native inventory/lifecycle tools; terminal paths, file Open/Download, trusted skill search, provider routing, and channel deletion are end-to-end tested. |
11 changes: 7 additions & 4 deletions docs/USER_GUIDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -193,8 +193,10 @@ stand in for a news photograph.

## Skills and Learn a new skill

Every resident permanently owns the safe built-in operational arsenal. The
runtime activates only relevant playbooks for the current task.
Every resident permanently owns the built-in operational arsenal. The model
sees a compact inventory, can list the available skills, and loads the full
procedure for one skill only when it chooses to use it. The procedures are not
injected wholesale into every turn.

![Built-in skills and the focused SkillsMD catalog](assets/guide/skills.png)

Expand All @@ -206,8 +208,9 @@ repository-specific procedure is unavailable, choose **Learn a new skill** so
Skipper can inspect supplied local sources, web URLs, and notes in a visible
thread and author a workspace-specific procedure.

A question such as “do we have a calendar skill?” is read-only: it must not
install a package, install a skill, or open an interview.
A question such as “do we have a calendar skill?” can be answered directly
from the agent's actual arsenal inventory without installing anything or
opening an interview.

## Gmail

Expand Down
19 changes: 10 additions & 9 deletions docs/VISION.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,12 +20,12 @@ resident, which verifies the original end-to-end outcome. The Captain is
involved only for consequential human judgment, credentials that only they can
provide, external authority, or an irreversible commitment.

Prompting is not the only enforcement layer. For operational requests, a
bounded deterministic outcome gate objects when a model tries to stop at a
tutorial, an unevidenced blocker, an unresolved tool failure, or a suggestion
that the Captain call Skipper. It keeps the turn open at most three times,
leaves the objection in the work log, and yields normally for explanatory
questions or a genuine structured human boundary.
The runtime gives the model a compact factual capability map: its identity,
channel, Linux computer and `/workspace`, callable tools, memory, skill arsenal,
and authority scope. It does not inject a behavioral manifesto or grade and
rewrite the model's prose. Tool and server implementations enforce isolation,
ownership, credentials, destructive-action confirmation, and human-only
boundaries.

If work depends on time passing, it becomes a persisted obligation. 1Helm does
not equate a model ending a turn with background execution. Follow-ups and
Expand All @@ -34,9 +34,10 @@ and observable completion or failure.

## Durable growth

Residents start with a substantive safe operational arsenal selected by task,
not a handful of generic prompt snippets. Skills define activation, execution,
authority boundaries, recovery, retained state, and verification. Trusted
Residents start with a substantive operational arsenal, not a handful of
generic prompt snippets. The model sees concise skill metadata and chooses when
to load one full procedure. Skills define activation, execution, authority
boundaries, recovery, retained state, and verification. Trusted
external procedures may be discovered and installed automatically only through
bounded, provenance-pinned, scanned, hashed ingestion beneath runtime policy.
Community popularity is not trust.
Expand Down
4 changes: 2 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "1helm",
"productName": "1Helm",
"version": "0.0.4",
"version": "0.0.5",
"private": true,
"type": "module",
"description": "1Helm is the self-hosted home for durable AI employees: one resident, one private computer, compounding memory and skills, and Skipper for every boundary.",
Expand Down
2 changes: 1 addition & 1 deletion public/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,6 @@
</head>
<body class="h-screen w-screen overflow-hidden antialiased">
<div id="app" class="h-full w-full"></div>
<script type="module" src="/bundle.js?v=44190c5b5255"></script>
<script type="module" src="/bundle.js?v=b053ad3e9c4b"></script>
</body>
</html>
17 changes: 9 additions & 8 deletions scripts/autonomy-benchmark.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ try {
db = database.db;
const { q1, run, now, seed } = database;
const { BUILTIN_SKILLS } = await import("../src/server/builtin-skills.ts");
const { outcomeGateObjection, validateAskUserInput, runtimeToolNamesForChannel } = await import("../src/server/bots.ts");
const { runtimePromptTiersForChannel, validateAskUserInput, runtimeToolNamesForChannel } = await import("../src/server/bots.ts");
const { createWorkflow, setWorkflowStatus, stopWorkflowLoop } = await import("../src/server/workflows.ts");
const { verifyAuditChain } = await import("../src/server/audit.ts");

Expand Down Expand Up @@ -45,12 +45,13 @@ try {
});
record("structured_human_boundary", !routine.valid && realBoundary.valid, { routine, real_boundary: realBoundary });

const handHolding = outcomeGateObjection({ request: "Install and verify the CLI", response: "You can run npm install yourself." });
const directBoundary = outcomeGateObjection({ request: "Deploy the site", response: "Skipper completed the host change.", successfulTools: ["call_skipper"] });
record("bounded_outcome_gate", /rejected an operational reply/i.test(handHolding) && directBoundary === "", {
hand_holding_objection: handHolding,
completed_boundary_objection: directBoundary,
rejection_budget: 3,
const prompt = runtimePromptTiersForChannel(botId, channelId, false, "Install and verify the CLI");
const promptLength = prompt.identity.length + prompt.operating.length + prompt.context.length;
record("compact_capability_map", promptLength < 2_000 && /isolated persistent Linux computer/i.test(prompt.operating) && /skill-arsenal count=/i.test(prompt.context) && !/active-skill-playbooks|### /.test(prompt.context), {
characters: promptLength,
has_linux_computer: /isolated persistent Linux computer/i.test(prompt.operating),
has_skill_inventory: /skill-arsenal count=/i.test(prompt.context),
injects_full_playbooks: /active-skill-playbooks|### /.test(prompt.context),
});

const toolNames = runtimeToolNamesForChannel(botId, channelId);
Expand Down Expand Up @@ -89,7 +90,7 @@ const report = {
validates: [
"shipped built-in playbook completeness",
"structured human-blocker validation",
"bounded runtime objection to operational hand-holding",
"compact factual capability-map delivery",
"resident autonomy tool availability",
"wakeable recurring-work persistence",
"audit-chain integrity for the executed fixture",
Expand Down
4 changes: 2 additions & 2 deletions src/client/settings.ts
Original file line number Diff line number Diff line change
Expand Up @@ -169,11 +169,11 @@ function skillsPanel(): HTMLElement {
h("div", { class: "flex flex-col gap-3 rounded-lg border border-accent/30 bg-accent-soft p-4 sm:flex-row sm:items-center sm:justify-between" },
h("div", {}, h("h3", { class: "font-semibold text-fg" }, "Teach 1Helm from your own material"), h("p", { class: "mt-1 text-sm leading-5 text-muted" }, "Give Skipper a folder or file, a web page, pasted notes, or any combination. It will inspect the sources and author one reusable workspace skill in a visible #main thread.")),
h("button", { class: "btn-primary shrink-0 text-sm", onclick: learnSkillDialog }, icon("sparkles", 15), "Learn a new skill")),
h("p", { class: "text-sm leading-6 text-muted" }, "Every resident permanently owns the safe built-in operational library. 1Helm activates only the playbooks relevant to the current task and can search the focused SkillsMD catalog for ready-to-install GitHub-backed skills."));
h("p", { class: "text-sm leading-6 text-muted" }, "Every resident permanently owns the built-in operational library. Agents see a compact inventory and load a full procedure only when they choose that skill. You can also search SkillsMD for GitHub-backed skills."));
void api<{ skills: Array<Skill & { arsenal_locked?: number; arsenal_reason?: string; assigned_agents?: number }>; catalog: SkillCatalogStatus }>("/api/skills").then(({ skills, catalog }) => {
wrap.append(skillCatalogBrowser(catalog));
const shipped = h("section", { class: "space-y-3" },
h("div", { class: "flex flex-wrap items-end justify-between gap-2" }, h("div", {}, h("h3", { class: "font-display text-lg text-fg" }, "Installed arsenal"), h("p", { class: "text-sm text-muted" }, `${skills.length} complete playbooks · permanently available · selected automatically per task`))));
h("div", { class: "flex flex-wrap items-end justify-between gap-2" }, h("div", {}, h("h3", { class: "font-display text-lg text-fg" }, "Installed arsenal"), h("p", { class: "text-sm text-muted" }, `${skills.length} complete procedures · permanently available · loaded on demand`))));
for (const skill of skills) shipped.append(h("article", { class: `card p-4 ${skill.arsenal_locked ? "opacity-80" : ""}` },
h("div", { class: "flex flex-wrap items-center gap-2" },
h("h3", { class: "font-semibold text-fg" }, skill.name),
Expand Down
Loading
Loading