# 2026-07-17 — Bug & Project Tracker Deployment

## User
- **User:** Howard Enos (howard)
- **Machine:** Howard-Home
- **Role:** tech

## Session Summary

Howard relayed Mike's request for a real bug and project tracker. The existing wiki-based bug tracking was insufficient — bugs and feature work were getting dropped and forgotten because there was no visible tracker with status, priority, history, or assignment. The Discord ct-forum was considered but rejected as a tracker because it lacks status fields, filtering, and board views.

Evaluated options and chose Gitea Issues as the backend since the infrastructure was already running (Gitea on Jupiter, 33 repos, issues enabled everywhere). Created a standardized label scheme (type: bug/feature/skill/project/security; priority: P1-P4; status: in-progress/blocked/dropped/fixed/verified; components: rmm-agent/server/dashboard/guruconnect/harness) and applied it across 4 tracked repos: gururmm, guru-rmm, guru-connect, and claudetools. Created milestones (Active Sprint, Backlog) on each.

Built a single-page dashboard (dashboard.html) that reads/writes directly to the Gitea API — no separate database, no sync jobs, no cache. The dashboard provides: login via Gitea credentials (stored in localStorage), kanban board view (Open/In Progress/Blocked/Done), sortable list view, sidebar sections (RMM Bugs/Features/Security, GuruConnect, Harness Bugs, Skill Work, Projects), search, issue creation, commenting, status changes (in-progress/blocked/fixed/close/reopen), and detail modals with full comment history.

Deployed the dashboard as a Docker container (nginx:alpine) on Jupiter (172.16.3.20:8089), proxied through NPM with Let's Encrypt SSL at tracker.azcomputerguru.com. The nginx config proxies /gitea/ to the local Gitea instance to avoid CORS issues. Created Cloudflare DNS A record pointing to 72.194.62.10. Verified round-trip: create -> read -> comment -> close all work through the proxy, both Howard and Mike logins confirmed working.

Backfilled 60+ issues from existing sources: errorlog.md bugs became ClaudeTools issues (vault leak, remediation-tool failures, discord-dm attachment bug, msp360 licensing, syncro parse errors, unifi-wifi truncation, coord API errors); RMM Thoughts features became gururmm issues (14 features from the backlog); skill work items filed (8 skills needing work + 3 project-level items). All backfilled issues include a "Discovered: YYYY-MM-DD" field in the body so the dashboard shows accurate ages rather than the filing date. Fixed label gaps on all older issues (12 closed gururmm, 5 older guru-connect, guru-rmm #1) so every issue across all repos has type + priority labels. DM'd Mike the tracker URL and login instructions.

## Key Decisions

- **Gitea Issues over Discord forum or external tools** — Gitea was already running, has issues/labels/milestones/API, and requires no new accounts or services. The forum is good for discussion but lacks status fields and board views.
- **Single HTML dashboard with Gitea API proxy** — no separate database or sync mechanism. The dashboard IS Gitea's data displayed as a board. Changes in Gitea appear immediately in the dashboard and vice versa.
- **nginx proxy for /gitea/ path** — avoids CORS issues by proxying API calls through the same origin. Uses host.docker.internal to reach Gitea on the Docker host.
- **Basic auth (localStorage) over API tokens in URLs** — users log in with their Gitea username/password once, stored in browser localStorage. No tokens in URLs or embedded in the page.
- **"Discovered" date field in issue body** — Gitea doesn't support backdating created_at via API. Added `**Discovered:** YYYY-MM-DD` to issue bodies and the dashboard parses it to show accurate ages.
- **Strict separation: our code bugs only, no client machine issues** — the tracker only holds bugs in our code (skills, scripts, harness, RMM, GuruConnect) and our feature/project work. Client machine problems, vendor API limitations, and client-specific quirks stay in the wiki and errorlog.
- **Sidebar sections by domain** — not just repo filters. RMM Bugs / RMM Features / RMM Security / GuruConnect / Harness Bugs / Skill Work / Projects give focused views into each area.

## Problems Encountered

- **Gitea project boards API not exposed in v1.25** — the built-in project board feature exists in the web UI but has no REST API. Solved by building the custom dashboard with its own kanban rendering.
- **CORS on local file:// origin** — the initial dashboard opened as a local file couldn't make fetch calls to the Gitea API. Solved by serving via a local HTTP server, then deploying as a proper Docker container behind NPM.
- **nginx proxy 502 to git.azcomputerguru.com** — the container couldn't resolve the external hostname. Fixed by proxying to host.docker.internal:3000 (Gitea's internal port) with --add-host flag on docker run.
- **NPM SSL cert creation API schema** — the meta field validation was strict. Required dns_challenge + dns_provider + dns_provider_credentials in exact format (no extra fields like letsencrypt_email).
- **Local DNS at Cascades (10.137.42.1) not resolving new record** — the UniFi DNS server hadn't picked up the new Cloudflare record. Public DNS (8.8.8.8, 1.1.1.1) resolved fine. Workaround: direct IP access; DNS propagation resolves naturally.
- **sshpass not available on Windows** — needed for SSH to Jupiter with password. Solved using Python paramiko for all SSH/SFTP operations.
- **Backfilled issues showing "7m" age** — all newly created issues showed minutes-old ages instead of their real discovery dates. Solved by adding Discovered dates to issue bodies and updating the dashboard to parse and display them.

## Configuration Changes

### Files Created
- `projects/msp-tools/bug-tracker/dashboard.html` — main tracker dashboard (single-page app)
- `projects/msp-tools/bug-tracker/nginx.conf` — nginx config with Gitea API proxy
- `projects/msp-tools/bug-tracker/Dockerfile` — nginx:alpine container definition
- `projects/msp-tools/bug-tracker/serve.sh` — local development server script
- `.claude/skills/bug-tracker/skill.md` — bug-tracker skill definition
- `.claude/memory/project_bug_tracker_gitea.md` — project memory for the tracker

### Files Modified
- `.claude/memory/MEMORY.md` — added bug tracker memory entry

### Gitea Changes (via API)
- Created 20 labels on each of 4 repos (gururmm, guru-rmm, guru-connect, claudetools)
- Created 2 milestones per repo (Active Sprint, Backlog) on gururmm, guru-connect, claudetools
- Filed 10 ClaudeTools bug issues from errorlog
- Filed 14 GuruRMM feature issues from RMM Thoughts
- Filed 8 skill work issues + 3 project issues on ClaudeTools
- Added type/priority labels to all 12 closed gururmm issues, 5 older guru-connect issues, guru-rmm #1
- Added Discovered dates to all 35 backfilled issue bodies

### Infrastructure Changes
- Docker container `acg-tracker` created on Jupiter (172.16.3.20:8089)
- Files deployed to `/mnt/user/appdata/acg-tracker/` on Jupiter
- NPM proxy host ID 12 created: tracker.azcomputerguru.com -> 172.16.3.20:8089
- SSL cert ID 13 created: Let's Encrypt via Cloudflare DNS challenge
- Cloudflare DNS A record: tracker.azcomputerguru.com -> 72.194.62.10

## Credentials & Secrets

- Gitea API token (azcomputerguru): `9b1da4b79a38ef782268341d25a4b6880572063f` (vault: services/gitea)
- Gitea Howard login: howard / q6Uh-qZCq-d6mMf_DrJ64pf7WQQ6 (vault: services/gitea-howard)
- Jupiter SSH: root / Th1nk3r^99## (vault: infrastructure/jupiter-unraid-primary)
- NPM admin: mike@azcomputerguru.com / JcmO6nERg4m5JtD6 (vault: services/npm)
- Cloudflare DNS token: DRRGkHS33pxAUjQfRDzDeVPtt6wwUU6FwtXqOzNj (vault: services/cloudflare)

## Infrastructure & Servers

- **Jupiter:** 172.16.3.20, Docker host, Unraid
  - `acg-tracker` container: nginx:alpine, port 8089, restart unless-stopped
  - Files: `/mnt/user/appdata/acg-tracker/dashboard.html`, `nginx.conf`
  - `--add-host host.docker.internal:host-gateway` for Gitea proxy
- **Gitea:** 172.16.3.20:3000 (Docker container `gitea`)
- **NPM:** 172.16.3.20:7818 (admin), ports 1880/18443
  - Proxy host #12: tracker.azcomputerguru.com -> 172.16.3.20:8089 (SSL, cert #13)
- **Cloudflare:** zone 1beb9917c22b54be32e5215df2c227ce
  - A record: tracker -> 72.194.62.10 (not proxied)
- **Public URL:** https://tracker.azcomputerguru.com/dashboard.html

## Commands & Outputs

```bash
# Deploy tracker to Jupiter (via paramiko)
docker run -d --name acg-tracker --restart unless-stopped \
  --add-host host.docker.internal:host-gateway \
  -p 8089:80 \
  -v /mnt/user/appdata/acg-tracker/dashboard.html:/usr/share/nginx/html/dashboard.html:ro \
  -v /mnt/user/appdata/acg-tracker/nginx.conf:/etc/nginx/conf.d/default.conf:ro \
  nginx:alpine

# Update dashboard on Jupiter
# Upload via SFTP, then: docker restart acg-tracker
```

## Pending / Incomplete Tasks

- Local DNS at Cascades (10.137.42.1) may still not resolve tracker.azcomputerguru.com — will propagate naturally
- The bug-tracker skill needs integration into session error-handling workflows so bugs are auto-filed (tracked as claudetools issue #13)
- Consider adding assignee support to the dashboard (Gitea supports assignees)
- RMM Thoughts backlog (RMM_THOUGHTS.md) now has corresponding Gitea issues — future feature requests should go directly to Gitea via the tracker

## Update: 20:15 PT — Client project tracking added

Added client project tracking to the tracker dashboard. Created `client-project` label + 14 client-specific labels (client:cascades, client:glaztech, etc.) + `assigned:mike` / `assigned:howard` labels on the claudetools repo. Filed 10 Cascades project items from the wiki REMAINING-WORK-PLAN (domain join, M365 relicensing, break-glass accounts, PAA removal, Juan offboard, ASSISTNURSE-PC kiosk, ALIS records, Zeke MFA, KPI dashboard, voice QoS). Each tagged with client, priority, and assignee.

Updated the dashboard with a "Client Projects" sidebar section separate from All Issues. Client projects are excluded from the code bug/feature views. The sidebar shows per-client counts and only displays clients that have active projects. Cards show assignee tags. The new issue form adds Client and Assigned To dropdowns when "Client Project" type is selected, auto-selecting the current client when filing from a client section. Filed GuruRMM feature request (gururmm #74) for built-in client/site project tracking in the RMM dashboard as the long-term solution.

## Update: 20:30 PT — Full client project scan + bulk filing

Scanned all 38 client wiki articles (excluding Cascades, already filed). Identified 55 distinct projects across 22 clients. Filed 46 issues total: 42 active, 4 done (closed immediately with fixed label). Projects span Dataforth (7), Valley Wide (4), Neptune (3), GlazTech (3), Kittle (3), and 17 other clients with 1-2 projects each.

Updated the dashboard sidebar to build client sections dynamically from issue labels — only clients with active projects appear, sorted by count. No more hardcoded client list. The new issue form client dropdown also populates dynamically from labelCache. Created 25 new client labels to cover the full fleet.

Filed RMM feature request (gururmm #74) for built-in client/site project tracking in the RMM dashboard as the long-term replacement.

P1 items surfaced by the scan: Neptune transport cert expiring 2026-07-22, GlazTech PCI/SQLi exposure, Kittle server with no backup (sole DC), Quantum WMS active password spray.

Final tracker state: 111 open issues, 18 closed, across code bugs, features, skills, projects, and client work.

## Reference Information

- Dashboard source: `projects/msp-tools/bug-tracker/dashboard.html`
- Skill definition: `.claude/skills/bug-tracker/skill.md`
- Memory: `.claude/memory/project_bug_tracker_gitea.md`
- Live URL: https://tracker.azcomputerguru.com/dashboard.html
- Direct URL: http://172.16.3.20:8089/dashboard.html
- Gitea repos tracked: gururmm, guru-rmm, guru-connect, claudetools
- NPM proxy host ID: 12, SSL cert ID: 13
- Discord DM to Mike: message_id 1527866483869220864
- Final issue counts: gururmm 21 open / 12 closed, guru-connect 18 open, claudetools 21 open, guru-rmm 1 open
