Use when working on a GitHub issue - fetches issue details, analyzes codebase, implements fix following project methodology
Guided workflow for implementing fixes for GitHub issues following the project's agent guidance and release methodology.
/fix-issue <number>
digraph fix_flow {
rankdir=TB;
node [shape=box];
fetch [label="1. Fetch issue details"];
analyze [label="2. Analyze issue type"];
verify [label="3. Verify it's a real bug"];
investigate [label="4. Deep investigation"];
plan [label="5. Enter plan mode"];
implement [label="6. Implement fix"];
test [label="7. Test changes"];
commit [label="8. Commit & push"];
fetch -> analyze;
analyze -> verify;
verify -> investigate;
investigate -> plan;
plan -> implement;
implement -> test;
test -> commit;
}
# Get issue details
gh issue view <number> --repo kube-hetzner/terraform-hcloud-kube-hetzner
# CRITICAL: Always read ALL comments - solutions may already be proposed
gh issue view <number> --repo kube-hetzner/terraform-hcloud-kube-hetzner --comments
| Type | Description | Action |
|---|---|---|
| 🔴 BUG | Reproducible defect | Fix it |
| 🟡 EDGE CASE | Fails in specific scenario | Evaluate effort vs impact |
| 🟠 USER ERROR | Misconfigured kube.tf | Help user, improve docs |
| ⚪ OLD VERSION | Fixed in newer release | Ask user to upgrade |
| 🔵 FEATURE REQUEST | New functionality | Move to Discussions |
| ❓ NEEDS INFO | Can't reproduce | Ask for more info |
initial_k3s_channel,
install_k3s_version, disable_selinux, disable_kube_proxy,
kubernetes_distribution_type, or existing_network_idCRITICAL: Many issues are user configuration errors, NOT bugs.
Before implementing any fix:
# Search for existing PRs
gh pr list --search "<error keyword>" --repo kube-hetzner/terraform-hcloud-kube-hetzner
# Check if issue is already mentioned in changelog
rg -i "<keyword>" CHANGELOG.md
Read these files to understand context:
# Always start with these
cat versions.tf # Provider/terraform versions
cat variables.tf # All configurable options
cat locals.tf # Core logic and computed values
# Then investigate specific areas based on the issue
| Area | Files to Check |
|---|---|
| Network | locals.tf, main.tf, validation-locals.tf, validation-contract.tf |
| Control Plane | control_planes.tf, locals.tf |
| Agents | agents.tf, autoscaler-agents.tf |
| Load Balancer | main.tf, init.tf, locals.tf, templates/*_ingress.yaml.tpl |
| CNI | templates/cilium.yaml.tpl, templates/calico.yaml.tpl, kustomize/flannel-rbac.yaml, locals.tf |
| Storage | templates/longhorn.yaml.tpl |
| Firewall | main.tf, locals.tf, validation-contract.tf |
| SELinux | docs/selinux.md, templates/kube-hetzner-selinux.te, templates/k8s-custom-policies.te |
| v2 -> v3 migration | MIGRATION.md, docs/v2-to-v3-migration.md, scripts/v2_to_v3_migration_assistant.py |
Use exact search, file inspection, and git history for broad context. For a complex or non-obvious issue, obtain an independent analysis from a separate capable reviewer and verify its findings against code and reproduction evidence.
MANDATORY: Always enter plan mode before implementing.
Write a plan that includes:
# Pull latest master first!
git pull origin master
# Create feature branch
git checkout -b fix/issue-<number>-<description>
# ALWAYS run these before committing
terraform fmt -recursive
terraform init -backend=false -input=false
terraform validate -no-color
# Test against existing deployment
cd /path/to/kube-test
terraform init -upgrade
terraform plan # Should NOT show resource destruction
terraform fmt -recursive passesterraform init -backend=false -input=false and terraform validate -no-color passterraform plan shows expected changes onlytest-changes skill (scripts/render_harness.py, scripts/contract_negative_tests.py, scripts/validate_v3_final_polish_examples.py, and/or scripts/smoke_v3_plan_matrix.py)For destroy/teardown issues, start with scripts/destroy.sh, not manual cloud
deletes. It runs Terraform/OpenTofu destroy, auto-retries only the known benign
ingress-LB detach race, and then prints a read-only orphan report. Use
scripts/cleanup.sh only as the forceful fallback when state is already wrecked
or the read-only report identifies leftovers to delete.
Autoscaler-created servers are outside Terraform state. If they pin the network
during destroy, delete them only after the control plane/Cluster Autoscaler is
dead, or first scale the autoscaler pool to min_nodes = 0. Deleting them while
min_nodes > 0 and the autoscaler is still running just lets the autoscaler
recreate them.
git add <specific-files>
git commit -m "$(cat <<'EOF'
fix: <brief description>
Fixes #<number>
<explanation of what was wrong and how it's fixed>
EOF
)"
git push -u origin fix/issue-<number>-<description>
If the fix originates from a community member's work — a patch posted in the issue, a diff from their fork, or an abandoned/superseded PR — preserve their credit in git history so they appear in the repo contributors graph and GitHub-generated release notes:
git cherry-pick those commits FIRST (keeps them as Author:), then add your changes as separate commits on top. Never squash their authorship away (see the review-pr skill for merge-method rules). Cherry-picking preserves contributor credit but does not make the original PR appear merged, so describe that disposition honestly.Co-authored-by: Name <email> trailer to your commit (use their GitHub noreply email <id>+<login>@users.noreply.github.com if no public email), and credit their handle in the commit body and changelog entry.Co-authored-by by EXACT email. Never guess the numeric id — fetch it first: gh api users/<login> --jq .id. A wrong id silently drops the credit.Co-authored-by: and any other trailers (e.g. Claude-Session:) together in one last block with no blank line between them — a trailer in an earlier paragraph is silently ignored by git and GitHub. Verify with: git log -1 --format='%(trailers:key=Co-authored-by,valueonly=true)'.Before completing ANY issue:
| Step | Command |
|---|---|
| Fetch issue | gh issue view <num> --comments |
| Check PRs | gh pr list --search "<keyword>" |
| Create branch | git checkout -b fix/issue-<num>-<desc> |
| Format | terraform fmt -recursive |
| Validate | terraform validate |
| Test plan | terraform plan |
| Commit | git commit -m "fix: ..." |
| Push | git push -u origin <branch> |
Human reporters and contributors get kind, specific replies — they are volunteers giving the project their time. Keep internal reviews and candidate status in the evidence ledger; default to one final disposition message per issue or PR instead of posting near-duplicate progress and completion notes.
mergedAt; partial adoption must be described
honestly as incorporated or credited.