134 lines
7.8 KiB
Markdown
134 lines
7.8 KiB
Markdown
# Cross-Code Review Report — Job b6fc4e5a (Re-review after fix)
|
||
|
||
- **Job ID**: b6fc4e5a
|
||
- **Target**: `multi-agent-mux-orc-onboard` skill + `orchestrator_uuids` exclusion gate in `lib.sh`
|
||
- **Reviewer**: cline
|
||
- **Context**: Re-review of the same changeset reviewed in job e7c13ec2 (which returned NOT PASS). The implementer has since applied the fix recommended in that prior review.
|
||
- **Scope**: lint, behavior (동작성), loss (유실) of the uncommitted working-tree changeset:
|
||
- `M .agents/skills/lib.sh`
|
||
- `M .gitignore`
|
||
- `M deploy/gitea-ci.yml`, `M deploy/remove.sh`
|
||
- `?? .agents/skills/multi-agent-mux-orc-onboard/` (SKILL.md + scripts/orc_onboard.sh)
|
||
- `?? tests/test_orc_onboard.py`
|
||
- **Baseline commit**: `1e1ab8c` (changes uncommitted, reviewed against working tree)
|
||
|
||
---
|
||
|
||
## 1. Executive Summary
|
||
|
||
The prior review (job e7c13ec2) returned **NOT PASS** for two reasons: (a) the orc-onboard test suite was non-deterministic — `test_o19`/`test_o33` failed 2/40 when run as a descendant of an orchestrator agent (the skill's own deployment context), and (b) stale test-pollution artifacts (`d.db*`, `d.update*`) were ungitignored in the repo root. The implementer has now fixed **both** issues:
|
||
|
||
1. **`MAM_AUTODETECT_FORCE_FAIL` testability hook** added to `detect_nearest_agent()` in `orc_onboard.sh`; `test_o19`/`test_o33` now set it → the autodetect-*failure* path is exercised deterministically regardless of process ancestry.
|
||
2. **`.gitignore`** now includes `d.db*` and `d.update*` patterns.
|
||
3. **Bonus**: the prior review's minor "equals-form argv parsing" edge note (`-r=<uuid>`) is also resolved — the regex now uses `[[:space:]=]+` (matches both space and `=` forms).
|
||
|
||
The full orc-onboard suite now passes **40/40 in both foreground and detached contexts** (deterministic), and the lib.sh-dependent regression subset passes **69/69** (no regressions). The implementation logic — previously verified correct in e7c13ec2 — is unchanged in substance.
|
||
|
||
---
|
||
|
||
## 2. Fix Verification (delta from prior review e7c13ec2)
|
||
|
||
### 2.1 `MAM_AUTODETECT_FORCE_FAIL` hook — `orc_onboard.sh:76-79`
|
||
|
||
```bash
|
||
detect_nearest_agent() {
|
||
if [ "${MAM_AUTODETECT_FORCE_FAIL:-0}" = "1" ]; then
|
||
return 3
|
||
fi
|
||
...
|
||
```
|
||
|
||
Correctly placed at the **top** of `detect_nearest_agent`, before the process-tree walk, returning `3` (the autodetect-failure exit code). The hook is opt-in (defaults to `0`), so the real autodetect-success path is unaffected — confirmed by `test_o25`–`test_o31` still passing. This makes the autodetect-*failure* path testable without depending on live process ancestry.
|
||
|
||
### 2.2 Test updates — `test_o19` (line 331), `test_o33` (line 537)
|
||
|
||
Both now pass `env={..., "MAM_AUTODETECT_FORCE_FAIL": "1"}` and assert `returncode == 3`. This is the exact fix recommended in the prior report (one env hook + two test edits), applied surgically.
|
||
|
||
### 2.3 `.gitignore` — `d.db*` / `d.update*`
|
||
|
||
```diff
|
||
+ d.db*
|
||
+ d.update*
|
||
```
|
||
|
||
Addresses the prior review's hygiene recommendation. Verified no stray `d.db*`/`d.update*` files remain in the repo root after a clean test run.
|
||
|
||
### 2.4 Bonus: equals-form argv parsing (lines 120/123/126)
|
||
|
||
The prior review noted `--id=<uuid>` (equals form) parsed empty because the regex only handled the space form. The implementer widened it to `[[:space:]=]+`, handling both forms:
|
||
- `(-r|--session-id)[[:space:]=]+[^[:space:]]+` (claude)
|
||
- `--conversation[[:space:]=]+[^[:space:]]+` (agy)
|
||
- `(--id|--session-id)[[:space:]=]+[^[:space:]]+` (cline)
|
||
|
||
Low-impact robustness improvement, consistent with the SKILL.md auto-detection spec.
|
||
|
||
---
|
||
|
||
## 3. Lint
|
||
|
||
| Check | Tool | Result |
|
||
|---|---|---|
|
||
| `orc_onboard.sh` syntax | `bash -n` | ✅ PASS |
|
||
| `lib.sh` syntax | `bash -n` | ✅ PASS |
|
||
| `orc_onboard.sh` shellcheck | `shellcheck` | ⚠️ Not installed locally; `deploy/gitea-ci.yml` adds the required `shellcheck .../orc_onboard.sh` line (covered by `test_o35`). CI gate covers it. |
|
||
| `lib.sh` shellcheck | `shellcheck` | ⚠️ Not installed locally (pre-existing, not introduced by this change). |
|
||
---
|
||
|
||
## 4. Behavior (동작성) — Test Results
|
||
|
||
### 4.1 `tests/test_orc_onboard.py` — DETERMINISTIC ✅
|
||
|
||
| Run context | Prior review (e7c13ec2) | This review (b6fc4e5a) |
|
||
|---|---|---|
|
||
| Foreground (pytest descendant of cline orchestrator session) | 38 passed, 2 failed | **40 passed** (6.27s) |
|
||
| Detached / reparented to PID 1 | 40 passed | **40 passed** (6.34s) |
|
||
|
||
The two previously-flaky tests (`test_o19_autodetect_failure_exits_3`, `test_o33_no_workspace_cache_fallback`) now pass deterministically in **both** contexts via the `MAM_AUTODETECT_FORCE_FAIL` hook. The non-determinism root cause (live process-tree ancestry) is bypassed for the failure-path tests, and the success-path tests (`test_o25`–`test_o31`) remain unaffected. Full suite: 40/40 PASS.
|
||
|
||
### 4.2 Regression (lib.sh-dependent suites) — PASS ✅
|
||
|
||
`tests/test_uuid_target.py tests/test_b4_session_created.py tests/test_o1_rebuttal.py tests/test_deploy_layout.py tests/test_deploy_freshness.py tests/test_deploy_registry_merge.py` → **69 passed in 103.07s**. The lib.sh changes (orchestrator_uuids gate, `verify_session_uuid`/`find_workspace_uuid` exclusion, `atomic_dump_yaml`/`load_state_json` touchpoints) introduced **no regressions** — identical to the prior review's result.
|
||
|
||
---
|
||
|
||
## 5. Implementation Review (unchanged in substance from e7c13ec2; re-confirmed)
|
||
|
||
### 5.1 `lib.sh` — exclusion gate (correct)
|
||
|
||
- `_validate` orchestrator_uuids: list, non-empty strings, no duplicates. ✅ (`test_o20`–`test_o22`)
|
||
- `get_all_sessions_status`: `__orchestrator_uuids__` sha256 entry for reconcile change detection. ✅
|
||
- `mam_orchestrator_uuids()`: cached; `MAM_ORCHESTRATOR_UUIDS` override (empty/JSON/comma) → `MAM_STATE_JSON` → sqlite DB → YAML; malformed → stderr warning + degrade to `[]` (open gate). ✅ (`test_o40`)
|
||
- `mam_row_own_uuid(row)`: first non-null `*_own` across agent families. ✅
|
||
- `verify_session_uuid` discover exclusion: `if mode=="discover" and uuid in mam_orchestrator_uuids() and uuid != mam_row_own_uuid(row): return False` + `workspace_key()` normalization. ✅ (`test_o39`)
|
||
- `find_workspace_uuid` discovery: builds `orchestrator_ids`, discards target's own UUID, `emit()` skips `running_ids ∪ orchestrator_ids`. ✅ (`test_o1`–`test_o16`)
|
||
|
||
### 5.2 `orc_onboard.sh` (correct)
|
||
|
||
- Arg parsing, `is_valid_id` (UUID + cline `^[0-9]{10,}_[0-9A-Za-z]+$`), `--list`, running-session conflict (exit 1), `atomic_dump_yaml` mutation. ✅ (`test_o17`/`test_o18`/`test_o38`)
|
||
- `detect_nearest_agent()`: process-tree walk, family basename match, argv-then-env extraction, stop at nearest agent ancestor, `return 3` on failure. `MAM_AUTODETECT_FORCE_FAIL` hook short-circuits to `return 3`. ✅
|
||
- `SKILL.md` frontmatter + auto-detection hierarchy docs. ✅ (`test_o37`)
|
||
|
||
### 5.3 Deploy wiring
|
||
|
||
`deploy/gitea-ci.yml` (+shellcheck line) and `deploy/remove.sh` (+fallback_assets entry). ✅ (`test_o34`/`test_o35`)
|
||
|
||
---
|
||
|
||
## 6. Loss / Hygiene (유실)
|
||
|
||
- **No orphaned call sites**: `verify_session_uuid`/`find_workspace_uuid` signatures preserved; 69-test regression confirms backward compatibility.
|
||
- **Artifacts now gitignored**: `d.db*`/`d.update*` added to `.gitignore`; no stray files in repo root after a clean run. Prior hygiene issue resolved.
|
||
- **No regressions**: lib.sh changes are behavior-preserving for non-orchestrator-uuid paths.
|
||
|
||
---
|
||
|
||
## 7. Verdict
|
||
|
||
The prior review's two blockers are both resolved:
|
||
1. **Non-deterministic test suite** → fixed via `MAM_AUTODETECT_FORCE_FAIL` hook + updated `test_o19`/`test_o33`; suite now passes 40/40 deterministically in both foreground and detached contexts.
|
||
2. **Ungitignored test-pollution artifacts** → fixed via `.gitignore` `d.db*`/`d.update*` patterns.
|
||
|
||
A bonus robustness fix (equals-form argv parsing) was also applied. The implementation logic is correct, atomic, and regression-free (69/69). No design-level rework is needed.
|
||
|
||
[VERDICT: PASS]
|
||
[VERDICT: PASS] |