name: fix-issue
description: Analyze a GitHub issue, explore related code, and propose or implement a fix. Use when the user asks to investigate, fix, or resolve a GitHub issue.
user-invocable: true
argument-hint: ""
allowed-tools: Bash, Read, Edit, Write, Glob, Grep, WebFetch, Task
Analyze and Fix a GitHub Issue
Given a GitHub issue number, investigate the problem, find the relevant code, and either propose or implement a fix.
Arguments
$ARGUMENTS — the GitHub issue number (e.g., 509). If not provided, ask the user.
Phase 1: Understand the Issue
Read the issue and extract key information:
gh issue view $ARGUMENTS --repo stillwater-sc/universal --json title,body,labels,state,comments
From the issue, identify:
- What's broken or missing — the core problem statement
- Which number type(s) are affected (posit, cfloat, lns, fixpnt, dd, qd, ereal, etc.)
- Which subsystem — api, conversion, arithmetic, math, operator<<, exceptions, etc.
- Severity — crash, wrong results, missing feature, documentation, performance
- Labels — enhancement, bug, help wanted, Epic, etc.
- Any code snippets or reproduction steps in the issue body or comments
Phase 2: Locate Related Code
Based on the issue analysis, search the codebase:
Find the relevant type's implementation:
include/sw/universal/number/TYPE/TYPE_impl.hppSearch for keywords from the issue:
- Function names, error messages, type names mentioned in the issue
- Use Grep and Glob to find related files
Check existing tests for the affected area:
static/{category}/TYPE/api/ static/{category}/TYPE/arithmetic/ static/{category}/TYPE/conversion/ static/{category}/TYPE/math/Examples:
static/fixpnt/binary/api/,static/tapered/posit/api/,static/block/microfloat/api/Check if there's a related PR or branch:
gh pr list --repo stillwater-sc/universal --state all --search "related keywords"
Phase 3: Assess Complexity
Classify the fix:
| Complexity | Criteria | Action |
|---|---|---|
| Trivial | Typo, missing include, simple one-line fix | Implement directly |
| Moderate | New function, algorithm fix, test addition (1-3 files) | Implement with user confirmation |
| Significant | Cross-type change, new subsystem, architectural (4+ files) | Present plan, ask user before implementing |
| Epic | Major feature, multi-PR effort | Present roadmap, suggest breakdown into sub-issues |
Phase 4: Implement the Fix
For Trivial/Moderate fixes:
Create a feature branch:
git checkout -b fix/issue-NNN-short-descriptionMake the code changes — follow existing patterns in the codebase
Build and test with BOTH compilers:
- Build with gcc:
cmake --build --preset gcc-debug --target TARGET - Run gcc test
- Build with clang:
cmake --build --preset clang-debug --target TARGET - Run clang test
- NEVER skip the clang build — CI uses clang and it catches different issues
- Build with gcc:
Run related regression tests to check for regressions
Commit with a descriptive message referencing the issue:
fix(TYPE): description of what was fixed Resolves #NNNPush and create a draft PR:
git push -u origin fix/issue-NNN-short-description gh pr create --draft --title "fix(TYPE): short description" --body "..."Always create PRs as draft — this skips the expensive CI jobs (sanitizers, coverage, full 11-platform matrix) and only runs the fast tier (gcc + clang CI_LITE, ~8 min). When the user is satisfied, they promote with
gh pr ready NNN.
For Significant/Epic issues:
Present a structured analysis:
## Issue #NNN: Title ### Root Cause [explanation] ### Affected Files - file1.hpp:line — what needs to change - file2.cpp:line — what needs to change ### Proposed Approach [step-by-step plan] ### Estimated Scope [number of files, complexity assessment] ### Risks [what could go wrong, what to watch for]Ask the user how to proceed
Critical Rules
Build Safety
- ONE build at a time, max
-j4 - Check
pgrep -a 'make|cmake|ninja'before building - Test with BOTH gcc AND clang
Code Quality
- Follow existing patterns — read similar implementations before writing
- Number types must be trivially constructible (no in-class initializers)
- Exception hierarchy: number types inherit
universal_*, internal blocks inheritstd::runtime_error - Don't use
constexpron constructors that call math functions
Portability Pitfalls
- Don't use
long doublebit-shift division — usestd::ldexp() - Always initialize
blockbinarytemporaries (clang doesn't zero stack) - MSVC has no
operator long double()onblocksignificand - MinGW has IPA ICF bugs with multiple template instantiations
Issue Communication
- If the user explicitly asks to notify the issue thread when starting work:
gh issue comment NNN --repo stillwater-sc/universal --body "Working on this. Plan: [brief description of approach]" - If the user explicitly asks to notify the issue after opening a PR, post a follow-up summary:
gh issue comment NNN --repo stillwater-sc/universal --body "Implemented [summary] in PR #PPP." - Do not comment on issues automatically; always ask for confirmation first.
- Reference the issue number in commits:
Resolves #NNNorFixes #NNN - If the fix is partial, use
Relates to #NNNinstead - Don't close Epic issues with a single PR — they track multi-step efforts
Common Issue Patterns
| Issue Pattern | Where to Look | Typical Fix |
|---|---|---|
| Wrong arithmetic results | TYPE_impl.hpp operators, blockbinary |
Algorithm fix, edge case handling |
| Missing math function | math/TYPE_math.hpp or mathlib.hpp |
Implement using existing patterns |
| Precision loss in output | operator<<, to_string() |
Use support::decimal for exact conversion |
| Conversion failure | TYPE_impl.hpp assignment operators |
Fix the conversion path |
| Build failure on platform X | Compiler-specific code paths | Portability fix with #ifdef or alternative |
| Missing istream support | operator>> in TYPE_impl.hpp |
Implement parsing |
| Performance issue | Hot path in arithmetic operators | Profile, optimize inner loop |
| CI test failure | Test expectations vs actual behavior | Fix test or fix implementation |