Files
geMoldInsight/docs/STATUS.md
T
2026-09-18 18:21:01 +08:00

18 KiB
Raw Blame History

geMoldInsight 项目状态(STATUS)

文档定位:唯一的「现在到哪了」。README / AGENTS / 各主文档只链接到这里,不复制状态内容。 维护规则:每完整完成一个需求,倒序在本文顶部加一条(日期 + 主题 + 关键事实);其余主文档(架构 / 规划 / 技术债 / 部署)维护各自的"当前有效说法",本文只记录"什么时候做到了哪一步"。维护规则出处见根目录 AGENTS.md。

2026-09-18(D3 剩余收敛:app_factory 平台层去模块化 + 路由单点聚合:① 平台工厂 app_factory.py 只做纯平台引导——connect_rustfs 参数移除,模块专属启动接线改经 startup_hooks 注入;RustFS 连接收敛为 init_storage.py 的 rustfs_startup_hook(moldinsight/unified 入口注入)。② 路由挂载收敛——moldinsight/api/__init__.py 新增 register_moldinsight_routers 单点聚合(/api 聚合路由 + HTML 报告根路径挂载),moldinsight/unified 入口不再各自重复 include html_report,退化为纯组装。③ 边界语义入文档:ARCHITECTURE §6.2/§2 说明更新(shared = 平台层,模块专属接线归属模块层);TECH_DEBT D3 剩余仅 identity/platform 注释口径。接口面零变化(openapi 无漂移已验)。测试基线:144 passed, 0 skipped(新增 test_html_report_router.py 单点聚合注册 1 项)。)

2026-09-18(批次 4 后续专项五项完成:D11 清偿 + 部署参数 + D2 诚实标注 + CI 门禁 + OCC 方案 B 实施:① D11 清偿(TECH_DEBT P2)——可视化报告 RustFS 单源化:写侧 HTMLGenerator 每任务写临时目录,.html/_summary.json/_data.json 三件统一裸传 RustFS 报告键 html/reports/{filename}(文件名寻址),/html StaticFiles 本地挂载删除,新增 html_report_router.py 根路径代理(报告键直取 → 遗留 html/{hash}.json JSON 包装解析 → 本地卷存量兜底 → 404;URL 形状 /html/{filename} 不变,持久化 cavity JSON 与前端 iframe 引用零迁移);celery 服务摘除 html_data 卷,Dockerfile.moldinsight 删除 COPY html_output/(构建机陈旧报告不再进镜像);已知约束:报告路由不做认证(iframe 无法携带 Authorization 头,沿用 StaticFiles 时代既定姿态,文档已声明);顺带删除 get_stp_file_with_data 的死数据块(html_content 组装零消费方,此前每次完成任务查询白下载数 MB 正文)。② OCC 方案 A 参数落地——CELERY_CONCURRENCY/CELERY_MAX_TASKS_PER_CHILD 进 Dockerfile.celery ENV + compose 透传 + .env.example。③ D2 清偿——铝价响应带 source: "simulated",HomeView.vue 按来源渲染"模拟数据 · 参考走势"标注(原硬编码"上海期货交易所"属虚假声明),死代码 getAluminumPrice 删除。④ CI 门禁——.gitea/workflows/ci.yml 三 job:pytest 全量 / 前端构建(含 vue-tsc)/ openapi 漂移检测(conda pythonocc 环境重导出比对;已实测 pytest 与导出均不依赖 .env)。⑤ OCC 方案 B 实施(TECH_DEBT D10 清偿)——run_occ(fn, *args) → run_occ(op_name, payload),执行器由线程池替换为常驻工作进程池 occ_process_pool.py + 操作注册表 occ_worker.py:超时/崩溃 terminate 换新补位、任务级超时 recover 整体重建,残留线程泄漏根治(进程边界回收 C++ 栈);TopoDS 形状不跨进程(generate_cavity 分模 + 方案 STEP 持久化导出全在子进程内,返回 export_manifest);调用点全量迁移(解析/网格/型腔/分析/倒扣/STEP 转换),删除内存形状缓存链(_cache_export_shapes/get_export_shapes/_persist_step_exports)、CADExporter.export_mold_results(零调用方)、shape_loader(→ stp_materializer.py);回归测试 test_occ_process_pool.py(OCC-gated,6 例含真实盒体 STP 解析/分模端到端)。接口变更三件套随批完成:openapi.json 重导出(76→77 paths,新增 /html/{filename})+ 前端 gen:api 再生 + 前端构建通过(方案 B 接口面零变化,无路由/schema 变更)。测试基线:143 passed, 0 skipped(D11 8 项 + 铝价 2 项 + OCC 进程池 6 项;基线 129 中原 2 个 skip 已随本地环境补齐 celery/alembic 转为执行)。下一步:回到 §3 主线 P2/P3 长期方向——D3 剩余收敛(app_factory 参数收敛、identity/platform 语义)、inventory 服务下沉、D13 pip 锁文件随下次镜像构建补齐,见 ROADMAP.md §3。)

2026-09-17(批次 4(架构演进)完成,§3.1 治理批次全部执行完毕:① D3 主体清偿——891 行的旧 shared/models/database.py(31 模型类三类同居,已删除)按归属拆为 shared/models/base.py(唯一 Base)+ shared/models/identity.py(身份权限 7 表)+ moldinsight/models/(分析域 9 表)+ inventory/models/(进销存 15 表,catalog/warehouse/trading/finance 四文件);三条跨模块 ORM relationship(User.stp_files / STPFile.user / STPFile.product)经全仓核实零使用,直接删除——跨模块桥接收敛为裸 FK 硬规则(ARCHITECTURE.md §5.1),单模块部署 mapper 可独立配置;约 45 处 import 全量改写(含 migrations/env.py 全量注册、scripts/ 两个一次性脚本),旧模块物理删除无兼容 facade;零调用方死方法 db_manager.create_tables 一并删除(拆分后会静默建残缺 schema);② D10 治理——_reset_occ_executor 补 cancel_futures=True(旧实现下"慢恢复"的旧线程会继续消化旧队列,与新 executor 并发操作非线程安全的 OCC,属数据竞争而非单纯泄漏);吞吐方案设计先行定稿 topics/performance/OCC_THROUGHPUT.md(短期 A:celery --concurrency 伸缩 + --max-tasks-per-child 兜底,启动参数已记 OPERATIONS.md §3;中期 B:run_occ 契约进程化 + kill-on-timeout,待独立排期);③ 新增 tests/test_model_ownership.py 锁定归属边界(31 表全量注册 / 单模块独立 mapper 配置 / 旧模块无 facade);④ 顺手清偿 D15——vite.config.ts 删除未用的 mode 参数,vue-tsc -b 恢复通过,前端生产构建链路解除阻断。接口面零变化(无路由与 schema 变更,openapi.json 不触发重导出)。测试基线:125 passed, 2 skipped(基线 122 + 新增归属测试 3 项)。下一步:治理批次收尾后回到主线方向;遗留项 D11(HTML RustFS 单源)、D13(pip 锁文件)、OCC 方案 B 独立批次。)

2026-09-17(批次 3(API 与代码结构)完成:① D1 清偿——592 行 advanced_router 拆为 design_router / cost_router / machining_router / export_router 四个子路由(端点路径不变),请求体全量 Pydantic 模型化(request.json() 手动解析退役,校验统一 422);② 路由装载失败显式化:ROUTE_MODULES 清单 + route_registry,失败经 /api/health 呈现 degraded 并列出清单(pythonocc 改真实探测),DEBUG 下 fail fast——此前失败仅 WARNING 后静默跳过,进程带病启动不可感知;③ 纯 Python 重计算端点(设计/加工/CAM 打包)统一 asyncio.to_thread 投放线程池,不再阻塞事件循环(OCC 仍走单线程 executor,D10 留批次 4);④ StorageIntegrationService(867 行)按职责拆为 task_storage / analysis_storage / file_history 三服务,无调用方死代码 log_user_activity 删除;⑤ D14 收尾清偿——MAX_FILE_SIZE 接线生效(默认上限 50MB→100MB,以 .env 为准)、celery_app 复用 Settings.redis_url(连接串唯一拼装点)。连带修复:管理员重置密码改 JSON body { new_password }(原裸 str 参数被解析为 query param,前端两个调用点均发 body,功能端到端断裂)+ UsersView.vue 同步;Dockerfile.celery 的 FROM 对齐 gemold-backend:latest(此前引用不存在的 tag,干净环境 celery 镜像必构建失败)。接口变更三件套随批完成:openapi.json 重导出(76 paths)+ 前端 gen:api 再生。连带发现:npm run build 因 vite.config.ts 既有 TS6133 失败(与本项目改动无关,登记 D15)。测试基线:122 passed, 2 skipped(新增 4 个测试文件共 17 项:test_advanced_split_contract / test_route_load_status / test_config_governance / test_auth_password_reset;skips 为 alembic / celery 缺失环境)。下一步:批次 4(架构演进:共享 ORM 拆分、OCC 吞吐方案,见 ROADMAP.md §3.1)。)

2026-09-16(批次 2(任务一致性模型)完成:① D7 清偿——Redis 进程内存回退彻底删除(写 no-op / 读 None,查询路径自然落 PG),PG 为任务状态单一事实源;批量元数据入库:processing_tasks 新增 batch_id 列(迁移 a3f8c2d91e47,升级后首次启动自动执行),GET /api/batch/{batch_id} 改为 PG 聚合查询 + STPFile.user_id 归属校验,删除 Redis batch key 与内存 dict 双通道;TaskQueryService PG 视图与 batch 聚合响应补 progress / current_step(Redis 不可用时前端仍能看到进度);② D8 清偿——型腔分模失败不再吞异常,任务标 failed 并带明确错误(已提交的几何/网格保留);③ D9 清偿——数据本体写方法只 flush,编排层分阶段原子收口(阶段 A 几何+网格、阶段 B 型腔+HTML+特征+指标+验证、完成时参数随状态一并提交),失败先 rollback 再置 failed;进度/状态更新保留即时 commit(长任务进度可见性);upload/batch/advanced 调用方补显式 commit,STPFile + ProcessingTask 原子落库消除孤儿文件记录。D11 未动(共享卷已兜正确性,留后续批次)。测试基线:105 passed, 1 skipped(新增 tests/test_batch_status_pg.py 4 项 + tests/test_redis_no_fallback.py 3 项)。下一步:批次 3(API 与代码结构:_safe_include 失败显式化、advanced_router 拆分 + Pydantic 请求模型、配置治理,见 ROADMAP.md §3.1)。)

2026-09-16(批次 1(部署正确性)完成:① D6 清偿——分派入参 file_path → stp_file_id,处理方按 PG 元数据从 RustFS 下载源文件到任务专属临时目录(RustFS 异常时回退节点本地路径),compose 增 uploads_data / html_data 共享卷过渡兜底;② D12 清偿——新增 AUTO_MIGRATE 开关(默认 true 保持单机行为;多副本设 false 改部署流程单点迁移),迁移脚本与 alembic.ini 补进镜像。连带发现并修复:迁移目录 alembic/ 与 alembic 包重名,应用内 import alembic 被遮蔽——启动期自动迁移自引入 alembic 起从未真正生效(异常被 init_database 吞掉只打日志),且镜像原本未打包迁移脚本;目录已改名 migrations/(alembic.ini + 4 处文档引用同步);③ D13 主体——Dockerfile.moldinsight 改为 conda 运行时原生执行(不再跨镜像拷贝 site-packages),基础镜像 tag 锁定;pip 全量锁文件遗留,随下次镜像构建 pip freeze 生成;④ compose 关键项去弱默认:SECRET_KEY / ADMIN_PASSWORD 改 ${VAR:?} 强制显式配置(与 OPERATIONS「无默认」声明对齐),create_admin_user 对空口令显式报错。测试基线:98 passed, 1 skipped(新增 tests/test_deployment_config.py;alembic 缺失环境 skip)。遗留:D13 pip 锁文件;既有问题待查——Dockerfile.celery FROM gemold-moldinsight:latest,而 build.sh 只构建 gemold-backend tag,干净机器上 build.sh 的 celery 步骤会失败。下一步:批次 2(任务一致性模型,见 ROADMAP.md §3.1)。)

2026-09-16(批次 0(安全与诚实)完成:① /api/status/{task_id} 补 JWT 鉴权 + 任务归属校验(无 token 401 / 他人或无主任务 403 / 不存在 404),归属校验收敛为 TaskQueryService.ensure_task_access 供 task_router 与 advanced_router 共用——技术债 D5 清偿;② 上传预检 pythonocc_available 从硬编码 true 改为惰性真实探测;③ bcrypt 口令治理:创建侧超 72 字节显式拒绝(此前静默截断改变有效密码),验证侧截断比较(兼容历史哈希 + 避免超长登录 500);④ SECRET_KEY 未配置 / RUSTFS_* 缺失时惰性校验抛明确错误,代码侧不再有占位弱默认。顺带修复:完成态任务未持久化 analysis_metrics 时 /api/status 组装视图 500(值为 None 时 .get(key, {}) 默认值不生效)。测试基线:pip 无 OCC 环境 96 passed(新增 tests/test_status_endpoint_auth.py 8 项回归)。status 端点鉴权为接口行为变化,已同步 API_CONTRACT.md §3.2;openapi.json 重导出仍按既有待办随下次接口变更一并执行。下一步:批次 1(D6 RustFS 主链路 + D12 alembic 移出 startup + D13 OCC 镜像,见 ROADMAP.md §3.1)。)

2026-09-15(后端设计审查完成 → 治理计划入文档:完成 moldinsight 后端设计审查(部署 / 任务一致性 / API / 代码结构),产出治理批次计划入 ROADMAP.md §3.1(批次 0–4:安全→部署→一致性→结构→架构);新识别技术债 D5–D14 入 TECH_DEBT.md §3——含确认安全缺口 /api/status/{task_id} 无鉴权、主处理链路依赖节点本地文件路径(API 与 Celery worker 容器无共享卷)等。下一步:按批次 0 + 批次 1 的 D6(RustFS 主链路)启动实施。)

最后更新:2026-09-15(项目规范体系对齐 ipc-chat-cortex——参考 ipc-chat-cortex 的 AGENTS.md + docs 规范重整本文档体系:① AGENTS.md 重写——硬约束速览(新增:接口变更三件套 Pydantic→openapi.json→gen:api、配置只走 .env 且关键项不兜底、单数据库刻意设计)+ 代码地图逐文件化 + 开发约定映射表(改什么→同步什么文档);② 新增 OPERATIONS.md(配置来源与优先级 / 本地启动 / Compose / 运维硬性要求)与 API_CONTRACT.md(端点总览 / 统一约定 / OpenAPI 类型生成流程);③ 本文件改为日志体,原静态内容分流到各归属文档(推荐部署模式→DEPLOYMENT §1,未完成项→ROADMAP/TECH_DEBT)。验证:openapi 导出命令实测可用(conda gemold 环境,unified app 76 paths);待办:checked-in openapi.json(2026-07-27,70 paths)已落后当前代码,下次接口变更时按 API_CONTRACT.md §4 重导出并 npm run gen:api。)

上一条:2026-09-02(模块化收口 + 文档主骨架建立(基线条目):代码侧完成 moldinsight 技术债治理——安全收口(debug/history 权限补齐、任务访问控制收紧)、静默失败修复(detect-undercuts 基于真实 shape 重建)、OCC 超时后 executor 重建防毒化全队列、后台任务统一分派、Redis 任务状态改 Hash 原子更新、完成态任务视图缓存、导出缓存与持久化收口、旧入口与死代码删除、Generator 公共接口提取 + 契约测试;详见 TECH_DEBT.md §2。结构侧完成 src/entrypoints/ 三入口拆分(moldinsight / inventory / unified)、shared 平台能力集中、前端独立 frontend/ 工程。文档侧建立 STATUS / ARCHITECTURE / ROADMAP / TECH_DEBT / DEPLOYMENT 主骨架,README 收敛为唯一导航入口,历史材料迁入 archive/。测试基线:本地 pip 环境 47 passed, 1 skipped(pythonocc 缺失自动 skip);moldinsight conda + OCC 环境 88 passed。inventory 侧少量既有 deprecation warnings 不影响通过。)

此前:2026-09-01(文档体系专项整理启动:明确「README 只做导航、每类信息单一归属、历史材料进 archive」的文档治理原则;建立 deployment/ 主题目录与 archive/ 归档目录;部署文档收口为 DEPLOYMENT(入口)+ deployment/LINUX_SETUP(操作)+ deployment/DEPLOY_PORT / PORT_CONFIG(端口补充)三层。)