Files
Frank 63219787af docs(agent): scaffold the agent-skills config as three vault pages
Point the mattpocock-lineage skills (triage, to-tickets, to-spec,
wayfinder) at repo facts instead of a parallel docs/ tree: Gitea is the
issue tracker (credential-safe curl shape, token-only writes), the five
canonical triage roles keep their default label strings (created on the
tracker today), and GLOSSARY.md/docs/adr/ stay lazy with this vault
owning operational facts. AGENTS.md gains the ## Agent skills pointer
block; indices regenerated.
2026-10-20 16:09:30 -07:00

4.5 KiB

type, title, description, tags, timestamp
type title description tags timestamp
reference Issue Tracker How agent skills read and write Gitea issues here: credential-safe curl, label IDs, and wayfinding without sub-issues.
agent
gitea
issues
triage
api
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:

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/<pid>/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:

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/<number> (fields: number, title, body, labels[].name, state)
  • List issues: curl -s -K "$cfg" "$API/issues?state=open&limit=50" — add &labels=<id> to filter
  • Comment: curl -s -K "$cfg" -X POST -d "$(jq -n --rawfile b "$BODY" '{body:$b}')" $API/issues/<number>/comments
  • Apply labels: POST $API/issues/<number>/labels with {"labels":[<label-ID numbers>]} — 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/<number>/labels/<label-id>
  • Close: PATCH $API/issues/<number> with {"state":"closed"}
  • Blocking relationships: this instance has no native sub-issues or dependencies — put Part of #<parent> / Blocked by: #<n>, #<n> 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: <working directory> · session: <omp session id> — 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/<number> 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 #<map> at the top of its body, plus a wayfinder:<type> 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/<n>/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.