资料文件真产出来了;E04/I01 补到验收线,顺手填了几个「墙拦住却不给路」的坑

**资料文件全链**(用户:审核资料这一步要真产出 word/excel/md/html,前端能渲、点资料名能开)
接手时这一步一个文件都产不出来 —— S3 剧本白纸黑字写着「file_ref 本 MVP 阶段可留空」。
文件是台账那一行的投影,不另存一份:
· 声明 `file:{titleColumn,bodyColumn,formatColumn}`,它同时是授权面(没声明就点不开)
· 现造真字节 —— docx/xlsx 是自己打的 OOXML 包(zip-write:store+CRC32,零依赖)
· 读回来渲 —— 解的就是造出来那份字节,渲得出来才证明文件是真的
· 件上 `data-file-of` → 工作区二级界面(Word 纸面/Excel 网格/渲好的 md/沙箱 html)+ 下载原件
放行落地前把每一份冻进 `sys.task_asset_file`(迁移 0029):归档件点开的必须是签字那一刻
那一份,而资料落在主数据上、试跑单不落正式表 —— 不存这一份,收工后一个都点不开。
工作成果里「产出的资料」自成一摞。Markdown 富文本渲染顺带销账(仍零依赖)。

**Harness**
· 画面按「这一拍办完之后」在办的那一步挑 —— 从前拿拍首的局面决定拍尾的事:
  收掉 S4、发出 S5 的卡,而屏上还摆着 S4 的只读件,人无处可填(墙要配路第四次现形)
· 验收「重做」真能退回重做,且打回后台账没动就不许再提交(软硬两段,不锁死单子)
· 立监听的授权面是清单声明;发卡的授权面是调人预算,不是计划项
· 读工具同参重调有兜底;空转写身后还有行动就不废串;finish 的 doneWhen 按写完后的草稿算

**界面**
· 翻件与翻页各归各位(从前二选一,多卡多页时页翻不动);没得翻写「—」不写 0/0
· 工作成果详情能翻份;表宽超出能横滑(E04/I01 抄版式时把 overflow-x 抄丢了)
· 查看面灰底滚过一屏变白 —— 两条独立的路都治了(沙箱内不同色 / 弹性子项不长个)
· 测试台「取不到」不再当成「还活着」

**活动**
E04 关系覆盖、I01 品牌内容各自补到验收线:判据全读基座数、判据指向的东西摆上卡面、
样例满载且名字 ≤14 字;提交前要裁的判据搬进说明书(模型会压拍,压过之后只有说明书还在)。

验收:e2e i01 4/4、e04 3/3 全部 released,资料在办中渲得出、放行后存了档点得开;
门禁 typecheck/lint/depcruise/1628 测全绿。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EEJX8Z7CHejvwmDQyPQuBX
This commit is contained in:
xcs
2026-08-24 10:26:45 +08:00
co-authored by Claude Opus 5
parent 70e83d0b09
commit 0aa2fc11b0
92 changed files with 13984 additions and 370 deletions
+243 -1
View File
@@ -3,7 +3,7 @@
> 一句话:组织的工作定义为可编排的工作流,工作流由**活动**编排而成;活动是完成一项任务的
> Agent 机制,系统外开发、安装即用。人只在责任点与放行点出现 —— 确定交系统,临场交 AI,落地交人。
## 现状快照(2026-08-02)
## 现状快照(2026-08-22)
- **三面一体**:设计中心 `/design`(九区:蓝图/触发器/流程包/活动库/工具箱/数据域/知识库/
大模型/**测试台:三格 —— 流程(投一封信)/ 活动(按契约填入参)/ 日志(历次试跑存档)**)· 运营中心 `/ops`(六区:驾驶舱/工作流/任务/员工/台账/系统)· 工作台 `/`。
@@ -783,6 +783,248 @@
截了才加省略号 —— 加了等于说「后面还有」。
实测:一单 8 行、6 行有抽屉、行高 34-36px 齐平,展开那两行 141/103px。
14 条新测(detailOf 五类 + 压下交代放行 + 首句去重)。
- **E04 关系覆盖与关键人经营修到验收线并全流程跑通**(2026-08-22,
`crm-relationship-coverage@2.0.5`,用户:「实现完成了但做的不好」)。接手时两天 18 次
试跑只 2 次 released、活单正熔断;收尾:**e2e 三案例(点名/月度/驳回循环)+ 浏览器
新客户建档路全部 released**,新客户路被拒 0(18 拍/216k/5 人环)。修死的账,harness 四刀:
①**finish 的 doneWhen 按写完后的草稿算**(从前拍首快照,「先写后 finish」这个被鼓励的
省拍打法被误拒,下一拍引擎又用同一份数据自动收步 —— 同一份数据两个裁决);
②**空转写身后还有行动就不废串**(「被拒停在谁那儿」把「写记账旗+发卡」整串弃权,
排在后面的发卡从没执行过,连拒五拍熔断 —— 值没变的写什么也没改,后面行动不该陪葬;
串尾/独苗仍拒,熔断检测靠它);③**调工具挂不上项不拦调**(授权面是工具白名单,
与「写的授权面是台账声明」同款);④**读工具同一份入参重调:第 2 次起出参标题带点名
警告(不算被拒),期间没写过东西的第 5 次才拒**(实测模型把 recompute-score 连调 10 次
赌分数变卦 —— 26 次调用烧穿预算的前科在案而 stalledTurns 只数被拒,成功的重调无兜底)。
活动包三处结构治:⑤**S5 记账旗退役**(receipt_confirmed_total 是模型写的「人环凭据」,
S4 一过它顺手写旗就坚信 S5 办完,[写旗+finish 被拒]×5 熔断两轮;门改读基座数
receipt _rows/_missing —— 回执四列全是人在件上填的,被叫的那一方无账可记);
⑥**收口拆两项**(S6_writeback 写回主数据 / S6_ledger_update 只写明细+结论 ——
三拍纪律写得再明白,模型照样把四张表挤一串,串尾最费字数的明细表被截成空数组;
拆开后剧本只摊自己那几张表,串想长也长不起来);⑦**case:openedAt 真的进 Agent 作用域**
(说明书让拿它铸 round_ref 而这个键从前只注给视图渲染 —— 模型只能编,正式表里一有旧号
就照抄,测试台里所有单共用同一个案号、跨单主键相撞;现注真实开案时刻含年秒,跨单唯一)。
S5 指南改「唯引擎 worldTouched 事实行是从,别自己数 card-reply」——轨迹里躺着 S2/S4 的
card-reply,模型对不准归属,连续三拍幻觉「回执已交回」(措辞治不了的结构治第 N 课:
**指南让模型判的事,引擎已有现成事实的,一律改成读事实**)。视图照目标件 §6.2 补齐:
关联任务(engines 注入 case:taskId)、步骤行、页脚案号、执行工单1 编辑闸措辞
「AI 已识别 N 个客户」(绑基座读数)、计划表补时间点列(判据③指向的东西must在卡面)、
回执对象列「客户 · 关键人」、结果摘要/客户反馈照目标件换 **textarea**(渲染器补
textarea 孪生:值进正文、collect/镜像/增删行全链)、台账更新确认补「依据/编码」次行
(三条 L4 从前让人判他看不见的东西)。verdict.trigger 改名 trigger_label(与入参同名,
首帧摆英文码);plan.status 死列退役;建档卡写的六列补进声明(授权面);两条 L1 谓词
各钉一半基座数(旗单独成谓词是「机检只读基座数」的伪装形)。e2e 加 `e04` 套件
(`stages` 按卡名对号 —— 一单两张不同表的执行单;`fillAllBlank` 整行扫空;
`decideSeq` 驳回→通过按张走;buildEdits 泛化 rowKey,不再钉死 pn)。
新测:turn-runner +6、包内 76(补 steps.test.ts:count(customers) 三形状真 @sfeel 钉死 ——
未绑定名 flatten 成 [undefined] 长度 1 不是 0)、view-render textarea 3、ui-kit 2。
- **验收「重做」第一次真的能退回重做**(2026-08-22,柴浩实测:点了重做,单子卡死):
从前非 pass 裁决也走 `finished` 分支 —— runTurn 把在途验收消费成 null、返回
「finished 未放行」,task 层把它重新挂成 awaiting-human;**人已经说了话,却再没有
任何事件会叫醒它**(A 系列 e2e 从来只点通过,这条路第一次被真人踩到)。
修死(turn-runner + port.ts + CONTRACT.md,3 测):非 pass = **打回重做,不是终局** ——
意见(`PendingAcceptance.comment`,onEvent 从裁决载荷捕入信封)以
「验收被打回重做:<意见>」进轨迹(没写意见就明说「自己复核一遍」),在途验收清掉,
**同一拍照常问模型**;刚被打回的那一拍不走判齐快道(判齐恒真的活动会在意见没人读时
原样再发一张卡)。模型修订后重新 submit,新发的验收卡才是下一次裁决的对象。
卡死的那单以「把消费掉的在途验收原样放回信封 + 拨回 running」救活
(不手插记忆行 —— task_memory 有封链,留痕必须走正规通道),实测:重做意见进轨迹 →
模型复核三条裁量 → 重新提交 → 新验收卡已回到负责人工作台。
- **「重做」得真的退回去改,不是原样再递一次**(2026-08-23,柴浩连点两次重做的实测账):
上一条修好了「重做后单子卡死」,但没治**空转重做** —— 打回那一刻案例模型的项全是
`Completed`,模型除了重新 submit 无事可做:两次都是 6 秒内把三条裁量判据重判一遍、
台账一个字没动就把同一份成果递回来,人看见的是「我说了重做,它当没听见」。两手一起治:
①**基座侧结构闸**(`raiseAcceptance` 一个出口管住模型 submit 与判齐快道两条路,6 测):
打回之后台账没动过(写/撤都算)就不许再提交;软硬两段 —— 头一次拒并指路
(改台账 / 或发卡问清楚要改什么),已因此拒过一次再提交就放行(墙要配路,不锁死单子)。
②**活动侧指路**(`quote-…` 同理,E04@2.0.7 的 T_release 剧本加「被打回重做」分支):
闸只知道「没改」,**改哪一张表是活动自己的知识** —— 理由空改 `plan.rationale`、
依据虚改 `ledger_update.evidence_ref`、结论糊改 `verdict.summary`;没写具体意见就
自己挑最站不住的那处改实,一律同 PK 覆盖写(新开行会把收步判据弄假)。
T_release 的 `writes` 同批补上这三张表 —— 不声明就写不进去(写的授权面是台账声明)。
- **「取不到」不是「还活着」:测试台钉着死号说在跑**(2026-08-23 用户:「推进完成了,
但测试台还在运行中,没有停下来」—— 当场复现):面板钉着一个**已被别处清掉**的任务
(reset-runs / 另一台起单会先销毁上一单),屏上同时说两句相反的话 ——
上面「AWAITING-EVENT · 自动刷新 2s」灯亮着、钮写「停止仿真」,下面一条橙带
「取数失败 —— 任务不存在」。两处一起修:
①**后端状态码说错了一格**:「任务不存在」抛的是普通 Error → 兜底成 `500 internal`,
而 500 的意思是「服务器出毛病了,等会儿再来」—— 面板据此举着上一次的状态每 2 秒重试。
现在这条路由如实回 **404 not-found**(「这一单已经不在了」);
②**前端把「取不到」当成了「在跑」**:`q.data` 在取数失败后保留上一次成功的那份、
其 `terminal` 恒 undefined → `live` 恒真;`s === undefined ? 'live'` 那个兜底更是直接
在撒谎。抽出纯函数 `observeFace`(6 测)分三种局面说话:**没了**(404 → 停轮询、
灯灭、说「这一单已不在了」、当场松手回装配台)、**取数失败**(断网/500 → 不说在跑,
轮询留着等它回来)、**取到了**(照实说)。浏览器实证:起单 → 面板盯着 → 别处清掉 →
6 秒内自己回到装配台,鬼卡片不再出现。
- **立监听的授权面是清单声明 —— 立了没人叫醒的监听不是等待,是失联**(2026-08-23,
验重做那一单当场撞出来的第三个洞):S4 审批过后模型**漏写了 `plan_approved_total` 那面旗**
(人工激活的项没有 doneWhen 兜底,finish 拦不住),S5 的入场哨兵永不成立 → 依赖断点 →
它临场「立一个 data 监听等执行回执」,而 E04 的 `declarations.listeners` 是**空的**、
这一单也不会有任何 data 事件进来(全仓没有一处消费静态监听声明,desk 侧更没有投递 data
的入口 —— 老 debt),单子就此挂在 `awaiting-event` 15 分钟一动不动。
修:`ListenerRegistrar` 补 `declared(taskId)`(engines 从清单取),`listen` 只放行
**声明过的那几种**,没声明的当场拒;拒回把两条真路一起指出来 ——
「要等人办事就发执行工单(人在件上把回音填回来);卡在断点多半是某个入场前提的数
还没写(常见是某面记账旗漏了),回去补那一笔,门自己就开」。3 测 + CONTRACT.md 已记。
- **步数是活动自己声明的预算,记的是 tick 不是模型拍**(2026-08-23 用户问):
测试台那三格读的是 `task.caps` ← 清单 `contract.resources.budget`(E04 声明
80 步 / 50 万 token / 12 次调人,A 系列 50-60 步 —— E04 高是因为四道人环 + 审批循环)。
**一步 = 一次 `task.tick()`**,而不是一次模型决策:实测一单 19 步里只有 12 拍真跑了模型,
另外 7 次是人回卡后「看一眼在途验收就返回」的空转 tick。挂起等人期间不烧步数
(推进器只捡 `runtime='running'` 的单),所以这笔账不会随人拖延而涨。
- **起单入参要预填满**(2026-08-23 用户:「询价受理起单时左边都有预填好的输入,E04 也要」):
测试台落到一个活动上自动铺的是 `samples[0]`,而 E04 的第一条样例只有
`{trigger:'monthly'}` 一个键 —— 表单除了那个下拉全空,看着像没预填(A1 两条样例都是
满载的一封信,所以那边没问题)。E04@2.0.6 把**满载的那条**(重大商机 · 点名 CU-0142,
四字段全有值)挪到第一位、月度例行补上真实背景说明,并把五条样例名收到 **≤14 字** ——
超过 14 字测试台只显示「样例 N」(activity-run.tsx),那等于没名字。
包内测试钉死这三条;e2e 的 e04 套件样例序号同批对调。
- **I01 品牌形象与销售工具包管理按 E04 标准审完并全流程跑通**(2026-08-23,
`brand-content-toolkit@1.1.1`):**e2e 三案例 3/3 released、被拒 0**(9-10 拍 / 66-82k),
浏览器真人路(件上加一行 → 提交 → 初稿审核 → 发布放行)**released、被拒 0**。
审出并修死的问题,与 E04 那一轮同族:
①**两条 L1 只读模型自写旗**(`requirement_confirmed_total`/`draft_approved_total`)——
各钉一半基座数(`_rows > 0 and _missing = 0`);
②**判据指向的东西不在卡面上**:L4「场景与 BT 标签是否登记完整」而 `content.asset`
压根没有 BT 列(剧本拿 `brand_tone` 顶替)—— 补 `bt_tag`(**人读值不带 tally**:
件上是普通格子、没有翻译层,存 ASCII 人看到的就是 ASCII,这是 `scene` 踩过的坑),
两份验收件都摆出来;
③**「发布前场景必须登记」只写在剧本里、机器数不出来** —— `scene`/`bt_tag` 加
`requiredWhen: {content_status: published}`,红带/提交闸/放行门 L2 三处同源;
④卡头/页脚缺说明书 §6.2 的四个共用动态位 —— 补关联任务(`case:taskId`)、步骤行、
页脚单号(最迟交回无真数据源,照 E04 口径不摆);编辑闸措辞改回目标件
「AI 已识别 N 个内容需求」(N 绑基座读数);触发口径并进【做什么】;
⑤样例名超 14 字全退成「样例 N」+ 样例 0 只有两个键 —— 收短名、把满载的那条挪到第一位;
⑥e2e 加 `i01` 套件(一张执行单 + 初稿审核决策卡 + 发布放行,含驳回循环案例)。
包内测试 29 → 44(补 steps.test.ts,把上面每条口径钉死)。
- **人在件上「加一行」会被静默丢掉:序号型主键没人给它续号**(2026-08-23,审 I01 时
逮到、浏览器实测复现):`content_brand.requirement` 的主键是 `round_ref + req_seq`,
而「加一行」那一下所有 `data-col` 都被清空(`ViewContainer.addRow` 如此)——
`req_seq` 空着,而各行序号本就互不相同,「全表一致」那条补法永远取不出 →
`writeEditedRows` 一 continue 就没了:**屏上两行、库里一行,还不报错**。
修:凑主键那一段抽成纯函数 `resolveRowKey`(9 测),三类主键三种凑法 ——
件上给了的用他填的 / 件上没摆的按行认或全表一致 / **整数型主键由基座续号(现有最大 + 1)**。
途中自己踩了一脚并当场修回:一度把序号列的 `data-col` 拿掉「让它只读」,
结果**老行也没了钥匙**,服务端把它当新增行、又拿「只有一行时的全表一致」猜出个 1,
**当场覆盖掉原来那一行** —— **主键列必挂 `data-col`**(它不是编辑面,是行的钥匙),
且序号型主键不走「全表一致」那条路(一致只是行数太少的假象)。
- **兜底卡自己被门拦住:最后的活路砌了墙**(2026-08-23,E04 回归实测):依赖断点那一拍
「当下可为」是空的,归一层给兜底卡兜出来的 `itemId` 就是空串,于是引擎自己造的那张
「需要你判断下一步」被 `readyToWork` 拒 —— 人连被问一句的机会都没有。
修两处:①归一层的项号兜底连**进行中**的项一起看;②**发卡的授权面是调人预算,不是计划项**
——项号挂不上照发、留痕注明(与「写看台账声明」「调工具看白名单」同族);
「这一步已经办完/停用」仍是真墙(既有测钉着),用 `ItemUnattachableError` 把两件事分开。
- **枚举列上下两态得说同一个字**(2026-08-23 用户:「BT 层级下拉框显示不全,
都看不到具体选了哪个」,`quote-…` E04@2.0.8):覆盖范围确认那张件的 BT 层级一格两处错 ——
①**列宽只有 80px**,而选项文字是「BT-01 · 采购/供应链」,下拉被挤扁,选了什么看不见
(覆盖深度那列因为选项只有两个字,同样的窄列一直没暴露);
②**只读那一份是 `data-slot` 直显**,存的是 ASCII `bt-02`,人看到的就是 `bt-02` ——
与编辑态下拉里的「BT-02 · 技术」对不上。**覆盖深度当初专门修过这个坑,BT 层级漏了**。
改:列宽 80 → 150,只读态换成 `data-class-of` 徽标、人读名由样式表出(值仍是 ASCII ——
台账与 recompute-score 的 `btLevel` 入参认它),选项文字统一成人读大写。
两条包内测试钉死:枚举列不许 `data-slot` 直显机器码、BT 列宽 ≥140px。
- **画面挑的是拍首那一步,而卡发的是下一步的**(2026-08-23,走查 E04 S4→S5 撞上):
那一拍收掉 S4(经营计划审批)、当场发出 S5 的回执执行卡,而工作区推的仍是 S4 声明的
**只读审批件** —— 人拿到的卡写着「把回执填到件上」,屏上一个可填的格子都没有;
提交闸如实拦住「缺完成状态、结果摘要、关键人变动」,他无处可填,整单挂死在那儿。
病根与 `liveScope` 那条同源:**拿拍首的局面去决定拍尾的事**(`liveStep` 在行动串跑完
之前就算好了)。修:推帧前按 `currentRuntime` 重算一次在办的那一步,算得出就以它为准;
算不出(活步都收完)照旧走老路,免得把人刚签过的放行页冲掉。设计律第一条
「墙要配路」的第四次现形。测钉死(拿掉修复就退回推 step1)。
- **表宽超出就得能横着滑**(2026-08-23 用户:「覆盖范围确认这个表格显示不全,
不能左右滑动」):E04/I01 抄 quote-* 版式时把 `.jc-tbl-wrap` 的 `overflow-x: auto`
抄成了 `overflow: hidden`(本意是圆角裁表头)—— 列一多、或某列为放下 BT 下拉框加宽,
右边那几列**直接被裁掉且滑不动**。两包改回 `overflow-x: auto; overflow-y: hidden`
(竖向仍关:件是整篇跟着外层滚的)。实证:950px 的表在 586px 容器里滑得动,
编辑态(958px)同样。E04@2.0.9 / I01@1.1.2。
- **翻件与翻页各归各位,没得翻就别摆数字**(2026-08-23 用户两条:「一次叫人不一定只有
一个 HTML 模板所以需要翻页,现在这个 0/0 显示的不正常」「工作成果点进一个工作成果
也需要这个东西」):右上角那对箭头从前**三处各写一遍、两组二选一**
(`docPages > 1 && openList.length <= 1`)—— 多张卡各自多页时**页就翻不动了**,
人只看得见每张卡的第一页。三处收成一个 `Pager`,两组同时在场时各带一个字(件/页)。
0/0 有两个来源,都治了:①`ViewContainer.paginate` 对没写 `data-page` 的件如实回报
0 页 —— **件在手上,再少也是一页**,改 `Math.max(1, …)`;②一件都没有时(在跑 /
等对话区那张卡 / 已收尾)摆的是 `0/0`,**0 分之 0 不是一个数**,改写「—」并禁用两枚箭头。
成果详情补**翻份**:一单常有三五份定稿(执行单快照 / 验收单快照 / 决策卡快照),
从前想看下一份得退出去再点一次;换份时页码归零(上一份翻到第 3 页,下一份可能只有一页)。
判断抽成纯函数 `pagerFace`/`pagerText`(9 测)。浏览器实证:决策卡那一屏「—」、
回执卡「1/1」、办结后四份成果 1/4→4/4 逐份翻过、末份下一枚变灰。
改共享面照例全量回归:1573 测 / typecheck / lint / depcruise 绿,
**e2e e04 三案例全部 released、发口 coverage-map 全对**(16-20 拍);
两案例各有 1-2 次被拒,都是既有的模型空转被墙拦住(recompute-score 同参连调第 5 次、
S6_writeback 少写一行就 finish),非本轮改动引入 —— E04 的 `被拒 0` 仍欠着。
- **I01 的「审核资料」第一次真产出资料文件**(2026-08-23 用户定:「格式可以是 word、excel、
md、html,文件需要能在前端渲染,在表格中点击资料名可以跳转到一个新的页面来渲染这些文件」):
接手时这一步**一个文件都产不出来** —— S3 的剧本白纸黑字写着「file_ref 选填,本 MVP 阶段
可留空」,台账里只有一行标题,人要审的那份初稿根本不在系统里(点不开、下不来)。
**文件是台账那一行的投影,不另存一份**(另存 = 同一份事实两处各存一份,改一处就分叉):
①**声明**:台账对象声明加 `file: {titleColumn, bodyColumn, formatColumn}`(契约变更),
它同时是授权面 —— 没声明的表点不开(403),与「写看台账声明」「立监听看清单声明」同款;
②**现造**:`file-compose.ts` 进「标题 + Markdown 正文 + 格式」出真字节 ——
docx / xlsx 是**自己打的 OOXML 包**(`zip-write.ts`:store + CRC32,不引依赖,
与 `upload-extract.ts` 读 xlsx 同一条路);md 出原文、html 出整份自带样式的文档;
③**读回来渲**:`file-doc.ts` 解**造出来的那份字节** → `FileDoc`(docx→段落 / xlsx→行列)
—— 屏上渲的与下载到的是同一份东西,渲得出来才证明文件是真的;
④**点得开**:视图新增绑定 `data-file-of="主键列"` → 渲成 `data-file="域.对象/主键值"`,
ViewContainer 接住 → 工作区二级界面 `FileViewer`(Excel 网格 / Word 纸面 / 渲好的 Markdown /
沙箱 HTML)+「下载原件」(`?raw=1`,RFC 5987 中文名)。
**Markdown 富文本渲染顺带销账**:`markdownBody` 一个依赖都没引(标题/列表/GFM 表格/
分隔线/粗体/行内码),全程转义、走同一个沙箱 —— 与下载到的 .html 是同一段函数出的。
I01 侧:`content.asset` 加 `body_md`(正文,必填)+ `file_format`(tally 四档,必填),
S3 剧本教它按内容形态挑格式(表→xlsx / 正式文档→docx / 网页→html / 短要点→md),
新增 L2 判据「每份内容都产出了资料文件」(四档计数之和 = 行数,两边都是基座数),
两份验收件的资料名都挂上链接 + 格式徽;新增第 4 条样例「对照表与落地页」——
一封需求里三种形态,专治「一律 docx」那条走不到的路。
**验收**:e2e i01 四案例(含驳回循环)**4/4 released、被拒 0**(8-9 拍 / 68-89k),
资料文件逐份取得回渲得出,末条实测 `xlsx / html / md` 三种格式各出各的;浏览器在**审核那一屏**逐份点开
(Word 纸面出四节标题与要点 / Excel 网格出参数对照表 / md 渲成标题+要点 / html 出纸面),
「下载原件」拿到的 .docx 落盘后 `file` 认作 **Microsoft Word 2007+**、
macOS `textutil` 逐段读得出正文。新测 47 条(现造+读回 22 · `data-file-of` 绑定 4 ·
fileRefOf 4 · 主键解析 6 · 包内 11);全仓 1573 → 1620。I01@1.2.2。
连带治掉一处每单白吃一次的被拒:**「提交前先裁三条 L4」原本只写在 T_release 的剧本里**,
而拟发布与提交常被模型压成同一拍 —— 那一拍摊开的是拟发布那一步的做法,T_release 的
剧本这时**根本不在上下文里**,于是照着 S5 写完就 submit,被门点名「三条还没裁过」。
规矩搬进**说明书**(每拍都在),与 A1 的卡骨架、A6 的决策卡同一课:
**模型会压拍,压过之后只有说明书还在**。
改了共享面(view-render / ViewContainer / desk 路由)照例全量回归:**e2e e04 3/3 released**、
发口全对(两例被拒 0,余一例是 E04 既有的模型空转)。
一处边界记进 debt:资料这一行落在**主数据**上,而试跑单放行时主数据只留在活动缓存、
不落正式表 —— 于是**试跑单放行之后**那份资料点不开(正式单不受此限);
404 的话已分两种说法,不拿「可能已被撤掉」把人支去翻一行根本不会在的东西。
- **产出的资料存了档,工作成果里点得开;查看面的灰底不再半路变白**(2026-08-23 用户两条):
①「渲染页面向下翻的时候背景的灰色在下半截会变成白色」—— **修了两刀,第一刀没打中**。
第一刀治的是走沙箱那两档(markdown / html):外层 `.fileview-body` 在 markdown 那一档
写死 `background:#fff`(它还是一整块 `<pre>` 铺满时的写法),与里面那份自带灰底的文档
不同色;改成同色 `#f4f5f7` + 去内边距,html 那一档一并(它套的是「渐变书桌 + 26px 边距」,
而那份文档自带书桌)。**但用户报的不是这两档** —— 他截图里那份是 docx,
走的是 word / excel 那条**父文档直接渲**的路(不进 iframe)。
真病根:`.fileview-body` 是 `.fileview`(`height:100%`)的弹性子项,默认 `flex:0 1 auto`
**不长个** —— 盒子高度被「看得见的那一屏」封住,而里面那张纸比一屏长时溢出盒子继续排,
**背景只画在盒子里**:滚过一屏,纸两侧的灰书桌就没了,底下是面板自己的白。
改 `flex: 1 0 auto`(不许被压 → 盒子至少和纸一样高;内容短时又能长满 → 下方不留白边)。
实证(同一单来回切):撤掉这一改盒子 529px、屏底取到 `rgb(255,255,255)`;改在盒子 1399px、
屏底取到书桌渐变。四种格式滚到底逐一取色:docx/xlsx 两侧是书桌灰,md/html 纸铺满且外层同色、
无空隙。**教训:同一个症状可能有两条独立的路,治完一条要把另一条也走一遍**。
②「检查当前产出的附件是否存档,在工作成果里也需要有产出的附件,点击后可以预览」——
**查出来的实情是没存**:文件一直是台账那一行**现造**的,而资料落在**主数据**上,
试跑单放行时主数据只留在活动缓存、不落正式表 ——「放行之后再点开」实测 404,
而工作成果恰恰是收工才去看的地方。现在**放行落地之前**(人的修订刚落回草稿层)
把每一份造成字节冻进 `sys.task_asset_file`(迁移 0029,一单一行一份、重复放行覆盖);
取文件那条路**存档优先** —— 归档件上点开的必须是他签字那一刻的那一份,
不是台账后来被下一单改成的样子。工作成果里「产出的资料」自成一摞(与定稿报告分开:
报告是「叫人办的那件事办完长什么样」,资料是**办出来的东西本身**),按格式上色、
带存档时刻,点开即预览、可下载原件;件上与归档报告里的资料名照旧点得开(同一条路)。
路上逮住一个只在存档那条路上出现的坑:**pg 取回来的 `Buffer` 挂在共享的 64KB 内存池上**,
`buf.slice().buffer` 是视图不是拷贝 —— 三份资料下载下来都是 65536 字节
(后面全是别人的残渣);改 `Uint8Array.from` 按元素拷。
验收:e2e i01 断言加了「放行之后逐份仍取得回、原件仍是 ZIP」这一条,
**四案例 4/4 released、被拒 0,每单都是「在办中渲得出 + 放行后存了档点得开」**;
浏览器实证两屏(审核那一屏、工作成果那一屏)都点得开,归档件里的资料名同样点得开,
归档的 .xlsx 落盘后 `file` 认作 **Microsoft Excel 2007+**、python `zipfile` 读得出
整张对照表。新测 8 条(存哪些不存哪些 + 主键拼法);`reset-runs` 一并清这张表。
## 文档权威地图