fix(ci): capability audit 丢掉 Next.js 路由组,公开 URL 不变
Gitea run 2697 唯一失败:侧栏把 /chart /ephemeris /reports 移进 app/(secondary)/ 后,_scan_app_routes 把文件夹名写进 app_routes。扫描时丢掉括号段。BUG-753。
This commit is contained in:
@@ -11762,3 +11762,20 @@
|
||||
- 相关记录:BUG-740、BUG-749
|
||||
- 复发自:无
|
||||
- 修复版本:待发布
|
||||
|
||||
## BUG-753 | 次级页移进 `(secondary)` 路由组后 capability audit 把文件夹名当成公开路由
|
||||
|
||||
- 状态:resolved
|
||||
- 首次发现:2026-09-16
|
||||
- 最近更新:2026-09-16
|
||||
- 影响面:Gitea `backend-quality-gate` run `2696` / `2697`、`tests/test_api_server_security.py::test_capability_audit_scans_registry_and_local_sources`、`scripts/jyotish_api_server.py` `_scan_app_routes`
|
||||
- 用户现象:用户看不见。`dc732825` 把校正门禁红修绿后,staging 推送 run `2697` 仍 `1 failed, 797 passed`:`app_routes` 出现 `(secondary)/chart` 等,期望仍是 `chart` / `ephemeris` / `reports`。
|
||||
- 触发条件:侧栏统一把四个次级页移进 `app/(secondary)/` 后跑 capability audit 精确集合。
|
||||
- 根因:BUG-713 同类。`_scan_app_routes` 把文件系统相对路径当公开路由,Next.js 路由组括号不进 URL。侧栏单和精度门槛修复单都只跑了前端矩阵,没跑这条 Python 契约。
|
||||
- 修复:扫描时丢掉 `(…)` 路由组段。公开 URL 集合不变,不把 `(secondary)/chart` 写进期望列表。
|
||||
- 验证:`pytest tests/test_api_server_security.py::test_capability_audit_scans_registry_and_local_sources`。
|
||||
- 防复发:新增或移动 `frontend/src/app/**/page.tsx` 必须同一提交跑 capability audit。路由组不是新入口。
|
||||
- 相关记录:BUG-014、BUG-126、BUG-143、BUG-454、BUG-713
|
||||
- 复发自:BUG-713
|
||||
- 修复版本:待发布
|
||||
|
||||
|
||||
@@ -3,9 +3,13 @@
|
||||
- 任务书:`docs/tasks/TASK-rectification-precision-gate-guided-collect-fix-20260916.md`(F1~F7 + 决策 D6)
|
||||
- 基线:`origin/staging` @ **`a396bbe0`**(第二轮已 rebase;上一版基线 `302ff085`,代码基线 `cfb41daf`)
|
||||
- 分支 / 工作树:`codex/rectification-precision-gate-guided-collect-fix-20260916` / `.worktrees/rectification-precision-gate-guided-collect-fix-20260916`
|
||||
- BUG:**747~752**。开工时最大号是 743;实现期间另一会话把侧栏统一那一单合入 staging,占掉了 744~746,所以本单整体后移到 747 起。rebase 后 `docs/BUG_HISTORY.md` 里 743 → 744 → … → 752 连续。
|
||||
- BUG:**747~753**。开工时最大号是 743;实现期间另一会话把侧栏统一那一单合入 staging,占掉了 744~746,所以本单整体后移到 747 起。rebase 后 `docs/BUG_HISTORY.md` 里 743 → 744 → … → 752 连续。合入后 Gitea run `2697` 仍红一条 capability audit,补 BUG-753。
|
||||
- 开工检索(AGENTS §5):BUG-733、654、656、740~743 已逐条读完;BUG-733 的防复发条本轮补了一句(见下)。
|
||||
|
||||
## 0.2 合入后跟进(BUG-753,Gitea run 2697)
|
||||
|
||||
`dc732825` 把 F1 修绿(797 passed),但 run `2697` 仍 `1 failed`:`test_capability_audit_scans_registry_and_local_sources` 扫到 `(secondary)/chart` 等。侧栏把四个次级页移进路由组后,`_scan_app_routes` 把文件夹名当成公开 URL。扫描时丢掉 `(…)` 段,期望列表仍是 `chart` / `ephemeris` / `reports`。本地 `pytest` 该条 + growth contract 8 passed。
|
||||
|
||||
## 0. rebase 到 `a396bbe0`
|
||||
|
||||
第二轮已 `git rebase origin/staging`(侧栏统一那 4 笔:`d9d34723`、`fb77c865`、`22edabbc`、`a396bbe0`)。
|
||||
|
||||
@@ -253,7 +253,7 @@
|
||||
| `RECONCILE-20260916.md` | — | **对账清单(不是任务书)**:状态板与现实脱节(09-15~16 那 10 份早已合入却仍写「待领取/待验收」,本轮已修正),所以另外 7 份 09-10~14 的单**不能拿 README 当证据**——它们没有 `PROGRESS-*.md`,但引用的 BUG 号都是 `resolved`。要么被别的单顺带修了没留记录,要么压根没做。每行回一个「做了/没做」即可。另附三条我已查到确定没做的证据、两条状态未闭环的、以及 BLK-001 仍红(2026-09-16 在 `4f643aa0` 复跑确认) | 待产品负责人 / 执行方回填 | — |
|
||||
| `TASK-rectification-precision-gate-guided-collect-20260916.md` | `PROGRESS-rectification-precision-gate-guided-collect-20260916.md` | **出卡加精度门槛 + 引导式补经历**:真机 30 分钟窗给 5 件事 / 3 领域就出卡,区间 20 分钟、5 候选并列 26/26/20%,卡下只有自由文本邀请。产品拍板 D1 出卡门槛「宽度 ≤10 分钟且前两名差 >3 个百分点且不并列」;D2 用户说没有了仍按现行规则出卡(保留永远给结果);D3 门槛未达改为系统点名逐题问 + 类型芯片 + 年/月选择器录入,删自由文本邀请;D4 跳过的线换问法再问一次(拒绝不重问,改 BUG-687 口径);D5 时间点题答「没发生」不关领域、存在性题问整个领域、七条线一张表不许按领域写死。引擎新增 `guided_collect_windows`(边界不设 45 天闸门、含小运),不改打分与 lead。Skill 10.0.27。附 T6 两条核实:B/C/D 回执文案对调、性格题后范围回弹 8 分钟。BUG-740~743 | **已验收:未通过 → 修复单已验收通过并合入** | `cfb41daf`;tsc/lint/Static/gzip(+0.44%) 通过,D1~D5 单测通过;但 `npm test` 新增 16 红(校正既有断言未跟上)+ memoization golden 因 receipt 新键红(门禁级,staging 仍部署 317e9f18);引导窗口领域轮询分配、回放未按真值注入、录入卡走模型轮 → `TASK-rectification-precision-gate-guided-collect-fix-20260916.md` |
|
||||
| `TASK-sidebar-unify-20260916.md` | `PROGRESS-sidebar-unify-20260916.md` | **侧栏统一成一个组件 + 次级页共享外壳 + 跳转不整页刷新(纯前端)**:`/` 用 `AppSidebar`、四个次级页用另写的 `AppNavRail`,两套标记结构共用一份 CSS,会话行少 `.session-main` 一层(无内边距 / 44px 高 / 当前项标记、留 44px 空列)、页脚 56px 菜单 vs 44px 文字;首页进次级页是 `window.location.assign` 整页刷新,次级页各自在组件里挂 `SecondaryShell`、无共享 layout 无缓存,每次跳转重拉 `/api/sessions` + `/api/account`;折叠状态不持久。产品拍板 D1 只留一个 `AppSidebar`(操作回调可选 = 只读模式,D9「不带写操作」维持)、D2 路由组 `app/(secondary)/` layout 承载外壳、D3 改 `<Link>`、D4 模块级 60 s 缓存 + 首页写操作失效、D5 折叠状态存 cookie、D6 回首页慢的启动链另开一单。实测:接口 TTFB 0.63~0.90 s,回 `/` 启动链串行 ≥4 次往返 + 揭幕闸门 4 s。BUG-744~746 | 已验收(2026-09-16,Opus 子代理实现 `22edabbc`,门禁全绿、失败清单与基线逐条相同;折叠状态取 localStorage 触发让步 1;真机清单待走) | `codex/sidebar-unify-20260916` |
|
||||
| `TASK-rectification-precision-gate-guided-collect-fix-20260916.md` | `PROGRESS-rectification-precision-gate-guided-collect-fix-20260916.md` | **验收修复单**:F1 `decision_receipt` 新增 `guided_collect_windows` 让 `test_rectification_engine_memoization` golden 红(在 CORE_PYTEST_TARGETS,staging 未部署 cfb41daf);F2 16 条既有校正断言红未按三栏改;F3 `mayDeliverOnPrecision` 缺省即放行、短路 BUG-654 且 `guidedCollectExhausted` 不含 refresh;F4 无领域轨道窗口轮询贴领域、一窗只问一领域;F5 离线回放注入 month_lo 非真值方向、0/20 不作数;F6 录入卡合成「或」列表句走模型轮;F7 page.tsx +1、手造 fixture。D6 产品已拍板:门槛只是必要条件,仍问完线再出。BUG 段 744 起 | **已验收通过,已合入 staging** | `dc732825`(Opus 子代理实现,Claude 独立验收):tsc 0 / lint 0 error / npm test 3405 条 31 红与基线 a396bbe0 逐条一致(16 条校正红转绿、0 新红)/ pytest 193 通过 / `○ /` Static / gzip 582,552 → 582,800(+0.04%)/ page.tsx 1836 → 1835 / golden diff 仅加 `guided_collect_windows` 一键 / Skill 10.0.28。F5 真值方向回放三档仍 0 例靠引导件达标,作研究结论记录。D2+D6 合并后 10 分钟门槛只上报不改出卡时机 |
|
||||
| `TASK-rectification-precision-gate-guided-collect-fix-20260916.md` | `PROGRESS-rectification-precision-gate-guided-collect-fix-20260916.md` | **验收修复单**:F1 `decision_receipt` 新增 `guided_collect_windows` 让 `test_rectification_engine_memoization` golden 红(在 CORE_PYTEST_TARGETS,staging 未部署 cfb41daf);F2 16 条既有校正断言红未按三栏改;F3 `mayDeliverOnPrecision` 缺省即放行、短路 BUG-654 且 `guidedCollectExhausted` 不含 refresh;F4 无领域轨道窗口轮询贴领域、一窗只问一领域;F5 离线回放注入 month_lo 非真值方向、0/20 不作数;F6 录入卡合成「或」列表句走模型轮;F7 page.tsx +1、手造 fixture。D6 产品已拍板:门槛只是必要条件,仍问完线再出。BUG 段 744 起 | **已验收通过,已合入 staging**;合入后 run `2697` 仍红 capability audit(`(secondary)/chart`),跟进 BUG-753 | `dc732825`(Opus 子代理实现,Claude 独立验收):tsc 0 / lint 0 error / npm test 3405 条 31 红与基线 a396bbe0 逐条一致(16 条校正红转绿、0 新红)/ pytest 193 通过 / `○ /` Static / gzip 582,552 → 582,800(+0.04%)/ page.tsx 1836 → 1835 / golden diff 仅加 `guided_collect_windows` 一键 / Skill 10.0.28。F5 真值方向回放三档仍 0 例靠引导件达标,作研究结论记录。D2+D6 合并后 10 分钟门槛只上报不改出卡时机 |
|
||||
|
||||
## 命名与归档
|
||||
|
||||
|
||||
@@ -10285,7 +10285,14 @@ class JyotishAPIHandler(BaseHTTPRequestHandler, VedastroEvidenceMixin, SynastryM
|
||||
if not {'page.tsx', 'page.ts', 'page.jsx', 'page.js'}.intersection(filenames):
|
||||
continue
|
||||
relative = os.path.relpath(dirpath, root)
|
||||
routes.append('home' if relative == '.' else relative.replace(os.sep, '/'))
|
||||
if relative == '.':
|
||||
routes.append('home')
|
||||
continue
|
||||
parts = [
|
||||
part for part in relative.replace(os.sep, '/').split('/')
|
||||
if not (part.startswith('(') and part.endswith(')'))
|
||||
]
|
||||
routes.append('/'.join(parts) if parts else 'home')
|
||||
return sorted(set(routes))
|
||||
|
||||
def _scan_app_source_text(self):
|
||||
|
||||
@@ -1595,6 +1595,8 @@ def test_capability_audit_scans_registry_and_local_sources() -> None:
|
||||
# 原值: 无 'ephemeris'
|
||||
# 新值: 在 chart 与 home 之间加入 'ephemeris'
|
||||
# 原因: /ephemeris 是产品入口,_scan_app_routes 已扫到;这是 BUG-143/454 同类遗漏(BUG-713)
|
||||
# 2026-09-16: 四个次级页移进 app/(secondary)/ 后扫描仍必须是公开 URL
|
||||
# chart / ephemeris / reports,不得出现 '(secondary)/…'(BUG-753)
|
||||
'ephemeris',
|
||||
'home',
|
||||
'login',
|
||||
|
||||
Reference in New Issue
Block a user