<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://neverdecel.github.io/onbehalf/feed.xml" rel="self" type="application/atom+xml" /><link href="https://neverdecel.github.io/onbehalf/" rel="alternate" type="text/html" hreflang="en" /><updated>2026-10-18T15:23:28+00:00</updated><id>https://neverdecel.github.io/onbehalf/feed.xml</id><title type="html">onbehalf</title><subtitle>One reviewed AI harness setup for a team on a shared Linux host. The runtime of each user runs as that user, with their own logins.</subtitle><author><name>Neverdecel</name></author><entry><title type="html">Why each AI agent must act on behalf of one user</title><link href="https://neverdecel.github.io/onbehalf/blog/2026/10/09/why-each-ai-agent-must-act-on-behalf-of-one-person/" rel="alternate" type="text/html" title="Why each AI agent must act on behalf of one user" /><published>2026-10-09T00:00:00+00:00</published><updated>2026-10-09T00:00:00+00:00</updated><id>https://neverdecel.github.io/onbehalf/blog/2026/10/09/why-each-ai-agent-must-act-on-behalf-of-one-person</id><content type="html" xml:base="https://neverdecel.github.io/onbehalf/blog/2026/10/09/why-each-ai-agent-must-act-on-behalf-of-one-person/"><![CDATA[<p>An AI harness can write code, push commits, open pull requests and change
cloud resources. Each of these actions has an owner. When the action goes
wrong, the team must know who did it.</p>

<p>The answer must be simple. The runtime acts on behalf of the user who
started it. It is not an identity of its own.</p>

<h2 id="the-runtime-is-not-an-identity">The runtime is not an identity</h2>

<p>A runtime is the running instance of the AI harness for one user. It has
a service, sessions, a history and a state. It does not have an account,
a login or a key of its own.</p>

<p>When <code>alice</code> starts a runtime, the runtime uses the account of <code>alice</code>, the
files of <code>alice</code> and the logins of <code>alice</code>. Git records the commit as
<code>alice</code>. GitHub shows the pull request from <code>alice</code>. The model gateway
records the tokens on the gateway key of <code>alice</code>.</p>

<p>Thus <code>alice</code> is responsible for the action, as for an action that <code>alice</code> does
by hand. The runtime is a tool of the user. It is not a team member.</p>

<h2 id="two-usual-setups-and-their-problems">Two usual setups, and their problems</h2>

<p>Most teams start with one of two setups.</p>

<p><strong>A setup on each laptop.</strong> Each user keeps the settings, the
instructions, the skills and the model access on a laptop. The actions show
the correct user. But an improvement stays with one user. A new team
member starts from zero. Nobody knows which models the team uses, or the
cost.</p>

<p><strong>One shared account on a host.</strong> The team puts one setup in one account.
All users use it. Now the team has one setup, but the identity is gone:</p>

<ul>
  <li>Git, GitHub and the cloud record each action as the shared account.</li>
  <li>Each user can read the credentials of all the other users.</li>
  <li>When a user leaves, the team must change each secret.</li>
</ul>

<p>The team must not select between a shared setup and a personal identity.
It must get both.</p>

<h2 id="one-shared-setup-one-identity-for-each-user">One shared setup, one identity for each user</h2>

<p>onbehalf gives a team one reviewed setup on one shared Linux host. It keeps
the identity of each user separate. It works at the Unix layer:
accounts, permissions, links and services.</p>

<p>The setup has three levels. Each level has a different owner:</p>

<ol>
  <li><strong>The shared stack.</strong> The team keeps the harness settings, the harness
instructions, the skills and the model catalog in Git. The team reviews
each change. The operator runs <code>onbehalf stack install</code> to make it
current. Each user gets it read-only.</li>
  <li><strong>The personal configuration.</strong> Each user can override the shared
stack in their own account.</li>
  <li><strong>The project configuration.</strong> The configuration in a repository has the
highest priority.</li>
</ol>

<p>The runtime of each user runs in the Unix account of that user. Each
user logs in to each work tool, for example Git, GitHub CLI and Azure
CLI. onbehalf does not log anybody in, and it does not keep a credential.</p>

<h2 id="one-gateway-one-key-for-each-user">One gateway, one key for each user</h2>

<p>The model gateway keeps the provider key of the team. Only the gateway can
read it. Each user gets a personal gateway key.</p>

<p>This gives the team three results:</p>

<ul>
  <li>The gateway records the model use and the cost of each user.</li>
  <li>The gateway key controls which models a user can use.</li>
  <li>No user can read the provider key.</li>
</ul>

<p><code>onbehalf report</code> shows the requests, the tokens, the cost and the failures
for each user and model. It never shows what a user asked.</p>

<h2 id="what-the-runtime-cannot-do-for-you">What the runtime cannot do for you</h2>

<p>The runtime is not a sandbox. It can do all that the user can do, with
the files and the logins of that user. onbehalf keeps users apart from
each other. It does not limit a user.</p>

<p>Unix permissions, the gateway key and the external systems control access.
The rules of a custom agent only guide the runtime. They are not access
control.</p>

<h2 id="when-a-user-leaves">When a user leaves</h2>

<p>The operator runs <code>sudo onbehalf user remove bob</code>. onbehalf does these
steps:</p>

<ol>
  <li>It stops the runtime of <code>bob</code>.</li>
  <li>It revokes the gateway key of <code>bob</code>.</li>
  <li>It removes the home directory with the credentials of <code>bob</code>.</li>
  <li>It removes a local account.</li>
</ol>

<p>Nobody shared a secret with <code>bob</code>. Thus the team has no secret to change.
<code>alice</code> and <code>carol</code> continue to work.</p>

<h2 id="try-it">Try it</h2>

<p>onbehalf is an early MVP, and it is open source under the Apache License
2.0. It supports Ubuntu and Arch Linux, with LiteLLM as the model gateway.
Since version 0.2.0, the operator selects OpenCode, Claude Code or Codex
as the AI harness of each host.</p>

<p>Read the <a href="https://github.com/Neverdecel/onbehalf">README</a> for the quick
start. Read
<a href="https://github.com/Neverdecel/onbehalf/blob/main/docs/how-it-works.md">how it works</a>
for the layers, and the
<a href="https://github.com/Neverdecel/onbehalf/blob/main/docs/faq.md">FAQ</a> for
frequent questions.</p>]]></content><author><name>Neverdecel</name></author><summary type="html"><![CDATA[An AI agent is not an identity of its own. onbehalf gives a team one shared AI harness setup, and runs the runtime of each user as that user.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://neverdecel.github.io/onbehalf/assets/social-preview.png" /><media:content medium="image" url="https://neverdecel.github.io/onbehalf/assets/social-preview.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry></feed>