日期 2026-09-23 | 分支 java | 未 push | BASE 663156f → HEAD 5290d84
(BASE→2663020 是 39 提交 / 39 文件 / +11109 −27;其后又落了本件 §1.2 后记、§1.3 后记与 §六-3 那三笔
只改注释/SQL 记录的提交,以及 5290d84 的 R-7b 代码修复 —— 各自的行数见对应小节,本行不汇总。
★ 上面那个「39 提交 / +11109 −27」是 2663020 时点的读数,不是 HEAD 的读数。)
本件位置说明:本件故意放在
.claude/plan/,不放在 SDD 工作区 (.superpowers/sdd/2026-09-23-lsy-onboarding-B/)内 —— 工作区是 git-ignored 的临时件, 将来可能被清掉,而本件是要交给用户执行/裁定的东西,必须能活下来。 工作区里的task-10-delivery-note.md是草稿,本件是它 的订正与定稿。
★ 读数口径:凡标「我量」的,是我 2026-09-23 当天当场复量的; 凡引自其它件的,标出出处。本件不含任何我没量过的数。
| # | 文件(java/src/main/resources/db/) |
状态 | 依据 |
|---|---|---|---|
| 1 | lsy-onboarding-menu.sql |
✅ 已执行,且逐格复核通过 | 见 §二 |
| 2 | lsy-merchant-mch-no-uk.sql |
✅ 已执行(2026-09-23,见 §1.2 后记) | 原读数(当时为真):uk_lsy_merchant_mch_no 在 pg_indexes 0 行;表上现有 4 个索引无一是 mch_no 唯一索引 |
| 3 | lsy-review-status-comment.sql |
✅ 已执行(2026-09-23,见 §1.3 后记) | 原读数(当时为真):review_status 的列注释仍是旧文案「A 阶段默认 APPROVED;B 阶段由进件写入口与上游审核通知回写」,不含 PENDING/APPROVED/REJECTED |
★ 状态 2、3 是今天新量的,此前无人量过(草稿只写了「需要执行」,没写「执行没执行」)。 ★ 状态 3 的判据是看注释内容、不是看列在不在(列与注释一直都在,只差「改了没改」);配了「故意写错的列名 ⇒ 0 行」的反对照。
pay_lsy_merchant 全表只有 2 行(正对照:非空 ⇒ 上面的 0 是真没有)。mch_no='Y52211090004' 有 2 行,tenant_id 都是 2 ⇒ CREATE UNIQUE INDEX 必然失败。
脚本自带守闸(把失败换成一句人话),但它不替你删任何一行。/commit Y52211090004 会命中 rows.size() > 1
⇒ BusinessException(409);同一对行还占满 tenant 2 的两个唯一键槽位 ⇒ 对 tenant 2 调 /create 也撞
uk_lsy_merchant_tenant_level。admin(tenant 1)不受影响,联调路径通。上面第 2 行的「❌ 未执行」与本节全文是当时的真读数,保留不改;这里记其后发生的事。
id=1)。
依据与「有没有发布过」无关:A 的 description 是数据自己写的处置说明(「正式进件(子项目 B)后应删除」),
而 B 占着 tenant 2 的 enterprise_id IS NULL 租户级槽位(受 uk_lsy_merchant_tenant_level 约束)。logs/_lsy-dedup-exec.txt):
删除前逐字段断言通过 → DELETE 影响 1 行 → 重复分组 0 行、全表剩 1 行(= B)
→ 守闸 DO 块通过(未抛异常)→ CREATE UNIQUE INDEX 已提交
→ pg_indexes 5 条(旧的非唯一 idx_lsy_merchant_mch_no 仍在,脚本要求它必须还在)
→ pg_constraint(contype='u') 0 条(正常,脚本第 2 步已解释)。mch_no 插入 ⇒ UniqueViolation,报文点名 uk_lsy_merchant_mch_no;
换 mch_no 插入 ⇒ 成功(负对照)⇒ 拦下来的确实是这一条索引,不是别的约束或别的失败。
探针后复核:全表仍 1 行、id 仍是 B。mch_no 现在唯一,原先「按 mch_no 定位会命中多行」的后果不再可能触发。上表第 3 行原读数「❌ 未执行」是当时的真读数,保留不改;这里记其后发生的事。
logs/_lsy-comment-readonly.py,自带两个对照):正对照全表 1 行;
反对照(故意写错的列名)col_description ⇒ None ⇒ 查询不是「怎么写都命中」;
注释确为旧文案、不含 PENDING/REJECTED;列 DDL = 'APPROVED'::character varying | NO | 32
(与脚本自己的第 2 条核对项逐字一致);值分布 APPROVED × 1(落在词表内)。logs/_lsy-comment-exec.txt):COMMENT ON COLUMN 已提交 →
新注释里 PENDING / APPROVED / REJECTED 三个词全部命中 →
列 DDL 未变(默认值仍是 'APPROVED'::character varying / NO / 32)→ 值分布未变
⇒ 确实只动了注释,没碰表结构也没碰数据。用该 SQL 自己尾部的只读核对语句,执行前基线 → 执行后实测:
| 核对 | 执行前 | 执行后(实测) |
|---|---|---|
| 收付款目录 | 1 行 | 1 行(id=268, /payment/collection) |
| 页面行「商户进件」 | 0 行 | 1 行 id=272, type=2, order=4, 权限 …:onboarding:list, route_name CollectionOnboarding, route_path /payment/collection/onboarding, component_path module_payment/collection/onboarding/index, uuid 36 字符 |
| 两个按钮行 | 0 行 | 2 行(273 建号 …:create / 274 提交入网 …:commit) |
| 授权行 | 0 行 | 3 行,role_id 全是 1 |
| 反面对照(故意写错的权限串) | — | 0 行 ⇒ 上面不是恒真 |
「库里有行」≠「页面能渲染」—— component_path 对不上时前端会静默回落 404 页。
故我把整条链走了一遍:
| 跳 | 读数 |
|---|---|
| ① 库 | component_path = module_payment/collection/onboarding/index |
| ② 前端解析 | permission.store.ts:6 glob "../../views/**/**.vue";:206 查表键 modules['../../views/${component}.vue'];:207 兜底是 views/error/404.vue(⇒ 对不上不报错) |
| ③ 真文件 | frontend/src/views/module_payment/collection/onboarding/index.vue 存在,31470 B |
| ④ 组件名 | 该文件 :242 defineOptions({ name: "CollectionOnboarding" }) = DB 的 route_name 逐字相等 |
| ⑤ 叶子判定 | permission.store.ts:203 只有叶子才挂组件;页面下挂着 2 个 type=3 按钮 ⇒ 若按钮进路由树就不是叶子。实测判否:UserService.java:623 与 :636 两处都 .in(MenuEntity::getType, List.of(1, 2, 4)) ⇒ 按钮被排除在建树之外 |
★ 仍未证明的:页面在浏览器里渲染成功(需登录态 + 后端在跑)—— 那是 §五 的 Step 3b。
(a)4 项凭据(配置 + 环境变量,默认值全空,缺失时由 LeshouyingProperties.missingOnboardingCredentials() 一次列全挡在入口):
| 配置项 | 环境变量 |
|---|---|
leshouying.channel-id |
LESHOUYING_CHANNEL_ID |
leshouying.bd-id |
LESHOUYING_BD_ID |
leshouying.channel-type |
LESHOUYING_CHANNEL_TYPE |
leshouying.rate-code |
LESHOUYING_RATE_CODE |
(b)上游需配置的 1 项:进件审核通知地址 leshouying.onboarding-notify-url / LESHOUYING_ONBOARDING_NOTIFY_URL(默认空)。
我们的接收端是 POST /payment/collection/notify/onboarding,免登录(靠验签)。
⇒ 交付时要给上游一个公网可达的地址。
reg_capital / fSettle_account_type / actual_addr / business_scope / check_code /
lease_contract / p_cashier 等)没进必填矩阵;字段照常进 DTO、照常上送(不收 ≠ 放行)。
代价若判错:通道落定后操作者漏填会被上游拒(报错点在上游,请求体在日志里,可当场比对补)。/api/info/bank 选择器要不要补。 account_bank_code 已从「平台级凭据」改正为
商户自己的结算账户开户支行(逐商户填)。本批次不实现该接口,联行号手工录入。rate_code 的归属未定:平台级还是逐商户。 现按平台级配置项实现(DTO 里留了可覆盖字段)。
代价若判错:若其实逐商户,操作者会用同一个值给所有商户进件 ⇒ 费率错。frontend/。
修复轮造出一台可执行验证台(真 @vue/compiler-sfc + 真 vue,驱动页面真 setup(),只桩 @/api 与上传子组件):
.superpowers/sdd/2026-09-23-lsy-onboarding-B/task-9-fix1-harness.mjs(10796 B / sha16 7f07de4099c96a23)。
它钉的是行为不是文本(主控实测两向变异:改前 pass=16 fail=9 → 改后 pass=25 fail=0;重引同一缺陷仍红 4 条)。
三条路:① 收编为正式测试 ⇒ frontend/ 需引入测试入口(该目录目前无测试框架);
② 只留文件 ⇒ 它留在批次工作区里,而工作区可能被清;③ 随工作区丢弃 ⇒ 下次同类页面要重造。
局限(务必一并考虑):模板不渲染 ⇒ 只证明函数判定逻辑、不证明浏览器表现;
exit code 恒 0 ⇒ 判成败只能读 SUMMARY 行。
★ 注:该台子在工作区内,若采纳 ② 需先把它挪到工作区之外。菜单 SQL 已执行(§二)⇒ 「页面 404」这个旧阻塞已解除。现在缺的是一个管理端登录。 ★ 我此前检索文档找登录凭据的尝试被权限层判为 [Credential Exploration] 并拒绝; 我已停止,且不会绕行。此项等用户提供登录方式(或由用户自己跑一遍)。
按 GC7,凭据到位前不部署、不联调。代码侧已就绪。
id=1)、
uk_lsy_merchant_mch_no 已建成并通电验证。本条原读数是「今天仍开着(我量:那 2 行还在)」,那是当时的真读数;读数见 §1.2 后记。tenantId/mchNo;
但上游那次 HTTP 建号不能纳入本地事务(出站调用不回滚)⇒ 这个状态依然可能出现。
本轮没有补偿、没有对账、没有自动重试;运维只能靠人走既有 save 手工补一行。要真正关闭需新开任务。5290d84,
测试 647 绿;两向变异 4 条逐条读数见 .superpowers/sdd/2026-09-23-lsy-onboarding-B 的加记 86)。
修法:在 LeshouyingOnboardingController 上加控制器局部的
@ExceptionHandler(LeshouyingApiException.class),不动全局 advice。回
HTTP 200 + 业务码 502(理由:业务失败在本仓的既有出口就是 HTTP 200 + 业务码,调用方按业务码取
msg 展示 —— 回 HTTP 502 反而让文案到不了操作员眼前;取 502 而非 500 是为了与兜底分支可分辨)。
★★ 文案分两句,判据取 HTTP 语义而不是路径名单:本控制器七个端点里六个走上游
(/create 建号、/commit 提交、/upload-image 上传、/update 更新商户、/areas 与 /mcc
取参考数据;只有 /page 只读本地库)。GET(/areas、/mcc)是读 ⇒ 重试安全,回「数据获取未成功,请稍后重试」;
非 GET 是写 ⇒ 回「请求未能完成,无法确认是否已经生效(不得当作失败直接重试,请联系管理员核实)」。
若改用「哪些路径是写」的名单去枚举,将来往本控制器加端点就会漏,而漏的方向恰好是
「新写端点拿到可重试文案」—— 正是本条要防的那件事。
★ 2026-09-23 这条判断被实数验证了一次:本条之后新增的 POST /update(提交 1af6ef2,
§七 第 7 行)一个字都没改这个 handler 就自动拿到写腿那句防重试文案 —— 正是因为判据是
HTTP 方法而不是路径名单。若当初写成名单,这就是那个「漏」的实例(且方向正是有害的那一侧)。
★★ 上面那条 GC1 警告被照办了:e.getMessage()(逐字形如「乐收赢接口失败[HTTP_504]: …」)
只进日志,一个字都不进应答;这一条由用例的两条 not(containsString(…)) 断言钉住,
并做过变异(把 message 拼进应答 ⇒ 那两条当场红)。
★ 本条原来的读数(保留,那是当时的真读数):LeshouyingApiException 无 advice 分支 ⇒ 落 catch-all。
超时意味着上游可能已经建号,而 500 的语义就是「重试」⇒ 重试会再建一个上游商户。
★★ (原)给将来修这条的人的 GC1 警告:LeshouyingResponseParser:103 的异常 message 含上游名号,
今天到不了租户眼前(catch-all 换了通用文案);若照 BusinessException 分支加一条回传 e.getMessage() 的分支,会当场违反 GC1 ⇒ 必须先消毒 message。
★ (原)2026-09-23 复量:前提仍成立,落点已定位。 全仓唯一 advice 是 GlobalExceptionHandler
(5 个分支,Exception 那条是 catch-all),没有 LeshouyingApiException 分支;
LeshouyingOnboardingController 也没有自己的 @ExceptionHandler。
⇒ /create 里 onboardingService.createMerchant(body)(:183)抛出的上游异常不被 :184 那个 try 覆盖
(它只包本地落库那一步)⇒ 逃逸成 catch-all 500。:181 之后、:183 之前无任何兜底。
★ 现成先例别漏:LeshouyingOpenController:301-309 已有一条 @ExceptionHandler(LeshouyingApiException.class)
(回 Result.of(500, "处理未成功,请稍后重试"))—— 但它是控制器局部的(类上是 @RestController,
不是 advice,见 :266 的注释解释了为何故意不用全局 advice)⇒ 只覆盖那 7 个 open API 端点。
修管理端时可照它的形状,但文案要换成防重试口径(open 侧那句「请稍后重试」在这里是有害的)。LsyMerchantUpdateDTO 带 rateCode,更新腿会用它覆盖平台费率。
今天不可达(生产代码无调用方、无控制器绑定)⇒ 将来给更新腿开 HTTP 入口时必须加同样的封盖。mchNo 原值(该方法对自己的日志做了消毒、对这个 message 没有)—— 需上游返回含换行的商户号才成立;
仓里已有同形先例。裁定:不修,届时随统一消毒一并处理。LsyOnboardingService.java:363-365 那句
「它们只活在下面这段解析代码里」)—— 实测该串在本文件出现 **6 行 = 1 行代码(:396)
:160/:358/:391/:416/:442),故「只活在」严格读不成立**。
裁定不改:该句要证的目的(这一串不进对外文案 ⇒ 不触 GC1)已实测成立,且误导线方向无害;
要把「只活在」换成可证的说法,需先做全仓普查 —— 本批不做,登记在此。类级 @RequestMapping("/payment/collection/onboarding")。
| # | 端点 | 权限串 |
|---|---|---|
| 1 | GET /page |
module_payment:leshouying:onboarding:list |
| 2 | POST /create |
…:onboarding:create |
| 3 | POST /commit |
…:onboarding:commit |
| 4 | GET /areas?level=&parentCode= |
复用 …:create |
| 5 | POST /upload-image(multipart,部件名 file) |
复用 …:create |
| 6 | GET /mcc?level=&parentId= |
复用 …:create |
| 7 | POST /update |
复用 …:create |
★ 4/5/6/7 复用 create 串 ⇒ 菜单 SQL 一个字不用改。
★ 第 7 行是 2663020 之后追加的(提交 1af6ef2,2026-09-23):R-7c 登记的是
「LsyMerchantUpdateDTO.rateCode + LsyOnboardingService:500 是同一 mass-assignment 的更新腿,
今天不可达(updateMerchant 无生产调用方、无控制器绑定),将来开 HTTP 入口时需同样封盖」。
用户指示「把修改商户的入口开出来」⇒ 那扇门开了,封盖与门一起装(不是开一扇裸门):
闸与 /commit 同形(requireTenantId() → requireByMchNoForTenant),两道 reject* 排在闸后、
服务调用前。★ 三条权限串与 lsy-onboarding-menu.sql 里 INSERT 的三条逐字相等(我量:DB 里那 3 行对得上)。
★ 前端入口随后补上了(用户裁定「把前端的 /update 入口也补上」):不新开页面, 进件页顶部加一个「建号 / 更新」模式切换,两条腿共用同一张表单与同一套级联 —— 因为更新腿的字段集就是建号腿那张表减去两个(见下)。前端侧的要点:
onboarding.ts 新增 updateOnboardingMerchant(第 5 个调用)。body 是 mch_no + 白名单,
空白字段整个省掉 —— 上游更新是增量语义,留空 = 保持原值(不是清空)。merchant_name_business(上游逐字「创建后即固定,无法修改」)、
lease_contract(创建页有、更新页没有)。两者都不在 LsyMerchantUpdateDTO 上 ⇒
发出去不是「被忽略」而是 HTTP 500(FAIL_ON_UNKNOWN_PROPERTIES)。
前端配了两道独立防线:更新模式下这两格不渲染(渲染出来 = 提供一个按下去必 500 的
入口),且键白名单里也没有它们。后者不能省 —— switchMode 有意不清空表单
(41 个框,误点一下不能毁掉已填内容),所以「建号模式下填过、再切到更新」的值仍留在
form 里,只靠「不渲染」挡不住。license_stt / account_type / legal_cert_stt /
account_idcard_stt / reg_capital / fSettle_account_type / actual_addr / business_scope /
check_code / p_cashier)—— 不是漏做:后端那张中文标签表是创建页 62 个参数的表,
它的键集被一条 assertEquals 钉死,这 10 个键一个都不在里面。要补得先从更新页参数表逐个转录。
⇒ 后端收 50 个,两支独立量法逐位同值:① updateMerchant 方法体内 putIfNotBlank
调用点 = 50(正控:全文件 putIfNotBlank( 出现 51 次 = 定义 1 处 + 调用 50 处,
且没有调用落在 updateMerchant 之外);② LsyMerchantUpdateDTO 的 private String
字段 51 个、去掉 mchNo = 50。
⇒ 前端能发出 39 个(执行级台子实跑倒出,不是从注释抄)。差的 11 个 = 上面那
10 个无入口的 + rate_code(有意封盖,不是漏做 —— 前端连输入框都不该有)。
⇒ 这中间的差是已知边界,不是缺陷。
★ 这 39 个与后端那 50 个做过跨端键名核对(fe-update-keycheck.mjs,把两边键集放在
同一个 node 进程里做集合运算):前端键集 ⊆ 后端键集,多出 0 个。这条不能省 ——
前端键名拼错不会当场报错,只会变成线上 HTTP 500。① 进件页与 7 个端点今天只对 admin(超管)可用。 lsy-onboarding-menu.sql 只授 role_id = 1,
故意不授 role_id = 2 —— 因为 /commit 的租户归属闸依赖一张调用方自己可写的映射表,
而 role 2(活库实测 17 个用户)本就持有那条写入口所需的读权限(merchant:list)。
⇒ 这是有意的收紧,不是漏授;租户用户看不到页面属预期行为。已在 §二 复核:授权行 3 行、role_id 全是 1。
② 「进件是租户自助还是仅管理端」待用户裁定 —— 这个答案决定 ① 是临时收紧还是终态。
③ save / delete 由读权限 merchant:list 守着,而那张映射表调用方可写 —— 既存面,不在本批修,如实登记。
草稿 §六-2 写「SingleImageUpload.vue 不在 Task 9 的 diff 内,改它要动共享组件 ⇒ 越界」。
「不在 diff 内」是假的(我量:git log 663156f..a9d1b83 -- <该文件> 只有 c48c253 一条,而它就是 Task 9;
整支包里文件头命中 1,配了正对照)。
但「不修」仍对:c48c253..HEAD 对该文件零改动,其全部内容是加法
(一个可选 prop uploader + 一段 if (props.uploader) 分支),catch/onError 路径一个字符没动
⇒ 双提示确属既有行为,本批次既没引入也没改过。
⇒ 正确理由:双提示落在既有错误路径上,去修它属于改动既有共享行为、超出本任务范围。
(「越界」不是文件级禁令 —— 本批次已经动过那个共享组件,且动得是加法。)
mvn clean test:645 绿(Tests run: 645, Failures: 0, Errors: 0, Skipped: 0),跑在三个提交全部落地之后。mvn clean test:647 绿(Tests run: 647, Failures: 0, Errors: 0, Skipped: 0),
跑在 5290d84(R-7b 修复)落地之后(clean ⇒ 报告目录是本次的,49 个 surefire
报告文件全部解析到汇总行、无失败类)。相对上面 645 的增量 = +2,正是 R-7b 新增的
两条用例(createEndpoint_upstreamCallFailure_isNotCatchAll500_andForbidsBlindRetry
与 areasEndpoint_upstreamCallFailure_saysRetryable_notTheWriteEndpointsAntiRetryCopy)。
★ 上面那条「@Test 计数 646」是 2663020 时点用另一支量具(数注解)的读数,
本轮未用同一支量具复量 ⇒ 不要把它与 647 相加或相减(两者量法不同,本件不替它推数)。70bb22a、2663020 也都是 645 绿(BUILD SUCCESS)。
两者「逐字节无行为变化」的完整证据(2663020 这一版两侧的 class 读数都是我自己采的):
① 行数不变(CR=1485 / LF=1485,无孤立 CR/LF,行尾仍 CRLF)⇒ LineNumberTable 不变;
② LsyOnboardingService.class 的 sha256 改前改后完全相同(909cf5898485a6cc…f0e337c,25444 B);
③ 该 .class 的 mtime 晚于源码 mtime(70bb22a 那轮 +34.4s;2663020 这轮 +41.3s)
⇒ 是拿改后源码编的,不是陈旧产物(这一条是必须的:sha256 相同分不清「没变」与「没重编」);
④ ★ 「javadoc 文本不进 .class」已从推断升级为直接实测:在 class 原始字节里搜 8 条 javadoc 探针
全 0 命中,同时 3 条代码字面量正控命中 1/1/2 ⇒ 量具是活的、这个 0 不是空的。
★ 一处不成立的理由已订正:70bb22a 那轮我写的链条是「行数不变 ⇒ javadoc 不进 class」——
那是 non-sequitur(散查复评指出,我接受):行数不变保住的只是 LineNumberTable。
上面第 ④ 条才是这件事的直接证据。@Test 计数 BASE = HEAD = 646;测试文件 49/49 ⇒ 收尾轮未增未删用例。0ddb002 → a9d1b83)净 diff 66 行,全部是注释(SQL -- 12 + javadoc * 34 + java // 20,
非注释 0)⇒ 无行为改动。三个来源、三支量法同判。java/src/main/resources/application.yml 的 redis.host: redis → localhost
(本地开发用,不属于本批内容;按本批实测结论 mvn test 不依赖 Redis ⇒ 影响 nil,且不会随交付出去)。
另有两个已跟踪的旧日志文件在工作区被删(logs/payment-platform.2026-07-1{5,6}.0.log.gz)—— 本批所为之外,会话开始前即如此。已回件。结论:无需修复 —— 0 条接缝缺陷、0 条安全缺口、0 条规格漏做/多做,
只有 1 条 Low 注释一致性问题(已修,见 §11.1)。范围 663156f..a9d1b83
(37 提交 / 39 文件 / +11109 −27;评审包 759216 B / sha16 741317ea91daea47),
按「接缝 / 整批规格符合性 / 安全 / 一致性」四个方向独立复量。
报告落在 .superpowers/sdd/2026-09-23-lsy-onboarding-B/final-review-report.md。
70bb22a)LsyOnboardingService.java:342 的小标题写「③ 组装:三处取值不属于调用方」,被它自己引入的
第三条(:349「rate_code:DTO 有值以 DTO 为准」)推翻;实现 :1225 也是 DTO 优先
(isBlank(dto.getRateCode()) ? props.getRateCode() : dto.getRateCode())。
⇒ 照小标题读会得出「rate_code 是平台级、调用方设不了」,进而删掉计划 §0.8 特意留在 DTO 上的覆盖口。
★ 同一段的第二处是我复量出来的,评审漏了并且主动开脱::352 写「其余 54 个字段原样透传」。
评审的开脱理由(「55 − 1 = 54,算得对」)自己就不自洽 —— 它给的分组 4 + 2 + 1 + 54 = 61 ≠ 60。
真值是 53,两支独立量法逐位相同:DTO 共 55 个字段,category 只用于派生那两个码值、自身不上送,
rate_code 又已在上面单列 ⇒ 原样透传 = 55 − 1 − 1 = 53。
已一并改掉,并把 53 写成可自检的算式,以免下次再靠人脑心算。
git diff <range> -- <path>。progress.md 与 25 份 _addendum*.md 它没有通读;派发件里那份「已裁定、不要重复报」
的清单,它是照转述采信的,没有回台账逐条核对。LeshouyingSensitiveTest 的 300–452 段)。LeshouyingSigner.verify 的签名原文规则只读了代码,没有独立构造向量做实证。fe-update-harness.mjs 执行级台子(编译真 SFC、跑
frontend/ 里那份真 vue、驱动真函数、只桩掉 api 与上传组件)43 条全绿,外加
4 条两向变异与 2 条 ts:check 可见性变异。仍未做的是浏览器里的验证
(本仓 frontend/ 无测试框架、ts:check 有非零历史基线,「跑绿了」在这里不成立)。LeshouyingProperties.validate() 的启动拒绝路径未实测。修复提交 70bb22a 的散查复评已回件,结论「通过」 —— 那 2 行改得对,没有把一处假话换成另一处。
它用第三种量法(按值表达式形态)独立算出 53,与我的两支同值;并逐键做集合比较确认
测试夹具的「54」与实现的 53 不矛盾(fixture DTOSEC − {rate_code} == 实现的 53 个透传键)
⇒ 与 §11.1 的结论一致,夹具不需要改。
★ 它同时报了 3 条我漏掉的同形缺陷,全部落在本轮未改动的行上(结论对、定语/因果句错)。 三条我都用自己的量具独立复现后才动手:
| 位置 | 原句错在哪 | 我复现的读数 |
|---|---|---|
:305–306 |
「后两个里的 inst_no 与 sign」 |
枚举序是 inst_no/trace_no/sign ⇒「后两个」= {trace_no,sign},点错了对象;LeshouyingClient.signedPayload:382–383 实测补的正是 inst_no+sign |
:307–309 |
构成式 3+4+2+54 = 63 |
真值 = 60 个 map 键 + inst_no + sign = 62;rate_code 被同时算进「配置四项」与「DTO 的 54 个」,数了两遍 —— 且这与我上轮 :352 写的「上面单列的 rate_code」直接矛盾 |
:313–316 |
凭据闸写「四项」 | 实测是 五项(missingOnboardingCredentials():230/233/236/239/242 五条 isBlank),漏的是 channel_type;而它不在那 60 个键里(生产代码只有 mccList:749 读它)⇒「凭据缺失时连报文都补不全」在「只有 channelType 缺」下不成立 |
:352(我上轮自己写的) |
「只用于派生的 category」 |
.getCategory() 生产读点实测 4 处,除 :1189/:1190 派生外还有 LsyMerchantRequiredFields:313(选必填集)⇒「只」在排他读法下偏 |
已一并修复,提交 2663020(1 文件 / 8 增 8 删 / 全注释行 / 行数不变 ⇒ .class 逐字节相同,见 §10)。
改法逐字::305「后两个里的」→「其中」;:307「配置四项(… / rate_code)」→「配置三项(…)+ rate_code(规则见 ③)」;
:309 的 54 → 53(⇒ 3+3+1+2+53 = 62,同时消掉与 :352 的自相矛盾);
:314 改为「凭据闸共五项,其中四项本身就是报文的一部分…(第五项 channel_type 只喂 MCC 那条腿)」;
:352「只用于派生的」→「自身不上送的」。
2663020 是本批最后一次注释订正轮。 之后再发现同族问题(定语 / 因果半句 / 计数)只登记 + 裁定,不改 ——
这四条全部落在注释上、.class 逐字节未变,继续改只会让「已评审范围」反复失效而不改变任何行为。
该例外条款(「若复评说新句子本身有假话则照改」)已用掉且未触发:第二轮散查复评判「通过」,
四条原问题都真消掉、四个新句子逐句实测无新假话、算术式 = 62。
它另独立量到两条我改时没量的读数:① :314–315 的「其中四项」恰好等于 :307 的「配置三项」∪{rate_code}(两处不再打架);
② :309 的 53 与 :352 的 53 逐键集合相等(双向差集皆空),不是「数字对、集合不对」。
⇒ 本范围内已闭合,不再改动(详见台账加记 82、83)。
★ 一件已知偏离(两轮同样):技能要求派发时显式指定模型(并点名末轮用最强),
但用户既有约束是派发不传 model(实测会 400 打死派发)⇒ 按意图执行、未传 model。
此项已写进台账加记 75 §二。