Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 30 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,36 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [Unreleased]

### Added

#### llm-support

- **`multi_review` subcommand** — fan out a code review across multiple openclaw reviewer agents.
- Bundles a local git repo, ships it to a remote host running `openclaw-gateway` via scp, invokes one or more named reviewer agents in parallel (or in an opt-in serial lane for shared-quota providers), and collects each reviewer's TD findings.
- Output layout under `--output-dir`:
- `raw/<agent>/{review.md, td-stream.txt, status.json, response.json}` — per-reviewer artifacts.
- `td-stream-all.txt` — merged pipe-delimited findings with reviewer attribution appended as a column.
- `multi-review-summary.json` — per-reviewer status (ok/failed/skipped), counts, durations, partial flag.
- Two-lane execution via `--reviewers` (parallel) and `--serial-reviewers` (sequential after parallel) for cases where some reviewers share a rate-limited provider.
- Failure semantics: bundle/ship failure hard-stops; per-reviewer failure is recorded and other reviewers continue; all-reviewers-fail exits non-zero.
- Designed to be invoked by `/code-review` Phase 5 when `review.mode: multi` is set in `.planning/.config/config.yaml`.

#### group_td

- **`REVIEWERS` and `CONFIDENCE` columns** — feature-flagged trailing columns rendered only when at least one input row carries a non-empty value, following the existing `SOURCE` column pattern.
- `REVIEWERS` stores comma-joined agent names from `multi_review` (e.g. `bruce,greta`). Rendered with a space after each comma in the table cell.
- `CONFIDENCE` is the dedupe-time computed score (`HIGH` = 2+ reviewers, `MEDIUM` = single reviewer or severity disagreement, `LOW` = single reviewer flagged as untrusted).
- Backwards-compatible — callers that don't pass these via `--headers` see no change in output.
- Internal: markdown header + row writers refactored to assemble cells dynamically.

### Fixed

#### llm-support

- **`yaml.parseNumber` preserves version-like strings** — values whose float representation would lose information (e.g. `"4.30"` → `4.3` → `"4.3"`) now stay strings. Only coerces to float when the value round-trips through YAML marshal back to the exact input.

## [1.8.2] - 2026-01-27

### Fixed
Expand Down
100 changes: 100 additions & 0 deletions docs/llm-support-commands.md
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ Complete documentation for all 40+ llm-support commands.
- [route-td](#route-td)
- [format-td-table](#format-td-table)
- [group-td](#group-td)
- [multi_review](#multi_review)

---

Expand Down Expand Up @@ -2103,6 +2104,105 @@ llm-support group-td --file items.json --min-group-size 5
| `lib/utils/string.ts` | `lib` | `lib-utils` | `lib-utils` |
| `config.ts` | `misc` | `misc` | `misc` |

**Optional trailing columns (feature-flagged):**

| Column | Triggered by | Source |
|--------|--------------|--------|
| `Source` | non-empty `SOURCE` field | `code-review` (adversarial finding) or `execute-sprint` (captured during work) |
| `Reviewers` | non-empty `REVIEWERS` field | comma-joined agent names from `multi_review` (e.g. `bruce,greta`) |
| `Confidence` | non-empty `CONFIDENCE` field | dedupe-time score: `HIGH` (2+ reviewers), `MEDIUM` (single), `LOW` (single + untrusted) |

These columns are emitted only when at least one input row carries a non-empty value, so existing 7- or 8-column callers see no change.

---

### multi_review

Fan out a code review across multiple openclaw reviewer agents on a remote host, collect each reviewer's TD findings, and merge them with per-row attribution.

```bash
llm-support multi_review [flags]
```

**Required flags:**

| Flag | Description |
|------|-------------|
| `--reviewers` | Comma-separated reviewer agent names (e.g. `bruce,greta,kai,mira,dax,otto`) |
| `--repo` | Local repo path to bundle and ship |
| `--openclaw-host` | SSH target running `openclaw-gateway` (e.g. `user@nucleus.lan`) |
| `--output-dir` | Where per-reviewer artifacts and merged stream land |

**Optional flags:**

| Flag | Default | Description |
|------|---------|-------------|
| `--serial-reviewers` | (empty) | Subset that runs sequentially after the parallel lane (shared rate limits) |
| `--base` | (empty) | Base ref for the diff range, included in the auto-built task message |
| `--head` | `HEAD` | Head ref |
| `--timeout-seconds` | `1200` | Total wall-clock budget for the entire fan-out |
| `--per-reviewer-timeout-seconds` | `600` | Per-reviewer soft timeout |
| `--gateway-container` | `openclaw-gateway` | Docker container running openclaw |
| `--task-message` | (auto) | Override the auto-built task message |
| `--skip-cleanup` | `false` | Do not remove the remote workdir after running |

**Output layout under `--output-dir`:**

```
<output-dir>/
raw/
bruce/
review.md # extracted prose
td-stream.txt # pipe-delimited findings with |bruce appended
status.json # model, duration, status, td line count
response.json # raw openclaw envelope (for replay)
greta/... (same shape)
...
raw/td-stream-all.txt # merged across reviewers with REVIEWER column
td-stream.txt # same merged content, surfaced at root so
# /reconcile-code-review auto-discovers this
# directory as one unified source
multi-review-summary.json # per-reviewer status + counts + partial flag
```

**Failure semantics:**

| Scenario | Behavior |
|----------|----------|
| Bundle/ship fails (SSH down, scp error, remote clone fails) | Hard-stop with error naming the host |
| 1+ reviewer fails, 1+ succeeds | Continue with successful ones, `partial: true` in summary, exit 0 |
| All reviewers fail | Exit 1 with summary path |

**Examples:**

```bash
# Six-reviewer fan-out, all parallel
llm-support multi_review \
--reviewers bruce,greta,kai,mira,dax,otto \
--repo ~/Documents/GitHub/myproject \
--openclaw-host user@nucleus.lan \
--output-dir .planning/sprints/active/2.0/code-review/multi-review \
--base v1.0.0 --head HEAD

# With a serial lane for shared-quota providers
llm-support multi_review \
--reviewers bruce,greta,kai,mira,dax \
--serial-reviewers mira,dax \
--repo . --openclaw-host user@host.lan \
--output-dir /tmp/mr-out

# Custom task message
llm-support multi_review \
--reviewers bruce \
--repo . --openclaw-host user@host.lan \
--output-dir /tmp/mr-out \
--task-message "Review only auth/*.go files for security issues."
```

**Wiring into `/code-review`:**

`multi_review` is designed to be invoked by the `/code-review` command's Phase 5 (adversarial review) when `review.mode: multi` is set in `.planning/.config/config.yaml`. See the [code-review prompt](https://github.com/samestrin/claude-prompts/blob/main/.claude/commands/code-review.md) for the integration.

---

## Global Flags
Expand Down
Loading
Loading