17 KiB
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:
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
ResolvedCredentialsshared or per-provider? - Does
.envtier usedotenv::var()? - Any tests call
from_env_or_saveddirectly?
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:
// 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
SessionErrorenum 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
RuntimeProviderConfigthe 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 | ⬜ | — | — | — |