工程证据
可信度不是说出来的,是能被对方自己核对的交付物。下表每一行对应仓库里的文件与测试;仓库可按尽调要求以只读方式提供。
门禁与机制
“门禁”指不通过就不能合入或发布的机器检查;“机制”指代码里固定下来的做法。
| 机制 | 它保证什么 | 仓库位置 |
|---|---|---|
| 三态单点推导 | 核验状态只有一个定义,水位、接口、MCP、界面、报告同源推导;估算与未核验不可能被第二套定义折进最高态 | app/states.py |
| 单元工作与字段级留痕 | 每条源记录一个事务;每次写入带 actor 与来源,字段级 diff 进 changes_log,可时点重现 | app/store/uow.py; changes_log (app/schema.sql) |
| 迁移链 | Schema 变更只走版本化迁移,只增不改;每个迁移写明回滚;老库升级后与新库结构一致 | app/migrations.py; tests/fixtures/migrations.lock; tests/test_migration_gate.py |
| 契约门禁 | /v1 每条路由与 MCP 每个工具的返回都带来源、时点、核验状态;新路由或新记录形状未写契约即红;internal 字段不下渗 | tests/test_contract_gate.py |
| 回放金样 | 采集解析对固定夹具的输出有金样本,改坏即红;核验不给源站加一次负载 | tests/fixtures/auction_replay_golden.json |
| PostgreSQL 影子库与读比对 | 服务层可切读 PostgreSQL 影子库;抽样与 SQLite 比对,差异计入 ops_metrics;行级安全由同一可见性谓词生成 | app/pgread.py; tests/test_pg_read.py |
| 采集纪律 | 标识 UA,同源请求间隔不低于 2 秒;验证码 / 登录墙 / WAF / 429 即停源并落盘;robots.txt 机械执行,被 Disallow 的路径即停源,不改 UA、不换路径 | pipeline/auction/http_util.py (robots 守卫); tests/test_failure_tiers.py |
| 来源 manifest 的 legal 块 | 每个来源的 robots 与条款快照哈希、日期、判定、权利层级与审阅到期日随清单走;到期未审或文本变动即拒绝运行 | pipeline/legal_snapshot.py |
| 原始档案 | 源站响应内容寻址留档,行级 raw_ref 指向读取的确切字节;默认关闭,开启须发布单记录法律 / 安全签字;开启时手机、座机、证件号先遮蔽 | pipeline/raw_archive.py; tests/test_raw_archive.py |
| 备份与恢复演练 | 在线快照带清单(sha256、行数、schema 版本);GFS 保留;恢复演练在独立路径计时并校验,不开生产库 | ops/backup.py; ops/drill_restore.py; tests/test_phase0_ops.py |
| 水位与告警 | 每轮管线后读业务表写 ops_metrics;核验状态永远三分报告,不合并为一个总数;更正请求超期升级告警 | ops/water_levels.py |
| 更正通道 | 更正 / 异议 / 删除三类请求,48 小时到期,答复留在记录上;请求本身不直接改记录 | app/reports_queue.py; tests/test_reports_channel.py |
| 法定披露项评分 | 13 项(12 项可判定)逐项规则与法律依据,带规则版本(basis_version)与文本哈希;判定的是公告文本,不是资产 | app/disclosure.py; tests/test_disclosure.py |
| 事件词表 | 21 类处置事件,分拍前 / 拍卖 / 结果 / 拍后;类型是固定字符串,写入点不得自由填值 | app/events.py |
| 清单匹配 | 按平台链接、规范化案号、地址包含三条规则匹配;多候选列出不合并;输出遵守调用方层级 | ops/dossier.py; tests/test_events_dossier.py |
| 回测 | T1 覆盖对平(对第三方公开月度数,参考值带 URL)与 T2 拍前命中率,方法公开,结果入 ops_metrics | ops/t1_coverage.py; ops/t2_preauction.py; tests/test_t1_t2_monthly.py |
| 脱敏 | 自然人姓名在写入时收敛为首字 + "**",原文不落库;机构名全保留;历史明文由迁移 0006 清除(secure_delete) | app/masking.py; tests/test_masking.py |
| 界面无裸色 | 界面源码不得出现原始颜色值,构建产物不得引用外部资源,不受信文本不得渲染为标记 | tests/test_ui.py |
| 数据合同 | 未建的表有合同草案,未生效拒写;覆盖接口报告“层未建”,不报零行 | app/contracts.py; tests/test_data_contracts.py |
| 门禁脚本 | ast 校验 + 测试 + 敏感模式扫描 + 全角符号扫描,四项全绿方可称“完成” | scripts/check.sh |
工程标准摘要
全文见 docs/engineering-standards.md;这里只摘对外有约束力的部分。
版本与接口
- 对外接口版本化(/v1 前缀);破坏性变更只升大版本并给弃用期。
- 统一错误结构(code / message / detail);列表接口游标分页并设上限。
- MCP 工具与 REST 共用同一服务层,禁止两套逻辑。
- 弃用政策:提前两版公告。
数据与迁移
- 每张表必备来源、置信度、更新时间三件套。
- Schema 只走迁移,只追加、不改写已发布条目;无 ADR 与恢复演练不做破坏性 DDL。
- 跨源同标的只经 id_crosswalk 关联,外部 ID 不进主表。
- authorized_supply 新源出生即带 rights_tier=internal_only, sellable=false。
发布与安全
- 语义化版本;发布单含变更清单、迁移说明、回滚步骤、验证证据。
- 密钥与凭证零入库;提交前扫描敏感模式。
- 依赖最小化,标准库优先;每个依赖的许可证与 LICENSE 快照登记在册(docs/licenses/)。
- 日志不输出身份证号、联系方式、凭证。
技术栈
- 语言与框架
- Python 3.11+, FastAPI;标准库优先,依赖最小化
- 存储
- SQLite(单机真源)与 PostgreSQL(影子库 / 只读切换,psycopg 3.2.3)
- 控制台
- React(app/ui 构建产物,源码 web/)
- 接口描述
- OpenAPI 由 FastAPI 自动生成:/openapi.json,交互式文档 /docs
- MCP
- stdio, JSON-RPC 2.0,标准库实现(app/mcp_server.py)
我们刻意不主张的
- 不主张信创适配。本地部署可做;国产数据库 / 操作系统适配 待核,未做,不承诺。若客户要求,列入试点计划后再做并记录;完成前不改口径。
- 不主张等保已过。等保二级、三级在资质路线图上,前置是法人主体与 dev / staging / prod 三分环境;现仓只有单一环境。费用与周期 待核。
- 不主张任何行业标尺。覆盖不足 20 城之前,月度产出一律称“观察”。
- 不报测试数量、覆盖率、规模数字。以 CI 输出与库内实查为准,带时点。