Stealth Cymbal #3

Merged
notid merged 10 commits from stealth-cymbal into master 2026-04-29 16:56:44 -07:00
Showing only changes of commit 0b560b94ca - Show all commits

135
docs/code-review-pr3.md Normal file
View File

@@ -0,0 +1,135 @@
## Code Review: PR 3 - "Stealth Cymbal"
### Scope
- **Branch:** stealth-cymbal
- **Base:** master
- **Files Changed:** 86 files (~1576 insertions, ~230 deletions)
- **Key Changes:** KQ4 Room Navigator skill, UID repair tools, MCP interaction server, room scene updates
### Review Team
-**ce-correctness-reviewer** - Logic errors, edge cases, state bugs
-**ce-testing-reviewer** - Coverage gaps, weak assertions, brittle tests
-**ce-maintainability-reviewer** - Coupling, complexity, naming, dead code
-**ce-project-standards-reviewer** - CLAUDE.md and AGENTS.md compliance
-**ce-agent-native-reviewer** - Agent-accessible design patterns
-**ce-learnings-researcher** - Past issues in docs/solutions/
---
### P1 -- High
| # | File | Issue | Reviewer | Confidence | Route |
|---|------|------|----------|------------|-------|
| 1 | `scenes/kq4_004_ogres_cottage/kq4_004_ogres_cottage.tscn:46` | UID mismatch - target UID for kq4_028_mine_entrance points to non-existent room | correctness | 75% | manual → downstream-resolver |
| 2 | `scripts/mcp_interaction_server.gd` | No runtime tests for 80+ TCP command handlers (171KB script) | testing | 50% | manual → downstream-resolver |
---
### P2 -- Moderate
| # | File | Issue | Reviewer | Confidence | Route |
|---|------|------|----------|------------|-------|
| 3 | `scenes/kq4_098_transitional_room/kq4_098_transitional_room.tscn` | Missing .uid companion file | correctness | 75% | manual → review-fixer |
| 4 | `scripts/build_room_graph.py:184` | `_resolve_target_room` returns None without explicit handling in callers | correctness | 75% | safe_auto → review-fixer |
| 5 | `tools/repair_uids.py:322` | Code duplication in fix_stale_target with inconsistent error handling | correctness | 75% | safe_auto → review-fixer |
| 6 | `tools/repair_uids.py` | No tests for file mutation operations (UID sync, target replacement) | testing | 75% | manual → downstream-resolver |
| 7 | `scripts/build_room_graph.py` | No tests for BFS edge cases (disconnected components, malformed UIDs) | testing | 75% | manual → downstream-resolver |
| 8 | `MainGame.gd`, `SetPiece_.gd` | No tests for signal emission logic and cursor action routing | testing | 50% | manual → downstream-resolver |
| 9 | `SetPiece_.gd:mock_interact()` | Unnecessary indirection - duplicates `_input()` logic | maintainability | 75% | gated_auto → downstream-resolver |
| 10 | `SetPiece_.gd` | Unused `entered/exited` signals with unclear `lab` param | maintainability | 75% | gated_auto → downstream-resolver |
| 11 | `tools/kq4_room_navigator.py` | sys.path manipulation creates coupling | maintainability | 50% | gated_auto → downstream-resolver |
---
### P3 -- Low
| # | File | Issue | Reviewer | Confidence | Route |
|---|------|------|----------|------------|-------|
| 12 | `MainGame.gd:13` | `get_current_room_name()` returns empty string on failure - silent failure mode | correctness | 50% | advisory → downstream-resolver |
| 13 | `scripts/mcp_interaction_server.gd:42` | Fixed 30-second timeout could mask real hangs | correctness | 50% | advisory → downstream-resolver |
| 14 | `SetPiece_.gd:60` | `mock_interact()` doesn't validate target room exists | correctness | 50% | advisory → downstream-resolver |
| 15 | `tools/kq4_room_navigator.py` | No tests for CLI tool | testing | 75% | advisory → human |
| 16 | `MainGame.gd` | Placeholder comment in `_ready()` - dead code | maintainability | 100% | advisory → human |
| 17 | `MainGame.gd` | Commented-out code with typo - dead code | maintainability | 100% | advisory → human |
| 18 | `scripts/mcp_interaction_server.gd` | Potentially incomplete implementation | maintainability | 50% | advisory → human |
| 19 | `.opencode/skills/kq4-room-navigator/SKILL.md:38-41` | Code block formatting changed from JSON to plain text | project-standards | 75% | advisory → human |
| 20 | `tools/kq4_room_navigator.py` | Dataclass overhead for Mismatch in CLI tool | maintainability | 50% | advisory → human |
| 21 | `.opencode/skills/kq4-room-navigator/SKILL.md` | Missing explicit retry guidance for `_busy` protocol | agent-native | 75% | advisory → human |
| 22 | `.opencode/skills/kq4-room-navigator/SKILL.md` | `mock_interact` vs `mock_interaction` typo in error messages | agent-native | 75% | safe_auto → review-fixer |
| 23 | `.opencode/skills/kq4-room-navigator/SKILL.md` | `--navigate` flag documented but not implemented in CLI | agent-native | 50% | gated_auto → downstream-resolver |
---
### Requirements Completeness
**No plan document found** for this PR. The PR title "Stealth Cymbal" is ambiguous and doesn't reference a specific plan.
---
### Pre-existing Issues
None identified in this review.
---
### Learnings & Past Solutions
**No institutional learnings found.** The `docs/solutions/` directory does not exist in this repository. Consider using `/ce-compound` skill after significant work to document:
- UID generation patterns (make_uid.py + .uid files)
- Navigation/pathfinding setup (NavigationServer2D)
- MCP server integration learnings
- Room transition wiring patterns
---
### Agent-Native Gaps
1. **Offline-Only Graph Discovery** - Agents can't dynamically discover room connectivity at runtime
2. **Manual Verification** - Navigation completion requires polling instead of signals
3. **No Path Validation** - Agents can attempt invalid navigation without guardrails
4. **Incomplete CLI** - The `--navigate` flag is documented but not implemented
---
### Residual Risks
1. **UID mismatch risk** - Room graph connectivity depends on UID consistency across all .tscn and .uid files. If UIDs drift from manual edits, pathfinding will fail even though runtime transitions work.
- **Mitigation:** Run `tools/repair_uids.py --fix` before each significant room update. Consider integrating UID validation into CI pipeline.
2. **Timeout risk** - The MCP server's `_busy` flag uses a fixed 30-second timeout. If navigation animations or other operations take longer, commands may be prematurely reset.
- **Mitigation:** Monitor `_busy` timeout warnings in logs. Consider making configurable or implementing per-command timeout overrides.
3. **Arbitrary code execution** - MCP eval command allows arbitrary code execution without guardrails.
4. **Heuristic risk** - UID auto-resolution in repair_uids.py may produce incorrect fixes based on heuristics.
---
### Testing Gaps
1. **No automated tests for UID consistency** across room transitions
2. **No tests for pathfinding edge cases** (disconnected rooms, single-room graphs, self-loops)
3. **No tests for MCP server command timeout** behavior under load
4. **No validation** that all TransitionPiece targets point to existing rooms
5. **No unit tests** for UID mismatch detection in repair_uids.py
6. **No tests** for BFS pathfinding edge cases in build_room_graph.py
7. **No tests** for SetPiece signal emission logic
8. **No tests** for busy-state timeout recovery in MCP server
---
### Coverage
- **Findings:** 23 total (2 P1, 9 P2, 12 P3)
- **Safe-auto (fixable now):** 3 findings
- **Manual (needs handoff):** 4 findings
- **Gated-auto (needs review):** 4 findings
- **Advisory (report-only):** 12 findings
- **Failed reviewers:** 0 of 6
---
### Verdict
**Ready with fixes**
**Fix order:**
1. **Critical:** Fix UID mismatch in kq4_004_ogres_cottage.tscn (finding #1) - this breaks navigation
2. **High:** Add missing .uid file for kq4_098_transitional_room (finding #3)
3. **Medium:** Fix None handling in build_room_graph.py (finding #4)
4. **Medium:** Consolidate code duplication in repair_uids.py (finding #5)
5. **Low:** Address dead code and formatting issues (findings #12-23)
**Before merge:** Run `tools/repair_uids.py --fix` to synchronize all UIDs and verify the UID mismatch is resolved.