shadowinlife
8c2fd3e127
fix: complete env-var migration — CI gate exit 0, 9 schema fields, noqa mechanism
- Add 9 missing env vars to EnvConfig schema (QVERIS_API_KEY,
VIBE_TRADING_API_URL, OPENAI_MODEL, FUTU_TRADE_PWD_MD5, etc.)
- Migrate 26 os.getenv calls to get_env_config() accessor across 17 files
- Add # noqa: env-gate inline suppression to ci_env_var_gate.py (21 lines)
- Refactor security.py _env_flag_enabled to direct schema access
- Wire CI gate into .github/workflows/test.yml
- Fix api_server.py import of deleted constants
- Restore _legacy.py timeout positive-value validation
- Add reset_env_config() to test_security_auth_api.py for singleton freshness
CI gate: exit 0 (was exit 1 with 54 violations)
Tests: 4953 passed, 4 pre-existing tushare failures, 0 regressions
Co-Authored-By: OpenCode <noreply@opencode.ai>
AI-Model: qwen3.7-max
Co-Authored-By: opencode <noreply@ai-tool.com>
Co-Authored-By: Claude Code <noreply@anthropic.com>
AI-Contributed/Feature: 188/188
AI-Contributed/UT: 39/39
2026-07-08 22:42:14 +08:00
..
2026-07-08 14:15:56 +08:00
2026-07-08 15:00:41 +08:00
2026-04-10 14:36:11 +08:00
2026-07-08 19:36:24 +08:00
2026-07-05 21:14:41 +08:00
2026-07-03 16:28:24 +08:00
2026-07-06 08:57:32 -04:00
2026-06-15 17:41:43 +08:00
2026-06-04 18:42:26 +08:00
2026-06-27 21:39:13 +08:00
2026-06-18 21:38:57 +08:00
2026-06-17 01:19:52 +08:00
2026-06-15 17:41:43 +08:00
2026-06-15 17:41:43 +08:00
2026-06-29 16:09:40 +08:00
2026-06-15 17:41:43 +08:00
2026-04-27 22:28:14 +08:00
2026-06-07 01:08:42 +08:00
2026-06-07 01:08:42 +08:00
2026-06-19 18:19:12 +08:00
2026-07-07 17:14:04 +08:00
2026-07-03 16:28:24 +08:00
2026-05-29 18:00:08 +08:00
2026-06-20 17:55:33 +08:00
2026-06-18 23:36:27 +08:00
2026-05-10 15:47:09 +07:00
2026-06-15 16:38:49 +08:00
2026-04-10 14:36:11 +08:00
2026-07-05 21:04:43 +08:00
2026-06-19 18:19:12 +08:00
2026-06-14 22:25:29 +08:00
2026-05-27 18:42:53 +08:00
2026-07-06 08:57:32 -04:00
2026-07-06 08:57:32 -04:00
2026-06-27 21:39:13 +08:00
2026-04-10 14:36:11 +08:00
2026-04-10 18:11:52 +08:00
2026-07-03 16:28:24 +08:00
2026-06-30 14:31:26 +08:00
2026-07-08 13:42:31 +08:00
2026-05-26 00:43:28 +08:00
2026-05-20 21:36:22 +08:00
2026-05-22 10:04:26 +08:00
2026-07-03 16:28:24 +08:00
2026-07-03 16:28:24 +08:00
2026-05-13 16:38:55 +07:00
2026-06-13 17:25:56 +08:00
2026-06-30 16:30:05 +08:00
2026-07-08 15:00:41 +08:00
2026-05-27 19:53:46 +08:00
2026-06-01 22:39:57 +08:00
2026-06-18 21:34:49 +08:00
2026-06-27 21:39:13 +08:00
2026-06-27 21:39:13 +08:00
2026-06-25 19:53:39 +08:00
2026-05-01 00:44:21 +08:00
2026-04-13 22:46:49 +08:00
2026-06-19 18:19:12 +08:00
2026-07-03 16:28:24 +08:00
2026-05-02 17:51:48 +08:00
2026-05-03 22:42:20 +08:00
2026-05-03 22:42:20 +08:00
2026-05-17 23:36:33 +08:00
2026-06-19 18:19:12 +08:00
2026-06-19 18:19:12 +08:00
2026-06-19 18:19:12 +08:00
2026-07-03 16:28:24 +08:00
2026-07-07 21:45:00 +08:00
2026-07-08 19:36:24 +08:00
2026-07-02 16:13:47 +08:00
2026-05-16 23:50:37 +08:00
2026-07-08 15:00:41 +08:00
2026-07-02 16:13:47 +08:00
2026-04-30 17:53:16 +08:00
2026-06-28 17:02:16 +08:00
2026-07-06 09:11:15 +08:00
2026-06-29 15:51:47 +08:00
2026-06-19 18:19:12 +08:00
2026-06-19 18:19:12 +08:00
2026-04-13 22:46:49 +08:00
2026-06-19 18:19:12 +08:00
2026-06-19 18:19:12 +08:00
2026-05-19 16:19:42 +08:00
2026-07-08 15:00:41 +08:00
2026-07-08 15:00:41 +08:00
2026-07-08 19:36:24 +08:00
2026-07-08 15:00:41 +08:00
2026-05-16 23:47:32 +08:00
2026-05-16 23:47:32 +08:00
2026-04-10 14:36:11 +08:00
2026-04-10 18:11:52 +08:00
2026-05-26 00:43:28 +08:00
2026-05-26 00:43:28 +08:00
2026-05-26 00:43:28 +08:00
2026-05-29 18:00:08 +08:00
2026-05-16 17:10:06 +08:00
2026-06-01 00:17:28 +08:00
2026-06-01 00:17:28 +08:00
2026-06-19 18:19:12 +08:00
2026-07-03 16:28:24 +08:00
2026-06-12 23:41:19 +08:00
2026-06-28 03:35:54 +08:00
2026-06-17 01:17:20 +08:00
2026-07-05 21:02:17 +08:00
2026-06-18 23:36:27 +08:00
2026-06-19 18:19:12 +08:00
2026-06-25 19:53:39 +08:00
2026-06-18 23:36:32 +08:00
2026-07-03 16:28:24 +08:00
2026-05-29 18:00:08 +08:00
2026-06-19 18:19:12 +08:00
2026-07-08 14:15:56 +08:00
2026-06-20 17:55:36 +08:00
2026-05-18 15:16:24 +08:00
2026-06-19 18:19:12 +08:00
2026-06-22 22:33:42 +08:00
2026-06-18 21:42:28 +08:00
2026-06-01 22:39:57 +08:00
2026-06-01 00:17:28 +08:00
2026-07-05 21:14:41 +08:00
2026-05-17 23:33:15 +08:00
2026-07-05 21:14:41 +08:00
2026-06-09 19:17:21 +08:00
2026-04-10 14:36:11 +08:00
2026-06-19 18:19:12 +08:00
2026-06-01 00:17:28 +08:00
2026-06-19 18:19:12 +08:00
2026-07-08 14:15:56 +08:00
2026-06-20 18:00:35 +08:00
2026-06-14 22:25:29 +08:00
2026-05-19 16:19:42 +08:00
2026-06-19 18:19:12 +08:00
2026-05-16 23:47:32 +08:00
2026-06-30 14:31:26 +08:00
2026-05-24 23:55:00 +08:00
2026-06-20 17:55:21 +08:00
2026-05-15 11:28:02 +08:00
2026-07-06 17:07:37 +08:00
2026-05-19 16:19:42 +08:00
2026-06-17 01:17:24 +08:00
2026-07-08 13:42:31 +08:00
2026-07-08 13:42:31 +08:00
2026-07-08 13:42:31 +08:00
2026-07-03 16:28:24 +08:00
2026-06-15 17:41:43 +08:00
2026-05-29 18:00:08 +08:00
2026-05-16 23:50:37 +08:00
2026-05-16 01:17:47 +08:00
2026-06-19 18:19:12 +08:00
2026-06-18 21:30:23 +08:00
2026-04-16 23:59:06 +08:00
2026-07-06 08:55:26 +08:00
2026-06-19 18:19:12 +08:00
2026-04-10 14:36:11 +08:00
2026-06-14 06:50:02 +08:00
2026-06-16 00:36:03 +08:00
2026-06-27 21:39:13 +08:00
2026-06-16 00:35:52 +08:00
2026-06-14 22:14:50 +08:00
2026-07-02 15:23:41 +08:00
2026-07-03 16:28:24 +08:00
2026-05-29 18:00:08 +08:00
2026-05-29 18:00:08 +08:00
2026-05-29 18:00:08 +08:00
2026-05-29 18:00:08 +08:00
2026-05-29 18:00:08 +08:00
2026-05-29 18:00:08 +08:00
2026-06-21 19:06:46 +08:00
2026-06-20 18:00:39 +08:00
2026-06-05 15:45:11 +08:00
2026-06-02 12:52:14 +08:00
2026-06-19 18:19:12 +08:00
2026-06-19 18:19:12 +08:00
2026-06-19 18:19:12 +08:00
2026-07-08 22:42:14 +08:00
2026-06-16 00:35:58 +08:00
2026-06-30 19:50:20 +08:00
2026-06-12 23:41:19 +08:00
2026-05-18 15:16:24 +08:00
2026-05-17 23:33:15 +08:00
2026-07-04 21:16:11 +01:00
2026-06-05 20:41:14 +08:00
2026-06-27 21:39:02 +08:00
2026-05-05 23:30:58 +08:00
2026-06-26 22:41:57 +08:00
2026-06-19 18:19:12 +08:00
2026-06-19 18:19:12 +08:00
2026-06-19 18:19:12 +08:00
2026-04-16 23:59:06 +08:00
2026-04-19 11:10:50 +08:00
2026-05-22 00:00:47 +08:00
2026-06-19 18:19:12 +08:00
2026-06-19 18:19:12 +08:00
2026-06-19 18:19:12 +08:00
2026-05-28 15:32:04 +08:00
2026-05-16 23:50:37 +08:00
2026-06-11 12:22:51 +08:00
2026-05-28 16:21:32 +08:00
2026-05-28 16:21:32 +08:00
2026-05-28 16:21:32 +08:00
2026-05-28 16:21:32 +08:00
2026-05-28 16:21:32 +08:00
2026-05-17 00:13:19 +08:00
2026-05-06 19:03:34 +08:00
2026-07-06 12:15:04 +08:00
2026-06-18 21:30:30 +08:00
2026-05-10 15:49:32 +07:00
2026-05-16 23:50:37 +08:00
2026-06-18 21:30:30 +08:00
2026-05-16 23:50:37 +08:00
2026-05-11 12:09:21 +08:00
2026-06-11 12:11:37 +08:00
2026-06-27 21:39:13 +08:00
2026-05-13 01:13:44 +08:00
2026-06-12 23:41:19 +08:00
2026-06-19 18:19:12 +08:00
2026-06-19 18:19:12 +08:00
2026-05-03 22:42:20 +08:00
2026-06-12 23:41:19 +08:00
2026-06-13 01:21:24 +08:00
2026-06-20 17:55:25 +08:00
2026-06-29 16:44:19 +08:00
2026-07-07 12:58:22 +08:00
2026-05-07 15:16:07 -03:00
2026-06-26 22:42:07 +08:00
2026-06-25 19:53:29 +08:00
2026-05-03 22:42:20 +08:00
2026-07-03 10:50:26 +08:00
2026-06-25 19:53:36 +08:00
2026-04-10 18:11:52 +08:00
2026-04-21 09:13:16 +08:00
2026-05-16 14:51:27 +08:00
2026-05-05 23:30:58 +08:00
2026-07-06 17:10:56 +08:00
2026-06-19 18:19:12 +08:00
2026-06-19 18:19:12 +08:00
2026-06-14 22:25:26 +08:00