文件
hyb-oa/.trellis/tasks/08-11-internal-oa-usage-census-and-simplification/prd.md
T

10 KiB

内部 OA 使用度普查与减法路线图

Goal

用一次脱敏、只读的生产使用度普查回答“5–10 人内部 OA 里哪些能力真的有人用”,并据此给出未来 30 天的减法路线图。任务的价值不是继续扩充功能,而是把有限开发时间集中到真实人工使用且失败成本高的流程,冻结、隐藏或候选退役其余维护面。

Background

  • hyb-oa 永久定位为本公司 5–10 人内部系统,不作为 SaaS、商业产品或通用 OA 发布。
  • 2026-07 的 07-30-current-issues-feature-portfolio-review 已完成代码、导航和业务必要性的组合盘点,但没有连接生产,也没有真实使用度数据。
  • 最近数日主要投入部署、认证恢复、测试定性和证据治理,用户可见功能变化很少;继续由“上一个任务发现的新债务”驱动,会偏离真实内部使用价值。
  • 生产合同台账当前为零行,但业务事实源将合同列入首批真实使用范围。这证明“零行”既可能是低频必要,也可能是流程尚未落地,不能自动解释为模块无价值或系统缺陷。
  • 现有工程原则已经固定低维护决策门:clear owner + recurring internal use + material failure cost + no cheaper reliable substitute。本任务为这道门补生产证据,不改写原则。

Confirmed Facts

  • 当前服务端工作区注册表包含工作台、审批、报销、采购、合同、项目、资产、付款/AP、票据、请假、考勤、周报、公告、预算、差旅、盘点和管理类入口,并已有 main/admin/hidden 三种显隐层级。
  • 当前存在 26 个功能开关键,数据库 override 与运行环境 gate 共同决定有效状态;只看代码默认值或数据库记录都不能代表生产实际可见性。
  • Prisma schema 含业务数据、认证、审计、企微留存、系统配置和集成运行表。动态扫描全部表会把 session、challenge、迁移、通知投递等技术活动误判成业务使用,因此必须采用显式模块 allowlist。
  • audit_logs 有 actor、action、target type 和时间,但自动任务、smoke/fixture 与真人操作可能共用审计链;审计量不能不加区分地等同于用户使用量。
  • 仓库已有 OA-only smoke 判据,可按员工编号、邮箱本地部分、名称中的受控模式识别测试账号;本任务复用其语义,但不输出完整账号、姓名或联系方式。
  • 生产只有一套名为 trialrun 的环境,没有预发。本任务只读测量,不需要也不允许为普查发布新应用候选。

Scope

  • 盘点当前用户可见业务、低频必要后台及已有退役候选,建立模块到生产表、审计、导航和功能开关的显式映射。
  • 在另获启动批准后,对唯一 trialrun 生产环境执行一次脱敏聚合只读普查,区分真人、smoke、system 和 unknown 活动。
  • 将生产快照与既有小团队业务裁决结合,输出四类模块矩阵、未来 30 天开发边界、负责人确认项和后续独立 task 候选。
  • 本任务只产出测量证据和决策建议;所有实际产品、配置、生产和数据变更均留给后续单独授权任务。

Requirements

R1. 模块目录与生产映射

  • 以 server/prisma/schema.prisma、server/src/services/workspaceSettings.js、server/src/services/featureFlags/index.js、当前业务事实源和 07-30 组合盘点为依据,建立显式模块目录。
  • 每个模块记录:主表/辅助表、主要活动时间字段、可用 actor 字段或审计 action、当前导航层级、关联 feature flag、历史组合建议和业务必要性来源。
  • 至少覆盖:工作台/通知、统一审批、报销/票据/OCR、付款/AP、采购、合同、项目、资产/盘点、请假/企微审批留存、考勤/团队状态、周报、普通待办、公告、预算、差旅、人员生命周期、薪资、绩效,以及 ERP/切换等系统候选。

R2. 只读生产快照

  • 生产查询必须先通过既有生产 identity bootstrap,并确认实际运行环境、已部署 SHA 与 migration 状态;本地 HEAD 领先生产的文档提交不得被误当成应用版本漂移。
  • 查询必须在单个显式 READ ONLY 事务内运行,设置有限的 statement/lock timeout;任何事务只读断言、表/列合同或查询解析失败均 fail-closed,不能把失败解释成零使用。
  • 只查询 R1 allowlist 中的表和字段,不动态遍历 schema,不读取附件正文、合同正文、银行信息、密码、token、Secret、原始 payload 或完整账号。
  • 对每个模块输出稳定聚合:总记录数、近 30/90 天新增或业务活动数、最近活动时间、可用时的 distinct actor 数、真人/smoke/自动系统活动分桶、生产导航层级及有效 feature flag 状态。
  • 只读快照允许反映执行期间其他真实用户的并发活动,但不得把并发变化归因于本任务;查询本身不得产生业务或审计写入。

R3. 活动去污染

  • 测试/smoke 活动使用与 repair-oa-only-smoke-accounts.js 一致的 smoke-like 语义识别,并只输出聚合计数。
  • system/job 活动按显式 action/表映射单独分桶;定时同步、投递重试、巡检和自动留存不能证明真人使用该模块。
  • 无法可靠归因的活动标记为 unknown,不得强行计入真人使用。
  • 真实人工使用至少需要真人 actor 或明确真人拥有/提交字段支持;只有表总数、缓存、seed、fixture 或 system job 不足以成立。

R4. 分类与决策矩阵

  • 每个模块基于生产证据、导航暴露、实际使用人数/频率、失败成本、明确负责人、可靠替代品和历史业务事实进行裁决,而不是只按行数排序。
  • 最终分类固定为四类:
    1. 重点优化:有真实人工使用,且流程高频或失败成本高;未来开发只从这里产生。
    2. 保持冻结:低频但必要、已有历史/审计价值,或目前无足够证据扩建;保持可用,不主动加功能。
    3. 隐藏入口:近期无真实人工使用、当前仍造成导航负担,且有更便宜可靠替代;只提出后续可逆隐藏建议。
    4. 候选退役:无真实数据/活动、无明确负责人或必要性、存在可靠替代;只进入后续调研,不在本任务删代码或数据。
  • “零行”“90 天无活动”或“flag 关闭”都不能单独触发隐藏/退役。合同、资产、备份恢复、权限、审计和付款 maker-checker 等低频高失败成本能力必须经过业务必要性判断。
  • 每个分类给出证据、置信度、缺失信息、负责人确认项和解除/触发条件;证据不足时选择风险更低的 保持冻结,不得猜测。

R5. 30 天减法路线图

  • 输出未来 30 天只做什么、不做什么:最多选择 1–2 条有真人使用证据的重点流程作为产品改进候选,其余功能开发冻结。
  • 后续工作按独立 Trellis task 列出,注明真实用户问题、预计收益、验证方式、触发条件和是否需要生产批准。
  • 实际修改 feature flag、导航、产品代码、schema 或生产数据,必须另建 task 并获得对应批准。
  • 低优先工具债只有在再次触达相关工具或能直接降低生产风险时才进入任务,不得挤占活跃业务流程优化预算。

Acceptance Criteria

  • AC1:形成覆盖 R1 范围的模块 allowlist,逐项映射业务表、时间/actor 信号、审计 action、导航与 feature flag,且没有动态全库扫描。
  • AC2:生产 identity、实际运行 SHA 和 migration 只读门禁通过;快照在显式 READ ONLY 事务中完成,查询失败项被标记为失败/未知而不是零使用。
  • AC3:每个模块具有总量、30/90 天活动、最近活动、可用 actor 数和真人/smoke/system/unknown 分桶;输出不含敏感原始字段或可识别个人明细。
  • AC4:真人、smoke/fixture、system job 三类证据被明确分开;至少用一组已知 smoke 数据和一组自动任务活动验证去污染规则不会把它们计为真人使用。
  • AC5:产出四类模块决策矩阵;每项同时引用生产证据和小团队业务必要性,不存在“零行自动关闭”或“审计多自动判活跃”的结论。
  • AC6:产出未来 30 天路线图,重点优化候选不超过两条,并明确冻结清单、后续独立 task、负责人确认项及事件触发条件。
  • AC7:本任务没有改 feature flag、导航、应用代码、生产配置、schema 或业务数据,没有制造测试业务记录,也没有发布新候选。
  • AC8:执行结果通过 task validate、Trellis governance、文档/流程相关门禁、敏感扫描与 git diff --check;生产只读执行与最终分类经过只读 reviewer 复核。

Out of Scope

  • 不在本任务关闭 feature flag、隐藏导航、删除路由、删除 schema/table 或清理任何真实/测试数据。
  • 不新增功能、不修复低优先工具债、不做 UI 改版、不部署应用候选。
  • 不通过登录、浏览器点击或制造业务记录测量使用度;生产访问仅限批准后的数据库/运行配置聚合读取。
  • 不把模块缺少记录直接定性为系统缺陷、流程缺陷或“尚未启用”;需要业务负责人确认的事实只登记,不代替确认。
  • 不把一次性普查扩成长期埋点、BI 平台、数据仓库或通用分析框架。

Test Plan

  • 静态复核 module/table/action/navigation/flag 映射与当前 schema、registry 一致。
  • 在非生产环境或静态 fixture 上验证查询输出 schema、smoke/system 分桶、失败项 fail-closed 和敏感字段白名单。
  • 获得另一次明确启动批准后,执行生产 identity/migration PRE、单次只读普查、POST 只读检查;零 retry,失败后先定性再决定是否重跑。
  • 复核结果矩阵满足四类定义和低维护决策门,启动只读 reviewer。
  • 运行 python3 ./.trellis/scripts/task.py validate 08-11-internal-oa-usage-census-and-simplification、node scripts/qa/check-trellis-governance.mjs、相关流程/文档门禁、敏感扫描和 git diff --check。

Execution Approval And Boundary

用户于 2026-08-11 审查规划后明确批准启动,授权本 task 的本地查询合同实现和一次生产只读普查。授权不包含发布、登录、feature flag/导航修改、schema/data 写入或任何模块退役;这些动作仍需后续独立 task 和对应批准。