diff --git a/docs/superpowers/plans/2026-09-14-bx-apply-withdraw.md b/docs/superpowers/plans/2026-09-14-bx-apply-withdraw.md
new file mode 100644
index 000000000..574716136
--- /dev/null
+++ b/docs/superpowers/plans/2026-09-14-bx-apply-withdraw.md
@@ -0,0 +1,579 @@
+# 报销 / 备用金申请「撤回」Implementation Plan
+
+> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
+
+**Goal:** 申请人可将「审批中」的报销/备用金申请单撤回为草稿,再编辑并重新提交;覆盖 Web 申请页与小程序详情。
+
+**Architecture:** 报销复用已有 `POST /reimburses/{id}/withdraw`;备用金按同规则新增 `AdvanceService.withdraw` + 路由。各端仅暴露单条撤回入口(工具栏选中 1 条 / 详情),前端用 `canWithdraw`(`pending` + `applicantId === 当前用户`)门禁,后端仍硬校验。
+
+**Tech Stack:** FastAPI + SQLAlchemy;Vue 3 + Element Plus(web-admin);uni-app(miniprogram)
+
+**Spec:** `docs/superpowers/specs/2026-09-14-bx-apply-withdraw-design.md`
+
+---
+
+## File map
+
+| File | Responsibility |
+|------|----------------|
+| `backend/app/services/bx/advance.py` | 新增 `withdraw`:申请人 + pending → draft,清 `current_node` |
+| `backend/app/api/bx/advance.py` | 新增 `POST /{advance_id}/withdraw` |
+| `backend/tests/test_bx_advance_withdraw.py` | 用 mock 测门禁与状态回写 |
+| `web-admin/src/api/bx/index.ts` | `advanceApi.withdraw` |
+| `web-admin/src/views/bx/reimburse/apply/index.vue` | 工具栏 + 详情撤回 |
+| `web-admin/src/views/bx/advance/apply/index.vue` | 同上(对称) |
+| `miniprogram/api/bx.js` | `reimburseApi.withdraw` / `advanceApi.withdraw` |
+| `miniprogram/pages/bx/reimburse/detail.vue` | 底栏撤回 |
+| `miniprogram/pages/bx/advance/detail.vue` | 底栏撤回 |
+
+---
+
+### Task 1: 备用金 withdraw 后端(TDD)
+
+**Files:**
+- Create: `backend/tests/test_bx_advance_withdraw.py`
+- Modify: `backend/app/services/bx/advance.py`(在 `reject` 方法之后、`_approval_record_dict` 之前插入)
+- Modify: `backend/app/api/bx/advance.py`(在 `reject_advance` 与 `delete_advance` 之间插入路由)
+
+- [ ] **Step 1: 写失败用例(mock Service 行为)**
+
+创建 `backend/tests/test_bx_advance_withdraw.py`:
+
+```python
+"""备用金撤回:仅申请人且审批中可回草稿。"""
+from types import SimpleNamespace
+from unittest.mock import MagicMock, patch
+
+from app.services.bx.advance import AdvanceService
+
+
+def _user(uid="u1"):
+ return SimpleNamespace(id=uid, name="张三", dept_id="d1")
+
+
+def _apply(**kwargs):
+ base = {
+ "id": "a1",
+ "applicant_id": "u1",
+ "status": "pending",
+ "current_node": "一级审批",
+ "update_by": None,
+ }
+ base.update(kwargs)
+ return SimpleNamespace(**base)
+
+
+@patch.object(AdvanceService, "_tenant_no", return_value="T1")
+@patch.object(AdvanceService, "get_by_id")
+def test_withdraw_pending_by_applicant(mock_get, _tenant):
+ apply_obj = _apply()
+ mock_get.return_value = apply_obj
+ db = MagicMock()
+ out = AdvanceService.withdraw(db, "a1", _user("u1"))
+ assert out is apply_obj
+ assert apply_obj.status == "draft"
+ assert apply_obj.current_node is None
+ assert apply_obj.update_by == "u1"
+ db.flush.assert_called_once()
+
+
+@patch.object(AdvanceService, "_tenant_no", return_value="T1")
+@patch.object(AdvanceService, "get_by_id")
+def test_withdraw_rejects_non_applicant(mock_get, _tenant):
+ mock_get.return_value = _apply(applicant_id="u1")
+ assert AdvanceService.withdraw(MagicMock(), "a1", _user("u2")) is None
+
+
+@patch.object(AdvanceService, "_tenant_no", return_value="T1")
+@patch.object(AdvanceService, "get_by_id")
+def test_withdraw_rejects_non_pending(mock_get, _tenant):
+ mock_get.return_value = _apply(status="draft")
+ assert AdvanceService.withdraw(MagicMock(), "a1", _user("u1")) is None
+
+
+@patch.object(AdvanceService, "_tenant_no", return_value="T1")
+@patch.object(AdvanceService, "get_by_id")
+def test_withdraw_missing_returns_none(mock_get, _tenant):
+ mock_get.return_value = None
+ assert AdvanceService.withdraw(MagicMock(), "a1", _user("u1")) is None
+```
+
+- [ ] **Step 2: 跑测确认失败**
+
+```bash
+cd backend && source venv/bin/activate && pytest tests/test_bx_advance_withdraw.py -v
+```
+
+Expected: FAIL(`AdvanceService` 无 `withdraw` 属性)
+
+- [ ] **Step 3: 实现 `AdvanceService.withdraw`**
+
+在 `backend/app/services/bx/advance.py` 的 `reject` 方法结束后插入(对齐 `ReimburseService.withdraw`,无发票释放):
+
+```python
+ @staticmethod
+ def withdraw(db: Session, apply_id: str, user: BxUserContext) -> Optional[BxAdvanceApply]:
+ tenant_no = AdvanceService._tenant_no(db, user)
+ apply_obj = AdvanceService.get_by_id(db, apply_id, tenant_no, user=user)
+ if not apply_obj:
+ return None
+ if apply_obj.applicant_id != user.id:
+ return None
+ if apply_obj.status != "pending":
+ return None
+ apply_obj.status = "draft"
+ apply_obj.current_node = None
+ apply_obj.update_by = user.id
+ db.flush()
+ return apply_obj
+```
+
+- [ ] **Step 4: 注册 API 路由**
+
+在 `backend/app/api/bx/advance.py` 的 `reject_advance` 与 `delete_advance` 之间插入:
+
+```python
+@router.post("/{advance_id}/withdraw", response_model=ApiResponse[AdvanceApplyOut])
+def withdraw_advance(
+ advance_id: str,
+ db: Session = Depends(get_db),
+ user: BxUserContext = Depends(get_bx_current_user),
+):
+ advance = AdvanceService.withdraw(db, advance_id, user)
+ if not advance:
+ raise HTTPException(
+ status_code=status.HTTP_400_BAD_REQUEST,
+ detail="备用金申请不存在、非本人申请或当前状态不可撤回",
+ )
+ db.commit()
+ db.refresh(advance)
+ return ApiResponse(data=AdvanceApplyOut.model_validate(advance))
+```
+
+对照报销路由:`backend/app/api/bx/reimburse.py` 中 `withdraw_reimburse`(约 766–781 行)。
+
+- [ ] **Step 5: 跑测确认通过**
+
+```bash
+cd backend && source venv/bin/activate && pytest tests/test_bx_advance_withdraw.py -v
+```
+
+Expected: 4 passed
+
+- [ ] **Step 6: Commit**
+
+```bash
+git add backend/tests/test_bx_advance_withdraw.py backend/app/services/bx/advance.py backend/app/api/bx/advance.py
+git commit -m "$(cat <<'EOF'
+feat(bx): add advance apply withdraw API
+
+EOF
+)"
+```
+
+---
+
+### Task 2: Web / 小程序 API 客户端
+
+**Files:**
+- Modify: `web-admin/src/api/bx/index.ts`(`advanceApi`,在 `submit` 后)
+- Modify: `miniprogram/api/bx.js`(`advanceApi` 与 `reimburseApi`)
+
+- [ ] **Step 1: Web `advanceApi.withdraw`**
+
+在 `web-admin/src/api/bx/index.ts` 的 `advanceApi.submit` 后增加:
+
+```ts
+ withdraw(id: BxId) {
+ return bxRequest.post(`/advances/${id}/withdraw`)
+ },
+```
+
+(`reimburseApi.withdraw` 已存在,勿重复。)
+
+- [ ] **Step 2: 小程序 API**
+
+在 `miniprogram/api/bx.js`:
+
+`advanceApi` 增加:
+
+```js
+ withdraw: (id) => bxRequest({ url: `/advances/${id}/withdraw`, method: 'POST' }),
+```
+
+`reimburseApi` 增加:
+
+```js
+ withdraw: (id) => bxRequest({ url: `/reimburses/${id}/withdraw`, method: 'POST' }),
+```
+
+- [ ] **Step 3: Commit**
+
+```bash
+git add web-admin/src/api/bx/index.ts miniprogram/api/bx.js
+git commit -m "$(cat <<'EOF'
+feat(bx): wire advance/reimburse withdraw API clients
+
+EOF
+)"
+```
+
+---
+
+### Task 3: Web 报销申请页撤回入口
+
+**Files:**
+- Modify: `web-admin/src/views/bx/reimburse/apply/index.vue`
+
+- [ ] **Step 1: 导入图标**
+
+在 `@element-plus/icons-vue` 导入列表增加 `RefreshLeft`。
+
+- [ ] **Step 2: 工具栏按钮**
+
+在「提交审批」与「查看审批流」之间插入:
+
+```vue
+