Compare commits
1
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
63586dcd50 |
@@ -0,0 +1,67 @@
|
|||||||
|
---
|
||||||
|
status: open
|
||||||
|
opened: 2026-10-09
|
||||||
|
located-in: []
|
||||||
|
fixed-by:
|
||||||
|
amended-design:
|
||||||
|
---
|
||||||
|
|
||||||
|
# 353. An agent cannot put a commit on the forge
|
||||||
|
|
||||||
|
## Symptom
|
||||||
|
|
||||||
|
On 2026-10-09, in an agent session on the operator's laptop, local times:
|
||||||
|
|
||||||
|
- An agent finished a change to this repository's connectivity design on a branch, committed it in a
|
||||||
|
worktree, and ran `merge-check.sh`; all four checks passed.
|
||||||
|
- `git push` was not possible: this repository's clone on the laptop has its push URL set to the literal
|
||||||
|
`DISABLED`. The laptop's clones of the mesh's code repositories push normally. Who set it, when, and
|
||||||
|
why is not recorded anywhere this session could find.
|
||||||
|
- The forge's tools have no verb that pushes a branch or makes a commit. `gitea_api` refused
|
||||||
|
`POST /repos/{owner}/{repo}/diffpatch`, the forge's endpoint that applies a patch to a branch: *not a
|
||||||
|
write gitea_api makes* ([ADR 0266](../../02-DECISIONS/0266-on-the-control-node-agents-run-under-an-account-of-their-own-that-cannot-become-root-without-a-person.md)).
|
||||||
|
- The one file write `gitea_api` allows is the contents endpoint, which takes the **whole file**,
|
||||||
|
base64-encoded. The changed design document is about 90 KB, so the call would carry about 121 KB of
|
||||||
|
base64 that the agent must reproduce character for character. That is not a workable path.
|
||||||
|
|
||||||
|
The change waits for the operator to push it by hand. This report waits for the same push.
|
||||||
|
|
||||||
|
## Why it is an issue
|
||||||
|
|
||||||
|
- **The mesh's own rule for a change cannot be followed by an agent.** Every change goes through a branch,
|
||||||
|
a pull request and a person's approval. An agent off the control node can make the branch locally and
|
||||||
|
open the pull request through `gitea_create_pull_request`, but it cannot put the commits between the two
|
||||||
|
on the forge.
|
||||||
|
- **Where no tool covers a need, none is worked around** ([ADR 0245](../../02-DECISIONS/0245-a-verb-says-what-it-replaces-and-the-agent-is-guarded-from-working-round-the-mesh.md)).
|
||||||
|
The only ways round are pushing to an explicit URL past the disabled one, or retyping a file as base64.
|
||||||
|
The first undoes a setting someone made on purpose. The second risks a commit that silently differs
|
||||||
|
from what was checked.
|
||||||
|
- **The control node already has an answer the laptop does not.** On the control node the agent account
|
||||||
|
holds a forge key of its own, so its pushes are its own (ADR 0266). An agent on any other machine has
|
||||||
|
no equivalent.
|
||||||
|
|
||||||
|
## Other gaps in the forge's tools
|
||||||
|
|
||||||
|
Found by listing the forge module's 37 tools on 2026-10-09. Only the first one blocks work. The others
|
||||||
|
can be done through `gitea_api`, which costs a raw call and a large answer each time.
|
||||||
|
|
||||||
|
| Gap | Today | Checked |
|
||||||
|
|---|---|---|
|
||||||
|
| **No push, commit or patch on a branch** | blocked, as above | yes |
|
||||||
|
| **No commit history or compare** | `GET …/commits` through `gitea_api`: about 100 lines of JSON for one commit, its author and committer printed in full each time. `gitea_contains` answers only whether one commit contains another. | yes |
|
||||||
|
| **No reading a pull request's reviews or line comments** | `gitea_list_comments` returns the conversation only. Reviews and comments on lines need `GET …/pulls/{n}/reviews` through `gitea_api`. An agent asked to address review feedback does not see it unless it knows to ask there. No *approve* tool is right, since approval is a person's. | yes |
|
||||||
|
| **No creating a branch** | `POST …/branches` through `gitea_api` | no |
|
||||||
|
| **No editing an issue** — title, body, labels | only close and reopen exist | no |
|
||||||
|
| **No listing a directory** | `gitea_get_file` reads one file | no |
|
||||||
|
| **No code search across repositories** | none | no |
|
||||||
|
|
||||||
|
*Checked* says whether this session called the raw endpoint and saw it answer. The rows marked *no* are
|
||||||
|
read from the tool list and the forge's API, not tried.
|
||||||
|
|
||||||
|
## Open
|
||||||
|
|
||||||
|
- Who disabled the push URL on the laptop's clone of this repository, and whether it was meant to keep
|
||||||
|
agents from pushing here or was a step in something else.
|
||||||
|
- Whether an agent off the control node should push with a forge key of its own, as on the control node,
|
||||||
|
or whether the forge module should take a commit as a patch and write it under the agent's account.
|
||||||
|
Either needs a decision record.
|
||||||
Reference in New Issue
Block a user