release: cut v2.1
Some checks failed
CI / pytest (Python 3.10) (push) Has been cancelled
CI / pytest (Python 3.11) (push) Has been cancelled
CI / pytest (Python 3.12) (push) Has been cancelled

This commit is contained in:
Hermes Agent
2026-06-13 14:49:58 +08:00
parent eb4f3e1e96
commit 3f46811e49
144 changed files with 22290 additions and 1057 deletions

View File

@@ -0,0 +1,402 @@
# 高考志愿填报系统 产品规划与技术实施评审报告(历史快照)
> 该文档是 2026-06-12 的评审快照;其中部分判断已被后续代码与验证结果更新。当前真相源请以 `reports/PROJECT_SYSTEM_REVIEW_2026-06-13.md` 为准。
**项目**: `gaokao-volunteer-system`
**评审日期**: 2026-06-12
**评审范围**: 产品规划、市场调研、业务场景、技术架构、实施计划、核心实现代码、CI 与测试结构
**评审方法**: 文档交叉核对 + 代码抽样核验 + 静态分析 + 本地测试验证
---
## 1. 结论摘要
### 1.1 总体结论
项目的**产品方向是成立的**,核心差异化也清楚:`27省政策检查``反扎堆``真人服务``数据透明``AI审核` 这条产品线在产品层面形成了闭环。
但从**产品规划 -> 技术设计 -> 实施计划 -> 代码现状**四层链路看,当前存在明显的**文档状态漂移**与**实施范围收缩**
- 核心产品能力已经部分落地,但并未完全覆盖 PRD 中的全部关键路径。
- `README.md``PRD.md``ROADMAP.md``IMPLEMENTATION_PLAN_v2.md` 对“已完成 / 规划中 / 待实现”的标注存在不一致。
- 业务场景中的 **Web 自助流程** 仍然缺少完整实现路径。
- AI 审核链路已经具备解析器、扎堆检测、模板等局部模块,但距离技术架构里定义的 `audit_service -> checker_integration -> crowd_detector -> report_generator` 端到端服务还有缺口。
### 1.2 评审评级
| 维度 | 评级 | 说明 |
| ------------------ | ---- | ------------------------------------------------ |
| 产品定位 | A- | 目标用户、价值主张、付费路径明确 |
| 行业差异化 | A | 反扎堆 + 政策合规 + 真人服务,差异点成立 |
| 业务场景设计 | B | 闲鱼/微信场景较完整Web 场景未闭环 |
| 技术规划对齐 | B- | 方向对齐,但模块落地不完整,文档与代码不同步 |
| 实施计划可执行性 | B- | 任务拆分合理,但范围较大,且部分任务状态滞后 |
| 行业最佳实践符合度 | B- | 安全、CI、测试、审计方向对了但门槛尚未完全达标 |
**综合判断**: 产品规划可用,技术实施计划需要按当前代码事实重新校准,不能直接按现有文档状态视为“全量已完成”。
---
## 2. 评审依据
### 2.1 产品与业务文档
- `product/PRD.md`
- `product/ROADMAP.md`
- `product/MARKET_RESEARCH.md`
- `docs/BUSINESS_SCENE.md`
- `docs/TECH_ARCHITECTURE.md`
- `docs/IMPLEMENTATION_PLAN_v2.md`
- `docs/AUDIT_REPORT_2026-06-11.md`
### 2.2 代码与运行时证据
- `README.md`
- `admin/app.py`
- `admin/routes/orders.py`
- `admin/routes/users.py`
- `admin/routes/stats.py`
- `data/orders/schema.py`
- `data/orders/crypto.py`
- `data/crowd_db/loader.py`
- `data/crowd_db/crowd_detector.py`
- `data/share/short_link.py`
- `data/share/permission.py`
- `skills/gaokao-audit/SKILL.md`
- `skills/gaokao-audit/scripts/plan_parser.py`
- `.github/workflows/ci.yml`
### 2.3 静态分析结果
- 深度分析报告:`reports/code-analysis-review-input-2026-06-12.md`
- 统计结果107 个核心文件25,582 行123 个数据模型/DTO218 条业务规则66 个外部依赖
---
## 3. 产品规划审核
### 3.1 产品定位是否符合行业最佳实践
结论:**基本符合**。
`PRD.md` 中的定位不是泛 AI而是“高考志愿填报的垂直决策支持”。这符合教育咨询类产品的最佳实践因为它避免了通用聊天机器人最常见的两个问题
1. 只给信息,不给行动建议。
2. 给建议但缺少政策约束与责任边界。
文档里给出的四维主张也合理:
- 兴趣
- 能力
- 家庭条件
- 就业导向
这四项和高考志愿的真实决策逻辑基本一致,不是拍脑袋的功能堆砌。
### 3.2 目标用户与场景是否匹配
结论:**匹配度高**。
`PRD.md` 中定义的三类用户画像,以及 `BUSINESS_SCENE.md` 中的两种核心交付路径,符合高考志愿填报服务的真实市场形态:
- 闲鱼 / 微信 / 学校渠道,适合低摩擦成交和人工深度服务。
- Web 自助路径,适合标准化、规模化和未来增长。
这个分层是合理的,且与 `MARKET_RESEARCH.md` 里“免费大厂工具负责流量教育,专业服务负责转化” 的市场判断一致。
### 3.3 产品优先级是否合理
结论:**核心优先级合理,但当前文档状态存在冲突**。
`PRD.md` 里把 `反扎堆推荐``AI方案审核` 作为核心差异化功能,这和当前市场竞争态势是一致的。
但同一文档里,`管理后台``报告分享``数据溯源``AI审核``反扎堆` 等状态标记混杂了“规划中”和“已落地”的语义,说明产品文档没有和实现进度同步更新。
这会带来两个问题:
- 对外部读者来说,不知道哪些是已交付能力,哪些只是规划。
- 对实施团队来说,无法据此准确排期。
### 3.4 产品层面的主要问题
#### 问题 1: PRD 和当前实现状态不同步
`PRD.md` 第 144-155 行仍把 `F011-F020` 多个功能标成“规划中”,但 `README.md` 已明确写出管理后台、仪表盘、用户管理、订单管理、分享能力、渠道兜底等内容已进入落地阶段。
这不是功能本身的问题,而是**产品文档治理问题**。
如果不修正,后续会直接影响排期、验收与商业交付口径。
#### 问题 2: Web 自助服务的产品路径没有真正闭环
`BUSINESS_SCENE.md` 第 15-23 行定义了 Web 自助流程,但 `IMPLEMENTATION_PLAN_v2.md` 的任务主线仍然围绕 AI 审核、反扎堆、数据溯源、订单管理展开,没有形成一个可直接上线的 Web 交易闭环。
也就是说:
- 产品层已经定义了 Web 场景。
- 代码层已经有管理后台和订单能力。
- 但**前台自助购买、资料填写、交付浏览、支付闭环**尚未形成完整产品。
这意味着场景 B 目前仍是规划态,而不是可交付态。
---
## 4. 技术规划审核
### 4.1 技术架构是否与产品方向对齐
结论:**方向对齐,落地不完全**。
`TECH_ARCHITECTURE.md` 的分层设计是合理的:
- Channels
- Gateway
- Services
- Data
- Infra
并且它明确了 4 个核心技术面:
- AI 审核服务
- 反扎堆检测
- 数据溯源
- 订单管理
这些都与 PRD 的核心卖点一致,说明技术规划没有偏题。
### 4.2 技术选型是否符合行业最佳实践
结论:**符合“务实型最佳实践”**。
当前选型没有过度复杂化:
- Python 3.10+
- SQLite
- FastAPI
- 本地优先
- 文件 / JSON / Markdown 为主
这对于一个以文档化规则、轻量交付和低并发为主的高考志愿辅助系统是合适的。
它避免了不必要的微服务、消息队列或过重前端框架,这一点符合 KISS 和 YAGNI。
### 4.3 技术规划的主要偏差
#### 问题 1: AI 审核服务的模块结构与代码现状不完全一致
技术架构里定义的 AI 审核服务包含:
- `audit_service.py`
- `checker_integration.py`
- `crowd_detector.py`
- `report_generator.py`
但当前代码层已核验到的实际实现是:
- `skills/gaokao-audit/scripts/plan_parser.py`
- `data/crowd_db/crowd_detector.py`
- `skills/gaokao-audit/templates/audit_report.html`
也就是说,**解析器、检测器、模板已经有了,但“编排服务层”仍然不完整**。
这使 AI 审核能力更像“若干模块拼装”,还不是完全闭环的服务产品。
#### 问题 2: 数据溯源的设计比实现更完整
`TECH_ARCHITECTURE.md` 要求数据溯源字段扩展、来源链接、置信度管理。
`data/crowd_db/SCHEMA.md``loader.py` 确实已经定义了 `source / source_url / source_type / confidence / last_updated / data_year` 等字段,并提供了 `confidence < 0.5` 的低置信度警告机制。
这说明数据溯源不是空谈,已经进入实现层。
但是从整体产品体验看,它仍然主要存在于数据结构和审核文档里,还没有在终端用户报告中形成足够强的可视化表达。
---
## 5. 实施计划审核
### 5.1 实施计划是否与产品规划对齐
结论:**部分对齐,且存在“计划超前/文档滞后”并存现象**。
`IMPLEMENTATION_PLAN_v2.md` 是在补齐先前审计缺口后修订的,这一版对齐意识很强,特别是新增了:
- T6 管理后台 MVP
- T7 分享功能 MVP
- T8 渠道 SDK 集成
- T9 错误处理体系
- T10 CI/CD 基础
- T11 性能与安全加固
这说明实施计划已经开始向行业化工程实践靠拢。
但存在两个现实问题:
1. 文档里仍然保留大量“待开始 / 规划中”的标记。
2. 代码仓库实际已经有部分 T6/T7/T8/T9 能力落地,计划文档没有完全反映现实。
这会导致一种典型风险:**研发推进速度快于文档治理速度**。
### 5.2 当前最关键的实施差距
#### 差距 1: Web 产品闭环未形成
业务场景文档定义了 Web 购买、资料填写、生成方案、站内交付,但实施计划没有把它作为一个独立可交付的主线任务。
对业务来说,这意味着:
- 无法真正形成标准化产品入口。
- 规模化能力被限制在人工渠道。
#### 差距 2: 核心服务的端到端编排层缺失
技术规划中的 AI 审核要成为商业卖点,必须有一个完整的服务编排层。
当前看,`plan_parser``crowd_detector``audit_report.html` 已存在但主服务编排、规范检查集成、PDF/HTML 输出组合还没有形成统一入口。
#### 差距 3: CI / 测试门槛没有完全兑现
`IMPLEMENTATION_PLAN_v2.md` 明确提出:
- 核心覆盖率 ≥ 80%
- 整体覆盖率 ≥ 60%
- CI 通过
`.github/workflows/ci.yml` 现在只是生成覆盖率报告,并没有在工作流中强制 `--cov-fail-under` 门槛。
也就是说,**测试门槛在计划里有,在流水线里还没真正硬化**。
---
## 6. 代码现状与文档一致性审核
### 6.1 已对齐部分
以下能力已经能从代码中看到真实实现,不是纯文档:
- 管理后台 FastAPI 入口:`admin/app.py`
- 用户管理:`admin/routes/users.py`
- 仪表盘统计:`admin/routes/stats.py`
- 订单管理:`admin/routes/orders.py`
- 订单加密与状态审计:`data/orders/schema.py``data/orders/crypto.py`
- 分享短链接与权限策略:`data/share/short_link.py``data/share/permission.py`
- 反扎堆数据加载与检测:`data/crowd_db/loader.py``data/crowd_db/crowd_detector.py`
- AI 审核解析器:`skills/gaokao-audit/scripts/plan_parser.py`
这说明项目已经不是“只停留在规划文档”的状态。
### 6.2 仍需警惕的部分
`README.md``PRD.md``ROADMAP.md``IMPLEMENTATION_PLAN_v2.md` 的状态描述存在明显不一致。
这类不一致本身就是产品与实施失配的信号,尤其在这种带有商业交付和合规风险的项目里,会直接影响:
- 交付验收
- 团队排期
- 商业对外口径
- 风险边界
---
## 7. 行业最佳实践符合度
### 7.1 符合的部分
- 产品定位清晰,不是泛 AI。
- 技术栈克制,没有引入多余复杂度。
- 核心功能围绕真实高考决策场景展开。
- 数据脱敏、加密、审计的方向正确。
- CI / 覆盖率 / TDD 的工程意识已经建立。
### 7.2 不足的部分
- 测试门槛尚未真正硬化。
- 文档状态治理不足。
- Web 自助闭环缺失。
- AI 审核端到端编排层未完全落地。
- 产品文档与实施计划没有统一“真相源”。
### 7.3 结论
按行业最佳实践标准,这个项目已经进入**可用的工程化阶段**,但还不能说已经达到**成熟的产品化交付阶段**。
最需要补的不是“再加功能”,而是**把已经实现的能力、正在做的能力、尚未做的能力分层讲清楚,并让计划与代码同步**。
---
## 8. 风险分级
### 8.1 高风险
1. **文档状态漂移**
影响:排期、验收、对外口径都可能出错。
2. **Web 自助闭环缺失**
影响:规模化能力不足,场景 B 不能独立运行。
3. **AI 审核链路未完全端到端**
影响:核心差异化卖点的交付完整性不足。
### 8.2 中风险
1. **CI 没有硬性覆盖率门槛**
2. **测试依赖未在当前系统环境可直接运行**
3. **部分数据集仍以骨架或低置信度形式存在**
### 8.3 低风险
1. 技术栈过重风险低
2. 数据模型扩展性尚可
3. 本地优先策略符合当前业务体量
---
## 9. 建议
### 9.1 立即修正
1. 统一 `PRD / ROADMAP / TECH_ARCHITECTURE / IMPLEMENTATION_PLAN_v2 / README` 的状态口径,先建立单一事实源。
2.`AI审核服务` 补齐端到端编排层,明确输入、校验、检测、出报告的主入口。
3.`Web 自助流程` 单独列为可交付范围,不要继续和人工渠道混在一个抽象里。
4. 在 CI 中强制覆盖率门槛,避免“只生成报告不阻断失败”。
### 9.2 短期优化
1.`README.md` 增加“已完成 / 进行中 / 规划中”三态表,并明确更新时间。
2.`data/crowd_db` 的骨架省份补充完整度分级,不要只靠目录存在代表能力存在。
3. 给 AI 审核报告增加更强的数据来源展示和修正建议链路。
### 9.3 中期优化
1. 把 Web 端做成真正的自助产品,而不是后台能力展示页。
2. 统一订单、用户、分享、报告的领域模型。
3. 建立基于真实用户案例的持续回归测试集。
---
## 10. 最终结论
**结论一句话**
这个项目的产品规划是专业且有市场逻辑的,技术路线也整体正确,但当前最大问题不是方向,而是**规划、实施和代码现状之间的同步失真**。
如果按“产品是否值得继续推进”来判断,答案是**值得**。
如果按“实施计划是否已经与产品规划完全对齐”来判断,答案是**还没有**。
最准确的判断是:
> **核心产品方向成立,核心差异化成立,已有工程落地可见,但实施计划与产品文档仍需重新对齐,尤其是 Web 闭环、AI 审核编排、CI 门槛和文档状态治理。**
---
## 11. 验证记录
### 11.1 已完成验证
- 已执行代码目录扫描与核心文档抽样阅读。
- 已执行 `code-analyzer` 静态分析,输出到 `reports/code-analysis-review-input-2026-06-12.md`
- 已核验评审报告文件存在,当前报告共 400 行。
### 11.2 未完成验证
本地测试套件未能执行,原因是当前系统 Python 环境缺少 `pytest`
```bash
pytest -q
# /bin/bash: line 1: pytest: command not found
python3 -m pytest -q
# /usr/bin/python3: No module named pytest
```
仓库存在 `requirements-dev.txt`,其中包含 `pytest``pytest-cov``pytest-timeout``pytest-xdist``httpx``locust` 等测试/性能依赖。
因此,本报告对代码健康度的判断基于静态分析和代码抽样,不声明当前测试套件通过。

View File

@@ -0,0 +1,322 @@
# gaokao-volunteer-system 系统性评审报告
**评审日期**: 2026-06-13
**评审对象**: `/home/long/project/gaokao-volunteer-system`
**评审方法**: 文档交叉核对 + 关键代码抽样 + 工程门禁实跑 + 两阶段 review规格对齐 / 代码质量)
---
## 1. 一句话结论
> 项目已经从“纯规划/纯 skill 仓库”演进为“运营后台 + 订单/分享/渠道同步 + AI 审核链路”的可运行系统,但**文档真相严重漂移、用户端 Web 自助闭环仍未落地、CI/类型/安全门禁未形成可信闭环**。当前更准确的项目标签是:**内部运营与人工服务增强系统已成形,面向用户的完整产品化交付仍未完成**。
---
## 2. 本次新鲜证据
### 2.1 工程门禁
```bash
git status --short
python3 -m pytest -q
python3 -m ruff check . --exclude .worktrees
python3 -m mypy .
python3 -m bandit -r admin data skills scripts -x .worktrees,tests,admin/tests,data/channel_sync/tests,data/orders/tests,data/share/tests,data/crowd_db/tests,skills/gaokao-audit/tests,scripts/legacy
pytest --cov=admin --cov=data --cov=skills --cov=scripts --cov-report=term-missing -q
pytest -q admin/tests
```
### 2.2 当前结果
- `git status --short`**大量未提交修改/新增文件**,当前真实状态主要存在于 working tree而不是稳定交付基线
- `python3 -m pytest -q`**459 passed, 2 warnings**
- `python3 -m ruff check . --exclude .worktrees`**All checks passed**
- `python3 -m mypy .`**97 errors / 19 files**
- `python3 -m bandit ...`:原始输出噪声很高;聚焦后仍有若干真实问题
- `pytest --cov=admin --cov=data --cov=skills --cov=scripts --cov-report=term-missing -q`**TOTAL 61%**
- `pytest -q admin/tests`**115 passed**
### 2.3 CI 干净环境复核事实
- `.github/workflows/ci.yml` 只安装 `requirements-dev.txt`
- `requirements-dev.txt` **不包含** `fastapi / uvicorn / PyJWT / cryptography / pydantic`
- 因此 CI 对 `admin/*` 的 clean env 可复现性并不成立
- 这意味着“本地 pytest 通过”≠“CI 对完整产品可复现”
---
## 3. 当前真相源排序
当前建议按以下顺序理解项目状态:
1. **代码与实跑结果**(最高优先级)
- `admin/`
- `data/orders/`
- `data/share/`
- `data/channel_sync/`
- `skills/gaokao-audit/`
- 当前 pytest / ruff / mypy / bandit / coverage 输出
2. **README + CHANGELOG部分可信**
3. **IMPLEMENTATION_PLAN_v2 / CHANNEL_INTEGRATION部分过时需结合代码**
4. **PRODUCT_TECH_REVIEW_2026-06-12 / AUDIT_REPORT_2026-06-11 / REMEDIATION_TASK_BOARD_2026-06-11历史快照不能直接继承为当前结论**
---
## 4. Stage 1规格/规划对齐审查
### 4.1 已对齐的主线
| 领域 | 当前状态 | 证据 |
| ----------------------------------------------------- | ------------ | ----------------------------------------------------------------------------- |
| 场景A闲鱼/微信/学校 → 管理端录单 → 顾问交付 | **基本对齐** | `docs/BUSINESS_SCENE.md` + `admin/routes/orders.py` + `data/channel_sync/*` |
| 管理后台(认证/用户/订单/案例/仪表盘) | **已落地** | `admin/app.py``admin/routes/*``README.md` |
| AI 审核主链(解析/规则检查/扎堆/报告/CLI | **已落地** | `skills/gaokao-audit/scripts/*.py` |
| 分享能力(短链/权限/公开分享) | **已落地** | `data/share/short_link.py``data/share/permission.py``admin/share_page.py` |
| 渠道同步(闲鱼 webhook/poller、微信/企微最小 client | **已落地** | `data/channel_sync/*` |
| crowd_db 溯源与风险展示 | **已落地** | `data/crowd_db/*``scripts/gaokao-data-trace` |
### 4.2 关键漂移
#### A. 最严重范围错位:用户端 Web 自助产品未形成闭环
文档定义的场景B是
- 用户访问 Web
- 站内先付费
- 付费后填写资料
- 自动/人工生成方案
- 站内查看 + 邮件 PDF 交付
当前代码现实:
- 仓库中**没有** `package.json``*.tsx`、用户端前台 Web 应用
- 只有:
- 管理后台 FastAPI
- 公开分享页
- 管理端仪表盘页面 `admin/static/dashboard.html`
- **未见用户注册/下单/支付/资料填写/邮件交付闭环**
结论:
- 当前系统更像“运营后台 + 人工服务增强链路”
- 不是“文档中描述的双流程完整产品”
#### B. PRD / ROADMAP / README / IMPLEMENTATION_PLAN_v2 状态互相冲突
- `PRD.md` 仍把 F016-F020分享/管理后台/反扎堆/数据溯源/AI审核标成“规划中”
- `ROADMAP.md` 仍把多项已实现能力放在后续阶段
- `IMPLEMENTATION_PLAN_v2.md` 顶层总览大量任务仍是 `📋`,但局部又写“已实现”
- `README.md` 写入了较新能力,但目录树和整体叙事仍偏旧
结论:
- 当前没有单一文档可以单独代表真实现状
- **文档真相层已经失效**
#### C. 旧报告已过时
| 文档 | 当前判断 |
| ------------------------------------------- | ---------------------------------- |
| `docs/AUDIT_REPORT_2026-06-11.md` | **严重过时** |
| `docs/REMEDIATION_TASK_BOARD_2026-06-11.md` | **严重过时** |
| `reports/PRODUCT_TECH_REVIEW_2026-06-12.md` | **部分仍有效,但若直接继承会失真** |
仍有效的旧判断:
- Web 自助闭环缺失
- 文档状态漂移
- 覆盖率/CI 硬门槛未闭环
已失真的旧判断:
- “AI 审核编排层未形成”
- “pytest 环境不可运行”
- “测试规模极低”
---
## 5. Stage 2代码质量 / 工程门禁审查
### 5.1 总体判断
| 维度 | 状态 | 结论 |
| --------- | ---- | ------------------------------- |
| pytest | ✅ | 功能回归层当前可通过 |
| ruff | ✅ | 代码风格/显性低级错误当前可通过 |
| mypy | ❌ | 类型门禁不可用 |
| bandit | ⚠️ | 噪声很大,但存在真实问题 |
| coverage | ⚠️ | 总覆盖率仅 61%,结构性短板明显 |
| CI 完整性 | ❌ | 不是可信质量门禁 |
### 5.2 真实高风险问题
#### H1. Webhook 来源 IP 信任边界错误
- `data/channel_sync/webhook_server.py` 定义了 `_trust_x_forwarded_for()`
-`_client_ip()` 实际**始终优先信任** `X-Forwarded-For`
- 结果:
- 限流可被伪造头绕过
- 审计 `remote_addr` 可被污染
这是**真实安全问题**,不是 bandit 噪声。
#### H2. 默认管理员弱口令 + 登录无节流
- `admin/config.py` 默认:`GAOKAO_ADMIN_USER=admin`, `GAOKAO_ADMIN_PASS=admin123`
- 空库会 bootstrap 管理员
- 登录接口未见失败次数限制 / 限流 / 锁定
虽然 prod 对 JWT secret 有强校验,但**admin 密码强度没有同级保护**。
#### H3. CI 无法代表完整产品可构建/可测试
- `.github/workflows/ci.yml` 只装 `requirements-dev.txt`
- 未安装 admin 运行依赖
- clean env 下 `admin/tests` 不可保证可运行
### 5.3 中风险问题
#### M1. 类型系统失控
`mypy .` 失败 97 个错误,集中在:
- `data/share/short_link.py`
- `data/cases/dao.py`
- `skills/gaokao-audit/*`
- `scripts/*`
- tests/legacy 噪声
含义不是“仓库不能跑”,而是:
- 类型门禁当前没有工程可信度
- 也无法直接接入 CI 做阻断
#### M2. 覆盖率不达计划标准
新鲜证据:
- TOTAL: **61%**
- admin 核心模块覆盖率明显偏低:
- `admin/routes/orders.py` 57%
- `admin/routes/ui.py` 55%
- `admin/users.py` 38%
- `admin/share_page.py` 14%
- `admin/errors/exceptions.py` 33%
- `admin/logging_utils.py` 23%
- skills 审核链路也有薄弱点:
- `checker_integration.py` 63%
- `report_generator.py` 67%
说明:
- `channel_sync``orders``crowd_db` 测试成熟度较高
- `admin``report_generator`、集成胶水层明显偏弱
#### M3. CSV 导出公式注入风险
`admin/routes/orders.py` 直接导出用户可控文本字段到 CSV未做 Excel 公式注入防护。
#### M4. 异常吞噬导致审计可观测性下降
`data/channel_sync/webhook_server.py` 多处 `except Exception: pass`,虽然提高了兜底可用性,但也会削弱取证与排障能力。
### 5.4 低风险与噪声
#### L1. Bandit B608 大量动态 SQL 报警,多数是 false positive
例如:
- `data/orders/dao.py`
- `data/cases/dao.py`
- `data/share/short_link.py`
- `admin/stats.py`
这些位置多数是:
- 拼接**白名单列名/固定 where 片段**
- 值仍通过参数绑定传入
需要人工甄别,**不能直接按 SQL 注入漏洞上报**。
#### L2. 开发占位 JWT secret 是 intentional false positive
- `admin/config.py``_DEV_JWT_SECRET` 在 prod 启动时会被阻止
- 它本身不是生产漏洞,但会污染 bandit 输出
---
## 6. 模块真实状态表
| 模块 | 真实状态 | 说明 |
| ---------------------- | ------------------------------------ | --------------------------------------------------------- |
| `admin/` | **Partial / 可运行但质量门禁不闭环** | 后台功能已明显成形CI 依赖、类型、覆盖率仍薄弱 |
| `data/orders/` | **Done-ish / 质量较好** | DAO、状态机、加密、CLI、测试都比较成熟 |
| `data/channel_sync/` | **Done-ish / 质量较好** | webhook/poller/adapter/monitor 已成形,存在 XFF 安全缺口 |
| `data/share/` | **Partial / 能用但有安全与类型债** | 功能全,但密码哈希策略偏弱,类型门禁差 |
| `data/cases/` | **Partial** | CRUD 有了,但类型安全与工程化不足 |
| `data/crowd_db/` | **Done-ish / 数据能力较强** | loader/trace/risk/report 成熟,但骨架省份仍有低置信度数据 |
| `skills/gaokao-audit/` | **Partial to Good** | 主链已落地,集成胶水层覆盖率与类型质量不足 |
| 用户端 Web 产品 | **Not started / Missing main chain** | 只有管理端与分享页,没有用户端自助闭环 |
---
## 7. 当前最准确的项目标签
### 不准确标签
- “完整产品”
- “双流程(人工 + Web 自助)已完成”
- “工程门禁完善、可稳定交付”
### 更准确标签
> **高考志愿填报运营与审核增强系统已具备后台、订单、分享、渠道同步、AI审核主链但用户端 Web 自助产品与工程化质量门禁仍未闭环。**
---
## 8. 当前 Gate 结论
### 代码层 Gate
- `pytest`: ✅
- `ruff`: ✅
- `mypy`: ❌
- `bandit`: ⚠️(有噪声,但存在真实中高风险)
- `coverage`: ⚠️(总量与关键模块均未达理想值)
### 产品/范围 Gate
- 场景A人工服务: ✅ 基本闭环
- 场景B用户端 Web 自助): ❌ 未闭环
- 文档真相: ❌ 漂移严重
### 综合 Gate
**结论: REQUEST_CHANGES / 条件通过,不可宣称整体完成。**
---
## 9. 最短整改路径
1. **先修真相层**
- 统一 README / PRD / ROADMAP / IMPLEMENTATION_PLAN_v2 状态口径
- 旧报告降级为历史快照
2. **再补工程门禁**
- 修 CI 依赖装配
- 设定 mypy 可执行范围与配置
- 在 CI 中加入 ruff / mypy / bandit / coverage fail-under
3. **再修真实安全问题**
- X-Forwarded-For 信任边界
- 默认 admin 口令与登录节流
- CSV 公式注入
4. **最后再决定产品方向**
- 要么收缩对外口径,承认当前是运营系统
- 要么继续把用户端 Web 自助闭环真正落地
---
## 10. 本报告与旧报告的关系
- 本报告是 **2026-06-13 的新鲜实跑结论**
- `docs/AUDIT_REPORT_2026-06-11.md``docs/REMEDIATION_TASK_BOARD_2026-06-11.md``reports/PRODUCT_TECH_REVIEW_2026-06-12.md` 仅保留历史参考价值
- 之后若继续推进,应以本报告与新的整改任务板作为当前真相源

View File

@@ -0,0 +1,261 @@
# 🔍 Deep Code Analysis Report
**Generated:** 2026-06-12T19:18:10.577328
**Path:** /home/long/project/gaokao-volunteer-system
## 📋 Executive Summary
- **Total Files:** 107
- **Total Lines:** 25,582
- **Architecture Style:** MVC
- **Entry Points:** 1
- **Data Models:** 123
- **Business Rules:** 218
- **External Dependencies:** 66
## 🏗️ Architecture
**Style:** MVC
**Layers/Modules:**
- `admin/`
- `data/`
- `scripts/`
- `tests/`
- `skills/`
## 🚀 Entry Points & Execution Flow
### main
- **Location:** `admin/app.py`
- **Parameters:** argv
- **Business Logic:** ❌ No
- **Calls:** ArgumentParser, add_argument, add_argument, add_argument, add_argument
## 📊 Data Models
### Core Entities
**UserOrderRecord** (`admin/users.py`)
**CaseRecord** (`data/cases/models.py`)
### DTOs/Value Objects
- **OrderSummaryResponse** - admin/routes/orders.py
- **OrderMutationResponse** - admin/routes/orders.py
- **CreateOrderRequest** - admin/routes/orders.py
- **UpdateOrderRequest** - admin/routes/orders.py
- **UserSummaryResponse** - admin/routes/users.py
## 📜 Business Rules
### Validation Rules (200)
**rule_1:** Validation in login
- Location: `locustfile.py:login`
- Priority: medium
- Condition: `if not token:
resp.failure("login response missing access_token")
se...`
**rule_2:** Validation in hash_password
- Location: `admin/password.py:hash_password`
- Priority: high
- Condition: `if not plain:
raise ValueError("password cannot be empty")
salt = secrets.token_bytes(_S...`
**rule_3:** Validation in verify_password
- Location: `admin/password.py:verify_password`
- Priority: high
- Condition: `if not plain or not stored or _STORED_SEPARATOR not in stored:
return False
salt_hex, ha...`
**rule_4:** Validation in authenticate
- Location: `admin/db.py:authenticate`
- Priority: medium
- Condition: `if result is None:
return None
user, password_hash = result
if not user.is_active:
...`
**rule_5:** Validation in authenticate
- Location: `admin/db.py:authenticate`
- Priority: medium
- Condition: `if not user.is_active:
return None
if not verify_password(password, password_hash):
...`
### Constraint Rules (18)
**rule_9:** Business constraint in log_event
- Location: `admin/logging_utils.py:log_event`
- Priority: critical
- Condition: `if not event:
raise ValueError("log_event: 'event' is required")
safe_fields: Dict[str,...`
**rule_12:** Business constraint in log_event_exc
- Location: `admin/logging_utils.py:log_event_exc`
- Priority: critical
- Condition: `if not event:
raise ValueError("log_event_exc: 'event' is required")
safe_fields: Dict[s...`
**rule_54:** Business constraint in main
- Location: `skills/gaokao-audit/scripts/validate_template.py:main`
- Priority: critical
- Condition: `if needle not in text:
print(f"FAIL: placeholder missing: {needle!r}")
retur...`
**rule_55:** Business constraint in main
- Location: `skills/gaokao-audit/scripts/validate_template.py:main`
- Priority: critical
- Condition: `if needle not in rendered:
print(f"FAIL: rendered output missing: {needle!r}")
...`
**rule_68:** Business constraint in base62_encode
- Location: `data/share/short_link.py:base62_encode`
- Priority: critical
- Condition: `if num < 0:
raise ValueError("num must be >= 0")
if num == 0:
return BASE62_ALPH...`
## 🔗 External Dependencies
### Other Dependencies
- locust
- datetime
- secrets
- dataclasses
- argparse
- urllib
- xianyu_adapter
- admin
- fastapi
- tempfile
- uuid
- collections
- schema
- json
- jinja2
## 💧 Data Flows
- **external** → **admin/password.py:verify_password**
- Data: plain, stored
- Trigger: function_call
- **external** → **admin/db.py:create**
- Data: username, password, role
- Trigger: function_call
- **external** → **admin/db.py:update_last_login**
- Data: user_id
- Trigger: function_call
- **external** → **admin/app.py:_validate_and_log_settings**
- Data: settings
- Trigger: function_call
- **external** → **admin/app.py:create_app**
- Data: settings
- Trigger: function_call
- **external** → **admin/stats.py:generate_day_series**
- Data: db_path
- Trigger: function_call
- **external** → **scripts/gaokao-quick-3min.py:generate_quick_summary**
- Data: info
- Trigger: function_call
- **external** → **scripts/gaokao-quick-3min.py:generate_quick_recommendation**
- Data: info
- Trigger: function_call
- **external** → **scripts/gaokao-visual-report-v2.py:generate_student_radar**
- Data: student_profile
- Trigger: function_call
- **external** → **scripts/gaokao-visual-report-v2.py:generate_school_comparison**
- Data: volunteer_list
- Trigger: function_call
## 🛤️ Key Execution Paths
### main
Entry point: admin/app.py
**Steps:**
1. `main`
### main
Entry point: scripts/gaokao-quick-3min.py
**Steps:**
1. `main`
### run
Entry point: scripts/gaokao-collect-info.py
**Steps:**
1. `run`
2. `main`
3. `_git`
4. `_run_cli`
5. `_remote_head`
6. `test_supports_async_function`
7. `test_audit_report_template_renders`
8. `_init_repo`
... and 2 more
## 💡 Recommendations
### For Understanding This Codebase
1. Start with entry points listed above
2. Review core entities and their relationships
3. Trace execution paths for key features
4. Review business rules for domain logic
5. Check external dependencies for integration points
### For Code Quality
1. Add documentation to entry points
2. Document business rules explicitly
3. Create architecture decision records (ADRs)
4. Add data flow diagrams

View File

@@ -0,0 +1,89 @@
# T11.1 性能基准报告
日期2026-06-12
仓库:`/home/long/project/gaokao-volunteer-system`
目标T6.1 FastAPI 管理后台骨架
## 1. 测试范围
使用 `locustfile.py` 对以下端点进行 10 并发基准:
- `POST /api/auth/login`
- `GET /api/auth/me`
- `GET /api/meta`
- `GET /api/orders`
- `GET /api/orders/{id}`404 视为成功路径)
- `GET /api/stats/orders`
- `GET /health`
用户模型:
- `AdminBrowseUser`:已登录后台浏览用户
- `LoginBurstUser`:登录高峰用户
## 2. 测试环境
- Python: 3.11.13
- Locust: 2.42.4
- 服务启动命令:`python3 -m admin.app --host 127.0.0.1 --port 18081`
- 测试命令:`locust -f locustfile.py --host http://127.0.0.1:18081 --headless -u 10 -r 2 -t 30s --csv reports/perf/t11_1`
- 数据库:`/home/long/project/gaokao-volunteer-system/.tmp/t11_1_admin.db`
- JWT secret本地临时测试值64 个 `x`
## 3. 发现与修复
首次执行失败,根因是 `AuthenticatedHttpUser` 作为基类未标记为抽象类Locust 会把它当成可实例化用户,导致:
- 异常:`No tasks defined on AuthenticatedHttpUser`
- 结果:进程退出码 1压测结果不可信
已修复:
- `locustfile.py` 中为 `AuthenticatedHttpUser` 增加 `abstract = True`
修复后重新执行,压测正常结束,`failures.csv``exceptions.csv` 均为空。
## 4. 结果摘要
总体:
- 总请求数327
- 失败数0
- 错误率0.00%
- 平均吞吐11.27 req/s
- 聚合中位延迟2 ms
- 聚合平均延迟4.62 ms
- 聚合 P9527 ms
- 聚合 P9936 ms
- 聚合最大值43.53 ms
分端点:
| 端点 | 请求数 | 失败 | 平均延迟(ms) | P95(ms) | 最大(ms) | 吞吐(req/s) |
| -------------------------- | -----: | ---: | -----------: | ------: | -------: | ----------: |
| POST /api/auth/login | 27 | 0 | 28.53 | 38 | 43.53 | 0.93 |
| GET /api/auth/me | 71 | 0 | 2.52 | 3 | 4.49 | 2.45 |
| GET /api/meta | 55 | 0 | 2.38 | 3 | 3.37 | 1.90 |
| GET /api/orders | 105 | 0 | 2.51 | 3 | 4.44 | 3.62 |
| GET /api/orders/{id} [404] | 15 | 0 | 2.61 | 4 | 3.98 | 0.52 |
| GET /api/stats/orders | 44 | 0 | 2.51 | 3 | 4.19 | 1.52 |
| GET /health | 10 | 0 | 1.77 | 2 | 2.04 | 0.34 |
## 5. 结论
结论在本地单机、10 并发、30 秒 headless Locust 基准下T6.1 管理后台骨架表现稳定0 失败,所有 GET 路由 P95 ≤ 4ms登录接口 P95 为 38ms满足“先建立可压测基线”的 T11.1 目标。
当前限制:
- 这是本地 SQLite + 单进程 uvicorn 基线,不代表生产容量上限。
- 当前业务仍是 T6.1 骨架,`/api/orders``/api/stats/orders` 返回占位数据;后续真实业务逻辑接入后需重跑基准。
- 当前测试时长为 30 秒,适合基线验证;若要做发布前容量评估,建议补 5 分钟持续压测与更高并发阶梯测试。
## 6. 产物
- `locustfile.py`
- `reports/perf/T11.1_PERF_REPORT.md`
- `reports/perf/t11_1_stats.csv`
- `reports/perf/t11_1_stats_history.csv`
- `reports/perf/t11_1_failures.csv`
- `reports/perf/t11_1_exceptions.csv`

View File

@@ -0,0 +1 @@
Count,Message,Traceback,Nodes
1 Count Message Traceback Nodes

View File

@@ -0,0 +1 @@
Method,Name,Error,Occurrences
1 Method Name Error Occurrences

View File

@@ -0,0 +1,9 @@
Type,Name,Request Count,Failure Count,Median Response Time,Average Response Time,Min Response Time,Max Response Time,Average Content Size,Requests/s,Failures/s,50%,66%,75%,80%,90%,95%,98%,99%,99.9%,99.99%,100%
GET,GET /api/auth/me,71,0,2,2.523277889081264,1.5841139829717577,4.48689199401997,144.0,2.4466548941768274,0.0,2,3,3,3,3,3,4,4,4,4,4
GET,GET /api/meta,55,0,2,2.3830690172458575,1.2161129852756858,3.3656150044407696,461.0,1.8952960447848664,0.0,2,3,3,3,3,3,3,3,3,3,3
GET,GET /api/orders,105,0,2,2.5105509222374254,1.2903409951832145,4.43644801271148,2.0,3.618292449134745,0.0,2,3,3,3,3,3,4,4,4,4,4
GET,GET /api/orders/{id} [404],15,0,2,2.613766002468765,1.9536199979484081,3.9837899967096746,231.0,0.5168989213049635,0.0,2,3,3,3,3,4,4,4,4,4,4
GET,GET /api/stats/orders,44,0,2,2.507629911468195,1.0961600055452436,4.19115400291048,109.0,1.516236835827893,0.0,2,3,3,3,3,3,4,4,4,4,4
GET,GET /health,10,0,2,1.7654583003604785,1.2791189947165549,2.0439459767658263,145.0,0.3445992808699757,0.0,2,2,2,2,2,2,2,2,2,2,2
POST,POST /api/auth/login,27,0,28,28.52843043985087,22.156253980938345,43.52652397938073,254.0,0.9304180583489343,0.0,28,28,29,29,38,38,44,44,44,44,44
,Aggregated,327,0,2,4.621693528836183,1.0961600055452436,43.52652397938073,160.11620795107032,11.268396484448205,0.0,2,3,3,3,4,27,29,36,44,44,44
1 Type Name Request Count Failure Count Median Response Time Average Response Time Min Response Time Max Response Time Average Content Size Requests/s Failures/s 50% 66% 75% 80% 90% 95% 98% 99% 99.9% 99.99% 100%
2 GET GET /api/auth/me 71 0 2 2.523277889081264 1.5841139829717577 4.48689199401997 144.0 2.4466548941768274 0.0 2 3 3 3 3 3 4 4 4 4 4
3 GET GET /api/meta 55 0 2 2.3830690172458575 1.2161129852756858 3.3656150044407696 461.0 1.8952960447848664 0.0 2 3 3 3 3 3 3 3 3 3 3
4 GET GET /api/orders 105 0 2 2.5105509222374254 1.2903409951832145 4.43644801271148 2.0 3.618292449134745 0.0 2 3 3 3 3 3 4 4 4 4 4
5 GET GET /api/orders/{id} [404] 15 0 2 2.613766002468765 1.9536199979484081 3.9837899967096746 231.0 0.5168989213049635 0.0 2 3 3 3 3 4 4 4 4 4 4
6 GET GET /api/stats/orders 44 0 2 2.507629911468195 1.0961600055452436 4.19115400291048 109.0 1.516236835827893 0.0 2 3 3 3 3 3 4 4 4 4 4
7 GET GET /health 10 0 2 1.7654583003604785 1.2791189947165549 2.0439459767658263 145.0 0.3445992808699757 0.0 2 2 2 2 2 2 2 2 2 2 2
8 POST POST /api/auth/login 27 0 28 28.52843043985087 22.156253980938345 43.52652397938073 254.0 0.9304180583489343 0.0 28 28 29 29 38 38 44 44 44 44 44
9 Aggregated 327 0 2 4.621693528836183 1.0961600055452436 43.52652397938073 160.11620795107032 11.268396484448205 0.0 2 3 3 3 4 27 29 36 44 44 44

View File

@@ -0,0 +1,27 @@
Timestamp,User Count,Type,Name,Requests/s,Failures/s,50%,66%,75%,80%,90%,95%,98%,99%,99.9%,99.99%,100%,Total Request Count,Total Failure Count,Total Median Response Time,Total Average Response Time,Total Min Response Time,Total Max Response Time,Total Average Content Size
1781251791,0,,Aggregated,0.000000,0.000000,N/A,N/A,N/A,N/A,N/A,N/A,N/A,N/A,N/A,N/A,N/A,0,0,0,0.0,0,0,0
1781251792,2,,Aggregated,0.000000,0.000000,2,2,38,38,44,44,44,44,44,44,44,6,0,2,14.866700997420898,1.2903409951832145,43.52652397938073,180.33333333333334
1781251793,4,,Aggregated,0.000000,0.000000,3,3,36,38,38,44,44,44,44,44,44,13,0,3,13.504982072985372,1.2903409951832145,43.52652397938073,144.92307692307693
1781251794,6,,Aggregated,4.000000,0.000000,2,3,29,31,38,38,44,44,44,44,44,24,0,2,11.799663666655155,1.2903409951832145,43.52652397938073,177.29166666666666
1781251795,8,,Aggregated,4.500000,0.000000,3,3,23,28,36,38,44,44,44,44,44,34,0,2,10.288498705074957,1.2903409951832145,43.52652397938073,171.85294117647058
1781251796,10,,Aggregated,5.666667,0.000000,3,3,23,26,31,38,44,44,44,44,44,48,0,3,9.592486706120932,1.2903409951832145,43.52652397938073,178.9375
1781251797,10,,Aggregated,6.750000,0.000000,2,3,4,24,29,38,38,44,44,44,44,60,0,2,8.91246349880627,1.2903409951832145,43.52652397938073,185.55
1781251798,10,,Aggregated,7.600000,0.000000,3,3,3,4,28,36,38,44,44,44,44,71,0,3,7.98847935118214,1.2903409951832145,43.52652397938073,186.50704225352112
1781251799,10,,Aggregated,8.166667,0.000000,3,3,3,4,28,31,38,44,44,44,44,83,0,3,7.185863492959908,1.2903409951832145,43.52652397938073,171.78313253012047
1781251800,10,,Aggregated,8.571429,0.000000,2,3,3,3,28,31,38,44,44,44,44,94,0,2,6.878889744179918,1.2791189947165549,43.52652397938073,178.29787234042553
1781251801,10,,Aggregated,8.875000,0.000000,2,3,3,3,28,29,38,38,44,44,44,110,0,2,6.229009380595843,1.2791189947165549,43.52652397938073,171.1818181818182
1781251802,10,,Aggregated,9.555556,0.000000,2,3,3,3,27,29,38,38,44,44,44,120,0,2,6.133288874116261,1.2791189947165549,43.52652397938073,179.81666666666666
1781251803,10,,Aggregated,9.700000,0.000000,2,3,3,3,24,29,38,38,44,44,44,131,0,2,5.826537418916807,1.2791189947165549,43.52652397938073,179.35114503816794
1781251804,10,,Aggregated,10.700000,0.000000,2,3,3,3,23,28,38,38,44,44,44,145,0,2,5.491272874923166,1.2791189947165549,43.52652397938073,168.82758620689654
1781251805,10,,Aggregated,11.100000,0.000000,2,3,3,3,23,28,36,38,44,44,44,154,0,2,5.473512369049289,1.2791189947165549,43.52652397938073,165.54545454545453
1781251806,10,,Aggregated,11.400000,0.000000,2,3,3,3,23,28,36,38,44,44,44,165,0,2,5.437436156595747,1.2791189947165549,43.52652397938073,168.8
1781251807,10,,Aggregated,11.900000,0.000000,2,3,3,3,23,28,36,38,44,44,44,179,0,2,5.3285276193715445,1.2791189947165549,43.52652397938073,162.72625698324023
1781251808,10,,Aggregated,11.800000,0.000000,2,3,3,3,23,28,36,38,44,44,44,190,0,2,5.157791936040954,1.2791189947165549,43.52652397938073,161.5157894736842
1781251809,10,,Aggregated,11.900000,0.000000,2,3,3,3,23,28,31,38,44,44,44,201,0,2,5.251868059354792,1.2791189947165549,43.52652397938073,160.5870646766169
1781251810,10,,Aggregated,12.000000,0.000000,2,3,3,3,23,28,31,38,44,44,44,210,0,2,5.14158705232798,1.2791189947165549,43.52652397938073,160.3761904761905
1781251811,10,,Aggregated,11.900000,0.000000,2,3,3,3,4,28,31,38,44,44,44,223,0,2,5.090079448450014,1.2791189947165549,43.52652397938073,159.96860986547085
1781251812,10,,Aggregated,11.500000,0.000000,2,3,3,3,4,28,31,38,44,44,44,235,0,2,4.947939795625218,1.0961600055452436,43.52652397938073,158.68085106382978
1781251813,10,,Aggregated,11.500000,0.000000,2,3,3,3,4,28,31,38,44,44,44,247,0,2,4.933227951188764,1.0961600055452436,43.52652397938073,160.04453441295547
1781251814,10,,Aggregated,11.200000,0.000000,2,3,3,3,4,28,29,38,44,44,44,258,0,2,4.820793891251593,1.0961600055452436,43.52652397938073,157.42635658914728
1781251815,10,,Aggregated,11.500000,0.000000,2,3,3,3,4,28,29,38,44,44,44,273,0,2,4.69094451266126,1.0961600055452436,43.52652397938073,159.91575091575092
1781251816,10,,Aggregated,11.800000,0.000000,2,3,3,3,4,27,29,38,44,44,44,283,0,2,4.613383886833797,1.0961600055452436,43.52652397938073,162.8939929328622
1 Timestamp User Count Type Name Requests/s Failures/s 50% 66% 75% 80% 90% 95% 98% 99% 99.9% 99.99% 100% Total Request Count Total Failure Count Total Median Response Time Total Average Response Time Total Min Response Time Total Max Response Time Total Average Content Size
2 1781251791 0 Aggregated 0.000000 0.000000 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A 0 0 0 0.0 0 0 0
3 1781251792 2 Aggregated 0.000000 0.000000 2 2 38 38 44 44 44 44 44 44 44 6 0 2 14.866700997420898 1.2903409951832145 43.52652397938073 180.33333333333334
4 1781251793 4 Aggregated 0.000000 0.000000 3 3 36 38 38 44 44 44 44 44 44 13 0 3 13.504982072985372 1.2903409951832145 43.52652397938073 144.92307692307693
5 1781251794 6 Aggregated 4.000000 0.000000 2 3 29 31 38 38 44 44 44 44 44 24 0 2 11.799663666655155 1.2903409951832145 43.52652397938073 177.29166666666666
6 1781251795 8 Aggregated 4.500000 0.000000 3 3 23 28 36 38 44 44 44 44 44 34 0 2 10.288498705074957 1.2903409951832145 43.52652397938073 171.85294117647058
7 1781251796 10 Aggregated 5.666667 0.000000 3 3 23 26 31 38 44 44 44 44 44 48 0 3 9.592486706120932 1.2903409951832145 43.52652397938073 178.9375
8 1781251797 10 Aggregated 6.750000 0.000000 2 3 4 24 29 38 38 44 44 44 44 60 0 2 8.91246349880627 1.2903409951832145 43.52652397938073 185.55
9 1781251798 10 Aggregated 7.600000 0.000000 3 3 3 4 28 36 38 44 44 44 44 71 0 3 7.98847935118214 1.2903409951832145 43.52652397938073 186.50704225352112
10 1781251799 10 Aggregated 8.166667 0.000000 3 3 3 4 28 31 38 44 44 44 44 83 0 3 7.185863492959908 1.2903409951832145 43.52652397938073 171.78313253012047
11 1781251800 10 Aggregated 8.571429 0.000000 2 3 3 3 28 31 38 44 44 44 44 94 0 2 6.878889744179918 1.2791189947165549 43.52652397938073 178.29787234042553
12 1781251801 10 Aggregated 8.875000 0.000000 2 3 3 3 28 29 38 38 44 44 44 110 0 2 6.229009380595843 1.2791189947165549 43.52652397938073 171.1818181818182
13 1781251802 10 Aggregated 9.555556 0.000000 2 3 3 3 27 29 38 38 44 44 44 120 0 2 6.133288874116261 1.2791189947165549 43.52652397938073 179.81666666666666
14 1781251803 10 Aggregated 9.700000 0.000000 2 3 3 3 24 29 38 38 44 44 44 131 0 2 5.826537418916807 1.2791189947165549 43.52652397938073 179.35114503816794
15 1781251804 10 Aggregated 10.700000 0.000000 2 3 3 3 23 28 38 38 44 44 44 145 0 2 5.491272874923166 1.2791189947165549 43.52652397938073 168.82758620689654
16 1781251805 10 Aggregated 11.100000 0.000000 2 3 3 3 23 28 36 38 44 44 44 154 0 2 5.473512369049289 1.2791189947165549 43.52652397938073 165.54545454545453
17 1781251806 10 Aggregated 11.400000 0.000000 2 3 3 3 23 28 36 38 44 44 44 165 0 2 5.437436156595747 1.2791189947165549 43.52652397938073 168.8
18 1781251807 10 Aggregated 11.900000 0.000000 2 3 3 3 23 28 36 38 44 44 44 179 0 2 5.3285276193715445 1.2791189947165549 43.52652397938073 162.72625698324023
19 1781251808 10 Aggregated 11.800000 0.000000 2 3 3 3 23 28 36 38 44 44 44 190 0 2 5.157791936040954 1.2791189947165549 43.52652397938073 161.5157894736842
20 1781251809 10 Aggregated 11.900000 0.000000 2 3 3 3 23 28 31 38 44 44 44 201 0 2 5.251868059354792 1.2791189947165549 43.52652397938073 160.5870646766169
21 1781251810 10 Aggregated 12.000000 0.000000 2 3 3 3 23 28 31 38 44 44 44 210 0 2 5.14158705232798 1.2791189947165549 43.52652397938073 160.3761904761905
22 1781251811 10 Aggregated 11.900000 0.000000 2 3 3 3 4 28 31 38 44 44 44 223 0 2 5.090079448450014 1.2791189947165549 43.52652397938073 159.96860986547085
23 1781251812 10 Aggregated 11.500000 0.000000 2 3 3 3 4 28 31 38 44 44 44 235 0 2 4.947939795625218 1.0961600055452436 43.52652397938073 158.68085106382978
24 1781251813 10 Aggregated 11.500000 0.000000 2 3 3 3 4 28 31 38 44 44 44 247 0 2 4.933227951188764 1.0961600055452436 43.52652397938073 160.04453441295547
25 1781251814 10 Aggregated 11.200000 0.000000 2 3 3 3 4 28 29 38 44 44 44 258 0 2 4.820793891251593 1.0961600055452436 43.52652397938073 157.42635658914728
26 1781251815 10 Aggregated 11.500000 0.000000 2 3 3 3 4 28 29 38 44 44 44 273 0 2 4.69094451266126 1.0961600055452436 43.52652397938073 159.91575091575092
27 1781251816 10 Aggregated 11.800000 0.000000 2 3 3 3 4 27 29 38 44 44 44 283 0 2 4.613383886833797 1.0961600055452436 43.52652397938073 162.8939929328622