docs(dedupe): one owner for the finish rule, and the Gitea index routes instead of restating

Two independent copies of the same law, and each page cited its own numbers. The finish rule —
stop when independent sources agree, when the retrieval budget is spent, or when every claim is
met; report gaps, never invent a source — stood in full in `agentic-search-best-practices.md`
(with the loop caps: 20 steps, re-plan every 4) and again in `research-effectiveness.md` without
them. The operational page owns it; the measurement page keeps the pointer and the one thing
that is its business, which is that unbounded loops are why "infinite re-search" is a named
failure mode.

`tools/gitea/index.md` was a second copy of its own directory: an architecture table, a
management command table, a data-persistence path table and a boot-persistence paragraph, every
one of them a subset of `architecture.md`, `management.md` and `data-persistence.md` — verified
line by line before cutting, including the two facts that looked unique to the index (the
`dns_enabled: false` default network, the `/opt/gitea` leftover) and turn out to be owned
upstream with more detail. The index now answers "which page owns my question" and gives three
one-line orientation facts. Gitea's live version was re-read while I was in there: still 1.27.3.

Refs #64
This commit is contained in:
Frank
2026-10-21 02:24:11 -07:00
parent 047f264fcf
commit 8b87b5ae1a
2 changed files with 28 additions and 47 deletions
@@ -96,13 +96,11 @@ Pi already runs a similar model with its parallel `researcher` and `scout` subag
## The Finish Rule
Research must end. Stop when any one is true:
1. Two or more independent sources agree on the answer.
2. The retrieval budget is spent.
3. The required confidence is met for every claim.
Report gaps honestly. Do not invent a source to fill one.
The rule itself — stop when independent sources agree, when the retrieval budget is spent, or
when every claim has the required confidence, and report the gaps instead of inventing a source —
is owned by [Agentic Search Best Practices](agentic-search-best-practices.md#the-finish-rule),
the page an agent reads before it starts a loop. What belongs here is the measurement: unbounded
loops are why "infinite re-search" is a named failure mode in the next section.
## Failure Modes and Guardrails
+23 -40
View File
@@ -4,56 +4,39 @@ Private Git hosting on dankclaw. Two quadlet-managed containers in the rootless
**Host:** dankclaw (192.168.0.143 LAN)
**Config:** `~/.config/containers/systemd/gitea-{postgres,server}.container` + `gitea.network`
**Local access:** `http://dankclaw:3000` — Gitea 1.27.3 (`/api/v1/version`, probed 2026-10-19)
**Local access:** `http://dankclaw:3000` — Gitea 1.27.3 (`/api/v1/version`, re-read 2026-10-21)
**Domain:** `https://gitea.franksdank.cloud` (live; served by fleet Caddy, DNS-01 TLS)
## Architecture
## What lives where
| Container | Unit | Port | Purpose |
|---|---|---|---|
| `gitea-server` | `gitea-server.service` | 3000 (HTTP), 2222 (SSH) | Git web UI, API, SSH daemon |
| `gitea-postgres` | `gitea-postgres.service` | 5432 (internal) | Database |
| (network) | `gitea-network.service` | — | quadlet `gitea.network` bring-up |
The containers share the private network `systemd-gitea` (quadlet `gitea.network`, DNS enabled). The automatic `podman` default network has DNS disabled; do not run the stack on it.
## Management
All commands run as `dank` on dankclaw.
| Action | Command |
| Question | Owner |
|---|---|
| Start all | `systemctl --user start gitea-postgres gitea-server` |
| Stop all | `systemctl --user stop gitea-server gitea-postgres` |
| Restart Gitea only | `systemctl --user restart gitea-server` |
| Follow logs | `podman logs -f gitea-server` or `journalctl --user -u gitea-server -f` |
| Check status | `systemctl --user status gitea-postgres gitea-server` |
| Containers, unit names, network topology, ports, env wiring | [architecture](architecture.md) |
| Start / stop / logs / upgrade; boot persistence (linger + `[Install] WantedBy=default.target`); incident log | [management](management.md) |
| Data layout on host bind mounts, UID ownership, backup and restore, the `/opt/gitea` leftover | [data-persistence](data-persistence.md) |
| Token-based HTTP access from clients, the credential store, git 2.56 store-format trap | [client-access](client-access.md) |
## Data Persistence
One-line answers, so you know which row to open:
All data lives on host bind mounts under `/home/dank/Containers/gitea/` (fleet storage standard since 2026-09-01; verified live 2026-10-18). Containers are ephemeral. Stopping a quadlet unit removes its container; the next start recreates it. Volumes survive. The old `/opt/gitea/` tree remains on disk as a leftover — do not use it.
* **Two containers** (`gitea-server` :3000/:2222, `gitea-postgres` internal) plus a quadlet
network unit, all in user `dank`'s rootless session.
* **Data survives everything**: host bind mounts under `/home/dank/Containers/gitea/`, env file
mode 0600; stopping a unit removes its container and the next start recreates it.
* **Boot**: user linger for `dank` plus `[Install] WantedBy=default.target` on each unit — no
login session required. The podman-compose stack had neither and did not survive a reboot
(2026-08-16, written up in [management](management.md)).
| Path | Contents |
|---|---|
| `/home/dank/Containers/gitea/data/` | Git repositories, app.ini, attachments |
| `/home/dank/Containers/gitea/postgres/` | PostgreSQL data files |
| `/home/dank/Containers/gitea/env` | EnvironmentFile (mode 0600; `GITEA_DB_PASSWORD`) |
See [data-persistence](/tools/gitea/data-persistence.md) for backup and restore.
## Boot Persistence
User-level linger is enabled for `dank`. The units start at host boot without a login. Each unit carries `[Install] WantedBy=default.target`; the podman generator applies it. The legacy podman-compose stack had no units and did not survive reboots (incident 2026-08-16).
See [management](/tools/gitea/management.md) for boot persistence details and troubleshooting.
This index used to carry its own copies of all four pages' tables. They went: a second copy of
an operational table is a future contradiction, and every one of them was already a subset.
## Repo Copies
The quadlet files and `.env` templates are tracked in the `serverAppConfigs` deploy repo; the sibling vault page `Infrastructure/Gitea.md` (in `~/Projects/serverAppConfig/serverAppConfigs-docs/`) is the deploy-side source of truth. Secrets live only on the host under `Containers/gitea/` (mode 0600), never in either docs tree.
The quadlet files and `.env` templates are tracked in the `serverAppConfigs` deploy repo; the
sibling vault page `Infrastructure/Gitea.md` (in `~/Projects/serverAppConfig/serverAppConfigs-docs/`)
is the deploy-side source of truth. Secrets live only on the host under `Containers/gitea/`
(mode 0600), never in either docs tree.
## See Also
* [Gitea Architecture](architecture.md) — container architecture, network topology, ports.
* [Gitea Data Persistence](data-persistence.md) — data layout, ownership mapping, backup strategy.
* [Gitea Management](management.md) — operations, upgrades, backups, incident log.
* [Gitea Client Access](client-access.md) — token-based HTTP access from clients, credential store, git 2.56 store-format trap.
* [Dankclaw](/system/dankclaw.md) — the host, and its container census.
* [Caddy](/caddy/index.md) — the fleet edge proxy that fronts `gitea.franksdank.cloud`.