Skip to content

WIP(A03): offline financial opening writer, strict replay and recovery - #884

Merged
LIghtJUNction merged 4 commits into
wip/rust-core-go-extensionsfrom
fix/a03-financial-opening-preflight
Oct 18, 2026
Merged

LIghtJUNction merged 4 commits into
wip/rust-core-go-extensionsfrom
fix/a03-financial-opening-preflight

Conversation

@LIghtJUNction

@LIghtJUNction LIghtJUNction commented Oct 12, 2026 •

Copy link
Copy Markdown
Collaborator

开发主线交接(2026-10-12)

开发默认主线现为 wip/rust-core-go-extensions;旧单体 main 与 traditional 冻结于 3948a0a1ee1cefdd016a7aa45a11851545bb4b85。分支交接不是发布、部署或验收通过。原问题、源码基线、测试与未完成项保留;旧单体路径仅作历史证据,后续先在微服务源码重新确认并按职责移植,不回灌旧数据库/权限/资金实现。

主线/S11 跟踪:#895。Extore 商品同步:#894,未验收,禁止部署,尤其禁止合并/推送 Extore main。

本 PR 的候选实现和已有验证范围保持原样;不因主线交接自动合并或标记验收完成。

范围

继续 A03,目标 wip/rust-core-go-extensions。基线 a28f06e88b7adf3701937f2a4018689bdc96ad85,最新提交 13132f5b0abfc58908278d9e67789e0b283c7ed6。

已实现离线开账 writer;完整 A03 尚未验收,保留 Draft。不代表真实历史资金已迁移。

实现

  • 原 migrate-legacy-financial.py 保持只读。新 financial_import.py 分为 prepare / apply / resolve,不靠删除拒绝开关开放原脚本。
  • 重新解析既有冻结导出,绑定归档、逐行来源、完整身份映射、已导入身份回执、预留款证明及独立的来源单位审查;未知 Key、订阅和其他权利不自动启用。
  • 绑定目标 system identifier / OID / 启动时刻 / nonce / NOLOGIN owner、实际 schema catalog、对象所有权和权限,以及全表和序列状态。
  • 原始 SQL 和完整材料需显式离线批准。临时连接在取得原导入共用会话锁后开启 SERIALIZABLE 事务;开账余额、历史计数及回执原子提交。
  • 同 ID 同材料严格重放;同 ID 异材料及异 ID 冲突拒绝;检查独立钱包、欠款、返利、预留账户和未来交易平衡。
  • 提交回执丢失、超时或提交后检查异常一律 UNKNOWN。保留原 SQL、材料及尝试身份;只读 resolve 查原 ID,不自动换 ID 或盲重试。
  • 提供全表和序列状态摘要,精确核对无关业务状态。序列使用事务性 RESTART。

本轮修复 — 13132f5b

基于 f18e552f 正常推进原分支,仅三个 A03 文件,+158/-10。没有修改共享 schema、权限、入口、配置或 .github。

  1. 修复真实 PostgreSQL 失败。 上轮 CI 38211718340 已进入实库,其中五项开账/重放/恢复测试在 column reference "p" is ambiguous 处失败。生成的 PL/pgSQL 同时把 p 用作过程变量和查询行别名;本轮只将过程变量改为 v_payload,不删除校验。
  2. 提交上轮未推送的材料完整性补丁。 verify_source_files 在提交前及成功传输后重查源 catalog 和行数基准的文件哈希。缺失、内容变化、不安全权限或符号链接拒绝新提交;提交后变化保持 UNKNOWN,保留原尝试。
  3. 增加真实数据库中断测试。 在第一个账户开账已修改表及序列、但事务尚未提交时,终止唯一随机标识的合成测试 backend。要求全部表/序列回滚,只读 resolve 返回 NOT_APPLIED,再显式使用原材料执行。测试注入 SQL 不走生产入口;正常 CLI 仍拒绝被改动的 SQL。

本地实际验证

Python 3.13.5:

python3 -B -m unittest discover -s scripts -p 'test*financial*.py' -v
  • 修改前:147 项通过,10 项 PostgreSQL 测试跳过。
  • 修改后:151 项通过,11 项 PostgreSQL 测试跳过。本地没有 Docker/PG,不能将跳过计为通过。
  • 四个材料完整性回归测试方法在旧 writer 上实际失败(六个失败子场景),新 writer 通过。文件测试的目标传输仍为替身,不是 PG 证据。
  • 补丁在记录的父版本上 git apply --check 通过;实际应用后与测试源码逐字节一致。
  • 提交后的三个 Git blob SHA 与本地测试文件完全一致:writer 4597d9fb3809c695642ba0fbb33ca80e48cef9de;文件测试 601c19fbc323c1598d9a794e375b25e5098a319a;PG 测试 ae9cc35899aff0b490696ddc1c2d980703efff26。

CI 核验

现有 Rust 集成测试入口在 GitHub CI 启用专属、无网络、资源受限的 PostgreSQL 容器,不访问工作流共享数据库;完整金融测试共 162 项,其中 11 项为真实 PostgreSQL 场景。

本轮 Microkernel implementation checks — 38239181552 对合并候选 1a870a74f082a177ce071496d1c44b5fba150ddd 执行。目前仍在运行,尚未记录本轮实库通过结论。 Lint workflows 已失败,Rust/实库步骤按原工作流仍继续执行;整条 CI 不能因此标为通过。结果须以实际测试日志为准。

保留此前失败记录:f5398fd5 的容器临时服务器就绪误判及 Rust 格式问题在 f18e552f 修复;f18e552f 的五项 PostgreSQL SQL 歧义失败由本轮修复。此前 standalone Compose / native protobuf 问题未在本 PR 修改,也不借局部通过声称全部 CI 通过。

尚不能标记完成的部分

  • 真实源资金单位/预留来源审查,以及 S11 的真实源离线 apply、独立复核和最终组合验收。
  • 历史 Key 凭据、撤销与额度来源的接口和完整接入。
  • 历史订阅的时区、跨周期、never/无限等完整导入与使用链路。
  • affiliate 收益/追偿、bounty escrow 及其他跨业务权利接入,不能由 opening writer 伪造。

本轮没有生产数据库访问、真实资金操作、合并、发布或部署。不得据此关闭完整 A03 或标记 MIGRATED。

Reject intermediate clearing balance overflow, mixed source bindings and
counter ownership mismatches before producing opening material. Include
the preflight helper in tool source hashes and add 17 synthetic tests.

A03 partial delivery only: keep --apply disabled; no target database writes.

Copy link
Copy Markdown
Collaborator Author

A05 / #879 的历史退款接口依赖:目前读到本 PR 的 860da6d1 仍是开账预检,尚不能据此消费 LegacyPaymentBasis。

请在 A03 冻结的版本合同中提供:原始来源与记录摘要、目标账户/所有者映射、原 provider/merchant/environment/transaction 绑定、币种与原支付整数金额、可证明的历史额度换算依据、已退款与剩余可退累计值,以及对应的最小 Rust 账本动作和幂等/UNKNOWN 结果。新旧支付必须对同一 provider 交易统一防重。

A05 需要同时取得正常、重复/冲突、缺少换算依据、累计上限、部分退款取整、零额度差额及账户资金不足的合成输入/预期。没有明确来源时保持不可退款,不按当前汇率倒推,不创建假充值 intent,不把 opening 余额重放成原充值 journal。该请求不要求在此公开原始资金材料或数据库凭据。

A05 现有 native 回执恢复与运行组件已在 #879 推进,Go 支付包及独立 PostgreSQL 测试已由 CI 通过;历史退款仍需本合同后才能连接,不会由 Go 直接读写 Core 数据库。

Bind original source files, exact target instance/catalog/owners, identity
receipt and approved SQL. Commit opening balances, counters and immutable
receipt atomically; strictly verify replay and resolve lost acknowledgments
under the original session fence. Preserve unrelated tables and sequences.

Keep the existing planner SELECT-only. Add 27 contract/driver tests and
10 isolated PostgreSQL scenarios through the core integration test entry.
Local: 137 tests passed, PostgreSQL scenarios skipped (no local Docker).
Real-source import, subscriptions and Key rights remain separate acceptance;
no production operations, workflow changes, schema or runtime ACL changes.
…iles

Treat unexpected errors after SQL submission as UNKNOWN, never REFUSED.
Use type-sensitive source equality and compare snapshot boot instants rather
than timestamp spelling. Exercise the complete frozen-export prepare path
and private file gates with ten additional tests.

Fix the real PostgreSQL fixture readiness race: wait for the final PID 1
server rather than the image bootstrap socket. Apply rustfmt output from CI.
Local: 147 passed; ten isolated PostgreSQL scenarios await the next CI run.
The first run's failed fixture setup and Rust formatting remain recorded.
@LIghtJUNction LIghtJUNction changed the title [A03][WIP] 增加资金开账整批预检与累计溢出防护 WIP(A03): offline financial opening writer, strict replay and recovery Oct 12, 2026

Copy link
Copy Markdown
Collaborator Author

补充当前实库证据:f18e552f 的 PostgreSQL 测试已实际执行,157 项中 5 项失败,共同错误为 column reference "p" is ambiguous。

financial_import.py 的 DO 块声明了 p jsonb,精确回读和余额核对查询又使用 jsonb_array_elements(...) p,存在 PL/pgSQL 变量与 SQL 别名冲突。建议把循环变量和查询值显式分离,一并检查 opening、counters、余额核对的引用,再重跑严格重放、提交回执丢失恢复及回滚场景。

实际失败 job。这是当前代码/CI 核查,尚未独立运行修复;首次 apply 和 UNKNOWN 恢复仍不能标为验收通过。

…data

Rename the PL/pgSQL payload variable that conflicted with JSON row aliases
in five real PostgreSQL cases. Recheck transitive catalog/count evidence
before submission and after transport completion, retaining UNKNOWN on
post-submission changes.

Include the previously unpushed metadata regressions and an isolated
PostgreSQL backend-termination test covering table/sequence rollback,
read-only resolution and explicit retry of the original material.

Local Python 3.13.5: 151 passed; 11 PostgreSQL tests skipped without Docker.
PostgreSQL execution remains for the existing CI; no production access.
@LIghtJUNction

Copy link
Copy Markdown
Collaborator Author

本轮在固定 head 13132f5b0abfc58908278d9e67789e0b283c7ed6 做了只读边界核对,没有向此活跃分支写入另一套 importer,也没有重跑远程 CI。

A03 → A04 / A05 的后续建议先拆成两个明确交付,而不是继续把 opening writer 的局部测试扩写为全迁移通过:

  1. 面向 A04 WIP(A04): authorized history reads and bounded finance ZIP — 47 scoped checks passing #875 的只读来源视图与 source_contract_v1 收据,包含真实账户/Key/团队映射、历史/native 去重、金额依据与退款/作废核验;合成 fixture 只作字段合同,不作为来源完成证据。
  2. 面向 A05 fix(payments): recover accepted inbox and receipts across Go process crashes (A05 WIP) #879 的不可变原支付/退款基准;opening balance 不能替代原付款方、原 provider 绑定和退款可恢复证据。

另有共享验收工具的权限查询问题:runtime 未获得 core_migration schema USAGE,相关测试的名称查表断言会先报 namespace 权限错误。应由 S11 修正只读权限验证/查询方式,不能为使测试通过赋予迁移表写权限或 import 函数执行权限。这与 importer 的资金校验是两类问题,需分别记录,不互相抹掉。

Draft/未集成状态保持;没有生产导入、合并或部署。来源和支付交接继续在 #895 联合核验。

Copy link
Copy Markdown
Collaborator Author

补齐 PR 正文里仍写“运行中”的 CI 结果:已读取 run 38239181552 / protocol job 的结束状态和日志。

  • offline_financial_import_contracts_and_postgres 实际执行了 Ran 162 tests ... OK,对应 Rust 包装测试也为 ok。这是该次合并候选的离线金融导入测试证据,不是我本次重新执行,也不代表真实资金迁移完成。
  • 整条 run 最终仍是 failure:Lint workflows、Rust checks and real database tests、Native protobuf round trips and failure recovery 均失败。不能把这 162 项通过扩写为全量 CI 通过。
  • 其中日志显示 .github/workflows/s11-source-snapshot.yml:23 的 ShellCheck SC1083 使后续 Go host 构建步骤跳过;tests/relay_http.rs:1429 随后明确因缺少 LMM_RELAY_EXTENSION_BIN 失败。应先修共享工作流并恢复真实宿主构建,再验该场景,不能跳过断言来消除红灯。

建议将正文的 CI 状态更新为以上分层结果;现有 A04/A05 合同依赖、Draft 与未完成的组合验收继续保留。没有合并或部署。

@LIghtJUNction
LIghtJUNction merged commit 0e37c99 into wip/rust-core-go-extensions Oct 18, 2026
1 of 2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant