63ad679c8b3a51bf26f47368bfac91eee078f7a3
Gitea dismisses an approval made stale by a push in a job it queues on the push (services/pull AddTestPullRequestTask, v28.1.0), and its merge check counts approvals not yet dismissed. Measured here, the approval stands for 0.15-0.23 s after the push; the test's merge came a couple of API calls later, so it usually lost the race, and once won it. The test now waits for the dismissal, with a timeout, before expecting Gitea's refusal, and checks the agent's own rule at once: the PR's head is read from the branch, so the approval is for an older commit straight away. Also notes in the Development Plan why the helper loop doesn't compact. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01J5Utyfzw7gF7UhjRDEtjTk
Nisse
Two self-hosted AI agents sharing a common library, named for the Nordic farm spirit that keeps the place running overnight and expects to be treated well in return.
| Package | Role |
|---|---|
nisse-core/ |
Shared library both agents sit on (Part L) |
nisse-dev/ |
Dev Agent — plans and implements software projects (Part D) |
nisse-ops/ |
Sysadmin Agent — operates infrastructure (Part O) |
One repository, three packages. The library does not exist as code yet: it is
extracted from nisse-dev once that agent works (build-order step 10), as a
package split within this tree.
Architecture
The system-level specification lives at
docs/Architecture.md. It covers the
shared library, both agents, the supporting services, the build order, and the
remaining open decisions.