纠偏(08-23-production-fact-source-corrections): 更新当前生产事实源

这个提交包含在:
2026-08-23 19:49:04 +08:00
父节点 45a1fa8d03
当前提交 69edf40df1
共修改 10 个文件,包含 139 行新增和 18 行删除
@@ -0,0 +1 @@
{"_example": "Fill with {\"file\": \"<path>\", \"reason\": \"<why>\"}. Put spec/research files only — no code paths. Run `python3 .trellis/scripts/get_context.py --mode packages` to list available specs. Delete this line once real entries are added."}
@@ -0,0 +1 @@
{"_example": "Fill with {\"file\": \"<path>\", \"reason\": \"<why>\"}. Put spec/research files only — no code paths. Run `python3 .trellis/scripts/get_context.py --mode packages` to list available specs. Delete this line once real entries are added."}
@@ -0,0 +1,20 @@
# 生产事实源纠偏实施计划
## 执行清单
- [x] 复核浏览器路由、CEO 财务兜底和当前生产构建三组证据。
- [x] 纠正归档登录任务中的错误当前态,并保留探针误判的证据边界。
- [x] 更新文档索引、事实源状态矩阵和产品口径,不改历史阶段快照。
- [x] 运行 task、governance、process、docs、sensitive、scope 和 diff 门禁。
- [ ] 更新 PRD 验收状态并提交、归档当前任务。
## 变更边界
- 允许:当前 task、归档登录任务 PRD/实施记录、文档索引、事实源状态矩阵、产品口径。
- 禁止:产品代码、脚本、依赖、schema、migration、部署配置、生产和业务数据。
## 验证与回滚
- 精确搜索错误当前态和新生产基线,区分历史快照与当前事实。
- 运行 PRD Test Plan 中的全部治理命令。
- 文档变更可通过本任务提交反向补丁恢复;不涉及运行时回滚。
@@ -0,0 +1,71 @@
# 生产事实源纠偏
## Goal
纠正当前事实源中已经被现场证据推翻或被更早已完成任务覆盖的状态,避免后续工作重复治理不存在的 404 问题、错误认为 CEO 本人报销仍受 `finance_mgr` 缺口阻断,或继续使用过期生产构建作为当前可信基线。
本任务只修正文档与已归档 Trellis 证据,不改产品代码、API、schema、生产配置或业务数据,也不重新部署应用。
## Scope
- 纠正归档登录任务 PRD/实施记录中的路由刷新和 CEO 报销当前态。
- 更新文档索引、事实源状态矩阵和产品口径中的当前生产构建与 CEO 兜底状态。
- 记录纯 HTTP 探针与真实浏览器导航的证据边界,并完成文档/治理门禁。
## Confirmed Facts
- 纯 HTTP 客户端以默认 `Accept: */*` 请求 `/login`、`/forgot-password` 时可得到 404,但这不代表浏览器刷新行为。
- 全新、禁用 Service Worker 的真实浏览器直接进入上述两个路由时均返回 200 且目标页面可见;已有 Service Worker 的浏览器首次进入和刷新同样为 200。用户本人刷新也未见 404。因此“用户刷新会看到 404”和“需要 history fallback 治理”均不成立。
- 已归档 `07-28-ceo-finance-fallback` 在代码、API、前端、种子和生产规则上支持 `finance|finance_mgr`,默认与生产目标均为 `finance`;生产恰好 3 条启用规则已原子回填,CEO 三档只读解析均为唯一 active 非本人 `finance`。
- 当前生产应用已部署并复核的产品构建为 `7b86ffb`;后续 `b32b5f2`、`45a1fa8` 是任务记录与归档提交,不是新的产品部署版本。
- `docs/文档索引.md`、`docs/文档事实源状态矩阵.md` 仍以 2026-07 的旧提交作为“当前可信基线”,`docs/产品口径.md` 仍残留“候选尚未部署、生产规则尚未回填”的过期句子。
## Requirements
### R1. 撤回错误的路由 404 结论
- 在 `07-28-all-account-login-readiness` 的归档 PRD/实施记录中删除“浏览器直接请求或刷新会出现 404”和“需要 history fallback 后续治理”的错误结论。
- 保留可复核的边界:默认 `Accept: */*` 的纯 HTTP 探针不是浏览器导航证据;浏览器验证必须以 `Accept: text/html` 或真实浏览器页面结果为准。
- 不把本次纠偏描述为生产修复、代码修复或重新部署;生产用户路径原本即正常。
### R2. 纠正 CEO 本人报销兜底状态
- 将同一归档任务中“当前实现只支持 `finance_mgr`”“CEO 本人报销保持阻断”的当前态表述改为已完成事实:代码支持 `finance|finance_mgr`、生产三档规则以 `finance` 为兜底、CEO 三档均解析为唯一 active 非本人 `finance`。
- 保留失败关闭边界:无 active 非本人 `finance`、CEO 本人同时持有 fallback 角色或规则漂移时仍应阻断;不得扩张为允许自审或管理员代批。
- 不改写 `docs/trialrun/人工试运行报告.md` 中明确标注为 2026-05 历史阶段的旧 `finance_mgr` 方案;其后的 2026-07 状态增量已负责纠偏。
### R3. 更新当前可信生产基线
- 将 `docs/文档索引.md` 和 `docs/文档事实源状态矩阵.md` 的当前可信基线日期更新为 2026-08-23,并明确产品部署构建为 `7b86ffb`。
- 记录该构建已通过 `/ready`、migration pending=none、runtime/external-deps smoke、公网 bundle、真实浏览器登录/忘记密码路径和备份合同 refresh。
- 明确仓库后续文档/归档提交不等于生产应用重新部署,避免未来错误要求公网构建匹配文档 HEAD。
- 将 `docs/产品口径.md` 的 CEO 兜底状态改为已部署、已回填、未创建真实 CEO 报销;不把只读解析扩大为真人 CEO 报销验收。
### R4. 变更边界与验证
- 只允许修改当前 task、上述归档任务和三个既有事实源;不新增文档,不修改代码、脚本、依赖、migration、部署文件或生产状态。
- 用精确搜索确认当前事实源不再把上述两个错误状态描述为当前事实,同时允许历史阶段材料保留明确的历史快照。
- 运行 task validate、Trellis governance、process contract、docs registry、敏感扫描和 `git diff --check`。
## Acceptance Criteria
- [x] AC1:当前事实源不再声称浏览器刷新 `/login` 或 `/forgot-password` 会出现 404,也不再提出无依据的 history fallback 修复任务。
- [x] AC2:归档登录任务中的 CEO 报销状态与 `07-28-ceo-finance-fallback`、当前代码和生产回填事实一致,且继续保留无持有人、自身持有兜底角色和规则漂移时失败关闭。
- [x] AC3:文档索引与状态矩阵明确当前生产产品构建为 `7b86ffb`,并区分产品部署版本与后续文档/归档提交。
- [x] AC4:产品口径不再写“候选尚未部署、生产尚未回填”,也不虚构真实 CEO 报销已经发生。
- [x] AC5:变更文件严格限制在当前 task、归档登录任务、文档索引、状态矩阵和产品口径;产品代码、schema、部署配置和生产均零变更。
- [x] AC6:任务、治理、流程、文档、敏感和差异门禁通过;既有 22 个未登记文档 warning 不因本任务增加。
## Out of Scope
- 不修复或调整 Caddy、SPA、Service Worker、认证页面或任何前端路由。
- 不重新执行 CEO 报销规则生产回填,不修改角色、审批规则或创建测试/真实报销。
- 不启动隔离备份恢复演练;该工作在本任务完成后另建独立 Trellis task 并再次批准。
- 不批量重写历史 Issue CSV、历史试运行快照或所有旧提交号,只纠正仍被当作当前事实的内容。
## Test Plan
- 精确复核归档登录任务、CEO 财务兜底归档任务、当前工作流代码和三个事实源之间的一致性。
- 搜索 `404`、`history fallback`、`finance_mgr`、`尚未部署`、旧当前基线提交和 `7b86ffb`,逐条区分当前事实与历史快照。
- 运行 `python3 ./.trellis/scripts/task.py validate 08-23-production-fact-source-corrections`。
- 运行 `node scripts/qa/check-trellis-governance.mjs`、`node scripts/qa/check-process-contract.mjs --baseline --json`、`node scripts/qa/audit-docs.mjs --check-registry` 和 `git diff --check`。
@@ -0,0 +1,26 @@
{
"id": "production-fact-source-corrections",
"name": "production-fact-source-corrections",
"title": "生产事实源纠偏",
"description": "纠正路由刷新、CEO 报销兜底和当前生产构建三类事实源漂移,不改产品代码或生产。",
"status": "in_progress",
"dev_type": null,
"scope": "docs-governance",
"package": null,
"priority": "P1",
"creator": "shunli",
"assignee": "shunli",
"createdAt": "2026-08-23",
"completedAt": null,
"branch": null,
"base_branch": "main",
"worktree_path": null,
"commit": null,
"pr_url": null,
"subtasks": [],
"children": [],
"parent": null,
"relatedFiles": [],
"notes": "",
"meta": {}
}
@@ -35,7 +35,7 @@
- [x] 曾按用户初次指令将唯一 active `manager` 的直属主管设为 `wangshunli`;用户随后澄清其仅为系统开发/系统管理员,该中间关系需按最终职责口径修正。
- [x] 只读确认唯一 active `manager` 与 `majianyong` CEO 账户,排除自环/环路后原子将 `direct_manager_id` 从 `wangshunli` 修正为 `majianyong`、写脱敏审计,并复核组织链;不改角色、邮箱、密码、binding 或企微通讯录。
- [x] 只读解析手工企微通讯录导出并与生产 OA 对账:6 个 userid/binding 和 6 个企业邮箱全部精确一致,缺失、重复、冲突、未匹配和需修改数均为 0。
- [x] 只读确认 `majianyong` 保持 `ceo` 且无直属主管、`wangshunli` 不新增业务审批角色;生产只有 active `finance`、没有 active `finance_mgr`,CEO 本人报销在后续最小权限修正前保持阻断。
- [x] 只读确认 `majianyong` 保持 `ceo` 且无直属主管、`wangshunli` 不新增业务审批角色;生产只有 active `finance`、没有 active `finance_mgr`。更早完成的 `07-28-ceo-finance-fallback` 已使代码兼容 `finance|finance_mgr` 并将生产三档规则回填为 `finance`,CEO 本人三档均只读解析为唯一 active 非本人 `finance`;本轮未创建真实 CEO 报销。
- [x] 更新现有管理员手册/试运行 checklist:active 账号启用必须包含安全凭据交付、首次改密、密码登录和企微本人免登。
- [x] 运行认证聚焦测试、前端 typecheck/build、Trellis task/governance、敏感扫描、文档审计和 `git diff --check`;获批后已完成腾讯云真实生产发布与公网 smoke。
@@ -86,7 +86,7 @@
- [x] 使用既有部署标准入口发布 `7b86ffb`,固定 `SYNC_ENV=0`、`DEPLOY_DATA_MODE=existing`;未覆盖生产 `.env`,未执行 reset、db push、手工 DDL 或业务写入。
- [x] 部署后 Prisma、`/ready`、运行构建、企业微信/SMTP/OCR/消息桥接契约、runtime smoke、公网 bundle 扫描与备份合同 refresh 均通过;Compose 保持 `server=1、worker=0`,未启动 worker。
- [x] 无凭据真实浏览器公网复核通过:根入口登录页可见,密码框 Tab 直接进入“忘记密码?”链接,点击后忘记密码页面正常打开;未登录账号、未发送验证码、未写生产数据。
- [ ] 直接请求或刷新 `/login`、`/forgot-password` 当前返回 404;从 OA 根入口的 SPA 实际流程正常。本问题不由本次 Tab 改动引入,后续应单独治理反向代理/静态资源 history fallback,不在本任务内扩大变更。
- [x] 纠正发布后探针误判:默认 `Accept: */*` 的纯 HTTP 客户端请求两个路由可返回 404,但全新且禁用 Service Worker 的真实浏览器直接进入时均返回 200、目标页面可见;已有 Service Worker 的首次进入和刷新也均为 200,用户本人刷新未见 404。因此不存在用户可见的 history fallback finding,无需创建对应修复任务。
## 5. Stop Conditions
@@ -53,7 +53,7 @@
- 任何 binding 修正必须先证明目标 OA 员工和企微 userid 唯一对应;不得按姓名模糊匹配,不得修改企业微信通讯录成员。
- 生产 binding、密码、账户状态或认证配置写入前另行给出精确变更清单并取得批准。
- 最终业务职责以用户最新确认口径为准:`majianyong` 是 `ceo`,`wangshunli` 仅承担系统开发和系统管理,不是业务审批人;当前唯一 active `manager` 的 OA 直属主管应为 `majianyong`。
- `majianyong` 本人报销不配置直属主管、不允许自审,目标由 active 非本人 `finance` 审批;当前实现只支持 `finance_mgr` 且生产无持有人,本轮保持失败关闭并记录后续最小权限修正,不修改任何角色、邮箱、密码、binding、审批规则或企微通讯录。
- `majianyong` 本人报销不配置直属主管、不允许自审,目标由 active 非本人 `finance` 审批;已归档 `07-28-ceo-finance-fallback` 证明当前实现兼容 `finance|finance_mgr`、默认和生产三档规则均为 `finance`,三档只读解析均为唯一 active 非本人 `finance`。无 active 非本人持有人、CEO 同时持有 fallback 角色或规则漂移时仍失败关闭;本任务不修改任何角色、邮箱、密码、binding、审批规则或企微通讯录。
- 认证页密码框的顺序 Tab 行为采用“当前密码输入框 → DOM 中下一个顺序表单控件”;框内显示/隐藏按钮保留鼠标、触屏和辅助技术语义,但不占普通连续填表的 Tab 次序。登录页的“忘记密码?”链接仍保持键盘可达,不通过正数 `tabIndex` 重排其他控件。
## Decision: Credential Recovery
@@ -91,11 +91,11 @@
- [x] 不存在 active 账户同时缺少密码找回能力和可用企微 binding;当前 6/6 均已有经本人验证的企微主入口,密码找回系统能力已有代表性生产 PASS,实际真人密码回退覆盖为 4/6。
- [x] 本任务实际发生的重置、绑定、解锁和会话撤销均有 OA 审计;生产复核未发现角色扩张或企业微信通讯录写入。
- [x] 当前唯一 active `manager` 的直属主管唯一解析为 active `majianyong`,不存在自环或主管链环路,并有脱敏审计;`wangshunli` 不进入业务审批链。
- [x] `majianyong` 保持 `ceo` 且无直属主管;其本人报销目标为 active 非本人 `finance`,当前 `finance_mgr` 配置缺口未修复前保持阻断且不发生自审。
- [x] `majianyong` 保持 `ceo` 且无直属主管;已部署规则使其本人三档报销均唯一解析到 active 非本人 `finance`,不发生自审;本轮未创建真实 CEO 报销,因此该结论是生产规则与只读解析验收,不是真人报销证据。
- [x] 自动化、Trellis、敏感扫描、生产 `/ready` 和关联认证 smoke 已通过;未实测人员未来需要时可使用同一找回流程,但本轮不要求逐人操作。
- [x] 登录、修改密码和忘记密码页的密码框按 Tab 跳过框内显示/隐藏按钮并进入 DOM 中下一个顺序表单控件;显示/隐藏按钮仍可点击、保留稳定可访问名称,且切换不丢失输入值。
当前员工可测试边界:生产邮件能力、公网 `/ready`、认证 capabilities 与 SMTP 连接/认证已通过;已有 1 名首次改密人员完成全链路,另外 2 人按批准不要求本轮逐人实测,仅记为预计可用。其本人未来使用找回流程时仍不得在聊天中传递密码或验证码,不连续点击重发;新签发验证码会使旧验证码失效。公网根入口到登录、忘记密码页面及密码框 Tab 行为已通过真实浏览器复核;直接刷新前端子路由的 history fallback 另行治理,不属于本任务登录能力和 Tab 改动的验收范围。
当前员工可测试边界:生产邮件能力、公网 `/ready`、认证 capabilities 与 SMTP 连接/认证已通过;已有 1 名首次改密人员完成全链路,另外 2 人按批准不要求本轮逐人实测,仅记为预计可用。其本人未来使用找回流程时仍不得在聊天中传递密码或验证码,不连续点击重发;新签发验证码会使旧验证码失效。公网根入口、浏览器直接进入和刷新登录/忘记密码页面,以及密码框 Tab 行为均已通过真实浏览器复核。默认 `Accept: */*` 的纯 HTTP 探针返回 404 不能代表浏览器导航,不形成 history fallback 产品 finding。
## Definition of Done