# PROGRESS · 引擎卫生:限流状态、静默失败、功能吉凶兜底 - 日期:2026-10-15 - 分支:`codex/python-hygiene-20261013` - 基线:`origin/staging` `e4ff62c73856d1e10d44f42f998e94835b8acdf0` - 前置:`dbba127e715759f0e225fc57faf12508a01d2380` 是该基线的祖先 - BUG:BUG-1340。本分支最大已用编号是 BUG-1357,1340 空着,按任务书使用,不顺延。 ## 做了什么 1. 免费层「是否在限流」改成读适配器里的真实判断:官方公共端点、没有 API key、配额窗口大于 0。三个旧变量名还在,只在诊断里标成已废弃,不能拿来关掉限流。网关离线排队仍用原来的另一组变量。 2. 功能吉凶兜底收成 `scripts/functional_layer.py` 一处。引擎、接口、MCP 都转发到它。正常成功的结果与原来逐字节一致。`functional_benefics.py` 未改。 3. 会让结果少一块的静默失败改为记下模块名、函数名和错误类型。预期内的失败保持安静,并写明原因。裸 `except` 里任务点名的两处引擎、星宿大运和星宿命令已改成 `except Exception`。 4. 快速门加入静默失败计数和 `scripts/` 根目录 `.py` 数量两条只许下降的守卫。 ## T3 分类 写作时口径是 29 处。本基线多了 `scripts/api_scratch_retention.py::_loop`(前序单新增),收尾 30 处。A 类 14 处不计入守卫;B 类 16 处改为记日志。未收窄 A 类的异常类型:不能证明只会抛某一种。 | 类 | 位置 | 处理 | | --- | --- | --- | | A | `annual_tajika_pack._iana_timezone_id` | 时区名解析失败保持安静,`# noqa: BLE001` | | A | `api_scratch_retention._loop` | 清理循环必须活着,保持安静 | | A | `jyotishganit_shadbala_surface_probe.clean` | 探针清理失败保持安静 | | A | `jyotish_engine.write_pl9_pdf` 字体循环 | 换下一个字体,最后仍可用 Helvetica | | A | `local_oss_observation_inventory.git_commit` | 读不到提交号保持安静 | | A | `muhurta` 导入 swisseph | Windows 上动态库失败不一定是 ImportError,保持安静 | | A | `nakshatra_dasha.calc_nakshatra_dasha_breakdown` | 日期文本解析失败不改变年龄明细;裸 `except` 已改为 `except Exception` | | A | `oracle_boundary_audit._date_delta_days` | 日期文本解析失败保持安静 | | A | `tajika._resolve_external_pyjhora_python` | 外部解释器探测失败保持安静 | | A | `vedastro_gateway._sdk_version` | 可选依赖版本读不到保持安静 | | A | `vedastro_python_bridge` 序列化兜底 | 对象转 JSON 失败再走原兜底 | | A | `yoga_engine` 自定义表达式 3 处 | 每条规则都可能失败,保持安静 | | B | `cmd_muhurta._get_sun_moon_lons` | 记下错误类型后仍走近似日月位置 | | B | `cmd_nakshatra_adv.cmd_nakshatra_dasha` | 过境位置失败记日志;裸 `except` 已改为 `except Exception` | | B | `daily_guidance_service._current_mahadasha` | 记日志,返回值不变 | | B | `jyotish_engine._conflict_arbitration` | 记日志;裸 `except` 已改为 `except Exception` | | B | `jyotish_engine.cmd_planetary_congregation` | 记日志 | | B | `jyotish_engine.cmd_full_reading` 过境位置 | 记日志;裸 `except` 已改为 `except Exception` | | B | `muhurta` 日出、儒略日、日月位置 3 处 | 记日志,返回值不变 | | B | `pl9_full_data_export` 中英 Sudarshana 各 1 处 | 记日志。报告正文不写「本段数据缺失」(需拍板) | | B | `reference_transparency_contract._case_chart` | 记日志 | | B | `solar_return._get_sun_lon_jd` | 记日志 | | B | `tajika._year_lord_is_daytime` | 记日志 | | B | `transit_trigger._get_transit_lon_precise` | 记日志 | | B | `mcp_server.strict_workflow` | 记日志 | 引擎里另外三处裸 `except` 会赋值(记忆统计、两处年龄推算),不在本口径,未改。 ## 断言 | 位置 | 原值 | 新值 | 原因 | | --- | --- | --- | --- | | `tests/test_api_server_security.py` 高严谨官方摘要 `queue_enabled` | False | True | 没设置已废弃开关时,官方免费层默认仍在限流 | | `tests/test_vedastro_user_entrypoint.py` 两处 `free_tier_queue_enabled` / `queue_enabled` | True | True | 该用例没有 key、端点是官方地址、配额为正。字段跟随真实限流,不再跟随废弃开关 | ## 全量解读对照 同一虚构盘、同一随机种子、关闭网络。退出码 0,标准错误 20 字节。标准输出 5236527 字节,摘要哈希与开工前基线不同。逐项对比只有 29 处差异:缓存创建和过期时间、耗时、最慢阶段的名次、结果哈希、一份大运的参照时钟。`modules.functional_benefic_malefic` 排序后逐字节相同,长度 1442。 ## 反向验证 人为在 `scripts/functional_layer.py` 加一处 `except Exception: pass`,并在根目录加一个空 `.py`,然后立刻删掉。 ``` FAILED tests/test_python_hygiene_budget.py::test_silent_except_budget_does_not_grow AssertionError: ['scripts/functional_layer.py:46'] assert 1 <= 0 FAILED tests/test_python_hygiene_budget.py::test_scripts_root_py_count_does_not_grow AssertionError: 447 assert 447 <= 446 ``` 撤回后根目录仍是 446。守卫测试 2 通过。 ## 检查 | 检查 | 命令 | 结果数字 | | --- | --- | --- | | 定向测试 | 任务书 Grok 自测清单,外加功能层快照 3 条、改过的安全断言 1 条 | 77 项,76 通过,1 失败 | | 失败项 | `test_gateway_completion_archives_official_raw_response` | `st_mode & 511` 实得 438,期望 384 | | 静默守卫 | `tests/test_python_hygiene_budget.py` | 2 通过;未标记静默 0;带 noqa 的 A 类 14 | | 功能层快照 | `tests/test_functional_layer_snapshot.py` | 3 通过 | | 根目录 `.py` | `scripts/*.py` | 446(含新建的 `functional_layer.py`) | 失败的那条断言检查归档文件权限必须是 `0o600`。本单在 `vedastro_gateway.py` 只加了一行静默原因注释,`os.chmod(..., 0o600)` 未改。Windows 回报的权限位是 `0o666`。断言不放宽。 ## 偏离 - T4 测试脚本归位未做。任务书让步顺序第一项,避免搬动被证据索引或冻结清单钉住的文件。 - T5 第 2 条做了:根目录上限按收尾实测 446,只许下降。 - A 类没有收窄异常类型。 - 报告正文不增加「本段数据缺失」。 - `skills/jyotish-vedic-astrology/scripts/` 里的旧排队开关解析未改。任务书文件清单不含它,也没有字节对照测试。 - 不改前端、依赖、`.gitea/**`、生产配置、冻结文件。