Files
Jyotisha/TASK-engine-runtime-hygiene-20260901.md
T
Jesse_Chen f62977f2c0
Independent Staging Quality Gate / validate (push) Has been cancelled
Independent Staging Quality Gate / publish (push) Has been cancelled
docs(chat): add batch-three and engine-hygiene briefs plus manual walkthrough
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LVapmh2oGNyr6ECHKjPJY8
2026-09-01 20:45:23 +00:00

4.3 KiB
Raw Blame History

任务书 · Python 引擎运行时治理(2026-09-01

基线:origin/staging 最新。本轮不碰 frontend/src/app/page.tsx,可与拆页第三批并行。改动面:deploy/scripts/tests/AGENTS.mddocs/

为什么要做(事故实证)

  1. api 容器没有任何持久卷。 deploy/docker-compose.server.yml 里只有 caddy 挂了卷(caddy_data / caddy_config),api 服务一个卷都没有。而 scripts/jyotish_api_server.py 的异步任务态默认落 scratch/local/async_jobsfile 后端,JYOTISH_ASYNC_JOB_BACKEND 可选 sqlite,同样在 scratch/local/async_jobs.sqlite3),chart 缓存落 scratch/local/api_chart_cache每次部署/重启,进行中的异步任务状态直接蒸发;chart 缓存全冷(可接受,但同因同治)。
  2. scripts/jyotish_api_server.py 已 11,035 行,单文件承载全部端点。三轮前端治理的经验:巨石只会继续膨胀,除非有测试锁住。
  3. 重计算端点没有并发上限。 ThreadingHTTPServer 每请求一线程,2 vCPU 生产机上多个校正扫描/高严谨排盘并发时互相挤压,最坏拖垮健康检查。

决策记录(产品授权,2026-09-01)

  1. api 服务加命名卷持久化 scratch/local(任务 1)。这是 deploy/ 拓扑变更,deploy/README.md 是运维真相源,必须同步更新。
  2. jyotish_api_server.py 冻结增长:新端点/新功能必须落独立模块由主文件薄注册,锁文件行数的合同测试入 quick gate(任务 2)。
  3. 重计算端点加有界并发(任务 3)。饱和时快速失败(429 + Retry-After)优于排长队——前端各调用方已有错误/重试路径。
  4. 迁移 squash 本轮明确不做:需要 staging/production 双环境维护窗口与备份演练配合,收益(新环境重放耗时)目前不痛。延后条件:出现新环境搭建需求或迁移重放实际出错时再立项。

硬红线

  1. 不改 .gitea/workflows/**。deploy 脚本(run-staging-deploy.sh 等)如需感知新卷,改动最小化并在 PROGRESS 说明。
  2. 生产 composedocker-compose.server.yml 为 staging/production 共用基座)改动必须向后兼容:卷不存在时首次创建、已有容器内数据无需迁移(本来就是易失的)。
  3. 并发上限必须可配置(环境变量,含默认值),默认值保守(建议 2,与 vCPU 对齐);健康检查端点绝不能被并发闸门挡住。
  4. Python 测试:tests/test_api_server_security.py 等既有套件不得回归;新增锁测试入 CORE_PYTEST_TARGETS。行数锁的基线取现值上浮小余量(建议 +300 行,容 bugfix),注释写明"新功能请开模块"。
  5. 前端不动;npm test 基线照常逐条比对。tsc 不适用本轮 Python 侧,但若碰 frontend/ 则照旧全套。
  6. 不在脏工作树切分支;不自行提升 main。

让步顺序:生产不中断 > 数据不损坏 > 功能与测试不回归 > 代码整洁。

任务分解

任务 1P0)· api 持久卷

  • docker-compose.server.yml 的 api 服务加命名卷挂到容器内 scratch/local 的实际路径(先读 deploy/railway-api.Dockerfile 确认工作目录,不要猜)。
  • deploy/README.md 架构段与备份说明同步;staging 备份脚本是否需要覆盖该卷,评估后写结论(chart 缓存不值得备份;异步任务态短生命周期,说明白即可)。
  • 验收:staging 部署后 docker volume ls 见新卷;重启 api 容器后 scratch/local 内容存活;/api/health 正常。

任务 2P1)· 冻结巨石

  • AGENTS.md(根目录)加规矩:scripts/jyotish_api_server.py 只减不增,新端点开模块注册。
  • 新合同测试锁行数上限(红线 4),入 quick gate。

任务 3P1)· 重计算并发闸

  • 盘点主文件里最重的计算端点(校正扫描、高严谨排盘类;按实际 handler 认定,PROGRESS 列清单),加共享有界信号量:获取失败立即 429 + Retry-After
  • 健康检查与轻量端点不经过闸门。
  • 测试:并发占满时第 N+1 个请求得到 429;释放后恢复。

总验收

quick gate 全绿(含新锁测试);staging 部署实测任务 1 的三条;PROGRESS 附并发闸端点清单与压测/并发测试输出;deploy/README.md 更新可读。