docs(p1-verify): 记录 P1 后端 real-PG IT 验收(19/20 类零失败)+ 接入配方与 SOCKS 代理坑

接通共享远端 PostgreSQL(100.64.0.8:5433,PG17.10)真跑全部 20 个 P1r*IT:
19/20 IT 类零功能失败(~95 用例绿),覆盖 completed-approval、Flyway 迁移、
events-publish outbox 后端路径 + New-API live 调用——此前"86 个 needs_verification
须真实 PG、本地不可验/环境阻塞"的判断被实测推翻,后端获机械绿证据(非假绿)。

唯一红:P1rKnowledgeFlywayMigrationIT 硬编码断言 V14 而 schema 已到 V21(陈旧用例,
源自 commit 7155285、非本轮改动),应改为动态读取最新版本;已登记总账 TODO。

沉淀(避免重蹈):
- .agents/knowledge/external-deps-and-gotchas.md §四:跑 real-PG IT 的完整配方
  (test 阶段 + -Dtest=<IT类>,避开 verify/integration-test 的 repackage 破坏跨模块编译;
  库名须 _test 结尾且会被 flyway.clean;locations 恰为 filesystem:sql/muse;密码只走 env)
  + **本机 HTTP_PROXY 致 JVM socksProxyHost 破坏 PG 原始线协议**(EOF 误判为密码/pg_hba)的
  判定与修复(-DargLine='-DsocksProxyHost= -DsocksProxyPort=');PG 实为 17.10。
- 进度总账:时间线 + "环境阻塞已解除"状态订正(诚实标注 FE / 唯一红 / live opt-in 仍未达)。

注:验收用共享 _test 库(各 IT 专属、isolated、flyway.clean 重建);本轮新建的 3 个
muse_it_*_test 已 DROP 清理;远端 PG 凭据由用户提供、未入库。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
lili 2026-06-14 08:19:01 -07:00
parent d38260fc51
commit 1a76a14995
2 changed files with 24 additions and 0 deletions

View File

@ -31,3 +31,24 @@
- **studio(Vite + React + TS6.0)**:`erasableSyntaxOnly` 禁用 constructor 参数属性;`exactOptionalPropertyTypes` 下可选属性需规避写法;采纳/Diff 用 **Coarse-to-Fine 分级 Diff** 规避 3000+ 字正文上 O(N×M) LCS 性能爆炸;MSW 仅 `import.meta.env.DEV` 启用。
- **admin(Vben)**:`museAdminApi` 只拼 `/muse/**`(baseURL 已是 `/admin-api`,否则双前缀 `/admin-api/admin-api`);路由测试**不能**放 `src/router/routes/modules/**`(会被 Vite 动态路由 glob 当业务路由);Opsera pre-commit 缺失时跳过用 `touch /tmp/.opsera-pre-commit-scan-passed`
- **git 边界(未决)**:`muse-admin/``.gitignore` 作"独立子仓库边界",源码靠 `git add -f` 纳入——长期纳管方式待定(见进度总账 TODO)。
## 四、跑 P1R real-PG 集成测试(IT)的配方 + 本机代理坑(2026-06-14 实证)
**结论先行**:P1 后端 20 个 `P1r*IT`(completed-approval / Flyway 迁移 / events-publish outbox / live-acceptance)**可在共享远端 PG 上真跑验证**。2026-06-14 实跑 **19/20 IT 类零功能失败**(~95 用例绿,含真实 New-API live 调用)。唯一红:`P1rKnowledgeFlywayMigrationIT` 硬编码断言 V14,而 schema 已到 V21(陈旧用例,非功能缺陷,源自 commit 7155285,非本轮引入)——这类硬编码版本号的迁移断言随 V15-V21 增长会失效,需改为动态读取最新版本。
**▲ 最大坑(排查极久):本机 env `HTTP_PROXY=HTTPS_PROXY=http://127.0.0.1:7897` → JVM 取 `socksProxyHost=127.0.0.1:7897`,把所有 Java socket 走 SOCKS;转发 HTTP 正常,但破坏 PostgreSQL 原始线协议(发完 StartupMessage 即被 EOF,认证前关闭,极像 pg_hba/密码错)。** `nc`/`curl` 直连正常,只有 JDBC/JVM 中招;且 `env -u HTTP_PROXY` 清不掉(socksProxyHost 由 JVM 层注入)。
- 判定 PG 真可达:`printf '\x00\x00\x00\x08\x04\xd2\x16\x2f' | nc -w5 100.64.0.8 5433 | xxd``N` 即 PG 在说话(纯 nc 直连,不经代理)。
- **修复:给 forked 测试 JVM 加 `-DargLine='-DsocksProxyHost= -DsocksProxyPort='`**(清空 SOCKS,JVM 直连 tailnet);代码内可用 `new Socket(java.net.Proxy.NO_PROXY)`
**跑单个 IT 的配方(已验证)**:
```bash
export MUSE_POSTGRES_PASSWORD=<root 密码;来自 infra.env / 用户提供,勿入库>
mise exec --cd muse-cloud -- mvn -pl muse-server -am test \
-Dtest=<P1r...IT> -Dsurefire.failIfNoSpecifiedTests=false \
-Dp1r.flyway.url='jdbc:postgresql://100.64.0.8:5433/<专属_test库>' \
-Dp1r.flyway.user=root -Dp1r.flyway.locations='filesystem:sql/muse' \
-DargLine='-DsocksProxyHost= -DsocksProxyPort='
```
要点:① 用 **`test` 阶段 + `-Dtest=<IT类>`**(surefire 显式点名即可跑 `*IT`),**别用 `verify`/`integration-test`**——那会触发 `package`/spring-boot repackage 把 member-server 等打成 fat jar,破坏跨模块编译(`package ... does not exist`),且 surefire 会先跑到平台陈旧红(`QiniuSmsClientTest` 时区)而中止整个 reactor。② `p1r.flyway.url` 库名**必须 `_test` 结尾**(IT 有 assertTestDatabaseUrl 守卫 + 会 `flyway.clean()` DROP 全库,**绝不能指 muse_local / muse**);各 IT 用各自专属 `_test` 库(`muse_p1r_*_test` 系列已存在;缺的用 root `CREATE DATABASE`,跑完可 DROP)。③ `p1r.flyway.locations` 必须**恰为** `filesystem:sql/muse`(IT 断言该精确字符串,再从 `user.dir` 上溯定位 `sql/muse`)。④ 密码**只走 env**(`MUSE_POSTGRES_PASSWORD`/`P1R_FLYWAY_PASSWORD`;IT 有 assertNoPasswordSystemProperties,用 -D 传会红)。⑤ live-acceptance IT 需 `set -a; . scripts/dev/p1r-external-acceptance.env; set +a` 载入 token,且部分用例额外需 `MUSE_P1R_EXTERNAL_ACCEPTANCE=true` 才真跑(否则 assumeTrue 跳过、显示 Skipped)。
> 远端 PG 实为 **PostgreSQL 17.10**(§一表内"15"为旧记,以此为准),超管用户 `root`;本机无本地 PG(127.0.0.1:5432 关闭)。批量顺序跑见交付报告(禁止并发 maven,会损坏 target)。

View File

@ -44,6 +44,8 @@
> 整体只读评估 ≈ 76%:后端实现高、内部验证门禁中、前端用户端低、跨 BC 集成与机械门禁低(机械门禁项本轮已补 BC + 契约门)。
> **2026-06-14 更新 —— P1 后端"环境阻塞"已解除**:此前"86 个 needs_verification 须真实 PG、本地不可验"的判断**已被实测推翻**。接通共享远端 PG(详见 §四 时间线 + [.agents/knowledge §四](../../.agents/knowledge/external-deps-and-gotchas.md))真跑 20 个 `P1r*IT`,**19/20 类零功能失败**——completed-approval / Flyway 迁移 / events-publish outbox 等后端路径在真实 PG 上获机械绿证据(非假绿)。**仍未验证/未达**:前端 muse-studio(无 FE 运行栈);唯一红 `P1rKnowledgeFlywayMigrationIT`(陈旧硬编码 V14,待改为动态版本);live-acceptance 中需 `MUSE_P1R_EXTERNAL_ACCEPTANCE=true` 才真跑的用例;以及覆盖台账 completed≠端到端可用(FE 断链仍在)。
---
## 三、最大共性风险(跨模块,来自基线)
@ -73,4 +75,5 @@
2026-06-14 Agent 开发基建六砖(BC 门 + 契约门 + .agents 中枢 + 单一总账)+ 历史文档清理
2026-06-14 P1 harness 验证:消除 BC 违例 ContentMuseWorkOwnerFacade(content-api 端口 + AI 改消费)→ ArchUnit 豁免删除、门禁收紧(反向红 31 例 / 正向绿;13+7 单测)
2026-06-14 P1 market 写路径整改(ultracode):member 暴露 MuseAccountRecordProjectionApi 写端口 + DTO,market 5 类去 member.dal → 豁免清空、BC 门全绿;附带补正 round-2 knowledge 旧测试假绿(JDK21 scoped 实跑:BcBoundary 1/0F+0 违例、knowledge 5/0F、member 4/0F、market 5 类全绿、契约/loop/覆盖门全绿,BUILD SUCCESS)
2026-06-14 P1 后端 real-PG IT 验收:接通共享远端 PG(100.64.0.8:5433,PG17.10;破本机 SOCKS 代理破坏 PG 协议的坑)真跑 20 个 P1r*IT,**19/20 类零功能失败**(~95 用例绿,含 completed-approval/Flyway 迁移/events-publish outbox + New-API live)。唯一红=P1rKnowledgeFlywayMigrationIT 硬编码断言 V14(schema 已 V21,陈旧用例,源自 commit 7155285、非本轮)。配方+代理坑入 [.agents/knowledge §四](../../.agents/knowledge/external-deps-and-gotchas.md)。
```