docs(roadmap): add new agent types extension roadmap and peer review reports
This commit is contained in:
@@ -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 <name> --kind <kind> -- <cmd>) │
|
||||||
|
└────────────────────────────┬─────────────────────────────┘
|
||||||
|
│
|
||||||
|
▼
|
||||||
|
┌──────────────────────────────────────────────────────────┐
|
||||||
|
│ 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 <agent>)
|
||||||
|
│
|
||||||
|
▼
|
||||||
|
┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
||||||
|
│ 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 `<agent>` (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/<agent>.py`)
|
||||||
|
Create `<Agent>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 <session_name>`
|
||||||
|
- `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 <name> --kind <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`.
|
||||||
|
|
||||||
@@ -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]
|
||||||
@@ -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]
|
||||||
Reference in New Issue
Block a user