Issue Fixer Pipeline — Architecture and Lifecycle #33

Closed
opened 2026-05-12 19:37:59 +00:00 by Mark · 2 comments
Owner

Overview

The Issue Fixer pipeline is a fully automated system that detects, triages, and fixes open issues across all Forgejo repos using the GSD (Get Shit Done) engine. It consists of two decoupled cron jobs that communicate via Forgejo issue labels.

Cron Jobs

1. issue-fixer-autorun (job_id: 76e2a36dcea4)

  • Schedule: every 15 minutes
  • Mode: agent-mode (LLM-driven)
  • Script: ~/.hermes/scripts/cron-get-issue.py
  • Model: deepseek-v4-flash (opencode-go)
  • Workdir: /home/b
  • Toolsets: terminal, file
  • Deliver: origin (#bad-idea)

2. feature-triage (job_id: f2cf3de5fff6)

  • Schedule: every 60 minutes
  • Mode: agent-mode (switched from no_agent to fix timeout)
  • Script: ~/.hermes/scripts/feature-triage.py

Script Locations

File Purpose
~/.hermes/scripts/cron-get-issue.py Orchestrator - fetches next issue, runs GSD pipeline
~/.hermes/scripts/next-issue.sh Finds next unvisited issue across all repos
~/.hermes/scripts/feature-triage.py Feature request assessment and routing
~/Projects/gsd-self/.gsd/bin/next-issue.sh Forgejo queue management
~/Projects/gsd-self/.gsd/gates/pre-dispatch.sh Required gate between plan and implement

State Files

File Purpose
~/.hermes/scripts/issue-fixer-state.json Visited issues, completed/blocked counts
~/.hermes/scripts/feature-triage-state.json Approved, deferred, blocked feature requests

Full Lifecycle

  1. issue-fixer-autorun fires every 15m -> calls next-issue.sh
  2. next-issue.sh scans 24+ repos via Forgejo API
  3. Filters out: visited issues, blocked/wontfix/feature-request (unless triage-approved), PRs
  4. Pick first unvisited issue -> GSD pipeline: research -> plan -> pre-dispatch -> implement -> verify -> commit
  5. All gates pass -> commit, push, close issue
  6. Gate blocks -> label issue with failure info, return to queue

Label Bridge

Feature requests handled via label bridge between both crons:

  • feature-request label -> auto-skipped by next-issue.sh
  • feature-triage scans feature-request issues, assesses via deepseek:
    • Approve (small scope + low risk + aligned to spec) -> adds triage-approved label
    • Defer (medium/partial) -> re-triage after 24h
    • Needs decision (large/high risk/misaligned) -> adds blocked:needs-decision + assessment comment
  • next-issue.sh checks for triage-approved -> bypasses feature filter -> issue enters GSD pipeline
  • Manual override: add triage-approved on Forgejo to dispatch any issue

Gate Chain

All 6 gates must pass for a fix to be committed:
research -> plan -> pre-dispatch -> implement -> verify -> commit

The pre-dispatch gate is MANDATORY and must be called explicitly by implementation scripts.

## Overview The Issue Fixer pipeline is a fully automated system that detects, triages, and fixes open issues across all Forgejo repos using the GSD (Get Shit Done) engine. It consists of two decoupled cron jobs that communicate via Forgejo issue labels. ## Cron Jobs ### 1. issue-fixer-autorun (job_id: 76e2a36dcea4) - Schedule: every 15 minutes - Mode: agent-mode (LLM-driven) - Script: ~/.hermes/scripts/cron-get-issue.py - Model: deepseek-v4-flash (opencode-go) - Workdir: /home/b - Toolsets: terminal, file - Deliver: origin (#bad-idea) ### 2. feature-triage (job_id: f2cf3de5fff6) - Schedule: every 60 minutes - Mode: agent-mode (switched from no_agent to fix timeout) - Script: ~/.hermes/scripts/feature-triage.py ## Script Locations | File | Purpose | |------|---------| | ~/.hermes/scripts/cron-get-issue.py | Orchestrator - fetches next issue, runs GSD pipeline | | ~/.hermes/scripts/next-issue.sh | Finds next unvisited issue across all repos | | ~/.hermes/scripts/feature-triage.py | Feature request assessment and routing | | ~/Projects/gsd-self/.gsd/bin/next-issue.sh | Forgejo queue management | | ~/Projects/gsd-self/.gsd/gates/pre-dispatch.sh | Required gate between plan and implement | ## State Files | File | Purpose | |------|---------| | ~/.hermes/scripts/issue-fixer-state.json | Visited issues, completed/blocked counts | | ~/.hermes/scripts/feature-triage-state.json | Approved, deferred, blocked feature requests | ## Full Lifecycle 1. issue-fixer-autorun fires every 15m -> calls next-issue.sh 2. next-issue.sh scans 24+ repos via Forgejo API 3. Filters out: visited issues, blocked/wontfix/feature-request (unless triage-approved), PRs 4. Pick first unvisited issue -> GSD pipeline: research -> plan -> pre-dispatch -> implement -> verify -> commit 5. All gates pass -> commit, push, close issue 6. Gate blocks -> label issue with failure info, return to queue ## Label Bridge Feature requests handled via label bridge between both crons: - feature-request label -> auto-skipped by next-issue.sh - feature-triage scans feature-request issues, assesses via deepseek: - Approve (small scope + low risk + aligned to spec) -> adds triage-approved label - Defer (medium/partial) -> re-triage after 24h - Needs decision (large/high risk/misaligned) -> adds blocked:needs-decision + assessment comment - next-issue.sh checks for triage-approved -> bypasses feature filter -> issue enters GSD pipeline - Manual override: add triage-approved on Forgejo to dispatch any issue ## Gate Chain All 6 gates must pass for a fix to be committed: research -> plan -> pre-dispatch -> implement -> verify -> commit The pre-dispatch gate is MANDATORY and must be called explicitly by implementation scripts.
Author
Owner

Update: Scripts moved to hermes-scripts repo

All pipeline scripts now live in Mark/hermes-scripts (~/Projects/hermes-scripts/) and are symlinked from ~/.hermes/scripts/:

This enables self-modification — file an issue in that repo and the fixer pipeline will patch the script, commit, and push it automatically. The symlink propagates changes instantly.

Repo contents

File Source symlink
next-issue ~/.hermes/scripts/next-issue
cron-get-issue.py ~/.hermes/scripts/cron-get-issue.py
feature-triage.py ~/.hermes/scripts/feature-triage.py
gsd-issue-fixer.py ~/.hermes/scripts/gsd-issue-fixer.py
gsd-issue-executor.py ~/.hermes/scripts/gsd-issue-executor.py
issue-autorun-state.json ~/.hermes/scripts/issue-autorun-state.json
feature-triage-state.json ~/.hermes/scripts/feature-triage-state.json

Known issues still open

  1. The feature-triage.py script's hermes chat -q assessment call can take 10+ minutes on slow model responses — doubled the timeouts to 1200s to compensate
  2. No deferred-indefinitely logic yet — all deferrals come back after 24h
  3. State files in the repo means state changes are versioned
## Update: Scripts moved to hermes-scripts repo All pipeline scripts now live in **Mark/hermes-scripts** (`~/Projects/hermes-scripts/`) and are symlinked from `~/.hermes/scripts/`: - https://forgejo.tail018ac4.ts.net/Mark/hermes-scripts This enables self-modification — file an issue in that repo and the fixer pipeline will patch the script, commit, and push it automatically. The symlink propagates changes instantly. ### Repo contents | File | Source symlink | |------|---------------| | `next-issue` | `~/.hermes/scripts/next-issue` | | `cron-get-issue.py` | `~/.hermes/scripts/cron-get-issue.py` | | `feature-triage.py` | `~/.hermes/scripts/feature-triage.py` | | `gsd-issue-fixer.py` | `~/.hermes/scripts/gsd-issue-fixer.py` | | `gsd-issue-executor.py` | `~/.hermes/scripts/gsd-issue-executor.py` | | `issue-autorun-state.json` | `~/.hermes/scripts/issue-autorun-state.json` | | `feature-triage-state.json` | `~/.hermes/scripts/feature-triage-state.json` | ### Known issues still open 1. The `feature-triage.py` script's `hermes chat -q` assessment call can take 10+ minutes on slow model responses — doubled the timeouts to 1200s to compensate 2. No deferred-indefinitely logic yet — all deferrals come back after 24h 3. State files in the repo means state changes are versioned
Author
Owner

Fixed in commit. Closing.

Fixed in commit. Closing.
Mark closed this issue 2026-05-14 01:35:39 +00:00
Sign in to join this conversation.
No description provided.