fix(ci): capability audit 丢掉 Next.js 路由组,公开 URL 不变
Independent Staging Quality Gate / validate (push) Successful in 14m41s
Independent Staging Quality Gate / publish (push) Successful in 40m10s

Gitea run 2697 唯一失败:侧栏把 /chart /ephemeris /reports 移进 app/(secondary)/ 后,_scan_app_routes 把文件夹名写进 app_routes。扫描时丢掉括号段。BUG-753。
This commit is contained in:
jesse-ux
2026-09-16 21:09:24 +08:00
parent 6a843ac6e1
commit 05cf20fb83
5 changed files with 33 additions and 3 deletions
+17
View File
@@ -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`F1F7 + 决策 D6
- 基线:`origin/staging` @ **`a396bbe0`**(第二轮已 rebase;上一版基线 `302ff085`,代码基线 `cfb41daf`
- 分支 / 工作树:`codex/rectification-precision-gate-guided-collect-fix-20260916` / `.worktrees/rectification-precision-gate-guided-collect-fix-20260916`
- BUG**747752**。开工时最大号是 743;实现期间另一会话把侧栏统一那一单合入 staging,占掉了 744~746,所以本单整体后移到 747 起。rebase 后 `docs/BUG_HISTORY.md` 里 743 → 744 → … → 752 连续。
- BUG**747753**。开工时最大号是 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、740743 已逐条读完;BUG-733 的防复发条本轮补了一句(见下)。
## 0.2 合入后跟进(BUG-753Gitea 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`)。
+1 -1
View File
@@ -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-740743 | **已验收:未通过 → 修复单已验收通过并合入** | `cfb41daf`tsc/lint/Static/gzip(+0.44%) 通过,D1D5 单测通过;但 `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-744746 | 已验收(2026-09-16Opus 子代理实现 `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_TARGETSstaging 未部署 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_TARGETSstaging 未部署 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 分钟门槛只上报不改出卡时机 |
## 命名与归档
+8 -1
View File
@@ -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):
+2
View File
@@ -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',