比较提交

...
2 次代码提交
作者 SHA1 备注 提交日期
wangsli 41da4c2638 归档(08-23-production-fact-source-corrections): 完成生产事实源纠偏
ci-minimal / check-minimal (push) Canceled after 0s
ci-e2e / e2e (push) Canceled after 0s
2026-08-23 19:49:47 +08:00
wangsli 69edf40df1 纠偏(08-23-production-fact-source-corrections): 更新当前生产事实源 2026-08-23 19:49:04 +08:00
共修改 10 个文件,包含 139 行新增和 18 行删除
@@ -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
@@ -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 门禁。
- [x] 更新 PRD 验收状态并完成工作提交,随后按 finish-work 归档当前任务。
## 变更边界
- 允许:当前 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": "completed",
"dev_type": null,
"scope": "docs-governance",
"package": null,
"priority": "P1",
"creator": "shunli",
"assignee": "shunli",
"createdAt": "2026-08-23",
"completedAt": "2026-08-23",
"branch": null,
"base_branch": "main",
"worktree_path": null,
"commit": null,
"pr_url": null,
"subtasks": [],
"children": [],
"parent": null,
"relatedFiles": [],
"notes": "",
"meta": {}
}
+1 -1
查看文件
@@ -180,7 +180,7 @@
### R-5 CEO 本人无主管报销限制
- `ownerSelfFallbackRole` 只允许 active、非本人的 `finance` 或兼容角色 `finance_mgr`;本公司新建默认和生产目标均为 `finance`。
- CEO 本人没有可解析直属主管时,只有存在 active 非本人 fallback 持有人才能提交;无持有人或 CEO 同时持有 fallback 角色时继续阻断。不得使用 `admin` 代批或恢复整库绕过。
- 既有审批快照不重路由,过去提交失败的单据也不会自动恢复。当前本地候选尚未部署、生产规则尚未回填,因此公网仍按旧配置阻断。
- 既有审批快照不重路由,过去提交失败的单据也不会自动恢复。`07-28-ceo-finance-fallback` 已完成代码部署和生产三档规则原子回填,CEO 三档只读解析均为唯一 active 非本人 `finance`;尚未创建真实 CEO 报销,因此当前证据不等于真人业务验收。
### R-6 单公司内部 OA 边界
- 系统只服务当前公司内部使用,不作为对外产品发布,不支持多公司、多租户、公司切换或集团工作区。
+7 -6
查看文件
@@ -2,18 +2,19 @@
**文档状态**:当前文档治理事实源。
**分类**:文档台账。
**适用时间**:TRELLIS2 及 2026-07-16 状态收口之后。
**适用时间**:TRELLIS2 及 2026-08-23 当前生产事实纠偏之后。
**关联治理**:当前 Trellis task;`GOV8` 只作历史治理来源。
**最近审计**:2026-07-16。
**最近审计**:2026-08-23。
**不得误读**:本文登记文档权威性和状态,不替代具体 Trellis task、PRD、模块规约或测试规约。
**治理口径**:中文优先,物理精简,优先复用已有文档。历史资料不建 `docs/archive/`,已确认不用的文档从当前树移除,通过 git 历史恢复。
## 当前可信基线(2026-07-16)
## 当前可信基线(2026-08-23)
- 最后有部署和公网复检证据的来源基线为 `df26922`;未做当前公网只读检查时,不据此断言服务器此刻仍运行该提交。
- 7 月 P0 可信度修复只在本地 `main`,尚未 push、部署或完成公网复检,不能视为线上生效。
- 当前有部署和公网复检证据的产品构建为 `7b86ffb`;`/ready`、migration pending=none、runtime/external-deps smoke、公网 bundle、真实浏览器登录/忘记密码路径和备份合同 refresh 均通过。
- 后续事实源与任务归档提交只更新仓库记录,不代表生产应用重新部署;未做新一轮部署时,不要求公网构建匹配文档 HEAD。
- CEO 财务兜底代码和生产三档规则已经支持 `finance|finance_mgr` 且默认/生产目标为 `finance`,三档只读解析均为唯一 active 非本人 `finance`;没有创建真实 CEO 报销,因此不扩大为真人业务验收。
- 旧 OAOPS1 只执行 Day 1–Day 4 后中断,原目标未完成;归档只表示生命周期关闭。
- 未来真实连续试运行必须在当前可信基线部署并复核后,由新 Trellis task 从 Day 1 启动。
- 未来真实连续试运行如需启动,应由新 Trellis task 基于当前可信基线从 Day 1 记录,不补造旧任务缺失天数。
## 冲突优先级
+7 -6
查看文件
@@ -2,9 +2,9 @@
**文档状态**:当前唯一文档入口。
**分类**:入口索引。
**适用时间**:TRELLIS2 及 2026-07-28 当前任务状态之后。
**适用时间**:TRELLIS2 及 2026-08-23 当前生产事实纠偏之后。
**关联治理**:当前 Trellis task;`GOV8` 只作历史治理来源。
**最近审计**:2026-07-28。
**最近审计**:2026-08-23。
**不得误读**:本文只指示当前事实源和读取顺序;历史 Issue CSV 只能用于追溯,不直接生成新开发任务。
**治理口径**:中文优先,物理精简,优先复用已有文档。已确认不用的历史文档不放 `docs/archive/`,直接从当前工作树移除;需要时从 git 历史恢复。
@@ -18,12 +18,13 @@
- 新需求或试运行反馈:优先创建或更新当前同类型 Trellis task;只有跨业务域、跨风险等级或阶段收口后,才新建下一版 task。
- 新增说明、方案、审计或证据:优先补充现有事实源、模块规约、操作手册、证据文档或当前 Trellis task;只有现有文档无法承载、需要独立审计证据或用户明确要求时,才新建文档并登记本索引和事实源矩阵。
## 当前可信基线(2026-07-16)
## 当前可信基线(2026-08-23)
- 当前有部署和公网复检证据的来源基线为 `a74cba1112e0`;`/ready`、migration、runtime/external-deps smoke 和公网 bundle 均通过。
- 当前本地 `main` 已 push;生产 CEO 财务兜底规则回填完成。其他未取得本轮公网证据的历史任务仍按各自状态记录,不由此自动升级为已上线。
- 当前有部署和公网复检证据的产品构建为 `7b86ffb`;`/ready`、migration pending=none、runtime/external-deps smoke、公网 bundle、真实浏览器登录/忘记密码路径和备份合同 refresh 均通过。
- `b32b5f2`、`45a1fa8` 及后续事实源/归档提交只更新任务记录,不代表生产应用重新部署;公网构建应匹配最近实际部署的产品提交,而不是文档 HEAD。
- 生产 CEO 财务兜底规则回填保持完成:代码兼容 `finance|finance_mgr`,默认与生产目标均为 `finance`,CEO 三档只读解析均为唯一 active 非本人 `finance`。其他未取得本轮公网证据的历史任务仍按各自状态记录,不由此自动升级为已上线。
- 旧 OAOPS1 7 天真实试运行只有 Day 1–Day 4,后续中断,缺 Day 5–Day 7、现场人工业务闭环和 Day 7 Go/No-Go;归档只表示生命周期关闭,不代表目标完成。
- 下一轮真实连续试运行必须等待当前可信基线部署并完成公网复核,再新建 Trellis task,从新的 Day 1 连续启动。
- 下一轮真实连续试运行如需启动,应基于当前可信基线另建 Trellis task,从新的 Day 1 连续记录;不得补造旧 OAOPS1 的 Day 5–Day 7。
- `07-28-ceo-finance-fallback` 已部署构建 `a74cba1112e0` 并完成生产原子回填:3 条启用规则与 3 条脱敏审计写入成功,CEO 三档只读解析均为唯一 active 非本人 `finance`,普通员工链保持小/中额 `manager -> finance`、大额 `manager -> ceo -> finance`;未创建真实报销、未写企业微信。
## 历史事实源链(截至 2026-05)