diff --git a/.pilot.yml b/.pilot.yml new file mode 100644 index 0000000..9d8faa7 --- /dev/null +++ b/.pilot.yml @@ -0,0 +1,23 @@ +# .pilot.yml — pilot 各阶段读它取分支/清理策略。 +# +# integration_branch 为什么必须 ≠ base_branch(PR #450 评审 High #1): +# phases/run.md §1 规定,无人值守的 `pilot run` 见到 daemon 给出 APPROVED + checks 绿, +# 就会自动 `git-guard.sh merge-pr --integration --squash`。 +# 若 integration_branch 写成 master,这条自动路径就等于「daemon 批准即直接合进主干」, +# 与 SKILL.md 硬约束 2「绝不直接合并自己的 PR 到主干」冲突。 +# GitHub 侧的分支保护挡不住它 —— master 要求 1 个 approving review, +# 而 daemon 提交的正是一个 approving review,条件天然满足。 +# +# 所以:feature 分支 → PR → review → 自动合进 preview; +# preview → master 保留为人工决定,不由 pilot 自动完成。 +# 本仓库 #433–#449 历史上是直接合 master 的,preview 分支于 2026-08-02 从 master 建出。 + +base_branch: master +integration_branch: preview +protect_patterns: + - release + - hotfix + - "7702" # EIP-7702 独立实验分支,不参与主线,永不清理 +remote: origin +allow_remote_cleanup: false +docs_dir: docs/agent diff --git a/docs/agent/progress.md b/docs/agent/progress.md new file mode 100644 index 0000000..ed8168e --- /dev/null +++ b/docs/agent/progress.md @@ -0,0 +1,78 @@ +# YetAnotherAA 实时状态 — progress + +> 「此刻仓库真实发生了什么」。由 `pilot run` 每一步更新。更新时间:2026-08-02 +> 00:55 + +## 当前聚焦 + +- **Milestone**:M1 Beta 上线(Sepolia) +- **Feature**:F1.2 高优负向用例 / F1.4 转账 UX 抢救项 +- **正在开发的 Task**:无(刚完成 `pilot plan`,等 `pilot run` 挑第一个 READY) +- **分支 / worktree**:`docs/pilot-plan`(无额外 worktree) +- **PR**:[#450](https://github.com/AAStarCommunity/YetAnotherAA/pull/450)(本规划台账自身,base + `preview`) + +## 仓库基线(2026-08-02) + +- 集成分支 = `preview`(2026-08-02 从 master 建出并推到 origin)。 **PR 合进 + `preview`,`preview` → `master` 保留为人工决定** —— 不这样的话,无人值守的 + `pilot run` 见 daemon APPROVED 就会自动 squash 合进主干(PR #450 评审 High + #1) +- 本地分支:`master` / `preview`(集成) / `docs/pilot-plan`(本 PR) / + `refactor/pure-frontend`(PR #400 draft,base 仍是 master,解冻时需一并改到 + `preview`) / `7702`(实验,保护不清理) +- pre-commit hook ✅ 生效于 `.git/hooks` +- PR 评审 daemon ✅ 在线 + +## 进行中 / 待回执的 PR + +| Task | PR | 状态 | 备注 | +| :----- | :--------------------------------------------------------------- | :------ | :------------------------------------------------------------- | +| T3.2.1 | [#400](https://github.com/AAStarCommunity/YetAnotherAA/pull/400) | BLOCKED | draft,自标 WIP·PAUSED,卡在 API-key/KMS-Origin 基建(T3.1.1) | + +## 阻塞项(BLOCKED) + +- **T1.1.6 KMS 双板 HA**:硬件依赖,等二号 imx93 到货。**待决**:YAA 侧配双 KMS + endpoint 故障转移,还是由上游 KMS 做 VIP? +- **T1.2.4 Guard 真机复现**:需要真机 Face ID/Touch + ID,CDP 虚拟认证器覆盖不到。**待决**:是否接受 CDP 降级验证? +- **T2.6.1 主网冒烟**:真实资金 + 发布闸门,必须最后做。**待决**:主网测试账户与预算上限由谁定? +- **T3.1.1 + API-key 授权模型**:当前写不出可机器验证的验收命令 → 保持 BACKLOG,不许直接转 READY +- **T3.2.1 纯前端迁移**:依赖 T3.1.1。**待决**:beta 要不要一次性导入既有后端数据到 localStorage,还是从零开始? +- **T3.5.1 executeRecovery + TOCTOU(#447)**:需合约侧原子接口配合。**待决**:等合约,还是 YAA 侧接受窗口 + 加监控? + +## 最近完成 + +- 2026-08-01 PR [#449](https://github.com/AAStarCommunity/YetAnotherAA/pull/449) + 合并进 master(`1d77b19`,squash)—— + guardian 恢复后的 DB 写入按爆炸半径排序(#446) +- 2026-08-02 `pilot plan` 建立三级规划:`roadmap.md` / `tasks.md` / + `progress.md` + `.pilot.yml` +- 2026-08-02 + **陈旧分支清理**(用户拍板:抢救特性、废弃分支)。删除前均已打归档 tag,**且已推到 origin** + ——任意 clone `git fetch --tags` 后即可 `git show ` + 取回,不依赖某一台机器的本地仓库。验证:`git ls-remote --tags origin | grep archive` + 应返回 4 条。 + + | 已删分支 | 归档 tag | 处置 | + | :----------------------------- | :---------------------------- | :---------------------------------- | + | `feat/registry-portal-sdk` | `archive/registry-portal-sdk` | 特性抢救为 T1.4.1 / T1.4.2 | + | `fix/portal-review-269` | `archive/portal-review-269` | 同上(门户主体已由 #269 进 master) | + | `feat/tier3b-raise-limit` | `archive/tier3b-raise-limit` | 已被 PR #390 取代,无需抢救 | + | `test/stage-1b-l1-more` | `archive/stage-1b-l1-more` | 同类用例已由 #415 落地 | + | `fix/446-recovery-write-order` | —(内容已全进 master) | 直接删除 | + +## 下一个 READY + +按优先级排序,`pilot run` 应从这里挑: + +1. **T1.2.1** 解冻并跑通 transfer-replay e2e(high)—— 依赖的 create-flow + bug 已闭合,spec 的 `test.fixme` 与 BLOCKED 注释都已过期;验收须断言 + `1 passed` +2. **T1.2.2** JWT 401 鉴权负向用例(high) +3. **T1.3.1** 未验证能力 UI 标 experimental(high) +4. **T1.1.5** 把已闭合的 beta 阻塞项回写进评估文档(mid) +5. **T1.4.1** AA26 智能 gas 估算 + 自动重试(mid,**涉钱**:必须设 gas 硬上限) +6. **T1.4.2** 最近收款人下拉(low) diff --git a/docs/agent/roadmap.md b/docs/agent/roadmap.md new file mode 100644 index 0000000..e9c69f0 --- /dev/null +++ b/docs/agent/roadmap.md @@ -0,0 +1,84 @@ +# YetAnotherAA Roadmap — Milestone → Feature + +> - 「未来要做什么」。具体怎么做 + 验收见 [`tasks.md`](tasks.md);此刻在做什么见 +> [`progress.md`](progress.md)。 +> - 编号:`M<里程碑>` → `F<里程碑>.<序号>` +> - 记录日期:2026-08-02 +> +> **来源**:本 roadmap 不是新造的,是把仓库既有规划转成三级结构: +> +> - 里程碑划分 = +> [`../BETA_READINESS_ASSESSMENT.md`](../BETA_READINESS_ASSESSMENT.md) +> §5 三阶段计划 +> - Feature/Task 素材 = 同文档 §4 must-do + +> [`../LAUNCH_READINESS_PLAN.md`](../LAUNCH_READINESS_PLAN.md) 五步 + open +> issues (#447/#382/#378) + 在途分支盘点 +> - 每条状态都对着 master 的**代码**核过,不是照抄 7 月的文档结论(详见 tasks.md 各 Task 的「证据」) + +--- + +## M1 — Beta 上线(Sepolia,二号 imx93 到位后) + +目标:把**已被链上证据支撑的核心路径**(passkey 注册 → 建号 → gasless Tier +1/2/3 转账 → 买入 aPNTs/GToken)作为 beta 范围发出去;范围外的能力显式标 experimental,不假装可用。 + +- **F1.1 Beta 阻塞项收口** — `BETA_READINESS_ASSESSMENT` §4 + must-do 清单里**尚未闭合**的那几条(多数已在 7 月后落地,见 tasks.md 核查结论) +- **F1.2 高优负向用例** — 重放拒绝、JWT + 401、余额不足、passkey 取消:每条断言「被正确拒绝」而非静默通过 +- **F1.3 Beta 范围闸门** — recovery / operator + / 多 EntryPoint 在 UI 上显式标 experimental 或禁用,避免用户踩未验证路径 +- **F1.4 转账 UX 抢救项** — 从被废弃的 `feat/registry-portal-sdk` + 抢救出来的两个未落地改进(AA26 智能 gas 估算+自动重试、最近收款人下拉),在当前 master 上重写 +- **F1.5 KMS 单点消除** — 二号 imx93 到位后的双板 HA(硬件依赖,非本仓库代码) + +## M2 — OP 主网发布(beta 期约一个月后) + +目标:beta 跑满一个月、负向矩阵补全、运营者链路闭环之后,发布主网版本;发布前做小额真实资金冒烟。 + +- **F2.1 运营者准入闭环** — `operator-onboarding.spec.ts` 卡在 Step5 的 + `deployAndRegisterPaymasterV4` revert;查因 → 补 Step5–7(Paymaster 部署 + + EntryPoint 充值 + Complete) +- **F2.2 完整负向/异常矩阵** — `LAUNCH_READINESS_PLAN.md` + 步骤 5 的 D1–D5 全表(L1 链上 / L2 API / L3 Playwright) +- **F2.3 Guardian 协签 UX 闭环** — issue + #382:提额(#3b) 已落地,转账 Tier-3 协签(#3a) 待补 +- **F2.4 多 EntryPoint 覆盖** — 目前只验过 v0.7;v0.6 / v0.8 未测 +- **F2.5 前端单测** — 至少覆盖 transfer / auth 关键路径(目前前端零测试) +- **F2.6 主网冒烟** — gasless 转账 + + gasless 买入各一笔,小额,证据归档;**全部前项通过后才做** + +## M3 — 基建加固(与 M1/M2 并行推进) + +目标:把 beta/主网依赖的基础设施从「单点 + 手工」变成「冗余 + 可观测」,并解锁被基建卡住的纯前端迁移。 + +- **F3.1 API-key 模型 / KMS Origin** + — 浏览器直连 bundler+KMS 的授权模型;这是 F3.2 的硬前置 +- **F3.2 纯前端零后端迁移** — PR + #400(draft,自标 WIP·PAUSED)解冻;含 localStorage 存储类的数据迁移决策 +- **F3.3 依赖存量监控** — bundler / paymaster / EntryPoint + deposit 余额告警,DVT 节点存活 +- **F3.4 发布物安全检查** — 浏览器 bundle 密钥泄漏扫描(DoD #8) +- **F3.5 已知安全缺口跟踪** — issue #447(executeRecovery + TOCTOU 窗口,已知、当前不可闭合)的收敛条件与再评估 + +## M4 — cos72 多社区演进(只到 Feature 层,暂不拆 Task) + +目标:从「单站点 YAA」演进到「小社区可自助拥有的协作站点」。 +**方向仍在收敛,故本里程碑刻意不拆 Task** —— 避免 `pilot run` +在产品方向未定时抢跑。真要开工前需先补 `research.md` + `acceptance.md`。 + +- **F4.1 配置即部署** — 一份配置驱动一个社区站点的产出(skill 化) +- **F4.2 多租户子域插件** — no-code 小社区 + 可评估的 Chrome 插件形态 +- **F4.3 create-app 模版** — 已有 `create-cos72-dapp` / + Cos72 雏形,需收敛成正式模版 +- **F4.4 可嵌入 SDK** — JS 引用 + React 组件两种嵌入形态 +- **F4.5 移动端与 FangPay** — 终点形态,依赖 F4.1–F4.4 + +> 注:M4 的多数实现落在独立仓库(`cos72-tour` / +> `create-cos72-dapp`)。本 roadmap 只记录 YAA 侧需要暴露的能力与边界。 + +--- + +> **当前聚焦**:M1 / F1.2 + F1.4。M4 只到 Feature 层,`pilot run` +> 不应从 M4 挑 Task。每个 Feature 的 Task 拆分与状态见 [`tasks.md`](tasks.md)。 diff --git a/docs/agent/tasks.md b/docs/agent/tasks.md new file mode 100644 index 0000000..1974811 --- /dev/null +++ b/docs/agent/tasks.md @@ -0,0 +1,361 @@ +# YetAnotherAA 任务台账 — Task + +> - 前置:[`roadmap.md`](roadmap.md)(M→F) +> - 每个 Task 自包含,可独立开发与验收。**验收标准必须可机器验证**(跑命令能判定通过与否)。 +> - 状态取值:`BACKLOG` · `READY` · `IN_PROGRESS` · `BLOCKED` · `PR_OPEN` · +> `CHANGES_REQUESTED` · `APPROVED` · `DONE` +> - 记录日期:2026-08-02 + +--- + +## F1.1 — Beta 阻塞项收口 + +> **核查前提**:`BETA_READINESS_ASSESSMENT.md` +> §4 的 must-do 清单写于 2026-07-02。建立本台账时逐条对着 master 的代码重新核过,其中 4 条已经落地——记为 DONE 并留证据,而不是让它们在清单里继续挂着假装是待办。 + +### T1.1.1 建号走 v0.23 passkey-at-birth + 画像 tier 配置 `DONE` + +- **优先级**:high +- **目标**:新用户建出来的账户是「已部署 + 有 owner + passkey + 有 tier 限额」的,而不是 legacy 反事实账户 +- **证据**:master `aastar-frontend/components/CreateAccountDialog.tsx:169-199` + 已改调 `prepareCreateWithPasskey` → `submitCreateWithPasskey` 并传 + `initialTokenConfigs`; `aastar-frontend/lib/tier-profiles.ts` 提供 + `resolveTierProfile`。这直接闭合了 `docs/CREATE_FLOW_BETA_BUG.md` + 记录的两个 root cause。 +- **验收命令**:`git grep -n "prepareCreateWithPasskey" -- aastar-frontend/components/CreateAccountDialog.tsx`(有输出即已切换) +- **备注**:`CREATE_FLOW_BETA_BUG.md` 文档本身尚未标注「已修复」,见 T1.1.5。 + +### T1.1.2 修 `operator/status` 500(`hasRole(undefined)`) `DONE` + +- **优先级**:high +- **目标**:未注册/缺参调用 `GET operator/status` 返回 200 + 空状态,而非 500 +- **证据**:master `aastar/src/operator/operator.controller.ts:38-67` + 已有显式 guard 与空状态返回 +- **验收命令**:`npm test -w aastar -- operator` + +### T1.1.3 服务存活监控与告警 `DONE` + +- **优先级**:high +- **目标**:cos72 跑在单台笔记本 + launchd 上,进程挂了要有人知道 +- **证据**:`scripts/ops/yaa-liveness.sh` + + `scripts/ops/io.aastar.yaa-monitor.plist`(PR #443 起纳入版本管理) +- **验收命令**:`test -x scripts/ops/yaa-liveness.sh && bash -n scripts/ops/yaa-liveness.sh` + +### T1.1.4 社会恢复:链上验证或降级标注 `DONE` + +- **优先级**:high +- **目标**:48 小时 recovery timelock 的安全属性在链上被证明 +- **证据**:`docs/SOCIAL_RECOVERY_TEST_REPORT.md`(Sepolia,2026-07-02,headless + e2e 证明 `executeRecovery()` 在 48h 前 revert);后续加固 PR + #441(执行前校验链上 proposal)、#446/#449(按爆炸半径排序恢复后的 DB 写入) +- **验收命令**:`npm test -w aastar -- guardian` +- **遗留**:TOCTOU 窗口仍开着 → issue #447 → 转 T3.5.1 跟踪 + +### T1.1.5 把已闭合的 beta 阻塞项回写进评估文档 `READY` + +- **优先级**:mid +- **目标**:`BETA_READINESS_ASSESSMENT.md` §4 / §6 与 `CREATE_FLOW_BETA_BUG.md` + 与代码现状对齐,别让文档骗人 +- **开发范围**:在两份文档里标注已闭合项 + 指向本台账;`CREATE_FLOW_BETA_BUG.md` + 顶部加 RESOLVED 头 +- **明确不做**:不改任何代码逻辑,不重写评估结论 +- **依赖**:无(T1.1.1–T1.1.4 的结论已在本文件记录) +- **交付物**:两份文档的状态更新 +- **验收命令**:`npm run format:check` +- **涉及文件**:`docs/BETA_READINESS_ASSESSMENT.md`、`docs/CREATE_FLOW_BETA_BUG.md` +- **风险/回滚**:纯文档,无风险 + +### T1.1.6 KMS 双板 HA(二号 imx93) `BLOCKED` + +- **优先级**:high +- **目标**:消除 KMS 单点故障 +- **阻塞原因**:**硬件依赖** —— 二号 imx93 到货 + 上架 + + KMS 部署,不是本仓库代码能推进的 +- **待决问题**:二号板到位后,YAA 侧是配双 KMS + endpoint 故障转移,还是由上游 KMS 做 VIP/负载均衡?这决定要不要改 + `aastar/src/kms/` +- **依赖**:无(外部) + +--- + +## F1.2 — 高优负向用例 + +### T1.2.1 解冻并跑通 transfer-replay e2e `READY` + +- **优先级**:high +- **目标**:证明「已消费的 challengeId 重放被拒绝」,把 spec 从 BLOCKED 状态放出来 +- **背景**:`aastar-frontend/e2e/transfer-replay.spec.ts` 用 + `test.fixme(...)`(第 14 行)把用例整个禁用了,头部注释写着 + `BLOCKED by docs/CREATE_FLOW_BETA_BUG.md`(新账户第一笔转账 prepare 就失败)。该 bug 已由 T1.1.1 闭合 → + **这个 spec 现在应该能跑了**,`fixme` 与注释都已过期 +- **开发范围**:把 `test.fixme` 改回 + `test`(这是关键动作,只删注释等于什么都没做);去掉过期的 BLOCKED 注释;实跑 spec;失败则修到通过或如实记录新的真实阻塞原因 +- **明确不做**:不扩到 D1 表的其他用例(那是 T2.2.x) +- **依赖**:T1.1.1(已 DONE) +- **交付物**:可跑通的 `transfer-replay.spec.ts` + 证据记录 +- **验收命令**(在 `aastar-frontend/` 下): + `npx playwright test e2e/transfer-replay.spec.ts --project=chromium 2>&1 | grep -E "passed|skipped|failed"` + 的输出里必须出现 `1 passed` 且不出现 `skipped` —— **必须断言 + `1 passed`**:`test.fixme` 会被 Playwright 当 skipped 处理,裸跑 + `playwright test` 即使用例一次都没执行也 exit + 0,那样「验收通过」只证明了注释被删掉 +- **涉及文件**:`aastar-frontend/e2e/transfer-replay.spec.ts` +- **风险/回滚**:会在 Sepolia 真实发一笔小额转账,需要 funded 账户;失败不影响生产 + +### T1.2.2 JWT 401 鉴权负向用例 `READY` + +- **优先级**:high +- **目标**:无 token / 过期 token + / 篡改 token 访问受保护接口,一律 401,不泄漏内部错误 +- **开发范围**:后端 e2e 覆盖 transfer / account / operator 三类受保护路由各一条 +- **明确不做**:不做权限分级(role-based)测试,只做认证层 +- **依赖**:无 +- **交付物**:`aastar/test/` 下的 e2e spec +- **验收命令**:`npm run test:e2e -w aastar` +- **涉及文件**:`aastar/test/`、`aastar/src/auth/` +- **风险/回滚**:纯测试新增 + +### T1.2.3 余额不足 / passkey 取消负向用例 `DONE` + +- **优先级**:high +- **证据**:PR #415 + `test(e2e): L3 negative transfer cases — insufficient balance + passkey cancel (CDP)`;spec 在 + `aastar-frontend/e2e/transfer-negatives.spec.ts` +- **验收命令**:`test -f aastar-frontend/e2e/transfer-negatives.spec.ts` + +### T1.2.4 Guard 严格模式 / 每日限额真机复现 `BLOCKED` + +- **优先级**:high +- **目标**:验证超限转账被强制升到 Tier 3、严格模式下受限操作被拦截 +- **阻塞原因**:需要**真机 passkey 操作**(Face ID/Touch + ID),CDP 虚拟认证器覆盖不到; `LAUNCH_READINESS_PLAN.md` 明确列为「用户负责」 +- **待决问题**:是否接受用 CDP 虚拟认证器做降级验证(覆盖逻辑但不覆盖真实生物识别)? +- **文档**:`docs/test-manual/GRD-04-guard-write.md` 已就绪 +- **依赖**:无(需人) + +--- + +## F1.3 — Beta 范围闸门 + +### T1.3.1 未验证能力在 UI 上显式标 experimental `READY` + +- **优先级**:high +- **目标**:beta 用户不会在不知情的情况下走进未验证路径 +- **开发范围**:recovery、operator(准入未闭环)、非 v0.7 + EntryPoint 三处加 experimental 标识/说明;文案说明「beta 期间该能力未完成验证」 +- **明确不做**:不禁用功能(只标注);不做 feature flag 体系 +- **依赖**:无 +- **交付物**:前端标注 + i18n 文案两语齐全 +- **验收命令**:`npm run i18n:check -w aastar-frontend && npm run type-check -w aastar-frontend` +- **涉及文件**:`aastar-frontend/app/recovery/`、`aastar-frontend/app/operator/`、i18n 文件 +- **风险/回滚**:纯 UI,回滚即 revert + +--- + +## F1.4 — 转账 UX 抢救项(来自废弃分支) + +> **来源**:`feat/registry-portal-sdk` / `fix/portal-review-269` +> 两条分支已落后 master 134 个 commit,且改的是已被 `/tokens` 取代的 +> `app/sale/page.tsx`,rebase 成本远高于重写。决策(2026-08-02,用户拍板):**抢救特性、废弃分支**。分支删除前已打归档 tag 并**推到 origin**(`git ls-remote --tags origin | grep archive` +> 可验证),原始实现在任意 clone 上 `git fetch --tags && git show ` +> 均可取回,见各 Task 的「参考实现」。 + +### T1.4.1 AA26 智能 gas 估算 + 自动重试 `READY` + +- **优先级**:mid +- **目标**:转账遇到 bundler + AA26(gas 估算不足)时自动按温和倍率重试,并把实际 gas 展示给用户,而不是直接把报错甩给用户 +- **开发范围**:在当前 master 的转账链路上重写;倍率沿用原分支结论(2x/3x 温和倍率, + `verificationGasLimit` 3x 安全系数 + 150k 下限) +- **明确不做**:不改 paymaster 选择逻辑;不做全局重试框架 +- **依赖**:无 +- **参考实现**:`git show 3fba02d`(智能估算+自动重试+实际 gas 展示)、`git show 2a88aa3`(温和倍率 2x/3x)、`git show f172185`(verificationGasLimit + 3x + 150k 下限)——三个 commit 由 tag `archive/registry-portal-sdk` 保活 +- **交付物**:转账重试逻辑 + 实际 gas 展示 + + **一个断言 gas 硬上限的单测**(见验收命令) +- **验收命令**:`npm test -w aastar -- transfer` + —— 其中**必须包含**一条断言:给定一个会连续触发 AA26 的 mock + bundler,重试收敛后的 `verificationGasLimit` / `callGasLimit` + 不超过初始估算的硬上限倍数,且重试次数不超过 cap。只跑 `type-check` + `lint` + **不足以验收本 task** + —— 那两条命令对 gas 上限一无所知,而这是本 task 唯一的涉钱风险点 +- **涉及文件**:`aastar-frontend/app/transfer/`、`aastar/src/transfer/`、`aastar/src/transfer/*.spec.ts` +- **风险/回滚**:**涉钱** + —— 重试会提高 gas 上限,必须设硬上限防止无限抬价;重试次数与倍率都要有 cap。上限值本身是产品决策(用户拍板),未定前本 task 不得转 IN_PROGRESS + +### T1.4.2 最近收款人下拉 `READY` + +- **优先级**:low +- **目标**:转账页地址栏可以从最近收款人里选,减少手输地址出错 +- **开发范围**:在当前 master 的地址簿/客户端存储基础上实现(地址簿已客户端化) +- **明确不做**:不做后端持久化(与纯前端迁移方向一致,见 F3.2) +- **依赖**:无 +- **参考实现**:`git show f5e241e`(由 tag `archive/registry-portal-sdk` 保活) +- **交付物**:转账页最近收款人下拉 +- **验收命令**:`npm run type-check -w aastar-frontend && npm run lint -w aastar-frontend` +- **涉及文件**:`aastar-frontend/app/transfer/`、客户端地址存储 +- **风险/回滚**:纯 UI + +--- + +## F2.1 — 运营者准入闭环 + +### T2.1.1 查 Step5 `deployAndRegisterPaymasterV4` revert 原因 `BACKLOG` + +- **优先级**:mid +- **目标**:解码 revert,区分 GToken 不足 / 工厂地址 / 角色前置 / SDK 入口四类因 +- **开发范围**:用 `simulateContract` 复刻该调用(含 ROLE_PAYMASTER_AOA 30 GT + stake)并解码 +- **依赖**:无 +- **验收命令**:`npx playwright test e2e/operator-onboarding.spec.ts --project=chromium`(跑到 Step5 不再 Retry) +- **涉及文件**:`aastar-frontend/e2e/operator-onboarding.spec.ts`、`aastar-frontend/app/operator/deploy/` +- **风险/回滚**:**涉钱** —— 会消耗测试 EOA 的 ETH/GToken + +### T2.1.2 补全 Step5–7 并断言链上结果 `BACKLOG` + +- **优先级**:mid +- **依赖**:T2.1.1 +- **验收命令**:`npx playwright test e2e/operator-onboarding.spec.ts --project=chromium`(跑到 StepComplete) + +--- + +## F2.2 — 完整负向/异常矩阵 + +### T2.2.1 D1 转账/Guard 剩余用例 `BACKLOG` + +- **优先级**:mid +- **目标**:`LAUNCH_READINESS_PLAN.md` §5 + D1 表里除 T1.2.1/T1.2.3/T1.2.4 之外的条目(金额边界、非法地址、过期 prepare) +- **依赖**:T1.2.1 +- **验收命令**:`npm run test:e2e -w aastar && npx playwright test --project=chromium` + +### T2.2.2 D2–D5 其余域负向用例 `BACKLOG` + +- **优先级**:mid +- **依赖**:T2.2.1 +- **验收命令**:同上 + +--- + +## F2.3 — Guardian 协签 UX 闭环 + +### T2.3.1 转账 Tier-3 guardian 协签 UX(issue #382 的 #3a) `BACKLOG` + +- **优先级**:mid +- **目标**:转账触发 Tier-3 时的 guardian 协签交互闭环(提额侧 #3b 已由 PR + #390 落地) +- **依赖**:T1.2.4(Guard 真机复现给出 Tier-3 强制升级的真实触发条件) +- **验收命令**:`npx playwright test e2e/transfer-tier3.spec.ts --project=chromium` +- **关联**:issue #382 + +--- + +## F2.4 — 多 EntryPoint 覆盖 + +### T2.4.1 v0.6 / v0.8 EntryPoint 路径验证 `BACKLOG` + +- **优先级**:low +- **目标**:目前只验过 v0.7;补另外两个版本的建号+转账路径 +- **依赖**:无 +- **验收命令**:`npm run test:onchain`(带 EntryPoint 版本参数) + +--- + +## F2.5 — 前端单测 + +### T2.5.1 前端关键路径单测起步 `BACKLOG` + +- **优先级**:mid +- **目标**:`aastar-frontend` 目前 `npm test` 是一句 echo;至少覆盖 transfer / + auth 的纯函数与状态逻辑 +- **开发范围**:先把 `aastar-frontend/package.json` 的 `test` 脚本从 + `echo "⚠️ No tests yet - skipping"` 换成真实 runner,再补用例 +- **明确不做**:不做全量组件快照测试 +- **依赖**:无 +- **验收命令**:`npm test -w aastar-frontend 2>&1 | grep -qE "Tests?[[:space:]]+[1-9]"` + —— **必须断言至少跑了 1 条用例**:当前 `test` 脚本是一句 `echo`,裸跑 + `npm test -w aastar-frontend` 今天就 exit 0,一条测试都不加也能「验收通过」 + +--- + +## F2.6 — 主网冒烟 + +### T2.6.1 OP 主网 gasless 转账 + 买入各一笔 `BLOCKED` + +- **优先级**:high +- **阻塞原因**:**真实资金 + 发布闸门** —— 按 `LAUNCH_READINESS_PLAN.md` + 必须在 M1/M2 全绿后、发布前才做 +- **待决问题**:主网测试账户与预算额度由谁准备、上限多少 +- **依赖**:M1 全部 + T2.1.2 + T2.2.2 +- **风险/回滚**:**真实资金**,不可回滚 + +--- + +## F3.1 — API-key 模型 / KMS Origin + +### T3.1.1 浏览器直连的 API-key 授权模型 `BACKLOG` + +- **优先级**:mid +- **目标**:让浏览器能在不经过自建后端的前提下安全调用 bundler + KMS +- **依赖**:上游 KMS 侧 Origin 解析行为(见 memory:KMS 按 Origin 解析 rpId) +- **验收命令**:待细化时补(当前写不出可验证命令 → 保持 BACKLOG,不许直接转 READY) + +--- + +## F3.2 — 纯前端零后端迁移 + +### T3.2.1 解冻 PR #400 `BLOCKED` + +- **优先级**:mid +- **目标**:把 `refactor/pure-frontend` 从 WIP·PAUSED 推进到可合并 +- **阻塞原因**:分支自己标注 PAUSED,卡在 API-key/KMS-Origin 基建(T3.1.1) +- **待决问题**:beta 是否需要把已有后端数据(地址簿/token 列表/paymaster 列表)一次性导入 localStorage,还是 beta 从零开始?这个决定影响迁移是否要写导入器 +- **依赖**:T3.1.1 +- **证据**:PR #400(draft,8 commits ahead / 43 behind master) + +--- + +## F3.3 — 依赖存量监控 + +### T3.3.1 paymaster / EntryPoint deposit 余额告警 `BACKLOG` + +- **优先级**:mid +- **目标**:代付资金见底前有告警,而不是用户转账失败才发现 +- **依赖**:无 +- **验收命令**:`bash -n scripts/ops/<新脚本>.sh` + 一次干跑输出当前余额 + +--- + +## F3.4 — 发布物安全检查 + +### T3.4.1 浏览器 bundle 密钥泄漏扫描 `BACKLOG` + +- **优先级**:mid +- **目标**:构建产物里不含任何私钥/密钥/内部 endpoint(DoD #8) +- **依赖**:无 +- **验收命令**:`npm run build -w aastar-frontend && bash scripts/security/<扫描脚本>.sh` + +--- + +## F3.5 — 已知安全缺口跟踪 + +### T3.5.1 executeRecovery TOCTOU 窗口(issue #447) `BLOCKED` + +- **优先级**:mid +- **目标**:收敛「链上 proposal 校验 → 实际执行」之间的时间窗 +- **阻塞原因**:issue + #447 自己标注「已知、暂不可闭合」—— 需要合约侧配合(原子化校验+执行) +- **待决问题**:是等合约侧提供原子接口,还是在 YAA 侧接受窗口并加监控告警? +- **依赖**:外部(Validator 合约仓库) +- **关联**:issue #447、PR #441/#446/#449 + +--- + +## 未收编项(登记,不进 M/F) + +- **`7702` 分支** — EIP-7702 独立实验,落后 master 168 commit,`7702/` + 目录不在 npm workspaces 里,与主线无耦合。**保留不动**(已写进 `.pilot.yml` 的 + `protect_patterns`),不作为 Task。 +- **issue #378** — 「[评估] 通知绑定方案的 YAA UI 部分」,主体在 + `aastar-sdk#193`,等上游方案定了再决定是否拆 Task。