# Trạng thái `recovery_core` Nội dung PLAN.md cũ đã được gỡ. Hai lý do: 1. **Đánh số phase trùng nhưng khác nghĩa.** Nó dùng "Phase 1/2/3" cho các mốc riêng của gói, trùng số với Phase 1–5 của `Test/NAV_REFACTOR_PLAN.md` — cùng một con số chỉ hai thứ khác hẳn nhau, trong hai file cùng nằm dưới `Test/`, là bẫy đọc nhầm. 2. **Tick sai.** Nó đánh `[x]` cho `RecoveryConfig::validate`, `RecoveryConfig::fromNodeHandle`, `MockBehavior` và `interface_contract_test.cpp` — grep cả ba symbol ra 0 hit, và `test/` khi đó chỉ có đúng một file. Một checklist nói dối còn tệ hơn không có checklist. ## Nguồn chuẩn hiện tại | Cần gì | Đọc ở đâu | |---|---| | Contract, họ output, bất biến an toàn | [`README.md`](README.md) | | Quyết định thiết kế và lý do | [`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md) | | Quy tắc bắt buộc khi viết plugin họ vận tốc | [`docs/SAFETY.md`](docs/SAFETY.md) | | Cách thêm behavior mới | [`docs/PLUGIN_GUIDE.md`](docs/PLUGIN_GUIDE.md) | | Bối cảnh trong cuộc refactor navigation runtime | `Test/NAV_REFACTOR_PLAN.md`, PHASE 3 | ## Đã xong - Contract: `bool configure(name, ctx, nh)` / `bool start(goal, now)` / `update(now)` / `cancel()`; `outputKind()` khai họ output; toàn bộ state của base là `private`. - `RecoveryContext` chỉ chứa **cổng** (`PoseProvider`, `CollisionChecker`, `PlanProvider`), không chứa con trỏ tới dữ liệu động. - `RecoveryGoal` dùng `std::optional` + `trigger`; bỏ quy ước sentinel "0 = dùng default". - `RecoveryRegistry` nạp theo YAML qua Boost.DLL, giữ factory sống đúng vòng đời. - `adapters/`: `CostmapPoseProvider`, `CostmapCollisionChecker`. - Bộ mặc định 4 plugin / 5 instance: `wait`, `conservative_reset`, `rotate`, `aggressive_reset`, `back_up`. `regen_path_recovery` bị xoá, không thay thế. - 9 bộ test GTest đăng ký với ctest, chạy trên cây config riêng của gói. ## Chưa xong - **Họ `kPath` chưa có behavior nào.** Contract đã sẵn sàng (`PlanProvider` + `outputKind()` trả `kPath`), nhưng một behavior sinh đường thoát thật cần thông tin từ global planner — nằm ngoài phạm vi gói này. - **`ClearCostmapRecovery` chưa có test tự động.** Nó cần `Costmap2DROBOT` thật (TF + chuỗi layer), không dựng được bằng fake của `nav_test_harness`. Hiện chỉ được kiểm bằng đọc code; test tích hợp thuộc Phase 5 (kịch bản chạy trên sim). - **Chưa chạy trên robot thật.** Bật từng behavior một, không bật cả bộ cùng lúc.