--- type: reference title: Issue Tracker description: "How agent skills read and write Gitea issues here: credential-safe curl, label IDs, and wayfinding without sub-issues." tags: [agent, gitea, issues, triage, api] timestamp: 2026-10-20T00:00:00Z --- # Issue Tracker Issues and specs for this repo live as Gitea issues in `dank/serverAppConfigs` on `http://192.168.0.143:3000` (Dankclaw). There is no `gh`/`glab` CLI here — the door is the GitHub-compatible REST API driven with `curl`. The mattpocock-lineage skills (`/triage`, `/to-tickets`, `/to-spec`, `/wayfinder`) read this page as their tracker contract. The git workflow around issues and PRs (branches, PR-only merges, attribution footer) is owned by [[Deployment Flow]]; this page owns only the API shape. ## Auth The token lives in the git credential file `~/.config/secrets/gitea`: one line in git-credential URL form, `http://user:TOKEN@192.168.0.143`. Extract it without echoing: ```bash tok=$(sed -nE 's#^http://[^:/@]+:([^@]+)@192\.168\.0\.143.*#\1#p' ~/.config/secrets/gitea | head -1) ``` **A token on a command line is world-readable in `/proc//cmdline`** (the same leak class AGENTS.md records for HF tokens). Never pass it with `-H` — put it in a mode-600 curl config and pass `-K`: ```bash cfg=$(mktemp); chmod 600 "$cfg" printf 'header = "Authorization: token %s"\n' "$tok" > "$cfg" # ... every curl below uses -K "$cfg"; rm -f "$cfg" when done ``` **GETs also accept HTTP Basic; writes do not** — a POST/PATCH with Basic auth is refused with `422 {"message":"token is required"}` (measured 2026-10-20). Use the `Authorization: token` header for everything. ## Conventions `$API=http://192.168.0.143:3000/api/v1/repos/dank/serverAppConfigs` - **Create an issue**: `curl -s -K "$cfg" -X POST -H 'Content-Type: application/json' -d "$(jq -n --arg t "$TITLE" --rawfile b "$BODY" '{title:$t, body:$b}')" $API/issues` - **Read an issue**: `curl -s -K "$cfg" $API/issues/` (fields: `number`, `title`, `body`, `labels[].name`, `state`) - **List issues**: `curl -s -K "$cfg" "$API/issues?state=open&limit=50"` — add `&labels=` to filter - **Comment**: `curl -s -K "$cfg" -X POST -d "$(jq -n --rawfile b "$BODY" '{body:$b}')" $API/issues//comments` - **Apply labels**: `POST $API/issues//labels` with `{"labels":[]}` — Gitea wants numeric label **IDs**, not names; resolve them from `GET $API/labels` (see [[Triage Labels]] for which labels exist) - **Remove a label**: `DELETE $API/issues//labels/` - **Close**: `PATCH $API/issues/` with `{"state":"closed"}` - **Blocking relationships**: this instance has no native sub-issues or dependencies — put `Part of #` / `Blocked by: #, #` lines at the top of the child body. A ticket is unblocked when every listed blocker is closed. - **Attribution footer (repo law)**: every issue body you open ends with `cwd: · session: ` — full rule in [[Deployment Flow]]. **PRs as a request surface: no.** Issues and PRs have separate number spaces on Gitea; a bare `#42` is an issue, a PR is spelled "PR #42". ## When a skill says "publish to the issue tracker" Create a Gitea issue as above. ## When a skill says "fetch the relevant ticket" `GET $API/issues/` and read `title` + `body` + `labels[].name` + comments. ## Wayfinding operations Used by `/wayfinder`. The **map** is a single issue labelled `wayfinder:map`, holding the Notes / Decisions-so-far / Fog body. - **Map**: create an issue, apply the `wayfinder:map` label (create it via `POST $API/labels` `{"name":"wayfinder:map","color":"#6f42c1"}` if missing). - **Child ticket**: an issue carrying `Part of #` at the top of its body, plus a `wayfinder:` label (`research`/`prototype`/`grilling`/`task`). - **Blocking**: the `Blocked by:` body line (see Conventions). - **Frontier**: list open issues (`?state=open`), drop any with an open `Blocked by` target or an assignee; lowest `number` wins. - **Claim**: `POST $API/issues//assignees` with `{"assignees":["dank"]}` — actually assign it or it stays in the frontier; the session's first write. - **Resolve**: post the answer as a comment, `PATCH` to `closed`, then update the map issue's body (GET → edit Decisions-so-far → PATCH) with a context pointer. ## Related - [[Triage Labels]] — the role strings these operations apply. - [[Domain Docs]] — what a skill must read before touching the codebase. - [[SSH and Remote Access]] — reaching the host when an issue needs live evidence.