Mark Phases 1-10 complete. Document Woodpecker CI integration
progress and known issues with Gogs 0.14 / Woodpecker 0.15.4
compatibility. Add gotchas section for token auth and DB types.
Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
TFTSR — IT Triage & Root-Cause Analysis Desktop Application
Implementation Plan
Overview
TFTSR is a desktop-first, offline-capable application that helps IT teams
perform structured incident triage using the 5-Whys methodology, backed by
pluggable AI providers (Ollama local, OpenAI, Anthropic, Mistral, Gemini).
It automates PII redaction, guides engineers through root-cause analysis, and
produces post-mortem documents (Markdown / PDF / DOCX).
Architecture Decisions
Area
Choice
Rationale
Desktop framework
Tauri 2.x
Small binary, native webview, Rust backend for security
Frontend framework
React 18
Large ecosystem, component model fits wizard-style UX
State management
Zustand
Minimal boilerplate, TypeScript-friendly, no context nesting
Repo activation via Woodpecker API returns 401 (permission/token issue)
CI build not yet triggering on push
Next steps:
Fix Woodpecker token storage: ensure Woodpecker DB has the actual bearer token
(Gogs token sha1 from CREATE response = actual token; DB sha1 column = hash of it)
Delete old "woodpecker" Gogs tokens via PostgreSQL, then re-login to Woodpecker
Fix the ?access_token=<JWT> 404 — investigate parsePushHook nil return
Alternative: upgrade to Woodpecker 2.x and add OAuth2 to Gogs (or migrate to Gitea)
Phase 12 — Release Package 🔲 PENDING
Tag v0.1.0-alpha
Verify Woodpecker builds Linux amd64 + arm64
Verify artifacts upload to Gogs release
Smoke-test installed packages
Known Issues & Gotchas
Gogs Token Authentication
The sha1 in the Gogs CREATE token API response IS the actual bearer token
Gogs stores sha1(token) and sha256(token) in the DB — these are HASHES, not the token itself
Known working tokens: [REDACTED-ROTATED] (woodpecker-setup)
Woodpecker CI + Gogs v0.15.4 Compatibility
The SPA form login uses login= field but Gogs backend reads username=
Workaround: nginx proxy at :8085 serves custom HTML login page
The webhook ?token= URL param is NOT read by Woodpecker's token.ParseRequest()
Use ?access_token=<JWT> instead (JWT must be HS256 signed with repo_hash as key)
Gogs 0.14 has no OAuth2 provider support — blocks upgrade to Woodpecker 2.x
Rust/DB Type Notes
IssueDetail is NESTED: { issue: Issue, log_files, resolution_steps, conversations }
DB uses TEXT timestamps for created_at/updated_at (not INTEGER)
All commands use the and_then pattern with rusqlite to avoid lifetime issues