feat: HSAP platform v2 — modular navigation, quality review, audit log, world model simulation

Major changes:
- New frontend (platform/web/): Vite + React 18 + TypeScript + Tailwind
- 4-module navigation: 数据送标 / 模型管理 / 车队管理 / 系统管理
- Data catalog with charts (DMS/ADAS/Lane 3-tab view)
- Quality review workflow (标注质检): Good/Fine/Bad scoring with auto-advance
- Audit enhancements: batch operations, rejection categories, Feishu notifications
- Operation audit log (操作日志)
- World model simulation studio (仿真工坊)
- Dataset version management with snapshots and diff
- ADAS 7-class dataset integration (138K images organized + compressed)
- User management with Feishu integration and pagination
- CRUD/search/filter on all pages, card layout redesign
- PIL-optimized image overlay rendering
- Auto-snapshot on build, in_review workflow stage
- Removed embedded algorithm code (now in workspace)
This commit is contained in:
2026-06-03 11:40:21 +08:00
parent 7c43b44c57
commit e72bc061c5
5487 changed files with 979207 additions and 6197 deletions

80
scripts/lake_checklist_audit.py Executable file
View File

@@ -0,0 +1,80 @@
#!/usr/bin/env python3
"""对照 DATA_LAKE_CHECKLIST 阶段 AE输出 HSAP 当前实现缺口(只读审计)。"""
from __future__ import annotations
import json
import sys
from pathlib import Path
ROOT = Path(__file__).resolve().parents[1]
sys.path.insert(0, str(ROOT / "platform"))
from as_platform.config import WORKSPACE # noqa: E402
def _check(name: str, ok: bool, detail: str = "") -> dict:
return {"item": name, "ok": ok, "detail": detail}
def main() -> int:
checks: list[dict] = []
staging = WORKSPACE / "lake" / "staging"
reports = WORKSPACE / "manifests" / "lake" / "reports"
curated = WORKSPACE / "lake" / "curated"
checks.append(_check("A_staging_dir", staging.is_dir(), str(staging)))
checks.append(
_check(
"A_upload_api",
(ROOT / "platform/as_platform/data/lake.py").is_file(),
"analyze_uploaded_candidate / promote",
)
)
checks.append(
_check(
"B_analyze_job",
(ROOT / "platform/as_platform/jobs/runner.py").is_file(),
"analyze_uploaded_dataset action",
)
)
checks.append(_check("B_reports_dir", reports.is_dir(), str(reports)))
report_files = list(reports.glob("*.json")) if reports.is_dir() else []
checks.append(_check("B_sample_report", len(report_files) > 0, f"count={len(report_files)}"))
checks.append(
_check(
"C_approval_flow",
(ROOT / "platform/as_platform/audit/queue.py").is_file(),
"delivery_ingest + approvals",
)
)
checks.append(
_check(
"D_curated_dir",
True,
"optional until first promote" + ("" if curated.is_dir() else f" (missing {curated})"),
)
)
checks.append(
_check(
"D_catalog_api",
(ROOT / "platform/as_platform/api/server.py").is_file(),
"GET /api/v1/catalog/*",
)
)
failed = [c for c in checks if not c["ok"]]
out = {"workspace": str(WORKSPACE), "checks": checks, "failed_count": len(failed)}
print(json.dumps(out, ensure_ascii=False, indent=2))
if failed:
print("\nLAKE_CHECKLIST_GAPS:", file=sys.stderr)
for c in failed:
print(f" - {c['item']}: {c['detail']}", file=sys.stderr)
return 1
print("LAKE_CHECKLIST_AUDIT_OK")
return 0
if __name__ == "__main__":
raise SystemExit(main())