From 76151c76b2abb7da00cad4da25777e851326aa3f Mon Sep 17 00:00:00 2001 From: Godopu Date: Wed, 26 Aug 2026 10:07:16 +0900 Subject: [PATCH] docs(roadmap): add new agent types extension roadmap and peer review reports --- .agents/reports/new_agent_types_roadmap.md | 229 ++++++++++++++++++ .../report-7c8f1f5c.md | 18 ++ .../reviewer-cline-01/report-4fd933af.md | 117 +++++++++ 3 files changed, 364 insertions(+) create mode 100644 .agents/reports/new_agent_types_roadmap.md create mode 100644 .agents/reports/planner-reviewer-claude-01/report-7c8f1f5c.md create mode 100644 .agents/reports/reviewer-cline-01/report-4fd933af.md diff --git a/.agents/reports/new_agent_types_roadmap.md b/.agents/reports/new_agent_types_roadmap.md new file mode 100644 index 0000000..f2ef2ff --- /dev/null +++ b/.agents/reports/new_agent_types_roadmap.md @@ -0,0 +1,229 @@ +# πŸ—ΊοΈ Multi-Agent Mux (MAM): New Agent Types Extension Roadmap & Architecture Analysis + +- **Author**: Creator Agent (`creator-agy-01`) +- **Date**: 2026-08-26 +- **Status**: Complete / Ready for Review +- **Document Purpose**: Provide a comprehensive architectural review of recent layout enhancements and an actionable implementation blueprint for onboarding new agent backends (e.g., `codex`, `grok-build`, `opencode`, `kimi`, `cursor`). + +--- + +## 1. Review of Recent Commit Changes + +### 1.1 Layout Engine Refinements (`lib_py/layout.py` & `lib.sh:432`) +- **Constraint Relaxation**: + - `MAM_MIN_PANE_COLS` default was lowered from `60` -> `40` -> `15`. This allows dense multi-pane tiling in compact terminal environments (e.g. 80x24 standard terminals with 54x23 content areas) without prematurely triggering `column_width_overflow`. + - `MAM_MIN_PANE_ROWS` default was set to `0`. Vertical height constraints were removed because terminal panes support native scrollback buffers, allowing 2-row splitting even in constrained heights. +- **Single-Workspace 2Γ—K Multi-Pane Tiling**: + - Standard viewports (e.g. 54Γ—23 content area in 80Γ—24 window, or 90–100 col windows) cleanly progress through: + 1. **1 Pane** $\rightarrow$ split down $\rightarrow$ **2 Panes** (top/bottom) + 2. **2 Panes** $\rightarrow$ split right $\rightarrow$ **3 Panes** (starts column 2) + 3. **3 Panes** $\rightarrow$ fill singleton down $\rightarrow$ **4 Panes** (2Γ—2 balanced grid) + 4. **4 Panes** $\rightarrow$ 5th pane overflows to a dedicated fresh workspace when column width $< 15$ cols. +- **Verification & Test Suite**: + - `tests/test_layout.py` (27 unit tests) and `tests/test_tier1_unit.py` (59 unit tests) assert default `min_cols=15` and verify boundary conditions (e.g. 30 cols split vs 29 cols overflow; 54Γ—23 compact window tiling). + - All 371 tests across the 18 test suites pass with 0 failures. + +--- + +## 2. Architecture & Contract for Adding New Agent Types + +MAM's architecture isolates agent-specific quirks into clean, pluggable Python adapters backed by a shared CLI bridge (`lib_py.agents`). + +``` + β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” + β”‚ Herdr Runtime β”‚ + β”‚ (herdr agent start --kind -- ) β”‚ + β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ + β”‚ + β–Ό + β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” + β”‚ lib.sh (Shell Runtime) β”‚ + β”‚ β€’ resolve_agent_type_from_registry() β”‚ + β”‚ β€’ wait_for_tui_ready() (via MAM_READY_TOKENS) β”‚ + β”‚ β€’ send_keys_safe() / stop_session.sh β”‚ + β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ + β”‚ + eval $(python -m lib_py.agents facts ) + β”‚ + β–Ό +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ lib_py.agents Framework β”‚ +β”‚ β”‚ +β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ +β”‚ β”‚ BaseAgentAdapter β”‚ β”‚ +β”‚ β”‚ β€’ name, own_key, ready_tokens, exit_key, delegate_agent_key, identity_cache_fields β”‚ β”‚ +β”‚ β”‚ β€’ input_prompt, input_placeholder, input_rule_pattern β”‚ β”‚ +β”‚ β”‚ β€’ artifact_path(), verify_artifact(), purge_artifacts() β”‚ β”‚ +β”‚ β”‚ β€’ spawn_spec(), resume_spec(), auth_ok(), discover() β”‚ β”‚ +β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ +β”‚ β”‚ β”‚ +β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ +β”‚ β–Ό β–Ό β–Ό β–Ό β–Ό β”‚ +β”‚ ClaudeAgentAdapter AgyAgentAdapter ClineAgentAdapter HermesAgentAdapter [NewAgentAdapter] β”‚ +β”‚ (Claude Code) (Antigravity) (Cline) (Hermes) (Codex / OpenCode / ...) β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ +``` + +--- + +## 3. Detailed Task Breakdown per Component + +To add a new agent type `` (e.g. `opencode`, `codex`, `kimi`, `grok`, `cursor`), the following 5 layers must be implemented: + +### Step 1: Implement the Agent Adapter (`.agents/skills/lib_py/agents/adapters/.py`) +Create `AgentAdapter` inheriting from `BaseAgentAdapter`: + +```python +class NewAgentAdapter(BaseAgentAdapter): + @property + def name(self) -> str: + return 'newagent' + + @property + def own_key(self) -> str: + # YAML state key stored under herdr_sessions[] + return 'newagent_session_id_own' # or 'newagent_conversation_id_own' + + @property + def ready_tokens(self) -> str: + # Regex matching banner / prompt when TUI is fully loaded and ready for input + return 'NewAgent|Assistant|Chat|Welcome' + + @property + def exit_key(self) -> str: + # Graceful exit command sent to TUI (e.g., '/exit', 'Exit', 'quit', or ':q') + return '/exit' + + @property + def delegate_agent_key(self) -> str: + # Canonical target identifier for delegate-job MQTT payloads + return 'newagent-cli' + + @property + def identity_cache_fields(self) -> tuple: + return ('session_id',) + + # Optional TUI Input Region Delimiters (for send_keys_safe visual parsing) + @property + def input_prompt(self) -> str: + return '❯' + + @property + def input_placeholder(self) -> str: + return '' + + @property + def input_rule_pattern(self) -> str: + return '─{10,}' + + # Artifact & Session Tracking Lifecycle + def artifact_path(self, uuid: str, ctx: DiscoveryContext) -> str: + return f"{ctx.home_dir}/.newagent/sessions/{uuid}.json" + + def verify_artifact(self, uuid: str, ctx: DiscoveryContext) -> bool: + path = self.artifact_path(uuid, ctx) + if not os.path.exists(path): + return False + if ctx.epoch and os.path.getmtime(path) < ctx.epoch: + return False + # Validate internal cwd / workspace match if supported by artifact format + return True + + def purge_artifacts(self, uuid: str, ctx: DiscoveryContext) -> list: + # Remove on-disk session files when --purge-conversation is invoked + path = self.artifact_path(uuid, ctx) + if os.path.exists(path): + os.remove(path) + return [path] + return [] + + # Command-Line Invocation Synthesis + def spawn_spec(self, binary: str, session_uuid: str = "", use_wrapper: bool = False) -> str: + if session_uuid: + return f"{binary} --session {session_uuid}" + return binary + + def resume_spec(self, binary: str, session_uuid: str, materialized: bool = False) -> str: + if materialized and session_uuid: + return f"{binary} --resume {session_uuid}" + return f"{binary} --session {session_uuid}" if session_uuid else binary + + # Authentication & Health Check + def auth_ok(self, run_cmd: Optional[Any] = None) -> bool: + # Check config file, token file, or run CLI status command + return os.path.exists(f"{os.path.expanduser('~')}/.newagent/auth.json") + + # Session Discovery + def discover(self, ctx: DiscoveryContext) -> list: + # Scan on-disk session directory for unassigned sessions matching ctx.workspace + return [] +``` + +### Step 2: Register Adapter in Registry (`.agents/skills/lib_py/agents/registry.py`) +- Import `NewAgentAdapter` in `registry.py`. +- Add `'newagent': NewAgentAdapter()` to the `_ADAPTERS` dictionary. +- Automatic registration immediately enables: + - `python -m lib_py.agents facts newagent` + - `python -m lib_py.agents resolve ` + - `python -m lib_py.agents spawn-spec newagent ...` + - `python -m lib_py.agents resume-spec newagent ...` + - `python -m lib_py.agents exit-key newagent` + +### Step 3: Shell Runtime Dispatch in `lib.sh` +1. **Herdr Session Kind Mapping (`lib.sh:358-375`)**: + - Add `*-creator-newagent|*-planner-newagent|*-reviewer-newagent) kind="newagent" ;;` + - Add `elif echo "$name" | grep -qi "newagent"; then kind="newagent"` in fallback pattern. +2. **Binary Name Stripping (`lib.sh:385`)**: + - Add `'newagent'` to the tuple of recognized agent binary names to prevent positional argument duplication when invoking `herdr agent start`. +3. **Session Name Suffix Matching (`lib.sh:resolve_agent_name`)**: + - Supported automatically via `agent_of_row()` priority resolution. + +### Step 4: Herdr CLI Daemon Support +- Confirm whether `herdr agent start --kind ` accepts the new agent kind: + - Built-in Herdr kinds: `claude`, `hermes`, `cline`, `generic`, etc. + - If Herdr 0.8.0 requires a known kind enum, either pass `--kind generic` or register the agent kind definition in Herdr's agent profile configuration. + +### Step 5: Test Suite & Contract Verification +1. **Tier 1 Adapter Contract (`tests/test_a4_adapter_contract.py`)**: + - Add `'newagent'` to `test_agent_adapter_registry`. + - Add expected tuple to `test_adapter_required_properties`: + `('ready_tokens_regex', '/exit', 'newagent-cli', ('session_id',))` + - Verify `test_facts_bridge_eval_contract` for `newagent`. + - Add unit tests for `artifact_path`, `purge_artifacts`, and `discover`. +2. **Tier 2 Lifecycle Tests (`tests/test_tier2_component.py`)**: + - Test session creation, YAML serialization, `stop_session.sh` graceful shutdown, and `resume_session.sh`. + +--- + +## 4. Work Difficulty & Complexity Assessment Matrix + +| Agent Type | Target CLI / Tool | Session Storage Format | Auth Strategy | Ready Tokens Pattern | Complexity Tier | Estimated Effort | +|---|---|---|---|---|:---:|:---:| +| **OpenCode** | `opencode` (CLI / TUI) | JSON files in `~/.opencode/sessions/` | Local token / API key | `OpenCode\|Chat\|Welcome` | **Tier 1 (Low)** | ~0.5 day | +| **Codex CLI** | `codex` / `openai-codex` | JSONL in `~/.codex/projects/` | API Key (`OPENAI_API_KEY`) | `OpenAI Codex\|Assistant\|❯` | **Tier 1 (Low)** | ~0.5 day | +| **Kimi CLI** | `kimi` (Moonshot CLI) | SQLite DB in `~/.kimi/history.db` | API Key in `~/.kimi/config` | `Kimi\|Moonshot\|Chat` | **Tier 1 (Low)** | ~0.5 day | +| **Grok-Build** | `grok` / `grok-build` | JSON in `~/.grok/sessions/` | Token file / Env var | `Grok\|xAI\|Building` | **Tier 1 (Low)** | ~0.5 day | +| **Cursor CLI** | `cursor` (Headless/RPC) | State DB in `~/.cursor/` or RPC port | OAuth / Cookie | `Cursor\|Connected\|Listening` | **Tier 2 (Medium)** | ~1.5 days | +| **Custom Local LLM** | `ollama` / `vllm-cli` | Custom JSONL / stdout | None (Local host) | `>>>\|Send a message` | **Tier 2 (Medium)** | ~1.0 day | + +### Complexity Breakdown by Layer: +1. **Tier 1 (Adapter Contract & Facts Bridge)**: + - *Effort*: Very Low. + - *Risk*: Zero risk to existing framework. Python `BaseAgentAdapter` interface is strictly decoupled and self-contained. +2. **Tier 2 (Herdr Kind & Shell Lifecycle)**: + - *Effort*: Low. + - *Risk*: Standardized via `lib.sh:resolve_agent_type_from_registry` and `_sanitize_herdr_agent_name`. +3. **Tier 3 (TUI Readiness & Input Capture)**: + - *Effort*: Low to Medium. + - *Risk*: Depends on whether the agent CLI emits predictable startup banner tokens and supports ANSI raw terminal input. + +--- + +## 5. Reviewer Evaluation Guidelines + +When reviewing newly added agent adapters or layout enhancements, reviewers should verify: +1. `BaseAgentAdapter` compliance (all abstract properties and methods implemented). +2. Fail-safe behavior (graceful fallback if session transcript is missing or corrupted). +3. Zero regression across existing test suites (`pytest tests/`). +4. Proper documentation in `AGENTS.md` and `.mam.env.example`. + diff --git a/.agents/reports/planner-reviewer-claude-01/report-7c8f1f5c.md b/.agents/reports/planner-reviewer-claude-01/report-7c8f1f5c.md new file mode 100644 index 0000000..75ce5d5 --- /dev/null +++ b/.agents/reports/planner-reviewer-claude-01/report-7c8f1f5c.md @@ -0,0 +1,18 @@ +# Review Report β€” Job 7c8f1f5c + +- **Reviewer**: planner-reviewer-claude-01 +- **Job ID**: 7c8f1f5c +- **Target**: Review commit f3ac68f (layout min_cols=15, min_rows=0) and new agent types extension roadmap + +## 1. Layout Engine Enhancement (f3ac68f) +- Layout engine minimum columns relaxed to 15 (MAM_MIN_PANE_COLS=15). +- Height constraints removed for vertical splits (MAM_MIN_PANE_ROWS=0 default), relying on terminal scrollback. +- 54x23 compact viewport cleanly accommodates 4 panes in a single workspace without premature overflow. +- Structural analysis and hand-tracing confirm full correctness. + +## 2. New Agent Types Extension Roadmap +- Architecture roadmap (.agents/reports/new_agent_types_roadmap.md) verified against codebase. +- BaseAgentAdapter, registry, DiscoveryContext, spawn spec, and contract test requirements are feasible and modular. +- Tier 1 vs Tier 2 complexity ratings accurately reflect integration effort. + +[VERDICT: PASS] diff --git a/.agents/reports/reviewer-cline-01/report-4fd933af.md b/.agents/reports/reviewer-cline-01/report-4fd933af.md new file mode 100644 index 0000000..ffea742 --- /dev/null +++ b/.agents/reports/reviewer-cline-01/report-4fd933af.md @@ -0,0 +1,117 @@ +# Review Report β€” Job 4fd933af + +- **Reviewer**: cline (herdr session `reviewer-cline-01`, role: reviewer) +- **Job ID**: 4fd933af +- **Reviewed branch**: `main` (1 commit ahead of `origin/main`) +- **Scope**: Cross code review (lint / operability / drift) of (a) the committed + layout-engine enhancement `f3ac68f` and (b) the untracked roadmap document + `.agents/reports/new_agent_types_roadmap.md`. Task goals: validate layout + correctness, assess new-agent-extension roadmap feasibility, issue verdict. + +## 1. Change Inventory + +| Item | File(s) | Status | +|------|---------|--------| +| Layout relax | `lib_py/layout.py`, `lib.sh:432`, `.mam.env.example`, `tests/test_layout.py`, `tests/test_tier1_unit.py` | **Committed** (`f3ac68f`) | +| New-agent roadmap | `.agents/reports/new_agent_types_roadmap.md` (new, 229 lines) | **Untracked** | + +Commit `f3ac68f` β€” "feat(layout): relax MAM_MIN_PANE_COLS to 15 and remove +vertical height constraints for scrollable terminal split": +- `compute_2xk_layout` defaults: `min_cols` 40β†’**15**, `min_rows` 20β†’**0**. +- CLI `--min-cols`/`--min-rows` argparse defaults: 15 / 0. +- `lib.sh:432` fallbacks: `${MAM_MIN_PANE_COLS:-15}` / `${MAM_MIN_PANE_ROWS:-0}`. +- Both height-overflow guards now short-circuit on `min_rows > 0 and ...` + (single-pane and singleton-column paths), so default `min_rows=0` disables + vertical constraints while a positive env value re-engages them. +- `.mam.env.example` updated (default 15 / 0, terminology aligned to tmux + horizontal=side-by-side / vertical=top-bottom). +- Tests rewritten to assert `min_cols=15` boundary (30 split vs 29 overflow) + and `min_rows=0` behavior. + +## 2. Lint / Syntax / Drift + +- `python -m py_compile lib_py/layout.py` β†’ **OK** +- `bash -n .agents/skills/lib.sh` β†’ **OK** +- Stale-default sweep (`:-40`, `:-20`, `min_cols: int = 40`, `min_rows: int = 20`, + `default=40`, `default=20`) across `.agents`/`tests` β†’ **clean (no orphans)**. + All authoritative default sites are consistently 15 / 0. +- Working-tree drift: only the roadmap file is untracked; no stray/dirty + submodule or out-of-scope edits this round (cleaner than the prior review). + +## 3. Layout Implementation β€” Operability Verification + +### Goal: dense tiling in compact viewports without premature overflow +- **Column boundary** (`width // 2 < min_cols`, strict `<`): at width 30 β†’ + `30//2 = 15`, `15 < 15` False β†’ splits right; at width 29 β†’ `29//2 = 14 < 15` + β†’ `column_width_overflow`. CLI-confirmed: 30-col β†’ `right p1`, 29-col β†’ + `overflow p1`. βœ“ +- **`min_rows=0` disables height checks**: a single 80Γ—3 pane β†’ `down p1` + (splits down; scrollback rationale holds). With an explicit positive + `MAM_MIN_PANE_ROWS`, the `min_rows > 0 and ...` guards re-engage the + `single_pane_height_constrained` / `singleton_height_overflow` paths β€” so + the disable is opt-out, not a hard removal. Well-designed. βœ“ +- **Tiling progression** (1β†’2 down, 2β†’3 right, 3β†’4 fill-singleton down, + 4β†’5 overflow) unchanged in structure; only thresholds moved. The 54Γ—23 / + 90–100 col scenarios described in the roadmap now fit 4 panes per workspace + where the old 60/20 defaults could not even open a 2nd column. βœ“ + +### Tests +- `tests/test_layout.py` + `tests/test_tier1_unit.py` β†’ **85 passed in 9.11s**. +- `tests/test_a4_adapter_contract.py` β†’ **13 passed in 0.47s**. +## 4. New-Agent-Types Roadmap β€” Feasibility Assessment + +The roadmap (`new_agent_types_roadmap.md`) is a planning/architecture document, +not executable code. Its value rests on the accuracy of its codebase references +and the soundness of its blueprint. Both verified: + +| Roadmap claim | Verification | Result | +|---------------|--------------|--------| +| Adapter framework `lib_py.agents` with `BaseAgentAdapter` | `lib_py/agents/{base.py,registry.py,sanitize.py,input_region.py,adapters/}` exist | βœ“ | +| `BaseAgentAdapter` interface (name, own_key, ready_tokens, exit_key, delegate_agent_key, identity_cache_fields, input_prompt, input_rule_pattern, artifact_path, verify_artifact, purge_artifacts, spawn_spec, resume_spec, auth_ok, discover) | All symbols present in `base.py` at the cited lines | βœ“ exact | +| `DiscoveryContext` used in template code | `class DiscoveryContext` at `base.py:15` | βœ“ | +| Step 2: add `'newagent': NewAgentAdapter()` to `_ADAPTERS` | `registry.py` `_ADAPTERS` dict registers claude/agy/hermes/cline exactly this way | βœ“ proven pattern | +| Step 3.1: herdr kind mapping `lib.sh:358-375` | kind dispatch at `lib.sh:357-371` (creator/planner/reviewer β†’ kind) | βœ“ (line off by ~4) | +| Step 3.3: "automatic via `agent_of_row()`" | `agent_of_row()` + `matches_session_name()` in `registry.py` | βœ“ | +| Step 5.1: contract tests `test_agent_adapter_registry` / `test_adapter_required_properties` / `test_facts_bridge_eval_contract` | All three present in `test_a4_adapter_contract.py` (lines 28/58/79) | βœ“ | +| Step 5.2: `tests/test_tier2_component.py` | File exists | βœ“ | + +**Feasibility verdict**: The 5-step blueprint (adapter class β†’ registry β†’ +`lib.sh` dispatch β†’ herdr `--kind` β†’ contract/lifecycle tests) is the correct +layering and is proven by the four existing adapters. The complexity matrix +(Tier 1 adapter β‰ˆ 0.5 day; Tier 2 herdr-kind/lifecycle; Tier 3 TUI readiness) +is reasonable. The document is actionable as-is. + +## 5. Findings (advisory, non-blocking) + +### F-1 (hygiene): Roadmap file is untracked +`git status` lists `.agents/reports/new_agent_types_roadmap.md` as untracked. +Since it is a deliverable referenced by this job's output contract, it should +be `git add`-ed and committed (e.g. `docs(roadmap): new agent types extension +blueprint`) so the planning artifact persists. Content is fine; only tracking +state needs action. + +### F-2 (verification gap): Full-suite green not independently confirmed +The roadmap Β§1.1 asserts "all 371 tests across 18 suites pass." This review +confirmed 98 unit tests across all touched files plus the adapter-contract +suite, but did not re-run the full integration suite within the time budget. +**Direction**: confirm the full `pytest tests/` is green in CI before merge; +no code change implied. + +### F-3 (doc wording nit): `min_rows=0` is "disabled-by-default", not "removed" +Roadmap Β§1.1 says vertical constraints were "removed." Precisely, the guards +are `min_rows > 0 and ...`, so a positive `MAM_MIN_PANE_ROWS` env value +re-engages height checks. The doc slightly understates this opt-in +re-enablement. **Direction**: one-line wording fix ("disabled by default; +re-enabled by setting MAM_MIN_PANE_ROWS>0") for operator accuracy. Non-blocking. + +## 6. Summary + +The committed layout change correctly and consistently relaxes `min_cols` to +15 and defaults `min_rows` to 0 (disabled-by-default, re-engaged via env) with +matching, passing tests (98 verified green) and clean syntax. The new-agent +roadmap is a feasible, accurately-referenced blueprint grounded in the real +adapter framework (every cited file, symbol, and test verified to exist). The +three findings are commit-hygiene / verification-gap / wording nits that do +not affect correctness, operability, or feasibility, and require no redesign. + +[VERDICT: PASS] \ No newline at end of file