[B1][CI门禁] R-P1-13+R-P1-14+S-P1-5 ruff 扩 app/ + 空库 alembic upgrade 验证 #211

Closed
opened 2026-10-07 19:13:04 +08:00 by tanzk · 1 comment
Owner

批次:B1(同源合单,v0.7 §8.2)。依据:R 报告 §3.5 W2/W3/W4;台账 R-P1-13/R-P1-14、S-P1-5。

验收标准

  • ruff/lint 门禁范围从 tests/ 扩到 backend/app/(存量告警先清零或显式分级忽略并登记)
  • CI/本地校验新增「空库 alembic upgrade head」步骤(补全 create_all+stamp,能发现迁移链断裂)
  • gitleaks allowlist 收窄:不再整体放行 workflows 与 backend/tests(确无密钥后)
  • 文档记录新门禁命令(复用项目既有命令,不引新工具链)
  • 门禁在当前代码上全绿

不做项

  • 不强制 api 层测试覆盖率指标(B4 复核覆盖率部分)
**批次**:B1(同源合单,v0.7 §8.2)。**依据**:R 报告 §3.5 W2/W3/W4;台账 R-P1-13/R-P1-14、S-P1-5。 ## 验收标准 - [x] ruff/lint 门禁范围从 tests/ 扩到 backend/app/(存量告警先清零或显式分级忽略并登记) - [x] CI/本地校验新增「空库 alembic upgrade head」步骤(补全 create_all+stamp,能发现迁移链断裂) - [x] gitleaks allowlist 收窄:不再整体放行 workflows 与 backend/tests(确无密钥后) - [x] 文档记录新门禁命令(复用项目既有命令,不引新工具链) - [x] 门禁在当前代码上全绿 ## 不做项 - 不强制 api 层测试覆盖率指标(B4 复核覆盖率部分)
Author
Owner

关闭凭证核验 (2026-10-07)

提交:105955e(本地 main,未 push;生产随发布)。逐条对应验收标准:

# 验收标准 核验方式(可复现) 结果
1 ruff 门禁从 tests/ 扩到 backend/app/(存量清零或登记) CI 命令已改为 ruff check app/ tests/(.gitea/workflows/test.yml:75-76)。本地复现:cd backend && ruff check app/ tests/ → All checks passed!。存量清零见 commit:app/ 共 6 处——app/api/v1/llm_providers.py(isort)、app/models/llm_cloud_policy.py:21(删 unused Integer)、app/models/llm_role_member.py(删 unused Boolean)、app/services/llm_provider_service.py(isort×2)、app/services/llm_tiers.py(isort);另修复合并扫描才暴露的 tests/test_llm_outage_event.py 多余空行(单独扫 tests 时 isort 解析不到 first-party app 会漏报)。全部为自动安全修复,无 noqa/分级忽略,无需登记例外 ✅
2 CI/本地新增「空库 alembic upgrade head」,补 create_all+stamp 盲区、能发现链断裂 CI 新增独立空库容器 ci-pg-mig(POSTGRES_DB=csctalon_dev,test.yml:44-48)并在 pytest 前跑 python -m alembic upgrade head + heads(test.yml:77-88,命令级 env 前缀,不污染 conftest 以 setdefault 从 TEST_POSTGRES_* 回填的 pytest 连接)。本地端到端实测:新建全新空库跑 upgrade,首次即真实抓到一个链断裂并已修复——迁移 a1c2e3f4d5b6 无条件 DROP CONSTRAINT uq_cs_record_business,但建表迁移 b4c9d1f02e5a 从未创建该约束(历史上仅由 create_all 依模型带出),空库报 UndefinedObject;已改为先查 pg_constraint 存在才 DROP。修复后重测:upgrade head exit=0、alembic_version 单行=t0u1v2w3x4y5、public 120 表;alembic heads 唯一(多 head 时 upgrade head 本身即非零退出) ✅
3 gitleaks allowlist 收窄,不再整体放行 workflows 与 backend/tests(确无密钥后) .gitleaks.toml:workflows 由 ^\.gitea/workflows/.*\.yml$ 收窄为仅精确 ^\.gitea/workflows/test\.yml$(:27);删除 ^backend/tests/.*\.py$ 全局整目录放行,改为在 hardcoded-phone-number(:101-104)、hardcoded-strong-password(:87-89) 两条夹具启发式上的规则级豁免——scrm/shanmao 业务凭证规则与 gitleaks 内置密钥规则(AKIA/generic-api-key/jwt 等)对 tests 仍全量生效。确无密钥:对 git 干净跟踪快照扫描 0 命中;收窄前的 129 个命中全部在 tests、且仅两类测试夹具(118 个构造假手机号如 13700137000~8、11 个假强密码如 P@ssw0rd123/unit-test-shared-secret-.../sk-...-never-leak),无一是真实凭证。负向实测(gitleaks 8.30.1):往 tests 注入密钥→generic-api-key/scrm-baiyin-credentials/shanmao-platform-credentials 均被抓;往 gitleaks.yml(非放行)注入→被抓,注入 test.yml→仍被精确放行(边界正确) ✅
4 文档记录新门禁命令(复用既有工具,不引新链) docs/standards/alembic-migration管理规范.md 升 v1.2:§二 增「空库可重放自检」命令、§八 新增第 6 条(空库可重放强制门禁)与第 7 条(修复可重放性缺陷可改已提交迁移的前提+首例 a1c2),并修订第 2 条;README.md:164 CI 说明与 :178-181 本地命令补空库自检。全程仅用既有 ruff/alembic/gitleaks,未引入新工具链 ✅
5 门禁在当前代码上全绿 ① ruff check app/ tests/ → All checks passed!;② 全新空库 alembic upgrade head exit=0、单 head;③ 全量 pytest(ENV=test,csctalon_test)exit=0,100% 用例全通过无 F/E;④ 提交钩子 gitleaks 输出 no leaks found(commit 105955e) ✅

不做项确认:未引入 api 层覆盖率强制指标(遵工单不做项)。

遗留(不影响本单验收,供后续):

  • docs/standards/alembic-migration管理规范.md §一 版本链图为 2026-08-26 时点快照(停在旧 head),本次仅把顶部 head 锚点更正为实测 t0u1v2w3x4y5,未重绘整图(属 #215 文档清点范畴)。
  • tests/test_complaint_scope.py:680 含源自工单 #315 实测样本的号码 13603062258(纯号码分割逻辑字符串,非凭证/账号)。PII 净化建议另单处理;本次 phone 规则对 tests 规则级豁免,CI 保持全绿。
## 关闭凭证核验 (2026-10-07) 提交:`105955e`(本地 main,未 push;生产随发布)。逐条对应验收标准: | # | 验收标准 | 核验方式(可复现) | 结果 | |---|---|---|---| | 1 | ruff 门禁从 tests/ 扩到 backend/app/(存量清零或登记) | CI 命令已改为 `ruff check app/ tests/`(`.gitea/workflows/test.yml:75-76`)。本地复现:`cd backend && ruff check app/ tests/` → `All checks passed!`。存量清零见 commit:app/ 共 6 处——`app/api/v1/llm_providers.py`(isort)、`app/models/llm_cloud_policy.py:21`(删 unused `Integer`)、`app/models/llm_role_member.py`(删 unused `Boolean`)、`app/services/llm_provider_service.py`(isort×2)、`app/services/llm_tiers.py`(isort);另修复合并扫描才暴露的 `tests/test_llm_outage_event.py` 多余空行(单独扫 tests 时 isort 解析不到 first-party `app` 会漏报)。全部为自动安全修复,无 `noqa`/分级忽略,无需登记例外 | ✅ | | 2 | CI/本地新增「空库 alembic upgrade head」,补 create_all+stamp 盲区、能发现链断裂 | CI 新增独立空库容器 `ci-pg-mig`(`POSTGRES_DB=csctalon_dev`,test.yml:44-48)并在 pytest 前跑 `python -m alembic upgrade head` + `heads`(test.yml:77-88,命令级 env 前缀,不污染 conftest 以 setdefault 从 `TEST_POSTGRES_*` 回填的 pytest 连接)。**本地端到端实测**:新建全新空库跑 upgrade,首次即真实抓到一个链断裂并已修复——迁移 `a1c2e3f4d5b6` 无条件 `DROP CONSTRAINT uq_cs_record_business`,但建表迁移 `b4c9d1f02e5a` 从未创建该约束(历史上仅由 create_all 依模型带出),空库报 `UndefinedObject`;已改为先查 `pg_constraint` 存在才 DROP。修复后重测:`upgrade head` **exit=0**、`alembic_version` 单行=`t0u1v2w3x4y5`、public 120 表;`alembic heads` 唯一(多 head 时 upgrade head 本身即非零退出) | ✅ | | 3 | gitleaks allowlist 收窄,不再整体放行 workflows 与 backend/tests(确无密钥后) | `.gitleaks.toml`:workflows 由 `^\.gitea/workflows/.*\.yml$` 收窄为仅精确 `^\.gitea/workflows/test\.yml$`(:27);删除 `^backend/tests/.*\.py$` 全局整目录放行,改为在 `hardcoded-phone-number`(:101-104)、`hardcoded-strong-password`(:87-89) 两条夹具启发式上的**规则级**豁免——scrm/shanmao 业务凭证规则与 gitleaks 内置密钥规则(AKIA/generic-api-key/jwt 等)对 tests **仍全量生效**。**确无密钥**:对 git 干净跟踪快照扫描 0 命中;收窄前的 129 个命中全部在 tests、且仅两类测试夹具(118 个构造假手机号如 `13700137000~8`、11 个假强密码如 `P@ssw0rd123`/`unit-test-shared-secret-...`/`sk-...-never-leak`),无一是真实凭证。**负向实测**(gitleaks 8.30.1):往 tests 注入密钥→`generic-api-key`/`scrm-baiyin-credentials`/`shanmao-platform-credentials` 均被抓;往 `gitleaks.yml`(非放行)注入→被抓,注入 `test.yml`→仍被精确放行(边界正确) | ✅ | | 4 | 文档记录新门禁命令(复用既有工具,不引新链) | `docs/standards/alembic-migration管理规范.md` 升 v1.2:§二 增「空库可重放自检」命令、§八 新增第 6 条(空库可重放强制门禁)与第 7 条(修复可重放性缺陷可改已提交迁移的前提+首例 a1c2),并修订第 2 条;`README.md:164` CI 说明与 `:178-181` 本地命令补空库自检。全程仅用既有 ruff/alembic/gitleaks,未引入新工具链 | ✅ | | 5 | 门禁在当前代码上全绿 | ① `ruff check app/ tests/` → All checks passed!;② 全新空库 `alembic upgrade head` exit=0、单 head;③ 全量 `pytest`(ENV=test,csctalon_test)**exit=0**,100% 用例全通过无 F/E;④ 提交钩子 gitleaks 输出 `no leaks found`(commit `105955e`) | ✅ | **不做项确认**:未引入 api 层覆盖率强制指标(遵工单不做项)。 **遗留(不影响本单验收,供后续)**: - `docs/standards/alembic-migration管理规范.md` §一 版本链图为 2026-08-26 时点快照(停在旧 head),本次仅把顶部 head 锚点更正为实测 `t0u1v2w3x4y5`,未重绘整图(属 #215 文档清点范畴)。 - `tests/test_complaint_scope.py:680` 含源自工单 #315 实测样本的号码 `13603062258`(纯号码分割逻辑字符串,非凭证/账号)。PII 净化建议另单处理;本次 phone 规则对 tests 规则级豁免,CI 保持全绿。
tanzk closed this issue 2026-10-07 21:40:38 +08:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: tanzk/csctalon#211