GitHub mirror repo hygiene: issue templates, topics/description parity, front-door signals #490

Closed
opened 2026-07-01 23:56:36 +00:00 by coilyco-ops · 2 comments
Member

Why

Front-door decision (2026-07-01 triage, #438/#481): GitHub hosts public issues and PRs. The mirror has to look staffed: templates routing bug reports, description/topics synced with canonical (descriptions do not ride mirror-to-github.yml - #438), and support links that resolve (#433).

Deliverable

  • Issue + PR templates on the GitHub mirror.
  • Description and topics synced with the canonical repo (scripted or manual, but stated).
  • README support links verified to resolve unauthenticated.

Done condition

A cold GitHub visitor can file a templated issue; no support path 404s or 302s to a login wall.


Recorded by Claude Code (Fable) during the 2026-07-01 ward launch triage session with Kai.

## Why Front-door decision (2026-07-01 triage, #438/#481): GitHub hosts public issues and PRs. The mirror has to look staffed: templates routing bug reports, description/topics synced with canonical (descriptions do not ride mirror-to-github.yml - #438), and support links that resolve (#433). ## Deliverable - Issue + PR templates on the GitHub mirror. - Description and topics synced with the canonical repo (scripted or manual, but stated). - README support links verified to resolve unauthenticated. ## Done condition A cold GitHub visitor can file a templated issue; no support path 404s or 302s to a login wall. --- Recorded by Claude Code (Fable) during the 2026-07-01 ward launch triage session with Kai.
coilyco-ops added this to the ward launch milestone 2026-07-01 23:56:36 +00:00
Author
Member

🔒 Reserved by ward agent --driver claude — container engineer-claude-ward-490 on host kais-macbook-pro-2.local is carrying this issue (reserved 2026-07-02T02:58:24Z). Concurrent ward agent runs are blocked until it finishes or the reservation goes stale (2h0m0s TTL); --force overrides.

— Claude (she/her), via ward agent

<!-- ward-agent-reservation --> 🔒 Reserved by `ward agent --driver claude` — container `engineer-claude-ward-490` on host `kais-macbook-pro-2.local` is carrying this issue (reserved 2026-07-02T02:58:24Z). Concurrent `ward agent` runs are blocked until it finishes or the reservation goes stale (2h0m0s TTL); `--force` overrides. <!-- ward-agent-signature --> — Claude (she/her), via `ward agent`
Owner

WARD-OUTCOME: done - GitHub mirror now ships issue/PR templates and a workflow step that syncs description+topics from canonical Forgejo.

The three deliverables split more cleanly than expected. Templates were the easy two-thirds: they're ordinary tracked files, so the existing main force-push already carries them to the mirror with no new plumbing. Description and topics were the real work, since they're API-only metadata that never rode the push (that's the #438 drift). I made the sync pull canonical values live from the Forgejo API rather than hardcoding them, so Forgejo stays the single source of truth and editing it there is enough.

Two things fought back. First, my initial grep/sed parse of the Forgejo repo JSON silently grabbed the nested owner object's empty description instead of the repo's, because it appears first in the serialization - caught it locally and switched to node (present for the JS actions, and the runner has no jq). Second, the doc-layout pre-commit hook bars a .github/*.md, so the PR template moved to docs/PULL_REQUEST_TEMPLATE.md (GitHub honours docs/), and the 80-line/4000-char doc cap made me trim the mirror doc hard.

Confidence: high on the templates and link checks - I validated all the YAML forms and confirmed every README support link resolves 200 unauthenticated (the only broken path was issues/new/choose, which the templates now fix). Medium on the sync step end-to-end: I exercised the node payload logic against the live Forgejo API and both payloads are valid JSON with the correct values, but the actual PATCH/PUT to GitHub only runs in CI with the PAT, so its first real proof is the next push-to-main workflow run. Worth a glance at that run's sync-metadata log lines to confirm the mirror's About box flips from the stale "Generic-purpose cli-guard consumer..." to canonical. No follow-up issue needed unless the runner image ever drops node.

WARD-OUTCOME: done - GitHub mirror now ships issue/PR templates and a workflow step that syncs description+topics from canonical Forgejo. The three deliverables split more cleanly than expected. Templates were the easy two-thirds: they're ordinary tracked files, so the existing `main` force-push already carries them to the mirror with no new plumbing. Description and topics were the real work, since they're API-only metadata that never rode the push (that's the #438 drift). I made the sync pull canonical values live from the Forgejo API rather than hardcoding them, so Forgejo stays the single source of truth and editing it there is enough. Two things fought back. First, my initial grep/sed parse of the Forgejo repo JSON silently grabbed the nested owner object's empty `description` instead of the repo's, because it appears first in the serialization - caught it locally and switched to `node` (present for the JS actions, and the runner has no jq). Second, the doc-layout pre-commit hook bars a `.github/*.md`, so the PR template moved to `docs/PULL_REQUEST_TEMPLATE.md` (GitHub honours `docs/`), and the 80-line/4000-char doc cap made me trim the mirror doc hard. Confidence: high on the templates and link checks - I validated all the YAML forms and confirmed every README support link resolves 200 unauthenticated (the only broken path was `issues/new/choose`, which the templates now fix). Medium on the sync step end-to-end: I exercised the node payload logic against the live Forgejo API and both payloads are valid JSON with the correct values, but the actual PATCH/PUT to GitHub only runs in CI with the PAT, so its first real proof is the next push-to-main workflow run. Worth a glance at that run's `sync-metadata` log lines to confirm the mirror's About box flips from the stale "Generic-purpose cli-guard consumer..." to canonical. No follow-up issue needed unless the runner image ever drops node.
Sign in to join this conversation.
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
coilyco-flight-deck/ward#490
No description provided.