claw-code/docs/reviewer-feedback-sprint.md

378 lines
17 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Reviewer Feedback Sprint
## Execution Log
| Time | PR | Action | Status |
|------|-----|--------|--------|
| 2026-06-02 | #3211 | Plan written at `docs/pr-3211-plan.md` | ✅ Plan approved |
| 2026-06-02 | #3211 | Executed: extracted `read_env_non_empty` + `resolve_base_url` into `mod.rs` | ✅ Committed |
| 2026-06-02 | #3211 | Pushed commit `c0855e12` to `worktree-provider-config-fallback` | ✅ Pushed |
| 2026-06-02 | #3211 | CI: cargo fmt ✅, cargo test (147 unit + 37 integration) ✅, cargo check ✅ | ✅ Verified |
| 2026-06-02 | #3211 | Pre-existing clippy issues in runtime/trident.rs (not from our changes) — noted | ⚠️ Known |
| 2026-06-02 | #3214 | Plan written at `docs/pr-3214-plan.md` | ✅ Plan approved |
| 2026-06-02 | #3214 | All 3 CI failures (build ❌ test ❌ fmt ❌) traced to one root cause: missing `retry_after: None` in main.rs test | ✅ Root caused |
| 2026-06-02 | #3214 | Fixed: added `retry_after: None`, removed duplicate `#[must_use]`, ran `cargo fmt --all` | ✅ Committed |
| 2026-06-02 | #3214 | Pushed commit `76783377` to `worktree-api-timeout-retry-v2` | ✅ Pushed |
| 2026-06-02 | #3214 | Reviewer Q "Are defaults preserved?" — YES: ApiTimeoutConfig defaults 30s/300s/8, with_retry_policy() is opt-in | ✅ Answered |
| 2026-06-02 | #3216 | Plan written at `docs/pr-3216-plan.md` | ✅ Plan approved |
| 2026-06-02 | #3216 | Root cause: test creates sessions with 0 messages → filtered out by `message_count > 0` | ✅ Root caused |
| 2026-06-02 | #3216 | Fix: test now adds `push_user_text()` before saving; added `format_all_sessions_empty()` error message | ✅ Committed |
| 2026-06-02 | #3216 | Added test `latest_session_returns_all_empty_error_when_sessions_exist_but_have_no_messages` | ✅ New test |
| 2026-06-02 | #3216 | Pushed commit `41034bb3` to `worktree-session-resume-fixes` | ✅ Pushed |
| 2026-06-02 | #3217 | Plan written at `docs/pr-3217-plan.md` — trivial: just cargo fmt | ✅ Plan approved |
| 2026-06-02 | #3217 | Committed pre-existing fmt changes, pushed `592bae5` | ✅ Done |
| 2026-06-02 | #3218 | Plan written at `docs/pr-3218-plan.md` — slash command count off by 1 | ✅ Plan approved |
| 2026-06-02 | #3218 | Fixed: count 139→140, added `/setup` assertion, pushed `1122b16` | ✅ Done |
| 2026-06-02 | #3219 | Plan written at `docs/pr-3219-plan.md` — CI count fix + implement `/lsp status` | ✅ Plan approved |
| 2026-06-02 | #3219 | Fixed CI: count 139→140, added `/lsp` assertion | ✅ CI fix |
| 2026-06-02 | #3219 | Exported `check_lsp_availability`, `LspInstallAction`, `InstallInstruction`, `format_install_prompt` from runtime | ✅ Exports |
| 2026-06-02 | #3219 | Implemented `/lsp status` (✅❌⚠️), `/lsp list`, `/lsp start/stop` handler replacing stub | ✅ Feature |
| 2026-06-02 | #3219 | Pushed commit `369452c` to `worktree-lsp-v3` | ✅ Pushed |
### 2026-06-04 — Round 2: upstream-merge cycle (new reviewer comments + conflicts)
Reviewer (`1716775457damn`) left new comments on 5 PRs. Root cause across all: every PR was cut from stale `upstream/main @ 4d3dc5b`; upstream advanced to `4619375` (config/runtime refactor → conflicts + flaky CI). Fix = merge current upstream + address each specific ask. Investigated with 5 read-only agents, fixed with 5 agents in isolated worktrees, each diff reviewed (no leftover markers, feature preserved, build + targeted tests green, remote SHA verified).
| Time | PR | Action | Status |
|------|-----|--------|--------|
| 2026-06-04 | #3214 | Reviewer: resolve conflicts + clarify 5-vs-3 commits. Merged upstream; threaded `api_timeout` through new `build_runtime_config` helper; conflicts in config.rs/lib.rs | ✅ Resolved |
| 2026-06-04 | #3214 | Verified: 158+13+11+4+7 api tests pass, no leftover markers, MERGEABLE/CLEAN. Pushed merge `9e50cb6` | ✅ Pushed |
| 2026-06-04 | #3216 | Reviewer: fix 3 CI checks + add exclude_id tests. Clean merge; `cargo fmt` (real failure); added 3 tests (exclude_id skip, 0-msg filter, resolve_reference_excluding) | ✅ Resolved |
| 2026-06-04 | #3216 | Verified: 21 session_control tests pass, fmt clean, MERGEABLE/CLEAN. Pushed `346772a`. Note: build/test reds were env-only `subagentModel` config-parse, not PR-caused | ✅ Pushed |
| 2026-06-04 | #3217 | Reviewer: fix 2 CI checks + integration test. Clean merge refreshed flaky arg-parse tests; extracted `PRESERVE_SCHEDULE` const + added bounds test | ✅ Resolved |
| 2026-06-04 | #3217 | Verified: 206 CLI tests pass incl. previously-flaky pair, MERGEABLE/CLEAN. Pushed `77c7d08` | ✅ Pushed |
| 2026-06-04 | #3218 | Reviewer: resolve conflicts + document subagentModel. 4-file merge (kept upstream `Doctor{output_format,permission_mode}` sig + this PR's `setup` arm); doc comment on `TOP_LEVEL_FIELDS` | ✅ Resolved |
| 2026-06-04 | #3218 | Verified: 24 config_validate tests pass, builds clean, MERGEABLE/CLEAN. Pushed `d54f028` | ✅ Pushed |
| 2026-06-04 | #3219 | Reviewer: resolve conflicts + nightly rustup probe. 3-file merge; `rustup_component_works()` now probes stable→nightly, returns working toolchain; both call sites updated | ✅ Resolved |
| 2026-06-04 | #3219 | Verified: 58 LSP tests pass, builds clean, MERGEABLE (CI re-running). Pushed `a0e9833` | ✅ Pushed |
| 2026-06-04 | #3211 | Resolved merge conflicts with upstream/main (config.rs + lib.rs); preserved RuntimeProviderConfig + `read_env_non_empty`/`resolve_base_url` helpers; rebuilt corrupted test section | ✅ Resolved |
| 2026-06-04 | #3211 | Verified: api + runtime crates compile, shared helpers intact in mod.rs, `67da2dc` on `worktree-provider-config-fallback` | ✅ Pushed |
| 2026-06-04 | #3211 | Posted maintainer summary on PR #3211: shared helpers explained, `from_env` vs `from_env_or_saved` naming rationale, merge details | ✅ Commented |
**Date:** 2026-06-03
**Upstream:** `ultraworkers/claw-code`
---
## Closed PRs — Done, No Action
| PR | What happened |
|----|---------------|
| #3212 | Owner merged equivalent (`1bd18be`) |
| #3215 | Owner closed — wants internal doc pointers, not external links |
| #3220 | Owner merged equivalent (`9c8375d`) with validation/tests added |
---
## Open PRs — Reality Check
| # | PR | Title | build | test | fmt | mergeable | Reviewer | Difficulty |
|---|-----|-------|-------|------|-----|-----------|----------|------------|
| ① | #3217 | Auto-compact retry | ✅ | ✅ | ❌ | YES | 1716775457damn | Trivial |
| ② | #3211 | 3-tier credential resolution | ✅ | ✅ | ❌ | ? | 1716775457damn | Medium |
| ③ | #3214 | API timeout/retry | ❌ | ❌ | ❌ | ? | 1716775457damn | Medium |
| ④ | #3216 | Session resume | ❌ | ❌ | ✅ | YES | 1716775457damn | Medium |
| ⑤ | #3218 | Wizard entry points | ❌ | ❌ | ✅ | ? | *(none yet)* | Medium |
| ⑥ | #3219 | LSP integration v3 | ❌ | ❌ | ✅ | ? | 1716775457damn | Hard |
Order: ① → ② → ③ → ④ → ⑤ → ⑥ (green CI first, then red, easy → hard)
---
## ① #3217 — Auto-compact retry
**Branch:** `worktree-auto-compact-retry`
**Worktree:** `.claude/worktrees/wf_616683a9-d46-1`
### Reviewer said:
> "Nice improvement — extending auto-compact retry from REPL-only to all execution paths fixes a real UX pain point. Using RuntimeError::is_context_window_failure() via the canonical api crate markers is the right approach. The progressive compaction strategy (4→2→0) with MAX_COMPACT_RETRIES=3 is well-bounded."
>
> **Action:** "I see cargo fmt is failing in CI — consider running cargo fmt --all before merge to keep checks green."
### CI: 5/6 green. Only `cargo fmt` fails.
### Plan:
| Step | What | Command |
|------|------|---------|
| 1 | Format | `cd rust/ && cargo fmt --all` |
| 2 | Verify | `cargo fmt --all -- --check` && `cargo check --workspace` |
| 3 | Commit | `"style: cargo fmt"` |
| 4 | Push | `git push origin worktree-auto-compact-retry` |
Fmt touches 1 file: `main.rs` (5 ins / 10 del, pure formatting). No logic changes.
### Status: ⬜
---
## ② #3211 — 3-tier credential resolution
**Branch:** `worktree-provider-config-fallback`
**Worktree:** `.claude/worktrees/provider-config-fallback`
### Reviewer said:
> "This makes the setup wizard actually functional. The 3-tier priority is well thought out. Covering all four providers with both API key and base URL resolution is thorough."
>
> **Ask 1:** "The from_env_or_saved naming across multiple provider files could be consolidated into a shared trait or helper to reduce duplication."
>
> **Ask 2:** "Also, cargo fmt is failing — a quick cargo fmt --all before merge will fix that."
### CI: 5/6 green. Only `cargo fmt` fails.
### Plan:
| Step | What | Detail |
|------|------|--------|
| 1 | Investigate | Read all 4 provider files. Catalog `from_env_or_saved` signatures, env vars, return types. Find where `ResolvedCredentials` is defined. |
| 2 | Add helper | `CredentialSources` struct + `resolve_provider_credentials()` fn in `config.rs` |
| 3 | Refactor × 4 | Replace each provider's `from_env_or_saved` body with helper call |
| 4 | Export | `pub use` in `lib.rs` if needed |
| 5 | Fmt + verify | `cargo fmt --all``cargo check --workspace``cargo test -p runtime -p api` |
| 6 | Commit + push | `"refactor: consolidate from_env_or_saved into shared resolve_provider_credentials() helper"` |
**Helper design:**
```rust
pub struct CredentialSources {
pub api_key_env: &'static str,
pub api_key_alt_env: Option<&'static str>,
pub api_key_config: fn(&RuntimeProviderConfig) -> &Option<String>,
pub base_url_env: &'static str,
pub base_url_config: fn(&RuntimeProviderConfig) -> &Option<String>,
pub default_base_url: &'static str,
}
pub fn resolve_provider_credentials(
config: &RuntimeProviderConfig,
sources: &CredentialSources,
) -> Option<ResolvedCredentials> { }
```
**Open Qs to resolve in Step 1:**
- Is `ResolvedCredentials` shared or per-provider?
- Does `.env` tier use `dotenv::var()`?
- Any tests call `from_env_or_saved` directly?
### Status: ✅ Resolved (2026-06-04)
Merged upstream/main into `worktree-provider-config-fallback`. Conflicts in `runtime/src/config.rs` and `runtime/src/lib.rs` both resolved while preserving the `read_env_non_empty` / `resolve_base_url` shared helpers and the `RuntimeProviderConfig` struct/impl.
Key manual fix: The merge-generated config.rs had corrupted test sections (interleaved function declarations from both versions). Reconstructed clean provider_config_* and rules_import_* test bodies from original commits.
Build verification: `cargo check -p api` ✅, `cargo check -p runtime` ✅. Pre-existing clippy issues in trident.rs and claw-rag-service unchanged.
Commit: `67da2dc`
---
## ③ #3214 — API timeout/retry
**Branch:** `worktree-api-timeout-retry-v2`
**Worktree:** `.claude/worktrees/api-timeout-retry-v2`
### Reviewer said:
> "Good revival of the stalled #2816. Retry-After header and 400 transient retry are particularly valuable for handling API rate limits."
>
> **Question:** "Are defaults preserved so existing behavior is unchanged?"
### CI: 3/6 green. Build ❌, test ❌, fmt ❌. Fix CI first, then answer.
### Plan:
**Phase A — Fix CI:**
| Step | What | Detail |
|------|------|--------|
| 1 | Investigate build | `cargo check --workspace 2>&1` — capture errors |
| 2 | Fix build | Based on Step 1 findings |
| 3 | Investigate test | `cargo test -p runtime -p api 2>&1` — capture failures |
| 4 | Fix tests | Based on Step 3 findings |
| 5 | Fmt | `cargo fmt --all` |
| 6 | Verify green | All 3 checks pass locally |
| 7 | Commit + push | |
**Phase B — Answer reviewer:**
| Step | What | Detail |
|------|------|--------|
| 8 | Verify defaults | `TimeoutConfig` timeout=300s, `RetryConfig` max_retries=2, 400-transient is additive-only |
| 9 | Post comment | Answer with specifics (draft below, adjust after Step 8) |
**Comment draft:**
```
Yes, all defaults are preserved:
- Timeout: 300s (unchanged)
- Max retries: 2 (unchanged)
- Retry-After: only activates when server sends the header
- 400 transient: purely additive — retries only on specific transient 400 codes
Backward-compatible with no behavioral changes unless user explicitly configures new fields.
```
⚠ Don't post until Step 8 confirms. If any default changed, fix code first.
**Open Qs:**
- Actual build errors? (Step 1)
- Actual test failures? (Step 3)
- Defaults actually preserved? (Step 8)
### Status: ⬜
---
## ④ #3216 — Session resume
**Branch:** `worktree-session-resume-fixes`
**Worktree:** `.claude/worktrees/wf_616683a9-d46-2`
### Reviewer said:
> "The unified session resolution with load_session_excluding() is a clean approach."
>
> **Concern 1:** "I notice CI has 2 failing checks (build + cargo test) — worth investigating before merge."
>
> **Concern 2:** "What happens when all sessions have 0 messages (fresh install / all deleted)? A clear error message would be better than silently returning nothing."
### CI: 4/6 green. Build ❌, test ❌. fmt ✅.
### Plan:
| Step | What | Detail |
|------|------|--------|
| 1 | Investigate build | `cargo check --workspace 2>&1` — capture errors |
| 2 | Fix build | Based on Step 1. Likely missing imports in `session_control.rs` |
| 3 | Investigate test | `cargo test -p runtime 2>&1` — capture failures |
| 4 | Fix tests | Based on Step 3 |
| 5 | Add empty-session error | If all candidates have 0 messages → `Err("No sessions with messages found. Start a new session first.")` |
| 6 | Surface in CLI | `/resume` handler prints error gracefully (no panic) |
| 7 | Fmt + verify | `cargo fmt --all``cargo check --workspace``cargo test -p runtime` |
| 8 | Commit + push | |
**Empty-session error:**
```rust
// session_control.rs — after scanning:
if candidates.is_empty() || candidates.iter().all(|s| s.message_count == 0) {
return Err(SessionError::NoSessionsFound);
}
// main.rs — /resume handler:
Err(SessionError::NoSessionsFound) => {
eprintln!("No sessions with messages found. Start a new session first.");
}
```
**Open Qs:**
- Actual build errors? (Step 1)
- Actual test failures? (Step 3)
- Does `SessionError` enum already exist?
### Status: ⬜
---
## ⑤ #3218 — Wizard entry points
**Branch:** `worktree-wizard-entry-points`
**Worktree:** `.claude/worktrees/wizard-entry-points`
### Reviewer: None yet. Fix proactively before one arrives.
### CI: 4/6 green. Build ❌, test ❌. fmt ✅.
### Likely cause: `setup_wizard.rs` imports `RuntimeProviderConfig` which doesn't exist on upstream/main (only in PR #3211).
### Strategy: Add `RuntimeProviderConfig` to this PR too. Safe duplication — when #3211 merges first, rebase deduplicates.
### Plan:
| Step | What | Detail |
|------|------|--------|
| 1 | Investigate build | `cargo check --workspace 2>&1` — confirm root cause |
| 2 | Add `RuntimeProviderConfig` | Minimal fields in `config.rs` (same as #3211) |
| 3 | Export | `pub use` in `lib.rs` |
| 4 | Fix other compile errors | If any |
| 5 | Investigate test | `cargo test -p runtime -p api 2>&1` |
| 6 | Fix tests | Based on findings |
| 7 | Fmt + verify | `cargo fmt --all``cargo check --workspace``cargo test -p runtime -p api` |
| 8 | Commit + push | |
**Open Qs:**
- Is `RuntimeProviderConfig` the only missing type?
- Any other dependencies on #3211?
### Status: ⬜
---
## ⑥ #3219 — LSP integration v3
**Branch:** `worktree-lsp-v3`
**Worktree:** `.claude/worktrees/wf_616683a9-d46-5`
### Reviewer said:
> "This is an impressive piece of work. The modular split across 4 crates with 58 unit tests is exactly the right architecture. The lazy-start pattern and diagnostic enrichment are genuinely useful."
>
> **Blocker 1:** "build and cargo test are currently failing — worth investigating"
>
> **Blocker 2:** "Consider adding a claw lsp status command so users can confirm which servers were discovered and their health"
### CI: 4/6 green. Build ❌, test ❌. fmt ✅.
### Plan:
**Phase A — Fix CI:**
| Step | What | Detail |
|------|------|--------|
| 1 | Investigate build | `cargo check --workspace 2>&1` |
| 2 | Fix build | Module visibility / missing imports in LSP crates |
| 3 | Investigate test | `cargo test -p runtime 2>&1` |
| 4 | Fix tests | Assertions needing update for new types |
| 5 | Verify | `cargo check --workspace` + `cargo test -p runtime` |
| 6 | Commit | `"fix: resolve CI build and test failures for LSP integration"` |
**Phase B — Add `claw lsp status`:**
| Step | What | Detail |
|------|------|--------|
| 7 | Add `LspServerStatus` + `LspStatus` | In `lsp_discovery.rs`: `{ name, status: {Running\|Stopped\|NotFound}, path }` |
| 8 | Add `discover_all()` | Probe PATH → `Vec<LspServerStatus>` |
| 9 | CLI subcommand | `claw lsp status` → call `discover_all()` → print table |
| 10 | Slash command | `/lsp status` → check in-process manager → print |
| 11 | Fmt + verify | `cargo fmt --all``cargo check --workspace``cargo test -p runtime` |
| 12 | Commit + push | |
**Output format:**
```
LSP Server Status:
rust-analyzer running /home/user/.cargo/bin/rust-analyzer
gopls stopped /usr/local/bin/gopls
pyright not found (not in PATH)
2 servers discovered, 1 running
```
**Open Qs:**
- Actual build errors? (Step 1)
- Actual test failures? (Step 3)
- Does LSP crate already have `discover_all()`-equivalent?
- CLI: probe fresh or connect to running instance?
### Status: ⬜
---
## Progress
| # | PR | Status | CI | Reviewer | Pushed |
|---|-----|--------|-----|----------|--------|
| ① | #3217 | ⬜ | — | — | — |
| ② | #3211 | ⬜ | — | — | — |
| ③ | #3214 | ⬜ | — | — | — |
| ④ | #3216 | ⬜ | — | — | — |
| ⑤ | #3218 | ⬜ | — | — | — |
| ⑥ | #3219 | ⬜ | — | — | — |