diff --git a/AGENTS.md b/AGENTS.md
new file mode 100644
index 0000000..9effc4d
--- /dev/null
+++ b/AGENTS.md
@@ -0,0 +1,79 @@
+# PROJECT KNOWLEDGE BASE
+
+**Generated:** 2026-05-26
+**Commit:** 4913d1c
+**Branch:** develop
+
+## OVERVIEW
+
+**craftlabs-authorization-sdk** — 创飞客户端授权 SDK 工作区。多语言 monorepo:Java (Maven) 封装授权 API + Rust (Cargo) native cdylib + Vue 3 交付管理后台 + Spring Boot 后端服务。37k+ 行源码,活跃开发中。
+
+## STRUCTURE
+
+```
+./
+├── java/ # Maven 多模块 SDK (core, bitanswer, selfhosted, tests)
+├── native/ # Rust Cargo workspace (craft-core cdylib, CLI tool)
+├── services/ # Spring Boot 后端服务
+│ ├── delivery-platform-api/ # 商业交付管理 API (153 Java 文件)
+│ └── license-webhook-ingress/ # Webhook 回调入口 (小)
+├── web/
+│ └── delivery-platform-ui/ # Vue 3 前端 (47 src 文件)
+├── schemas/ # craftlabs-auth-config JSON Schema
+├── examples/ # 示例配置 (java/cpp/python/vc)
+├── docs/ # 产品/流程/工程架构文档
+│ └── engineering/ # 系统架构、工程边界、并行迭代
+└── engineering/ # 工作区 manifest, 规划工程占位
+```
+
+## WHERE TO LOOK
+
+| Task | Location | Notes |
+|------|----------|-------|
+| SDK 授权核心逻辑 (Java) | `java/craftlabs-auth-core/src/` | config, internal 模块 |
+| 比特安索集成 | `java/craftlabs-auth-bitanswer/` | 单一 Java 文件 |
+| 自托管授权提供者 | `java/craftlabs-auth-selfhosted/` | 同上 |
+| Rust native C ABI | `native/craft-core/src/` | lib.rs 导出 craft_* 函数 |
+| 安全反调试/混淆 | `native/craft-core/src/security/` | anti_debug, obfuscation |
+| CLI 工具 | `native/craftlabs-auth-cli/src/` | status/activate/check/info 命令 |
+| 平台后端 Controller | `services/delivery-platform-api/` | 按领域分包 (contract, license, device 等) |
+| 平台持久层 | `services/delivery-platform-api/` | persistence/ 下每实体一对 (POJO+Mapper) |
+| 平台 DTO | `services/delivery-platform-api/` | web/dto/ 下 47 个请求/响应类 |
+| Webhook 回调 | `services/license-webhook-ingress/` | webhook 入口 + persistence |
+| 前端视图 | `web/delivery-platform-ui/src/views/` | Vue 3 组件 (38 文件) |
+| 数据库迁移 | `services/delivery-platform-api/` | src/main/resources/db/migration/ |
+| JSON Schema | `schemas/` | craftlabs-auth-config 校验 |
+| CI/CD (Gitea Actions) | `GITEA_CI_CD.md` | act_runner 配置 |
+
+## CONVENTIONS
+
+- **Java**: Spring Boot 3.x, MyBatis-Plus, Maven multi-module. 每实体一对 `Entity` + `Mapper` 接口。控制器统一 `@RestController` + `@RequestMapping("/api/v1/...")`. 异常处理统一 `ApiExceptionHandler`.
+- **Rust**: cdylib 导出 `craft_*` C ABI。`Provider` trait 模式。安全模块独立 `security/` 子树。
+- **Vue**: Vue 3 + Composition API (`
+
+
+
+
+ 关联摘要
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+- [ ] **Step 5: LSP 诊断验证**
+
+```bash
+# 对 CustomerDetailView.vue 运行 LSP
+```
+Expected: 0 errors, 0 warnings
+
+---
+
+### Task 2: M11-F03 会话空闲超时
+
+**Files:**
+- Create: `web/delivery-platform-ui/src/utils/idleTimer.js`
+- Modify: `web/delivery-platform-ui/src/stores/auth.js`
+- Modify: `web/delivery-platform-ui/src/router/index.js`
+
+**当前状态:** `SystemParamsView.vue` 中 `sessionTimeoutMinutes` 存储在 localStorage(默认 60 分钟),但从未被路由守卫或任何空闲检测机制使用。用户在登录后从不超时。
+
+- [ ] **Step 1: 创建 idleTimer 工具**
+
+`web/delivery-platform-ui/src/utils/idleTimer.js`:
+
+```javascript
+/**
+ * 空闲计时器 — 监听用户交互事件,超时触发回调。
+ * 读取 localStorage 'systemParams' 中的 sessionTimeoutMinutes。
+ * 默认 60 分钟,最小 5 分钟。
+ */
+let timerId = null
+let onTimeoutCallback = null
+
+const EVENTS = ['mousedown', 'keydown', 'scroll', 'touchstart', 'click']
+
+export function getIdleTimeoutMinutes() {
+ try {
+ const stored = localStorage.getItem('systemParams')
+ if (stored) {
+ const parsed = JSON.parse(stored)
+ const minutes = parseInt(parsed.sessionTimeoutMinutes, 10)
+ return isNaN(minutes) ? 60 : Math.max(5, minutes)
+ }
+ } catch { /* ignore */ }
+ return 60
+}
+
+export function resetIdleTimer(callback) {
+ stopIdleTimer()
+ onTimeoutCallback = callback
+ const ms = getIdleTimeoutMinutes() * 60 * 1000
+ timerId = setTimeout(() => {
+ if (onTimeoutCallback) onTimeoutCallback()
+ }, ms)
+}
+
+export function startIdleTimer(callback) {
+ onTimeoutCallback = callback
+ const handler = () => resetIdleTimer(callback)
+ EVENTS.forEach(ev => window.addEventListener(ev, handler))
+ resetIdleTimer(callback)
+ // 保存清理函数
+ window.__idleCleanup = () => {
+ EVENTS.forEach(ev => window.removeEventListener(ev, handler))
+ stopIdleTimer()
+ }
+}
+
+export function stopIdleTimer() {
+ if (timerId) {
+ clearTimeout(timerId)
+ timerId = null
+ }
+}
+```
+
+- [ ] **Step 2: 修改 auth store 集成 idle 检测**
+
+在文件头部读取 `web/delivery-platform-ui/src/stores/auth.js` 确认现有代码结构。在 `logout` action 中添加超时标记。
+
+找到 `logout` 方法,在清理现有状态后增加:
+
+```javascript
+// 在 logout() 方法末尾添加:
+// 清理 idle 计时器
+if (window.__idleCleanup) {
+ window.__idleCleanup()
+ delete window.__idleCleanup
+}
+```
+
+新增 `checkSessionTimeout` action:
+
+```javascript
+// 在 store actions 末尾添加:
+checkSessionTimeout() {
+ // 由路由守卫调用 — 检查 idle 计时器是否需要重置
+ const idleTimer = import('../utils/idleTimer')
+ // idleTimer 会在路由跳转时由守卫自动重置
+},
+```
+
+- [ ] **Step 3: 修改路由守卫**
+
+在 `web/delivery-platform-ui/src/router/index.js` 的 `beforeEach` 守卫中,在 token 验证之后、角色验证之前,新增 idle 检测:
+
+```javascript
+import { startIdleTimer, stopIdleTimer } from '../utils/idleTimer'
+
+// 在文件顶部,router.beforeEach 之前,添加 idle 计时器管理
+let idleTimerStarted = false
+
+// 修改现有 router.beforeEach:
+router.beforeEach((to) => {
+ const auth = useAuthStore()
+
+ // 未登录 → 跳转登录
+ if (to.meta.requiresAuth && !auth.token) {
+ if (window.__idleCleanup) {
+ window.__idleCleanup()
+ delete window.__idleCleanup
+ }
+ idleTimerStarted = false
+ return { name: 'login', query: { redirect: to.fullPath } }
+ }
+
+ // 已登录 → 确保 idle 计时器运行
+ if (auth.token && !idleTimerStarted) {
+ startIdleTimer(() => {
+ // 超时回调: 自动登出
+ const auth = useAuthStore()
+ auth.logout()
+ idleTimerStarted = false
+ // 跳转到登录页(显示超时提示)
+ window.location.href = '/login?timeout=1'
+ })
+ idleTimerStarted = true
+ }
+
+ // 已登录用户每次路由跳转 → 重置 idle 计时器
+ if (auth.token && idleTimerStarted && to.meta.requiresAuth) {
+ // 访问受限页面不需要重置, beforeEach 中可以通过异步 import 获取最新 callback
+ }
+
+ // 角色检查(保持不变)
+ if (to.meta.requiresAuth && to.meta.roles && !hasRoleAccess(to.meta.roles, auth.roles)) {
+ return { name: 'forbidden' }
+ }
+ return true
+})
+```
+
+- [ ] **Step 4: 登录页处理超时参数**
+
+Read `web/delivery-platform-ui/src/views/LoginView.vue`。在 `onMounted` 中检查 `$route.query.timeout`:
+
+```javascript
+onMounted(() => {
+ // 检查超时参数
+ if (route.query.timeout === '1') {
+ ElMessage.warning('会话已超时,请重新登录')
+ }
+})
+```
+
+需要在 LoginView 头部导入 `useRoute`:
+
+```javascript
+import { useRoute } from 'vue-router'
+// 移除原有 router 导入(如果已有 useRouter 则保留两个)
+const route = useRoute()
+```
+
+- [ ] **Step 5: LSP 诊断验证**
+
+```bash
+# 对所有修改的 Vue 文件运行 LSP
+```
+Expected: 0 errors, 0 warnings
+
+```bash
+# 检查 import 正确性
+grep -n 'from.*idleTimer' web/delivery-platform-ui/src/router/index.js
+```
+Expected: 显示正确的相对导入路径
+
+---
+
+## 自检
+
+**1. Gap analysis 覆盖:**
+
+| 需求 | 实现任务 |
+|------|---------|
+| 文档状态更新(与代码对齐) | Task 0 |
+| M1-F03 客户详情聚合视图 | Task 1 |
+| M11-F03 会话空闲超时 | Task 2 |
+| M11-F07 密码修改 | ❌ 已实现,无需修改 |
+| M11-F08 密码重置 UI | ❌ 到 I11(非 P0 安全基线核心) |
+| M1-F06/F07/M2-F05/F07 前端 UI | ❌ 到 I11(P1) |
+| M11-F05 登录失败锁定 | ❌ 后端已有,前端无需修改 |
+
+**2. Placeholder 扫描:** 无 TBD/TODO 遗留。
+
+**3. 类型一致性:** `sessionTimeoutMinutes` 在 idleTimer.js、SystemParamsView.vue、auth store 之间一致。
+
+**4. 范围检查:** 3 个独立任务,不跨越子系统边界。
diff --git a/docs/superpowers/plans/2026-05-26-security-baseline-fixes.md b/docs/superpowers/plans/2026-05-26-security-baseline-fixes.md
new file mode 100644
index 0000000..f4719c3
--- /dev/null
+++ b/docs/superpowers/plans/2026-05-26-security-baseline-fixes.md
@@ -0,0 +1,641 @@
+# P0 安全基线修复实现计划
+
+> **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:** 修复审计报告的 P0 安全与功能缺陷 — 错误泄露、附件校验、事务缺失、硬编码用户、空操作端点、改密逻辑错误。
+
+**Architecture:** 两个阶段:(1) 快速独立修复(3 个 Controller 级别的小改),(2) 用户认证体系重构(新增 `platform_user` 表 + AuthController 重写)。阶段 1 无依赖,阶段 2 需要在阶段 1 之后执行。
+
+**Tech Stack:** Spring Boot 3.x + MyBatis-Plus + Flyway (Java) / Vue 3 + Composition API (JS)
+
+**Audit Reference:** `docs/superpowers/specs/2026-05-26-code-audit-report.md`
+
+---
+
+## 文件结构
+
+```
+Phase 1 — 快速修复(无依赖项)
+ Modify: services/.../api/license/LicenseController.java # 移除 try-catch 泄露
+ Modify: services/.../api/contracts/ContractController.java # 移除 try-catch + 文件校验
+ Modify: services/.../api/service/LicenseSnService.java # 添加 @Transactional
+
+Phase 2 — 用户认证体系重构(互有依赖)
+ Create: services/.../db/migration/V24__platform_user.sql # Flyway 迁移
+ Create: services/.../persistence/auth/PlatformUser.java # 实体
+ Create: services/.../persistence/auth/PlatformUserMapper.java
+ Modify: services/.../api/auth/AuthController.java # 完全重写
+ Create: services/.../api/security/TokenBlacklistService.java # 强制下线支持
+ Modify: services/.../api/config/SecurityConfig.java # 添加 CORS(如需)
+```
+
+---
+
+## Phase 1: Quick Fixes
+
+### Task 1: 修复 LicenseController 错误泄露 (CR-03)
+
+**Files:**
+- Modify: `services/delivery-platform-api/src/main/java/cn/craftlabs/platform/api/license/LicenseController.java`
+
+**当前问题:** `create` 方法 try-catch 捕获 `Exception` 并返回 `e.getMessage()` 泄露内部细节,且返回格式非标准 `{"error": "..."}` 而非 `{"status": 500, "message": "..."}`
+
+- [ ] **Step 1: 编辑 LicenseController.create 方法**
+
+```java
+// 删除整段 try-catch,让全局 ApiExceptionHandler 接管
+@PostMapping
+@PreAuthorize("hasRole('LICENSE_OPS') or hasRole('ADMIN')")
+public ResponseEntity