Files
Neo-ZQYY/docs/audit
Neo 16c6fb0d3b fix(backend): F1-5b A6 ETL 连接显式 client_encoding=UTF8 防御 GBK (W1)
Windows GBK 环境下 psycopg2/libpq 在拼接连接字符串时,会读取系统
用户名 / 计算机名,若含中文(0xd6 是 GBK 首字节)会触发
UnicodeDecodeError。admin_db_health.py:105-115 已用显式 DSN +
PGCLIENTENCODING 修过,但 database.py 中的 4 个 connect 函数遗漏。

变更:
- apps/backend/app/database.py
  - 新增 _CONN_KWARGS = {**_KEEPALIVE_KWARGS, "client_encoding": "UTF8"}
  - 4 处 psycopg2.connect 调用从 **_KEEPALIVE_KWARGS 改为 **_CONN_KWARGS:
    * get_connection(zqyy_app 业务库)
    * get_etl_global_readonly_connection(ETL 全局只读)
    * get_etl_readonly_connection(ETL RLS 只读)
    * get_etl_write_connection(ETL 可写)

业务影响:
- 影响 75+ 调用点(grep 统计),Windows GBK 环境下未来出现
  UnicodeDecodeError 概率大幅降低
- Linux UTF-8 环境无影响
- ETL RLS / FDW 链路无逻辑变化(client_encoding 是协议层)

验证:
- 后端 reload + /health 200 OK
- /api/admin/db-health 测试库 connected(test_zqyy_app + test_etl_feiqiu)
- BE-3 / T3 unit test 5/5 PASS,间接证明 ETL 连接链路无破坏

§3.3 标"sandbox 无关",4b 跳过(client_encoding 是协议层,与 sandbox
业务时钟无关)。

未加 feature flag ETL_FORCE_UTF8(§8.3 兜底建议):client_encoding=UTF8
是 PostgreSQL 默认安全设置,无需 flag 控制。若未来出现特殊业务字段
含非 UTF-8 字节再考虑加 flag。

审计:docs/audit/changes/2026-05-05__wave1_f1_5b_a6_etl_conn_utf8.md

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-05 22:11:43 +08:00
..

审计目录docs/audit/

项目级统一审计落地点。所有模块ETL、后端、小程序、管理后台等的审计产物均写入此目录。

子目录与文件

目录/文件 说明
changes/ AI 逐次变更审计记录(<YYYY-MM-DD>__<slug>.md
prompt_logs/ Prompt 日志文件(每次 prompt 生成一个独立文件,按时间戳命名)
session_logs/ 全量会话记录(按 YYYY-MM/DD/ 分层),含双索引和 LLM 操作摘要。详见 SESSION-LOG-GUIDE.md
audit_dashboard.md 审计一览表(自动生成,勿手动编辑)
SESSION-LOG-GUIDE.md Session 日志使用指南(索引字段、查询方法、典型场景)

维护约定

  • prompt_logs/prompt-audit-log Hook 自动管理,请勿手动编辑
  • session_logs/agentStop Hook 自动提取,索引由提取脚本自动更新
  • audit_dashboard.md/audit 流程自动刷新,也可通过 python scripts/audit/gen_audit_dashboard.py 手动重新生成
  • 变更审计记录由 /audit 流程audit-writer 子代理)生成,包含 session_id 字段与 Session 日志双向关联
  • 历史记录(迁移前 ETL 子项目的审计)已合并至此目录

审计追溯链

Prompt 日志 ←→ Session 日志 ←→ 变更审计记录
(用户说了什么)   (AI 做了什么)   (正式变更文档)

通过 Prompt-ID 和 Session-ID 可在三者之间双向追溯。详见 SESSION-LOG-GUIDE.md