trellis2-official-task-contract 采用官方 Trellis 执行合同

这个提交包含在:
2026-05-26 10:08:06 +08:00
父节点 e7baa6c234
当前提交 1b5c7527b7
共修改 24 个文件,包含 361 行新增和 161 行删除
文件差异因一行或多行过长而隐藏
+4 -4
查看文件
@@ -2,14 +2,14 @@
## Source Docs
Read `docs/需求-统一审批中心规约.md` and the latest workflow-related Issue CSV
before modifying approval behavior.
Read `docs/需求-统一审批中心规约.md` and the current workflow-related Trellis
task before modifying approval behavior.
## Rules
- No self-approval.
- Do not use `admin` as a business approver unless the Issue explicitly defines
an administrative fallback.
- Do not use `admin` as a business approver unless the current Trellis task
explicitly defines an administrative fallback.
- Approval precheck, submission, workflow snapshot and task advancement must use
consistent rule semantics.
- Existing workflow snapshots are historical facts; approval advancement should
@@ -9,8 +9,8 @@ QA script patterns over new abstractions.
- Validate Prisma changes with `cd server && npm run prisma:validate`.
- For route/service edits, run `node --check` on the touched files and the
focused regression listed in the Issue CSV.
- Prisma migrations require rollback notes in Issue `Notes`.
focused regression listed in the current Trellis task.
- Prisma migrations require rollback notes in the Trellis task design or PRD.
- Do not resolve migration drift, reset databases, or rewrite migration history
without explicit approval.
- Workflow, approval and permission behavior must be verified at process level,
+2 -2
查看文件
@@ -7,11 +7,11 @@ Start from `docs/文档索引.md` and `docs/文档事实源状态矩阵.md`.
## Rules
- Prefer updating existing fact sources, module specs, manuals, evidence docs
or continuous Issue CSVs.
or the current Trellis task.
- New documents need a reason and must be registered in both the index and
status matrix.
- Old Issue CSV files are historical audit evidence and should not be rewritten
unless the current Issue explicitly says so.
unless the current Trellis task explicitly calls for a legacy/export update.
- For generated evidence, store report paths and conclusions, not raw secrets,
raw payloads, full account identifiers, invoice originals or confidential
business content.
+4 -4
查看文件
@@ -1,25 +1,25 @@
# hyb-oa Project Specs
These specs are the Trellis entry point for hyb-oa. They summarize stable
development rules and point back to the authoritative Issue CSV and `docs/`
development rules and point back to the current Trellis task and `docs/`
fact sources.
## Read Order
1. `project-governance.md`
2. The domain file matching the task.
3. `docs/文档索引.md` and the latest relevant Issue CSV.
3. The current `.trellis/tasks/<task>/prd.md` and `docs/文档索引.md`.
## Domain Specs
| Spec | Purpose |
| --- | --- |
| `project-governance.md` | Trellis-first flow, Issue CSV contract, approvals, commit rules |
| `project-governance.md` | Official Trellis task contract, approvals, commit rules |
| `backend-fastify-prisma.md` | Server implementation and migration boundaries |
| `frontend-react-vite-design.md` | React/Vite UI and design-source rules |
| `approval-workflow.md` | OA approval/workflow/self-approval boundaries |
| `reimbursement-invoice-ocr.md` | Reimbursement, invoice, OCR and attachment rules |
| `wecom-boundary.md` | Enterprise WeChat ownership and API/write gates |
| `deployment-trialrun.md` | Public deployment, smoke, live-readiness and rollback gates |
| `docs-and-evidence.md` | Documentation reuse, evidence, Issue CSV and status matrix |
| `docs-and-evidence.md` | Documentation reuse, evidence, Trellis task and status matrix |
| `security-privacy.md` | Privacy, secret handling and sensitive-data exclusions |
+18 -8
查看文件
@@ -2,17 +2,22 @@
## Main Rule
Trellis is the development workflow coordinator. Issue CSV remains the execution
contract and `docs/` remains the business fact source.
Trellis task directories are the execution contract for new hyb-oa work.
`docs/` remains the business fact source. Historical `issues/*.csv` files remain
audit evidence and optional export material, but they are not mandatory for new
tasks after TRELLIS2.
## Required Flow
- Start non-trivial work from a Trellis task with a PRD.
- Bind the task to an Issue CSV path and Issue ID before implementation.
- Put goal, scope, out-of-scope, acceptance and test plan in `prd.md`.
- Add `design.md` or `implement.md` for complex process, API, migration,
permission, deployment or workflow-governance changes.
- Curate `implement.jsonl` and `check.jsonl` with stable spec or research
context only.
- Give a concrete implementation plan before coding and wait for approval.
- Keep edits scoped to the current Issue.
- Update Issue statuses only after the stated Test_Method passes.
- Commit in Chinese and include the Issue ID.
- Keep edits scoped to the current Trellis task.
- Commit in Chinese and include the Trellis task name or task ID.
## Stop Conditions
@@ -24,8 +29,13 @@ contract and `docs/` remains the business fact source.
## Current Local Commands
- `python3 <plan-skill>/scripts/validate_issues_csv.py <csv>`
- `node scripts/qa/check-process-contract.mjs --baseline --json`
- `python3 ./.trellis/scripts/task.py validate <task>`
- `node scripts/qa/check-trellis-governance.mjs`
- `git diff --check`
- `bash scripts/check-minimal.sh`
## Legacy Issue CSV
- Do not delete, bulk rewrite or move historical `issues/*.csv` files.
- New work may mention an old Issue CSV for traceability, but must not require
a new CSV unless the user explicitly requests legacy/export evidence.
+1 -1
查看文件
@@ -12,7 +12,7 @@ operating audit.
- Enterprise WeChat API checks that need trusted IP must run from the deployment
server, not local.
- Do not write Enterprise WeChat, create templates, create approvals, expand
real users, or enable live trials without explicit approval and an Issue CSV.
real users, or enable live trials without explicit approval and a Trellis task.
- Approval-rule configuration cannot be fully read through official APIs; keep
manual backend/real-device gates where specified.
- Messages to Enterprise WeChat must be dehydrated and link back to OA; do not
@@ -0,0 +1,2 @@
{"file":".trellis/spec/hyb-oa/index.md","reason":"Verify project-specific specs are discoverable."}
{"file":".trellis/spec/hyb-oa/project-governance.md","reason":"Verify bootstrap remains compatible with current governance."}
@@ -0,0 +1,5 @@
# Bootstrap Design
This is the generated Trellis bootstrap task. hyb-oa keeps it as historical
setup evidence, while project-specific rules live in `.trellis/spec/hyb-oa/`.
TRELLIS2 supersedes the old Issue CSV binding requirement for new tasks.
@@ -0,0 +1,2 @@
{"file":".trellis/spec/hyb-oa/index.md","reason":"Project-specific hyb-oa spec entry after bootstrap."}
{"file":".trellis/spec/hyb-oa/project-governance.md","reason":"Project governance supersedes generated bootstrap placeholders."}
@@ -6,6 +6,32 @@
`.trellis/spec/hyb-oa/`; the generated backend/frontend scaffolds remain
secondary.
## Goal
Capture project-specific Trellis specs so future agents follow hyb-oa
conventions instead of generic generated placeholders.
## Scope
- Bootstrap project-specific Trellis specs and confirm hyb-oa conventions.
- Treat this task as historical setup evidence after TRELLIS2.
## Out Of Scope
- No OA business-code changes.
- No deployment, database write, Enterprise WeChat write or public data write.
## Acceptance
- hyb-oa project specs exist under `.trellis/spec/hyb-oa/`.
- Future work can use task PRDs and JSONL spec context instead of generic
agent memory.
## Test Plan
- `python3 ./.trellis/scripts/task.py validate 00-bootstrap-guidelines`
- `node scripts/qa/check-trellis-governance.mjs`
**You (the AI) are running this task. The developer does not read this file.**
The developer just ran `trellis init` on this project for the first time.
@@ -0,0 +1,6 @@
# TRELLIS1 Pilot Design
TRELLIS1 proved Trellis could be introduced without changing OA business code.
Its original design intentionally bound a Trellis task to Issue CSV evidence.
TRELLIS2 supersedes that dual-track rule and keeps this task as historical
migration evidence.
@@ -27,3 +27,8 @@ binding to Issue CSV and project documentation.
- The task contains issue binding and redacted scope.
- `implement.jsonl` and `check.jsonl` include real spec context entries.
- Trellis governance check passes.
## Test Plan
- `python3 ./.trellis/scripts/task.py validate 05-26-trellis1-pilot`
- `node scripts/qa/check-trellis-governance.mjs`
@@ -0,0 +1,3 @@
{"file":".trellis/spec/hyb-oa/project-governance.md","reason":"Check that task-first governance supersedes mandatory Issue CSV binding."}
{"file":".trellis/spec/hyb-oa/docs-and-evidence.md","reason":"Check documentation registration and evidence boundaries."}
{"file":".trellis/spec/hyb-oa/security-privacy.md","reason":"Check sensitive-data exclusions in Trellis governance files."}
@@ -0,0 +1,21 @@
# TRELLIS2 Design
## Decision
Use the official Trellis task directory as the single execution contract for
new work. Issue CSV remains available as historical evidence or an optional
export format when a tabular external audit packet is needed.
## Contract Shape
- `task.json`: metadata, status, scope, related files and optional commit/PR.
- `prd.md`: goal, scope, out-of-scope, acceptance and test plan.
- `design.md` or `implement.md`: required for complex process, API, migration,
permission, deployment or workflow-governance changes.
- `implement.jsonl` / `check.jsonl`: stable spec or research context only.
## Compatibility
Existing Issue CSV files stay in place. Existing Trellis tasks can mention
their old Issue CSV bindings as historical metadata, but new task validation
must not require those bindings.
@@ -0,0 +1,3 @@
{"file":".trellis/spec/hyb-oa/project-governance.md","reason":"Defines the hyb-oa development governance contract to update."}
{"file":".trellis/spec/hyb-oa/docs-and-evidence.md","reason":"Defines docs fact-source and evidence registration rules."}
{"file":".trellis/spec/hyb-oa/security-privacy.md","reason":"Defines redaction boundaries for Trellis tasks, docs and reports."}
@@ -0,0 +1,49 @@
# TRELLIS2 Official Task Contract
## Goal
Adopt official Trellis task-first usage for hyb-oa development governance.
Future non-trivial work starts from `.trellis/tasks/*`; the task directory
holds the PRD, implementation context, verification context and finish record.
## Scope
- Make Trellis task the execution contract for new work.
- Keep `docs/` as the business fact source.
- Keep historical `issues/*.csv` files for audit and legacy lookup only.
- Update AGENTS, Trellis workflow, project governance spec, governance check,
project documentation and the hyb-oa delivery skill.
## Out Of Scope
- No backend or frontend business-code changes.
- No deployment or public OA verification.
- No database, Enterprise WeChat, payment, production config or real-data write.
- No deletion, migration or bulk rewrite of historical `issues/*.csv` files.
## Acceptance
- New governance text says non-trivial work requires a Trellis task, not an
Issue CSV.
- `scripts/qa/check-trellis-governance.mjs` validates task contract quality
without requiring Issue CSV bindings.
- Current active Trellis tasks have PRD/test/scope information sufficient for
the new check.
- Documentation and the project skill agree on Trellis task-first operation.
## Test Plan
- `python3 ./.trellis/scripts/task.py validate 05-26-trellis2-official-task-contract`
- `python3 ./.trellis/scripts/task.py list`
- `node --check scripts/qa/check-trellis-governance.mjs`
- `node scripts/qa/check-trellis-governance.mjs`
- `node scripts/qa/audit-docs.mjs --check-registry`
- `python3 /home/shunli/.codex/skills/.system/skill-creator/scripts/quick_validate.py .agents/skills/hyb-oa-delivery`
- `git diff --check`
- `bash scripts/check-minimal.sh`
## Privacy
Do not store passwords, token, Secret, real invoice originals, contract bodies,
bank materials, full accounts, complete local paths or raw payloads in Trellis
tasks, docs, reports or chat.
@@ -0,0 +1,38 @@
{
"id": "trellis2-official-task-contract",
"name": "trellis2-official-task-contract",
"title": "TRELLIS2 official task contract",
"description": "Migrate hyb-oa development governance from Issue CSV binding to official Trellis task contracts.",
"status": "in_progress",
"dev_type": "docs",
"scope": "trellis-governance",
"package": "docs",
"priority": "P2",
"creator": "shunli",
"assignee": "shunli",
"createdAt": "2026-05-26",
"completedAt": null,
"branch": null,
"base_branch": "main",
"worktree_path": null,
"commit": null,
"pr_url": null,
"subtasks": [],
"children": [],
"parent": null,
"relatedFiles": [
"AGENTS.md",
".trellis/workflow.md",
".trellis/spec/hyb-oa/project-governance.md",
"scripts/qa/check-trellis-governance.mjs",
"docs/Agent开发交付实践.md",
"docs/文档索引.md",
"docs/文档事实源状态矩阵.md",
".agents/skills/hyb-oa-delivery/SKILL.md"
],
"notes": "No business code, no deployment, no public OA data writes. TRELLIS2 intentionally creates no Issue CSV.",
"meta": {
"contractMode": "trellis_task",
"supersedesPolicy": "TRELLIS1 dual-track Issue CSV binding"
}
}
+14 -11
查看文件
@@ -2,29 +2,32 @@
## hyb-oa Trellis-first Overlay
hyb-oa uses Trellis as the primary development workflow from TRELLIS1 onward.
Trellis organizes task context and execution, while Issue CSV remains the
auditable contract and `docs/` remains the business fact source.
hyb-oa uses official Trellis task directories as the development contract from
TRELLIS2 onward. Trellis owns task context, planning, execution, verification
and finish records; `docs/` remains the business fact source. Historical
`issues/*.csv` files are audit evidence or optional export material, not a
mandatory prerequisite for new work.
Required project sequence for non-trivial work:
1. Create or update a `.trellis/tasks/<task>/` task with a PRD and acceptance notes.
2. Bind the task to an `issues/*.csv` file and Issue ID before implementation.
1. Create or update a `.trellis/tasks/<task>/` task with `prd.md`, acceptance notes and test plan.
2. Add `design.md` or `implement.md` for complex process, API, migration, permission, deployment or workflow-governance changes.
3. Read the relevant `.trellis/spec/hyb-oa/` files and project docs referenced there.
4. Implement only after the user has approved the plan and Issue CSV.
5. Run the task's Test_Method plus the Trellis governance gate.
4. Implement only after the user has approved the task plan.
5. Run the task's test plan plus the Trellis governance gate.
6. Update specs/docs only with stable, reusable lessons.
7. Commit in Chinese and include the Issue ID.
7. Commit in Chinese and include the Trellis task name or task ID.
Hard boundaries:
- Do not let Trellis replace Issue CSV status, docs fact sources, or production
deployment gates.
- Do not let Trellis replace docs fact sources or production deployment gates.
- Do not create new Issue CSV files unless the user explicitly needs a tabular
external audit packet or legacy compatibility export.
- Do not auto-commit Trellis workspace/session files; `session_auto_commit` is
disabled in `.trellis/config.yaml`.
- Do not write passwords, token, Secret, real invoice originals, contract bodies,
bank materials, full accounts, complete local paths, or raw payloads into
`.trellis/`, docs, Issue CSV, reports, or chat.
`.trellis/`, docs, reports, or chat.
- In Codex, this project defaults to inline dispatch. Sub-agents are optional and
must receive an explicit active task path if used.
+11 -10
查看文件
@@ -1,23 +1,24 @@
# AGENTS
> Purpose: 以 Trellis 为主流程,保留 Issue CSV 审计合同和 hyb-oa 业务事实源。
> Purpose: 以官方 Trellis task 为执行合同,驱动 hyb-oa 后续开发、验证和复盘。
## Trellis-first 入口
- 开始任何非微小开发、审查、测试或文档治理任务前,先读 `.trellis/workflow.md`。
- Trellis task 是后续需求拆解、上下文组织、执行复盘的主入口;每个 task 必须绑定 `issues/*.csv` 中的 Issue ID。
- `issues/*.csv` 仍是可审计执行合同;Trellis 不替代 Issue CSV 状态、验收、回滚和 commit 追踪。
- `docs/` 仍是业务事实源;Trellis spec 只沉淀开发流程和高频工程规则。
- Trellis task 是后续需求拆解、执行、验证和复盘的执行合同;新任务不再强制绑定 `issues/*.csv`。
- `prd.md` 是任务需求和验收入口;复杂任务补 `design.md` 或 `implement.md`;`implement.jsonl` / `check.jsonl` 只登记稳定 spec 或 research 上下文。
- `issues/*.csv` 保留为历史审计材料或特殊外部交付导出格式,不再作为新开发的默认前置合同。
- `docs/` 仍是业务事实源;Trellis spec 沉淀开发流程和高频工程规则。
## 不可违反约束
- 编码前先方案:非微小改动必须先给实现方案并等待批准。
- 先有 Issue CSV 再开发:非微小改动必须先落 `issues/*.csv`。
- 先有 Trellis task 再开发:非微小改动必须先创建或更新 `.trellis/tasks/<task>/`。
- 计划工具约束:使用 Codex 原生 `update_plan` 做执行清单,不用外部自定义 plan 替代。
- 项目 Skill 优先:hyb-oa 交付、试运行、视觉复核、报销/OCR/附件、企业微信或部署类任务继续使用 `.agents/skills/hyb-oa-delivery`,再按 Trellis task/spec 组织上下文。
- 中文沟通;commit message 使用中文并引用 Issue ID。
- 中文沟通;commit message 使用中文并引用 Trellis task 名称或任务 ID。
- 不泄露密码、token、Secret、真实票据、合同正文、银行资料、完整账号、完整本地路径或原始 payload。
- 不轻易新建文档;优先更新现有事实源、模块规约、操作手册、证据文档或连续 Issue CSV。
- 不轻易新建文档;优先更新现有事实源、模块规约、操作手册、证据文档或当前 Trellis task。
- 页面调整必须参考 `docs/产品设计规则.md`,并对齐公司主页 `www.hyinda.com` 的品牌风格。
- 面向用户可测试的改动,只有部署与公网检查通过后才能告知用户可以测试。
@@ -42,14 +43,14 @@
## Trellis 使用边界
- `.trellis/workspace/` 为本地个人日志,默认不提交;需要沉淀的经验应脱敏后写入 `.trellis/spec/`、`docs/` 或 Issue CSV。
- `.trellis/workspace/` 为本地个人日志,默认不提交;需要沉淀的经验应脱敏后写入 `.trellis/spec/`、`docs/` 或当前 Trellis task。
- `.trellis/config.yaml` 固定 `session_auto_commit: false`;Trellis 不得自动提交。
- 当前仅启用 Codex 适配;不把 Cursor/Claude/其他平台迁移作为本轮默认范围。
- Codex hooks 文件可以存在,但只有用户级配置和 `/hooks` 审核启用后才生效;本项目不把 hook 自动注入作为验收前提。
## 编排规则
- 默认按 Trellis workflow 执行:task/prd -> Issue CSV -> implement -> check -> spec/docs update -> commit -> finish。
- 默认按 Trellis workflow 执行:task/prd -> design/implement notes(按需) -> implement -> check -> spec/docs update -> commit -> finish。
- 涉及权限模型、状态机、workflow、数据迁移、审批规则时,实施后必须启动只读 review,不让 reviewer 改代码。
- 公网部署、生产配置、真实数据写入、数据库重置、企业微信写入和真实付款必须另行获得明确批准。
- 若 Trellis 规则与业务文档冲突:最新 Issue CSV > 当前模块规约/PRD > `docs/产品设计规则.md` 和业务规约 > Trellis spec > 历史证据。
- 若 Trellis 规则与业务文档冲突:当前 Trellis task PRD/设计 > 当前模块规约 > `docs/产品设计规则.md` 和业务规约 > Trellis spec > 历史证据;历史 Issue CSV 只用于追溯。
+18 -16
查看文件
@@ -16,19 +16,19 @@
## 本项目采用的原则
### 0. TRELLIS1 后以 Trellis 为主流程
### 0. TRELLIS2 后以官方 Trellis task 为执行合同
TRELLIS1 起,hyb-oa 的后续非微小开发默认从 `.trellis/tasks/` 进入,由 `.trellis/workflow.md` 组织计划、实施、检查和复盘。
TRELLIS2 起,hyb-oa 的后续非微小开发默认从 `.trellis/tasks/` 进入,由 task 目录本身承载需求、计划、实施、检查和复盘。
Trellis 的定位是“开发流程和上下文组织层”,不是业务事实源替代品:
Trellis 的定位是“开发执行合同和上下文组织层”,不是业务事实源替代品:
- Trellis task:承载本轮需求 PRD、上下文和复盘。
- Trellis task:承载本轮需求 PRD、范围边界、验收、测试计划、上下文和复盘。
- Trellis spec:沉淀稳定开发规则和高频工程边界。
- Issue CSV:仍是执行合同、验收、状态和回滚审计台账。
- Issue CSV:保留为历史审计材料或特殊外部交付导出格式,不再作为新任务默认前置合同。
- `docs/`:仍是业务事实源、产品规则、操作手册和证据入口。
- `AGENTS.md`:只保留 Trellis-first 入口和不可违反硬约束。
每个 Trellis task 必须绑定 Issue CSV 和 Issue ID;`.trellis/workspace/` 默认作为本地个人日志,不提交。提交前必须运行 `node scripts/qa/check-trellis-governance.mjs`。
每个非微小 Trellis task 必须有 `prd.md`;复杂流程、API、迁移、权限、部署或治理变更补 `design.md` 或 `implement.md`;`.trellis/workspace/` 默认作为本地个人日志,不提交。提交前必须运行 `node scripts/qa/check-trellis-governance.mjs`。
### 1. 先简单、后编排
@@ -36,15 +36,17 @@ Trellis 的定位是“开发流程和上下文组织层”,不是业务事实
不为了“多 agent”而多 agent。复杂编排的收益必须超过上下文丢失、沟通成本和合并风险。
### 2. Issue CSV 是执行合同
### 2. Trellis task 是执行合同
所有非微小改动先进入 `issues/*.csv`,再实施。Issue 必须写清:
所有非微小改动先进入 `.trellis/tasks/<task>/`,再实施。task 必须写清:
- 业务流程级影响,不只写文件路径。
- 验收标准,不只写“完成开发”。
- 可执行验证命令或可复现手工步骤。
- 数据迁移、权限、状态机、审批规则的回滚策略。
历史 `issues/*.csv` 不删除、不批量回写;需要表格化审计时,可以从 Trellis task 摘要导出,而不是重新维护一套并行合同。
### 3. Skill 只沉淀操作流程
Skill 用于减少重复沟通和降低遗漏风险,适合沉淀:
@@ -124,7 +126,7 @@ DG9 之后,页面任务必须先按 `docs/产品设计规则.md` 的 A/B/C 页
- 当前事实源、操作手册和用户可读文档默认使用中文文件名;技术生态或脚本强引用的英文名可以保留,但必须在索引中说明。
- 已确认不用的历史文档从当前树物理删除,不放 `docs/archive/`;需要时通过 git 历史恢复。
- 不回写旧 Issue CSV 快照;旧 Issue 中的历史路径保留审计语义。
- 历史矩阵、旧 runbook 或旧 trialrun 记录若与最新 Issue CSV、当前 PRD 或模块规约冲突,以最新 Issue CSV 和当前模块规约为准。
- 历史矩阵、旧 runbook 或旧 trialrun 记录若与当前 Trellis task、当前 PRD 或模块规约冲突,以当前 Trellis task 和当前模块规约为准。
- R7/OPS7/DOC7 草案不代表真实 R7 已启动;MIF7/MIF7T 已收口,后续移动体验问题应进入新的 UX8 或专项 Issue。
### 7. 提交要小批次、中文、可回滚
@@ -136,7 +138,7 @@ DG9 之后,页面任务必须先按 `docs/产品设计规则.md` 的 A/B/C 页
- 前端体验。
- 测试和视觉验证。
commit message 使用中文并引用 Issue ID,例如 `R121/A1-A3 沉淀交付事实源`。
commit message 使用中文并引用 Trellis task 名称或任务 ID,例如 `trellis2-official-task-contract 采用官方 Trellis 执行合同`。
### 8. 自然语言派工是默认入口
@@ -145,9 +147,9 @@ commit message 使用中文并引用 Issue ID,例如 `R121/A1-A3 沉淀交付
- 意图:缺陷、需求、验收反馈、计划、审查、测试、部署、设计或产品流程优化。
- 对象:页面、接口、业务流程、数据、部署环境、文档或自动化。
- 约束:是否要求先规划、是否已授权实施、是否涉及公网、企业微信、真实账号或真实数据。
- 下一步:核查、建 Issue CSV、给方案等确认、实施、验证、提交、部署。
- 下一步:核查、建 Trellis task、给方案等确认、实施、验证、提交、部署。
当用户说“确认”时,默认表示批准上一条明确方案或 Issue CSV 进入下一阶段。若上下文中存在多个候选方案,agent 才需要反问确认对象。
当用户说“确认”时,默认表示批准上一条明确方案或 Trellis task 进入下一阶段。若上下文中存在多个候选方案,agent 才需要反问确认对象。
### 9. 少反问,先查已有资产
@@ -164,7 +166,7 @@ agent 在声明 blocker 前,必须先查项目内已有资产:
以下情况必须暂停确认:
- 非微小代码改动还没有方案批准,或没有 Issue CSV 执行合同。
- 非微小代码改动还没有方案批准,或没有 Trellis task 执行合同。
- 需要删除或重置数据、处理迁移漂移、修改生产配置、重启远程服务。
- 需要使用、重置或暴露真实账号密码、密钥、令牌、客户数据。
- 用户目标互相冲突,且无法通过现有文档和代码推断优先级。
@@ -176,7 +178,7 @@ agent 在声明 blocker 前,必须先查项目内已有资产:
同一个 agent 可以按任务临时切换工作视角,但输出必须落到可审计交付物:
- 产品经理:把一段话拆成业务流程、优先级、Issue CSV、验收标准和下一步建议。
- 产品经理:把一段话拆成业务流程、优先级、Trellis task、验收标准和下一步建议。
- 需求分析:补齐边界条件、角色权限、异常状态、国内同类系统常见处理方式。
- 开发:按 Issue 实施后端、前端、脚本或文档变更,并执行对应验证。
- 审查:默认先报风险、行为回归、权限泄漏、状态机问题和漏测项。
@@ -204,7 +206,7 @@ agent 在声明 blocker 前,必须先查项目内已有资产:
适合自动化或半自动化固化的任务:
- 每轮 Issue CSV 校验、状态回填检查和未完成项扫描。
- 每轮 Trellis task 合同校验、上下文检查和未完成项扫描。
- 后端 syntax、Prisma validate、核心回归脚本。
- 前端 typecheck、build、关键页面 Playwright 和视觉截图。
- 公网 `/ready`、企业微信配置、资源版本、核心文案和 live smoke。
@@ -217,7 +219,7 @@ agent 在声明 blocker 前,必须先查项目内已有资产:
开发类任务完成时,agent 必须说明:
- 改了什么,关联哪些 Issue ID。
- 改了什么,关联哪个 Trellis task。
- 验证了什么,哪些命令或路径通过。
- 是否提交 commit,commit hash 是什么。
- 面向用户可测试的改动是否已经部署;未部署时不能说“可以去企业微信测试”。
+11 -10
查看文件
@@ -5,12 +5,12 @@
**适用时间**:DCL7 之后。
**关联 Issue**:`GOV8`。
**最近审计**:2026-05-18。
**不得误读**:本文登记文档权威性和状态,不替代具体 PRD、模块规约、测试规约或 Issue CSV。
**不得误读**:本文登记文档权威性和状态,不替代具体 Trellis task、PRD、模块规约或测试规约。
**治理口径**:中文优先,物理精简,优先复用已有文档。历史资料不建 `docs/archive/`,已确认不用的文档从当前树移除,通过 git 历史恢复。
## 冲突优先级
最新 Issue CSV > 当前 PRD/模块规约 > 产品和设计规则 > 当前操作手册 > 技术参考 > 历史证据 > git 历史。
当前 Trellis task PRD/设计 > 当前 PRD/模块规约 > 产品和设计规则 > 当前操作手册 > 技术参考 > 历史证据 > git 历史。
## 台账状态值
@@ -118,17 +118,18 @@
| `OAFRONT6` | `issues/2026-05-25_12-29-03-oa-frontend-maturity-small-step-v1.csv` | `CURRENT` | 当前前端成熟化小步收口合同:承接 OAFRONT5 部署后 PC 硬问题清零和设计审计;路由标题修复、资产台账详情分区、移动视觉矩阵稳定等待、合同台账表单分组和长编号压缩均已实施部署,公网 PC 只读视觉矩阵复测 `PASS_PC_READONLY_VISUAL_READY` 且 `findingCount=0`;Portal 观察继续后置;本合同不写公网业务数据,不替代 OALAUNCH1 真实业务、备份恢复、7 天稳定化或 Go/No-Go |
| `OAKISS1` | `issues/2026-05-25_20-53-34-oa-business-flow-kiss-review-v1.csv` | `CURRENT` | 当前全业务流程 KISS 审查合同:按 MAGI 审视/执行/提升轮次,对报销/OCR、审批、采购/费用、合同/项目、付款/AP、票据池、资产、权限、移动/企微入口逐项做自动化和人工步骤审查;输出 KISS 建议台账,不直接改业务代码;OALAUNCH1 真实业务闭环、备份恢复、7 天稳定化和 Go/No-Go 仍是正式启用前硬门禁 |
| `PCDESIGN1` | `issues/2026-05-25_21-27-56-oa-pc-page-design-review-v1.csv` | `CURRENT` | 当前 PC 全页面设计审查合同:按 MAGI 审视/执行/提升轮次,以项目经理和设计总监视角盘点 45 条静态 PC 路由、A/B/C 页面分层、关键视觉矩阵和 KISS 建议;关键 PC 矩阵 `PASS_PC_READONLY_VISUAL_READY`,全静态路由扫描 `PASS_PC_STATIC_ROUTE_SCAN_READY`;建议优先收敛 HR/考勤边界、冻结模块入口、高密度 B/C 页默认视图和动态详情页证据,不直接改业务代码 |
| `TRELLIS1` | `issues/2026-05-26_09-02-34-trellis-primary-development-workflow-v1.csv` | `CURRENT` | 当前 Trellis 主导开发流程迁移合同:后续非微小开发默认从 `.trellis/tasks/` 进入;`.trellis/workflow.md` 组织计划、实施、检查和复盘;Issue CSV 仍是审计合同,`docs/` 仍是业务事实源;本轮不改业务代码、不部署、不写公网数据 |
| `TRELLIS1` | `issues/2026-05-26_09-02-34-trellis-primary-development-workflow-v1.csv` | `EVIDENCE` | Trellis-first 初始迁移历史合同:已由 TRELLIS2 官方 task 执行合同口径替代 |
| `TRELLIS2` | `.trellis/tasks/05-26-trellis2-official-task-contract/` | `CURRENT` | 当前开发流程合同:官方 Trellis task 作为新任务执行合同;Issue CSV 降级为历史审计或可选导出格式;本轮不改业务代码、不部署、不写公网数据 |
| `WREAL1-PREP` | `issues/2026-05-20_14-35-42-wecom-real-trial-prep-v1.csv` | `CURRENT` | 真实小范围试用准备合同:只固化候选员工、非自审审批人、回滚联系人、允许流程、暂停条件和验收标准;当前不启用真实员工,真实试用必须等请假/补卡/外出/加班四类测试号证据、WAPPR1 审批规则门禁和 WFULLSMOKE1 全域主路径可解释通过后再问 |
旧 Issue CSV 保留为历史审计证据:不删除、不批量回写、不移动到 `docs/archive/` 或其他归档目录。新连续合同如替代旧合同,只在新合同 `Notes` 或文档索引中说明 supersedes。
旧 Issue CSV 保留为历史审计证据:不删除、不批量回写、不移动到 `docs/archive/` 或其他归档目录。新治理流如替代旧合同,只在新 Trellis task、文档索引或事实源矩阵中说明 supersedes。
## 文档台账
| Doc_ID | Path | Category | Authority | Status | Owner | Related_Issues | Evidence | Supersedes | Last_Audited | Audit_Method | Risk | Notes |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| `IDX` | `docs/文档索引.md` | 入口索引 | 最高文档入口 | `CURRENT` | product/dev | `GOV8,QAOPS9,P2D,P2-ORG,P2-FIN-DECISION,P2-FIN-V1,P2-OCR-SAMPLE,P2Q,P2AUTO,P2AF,P2-FIN-LIVE-DECISION,P2-FIN-LIVE,PRELAUNCH,CASHIER-VOUCHER-V1,LAUNCH-DEPLOY-FINANCE,FIN-PROD-ENABLE,ACCOUNTING-HANDOFF-V1,SYSTEM-COMPLETE-GATE,LAUNCH-OPS-V1,REQ-COMPLETE-AUDIT,ATTV1,LAUNCH-AUTO-OPS-V1,AUTO-REMAINING-CLOSEOUT,HR-WECOM-DIRECTORY-V1,WFOC,DBWFOC,WFDG,WDRG,WCP1,WCPC,WHMS,WHMSLIVE,WOUA,WAPI,WRRA,WOUAFIX,WRV1,WRA1,WMSG1,WAPC1,WAPC2,WPROC1,WPROC2,WAPC2F,WAPC2FLIVE,WCBK1,WEGOV1,WARCH1,WARCH2,WROAD2,WARCH3,WCHECK1,WEXT1,WOPS1,WROAD2C,WROAD2B,WAPPR1,WRULE1,WAUTO1,WEXT1LD,WFULLSMOKE1,WTCLOSE2,WREAL1P,OAOPS1,ASSET1,OSMOKE1,OALAUNCH1,OMAT1,OPOLICY1,OAFLOW1,OAFRONT6,OAKISS1,PCDESIGN1` | `rg` | none | 2026-05-25 | `node scripts/qa/audit-docs.mjs --check-registry` | medium | 判断当前该读什么;OAOPS1/ASSET1/OSMOKE1 后优先读取 OALAUNCH1 最终启用门禁、OMAT1 成熟度缺口、OPOLICY1 制度与 OA 对齐、OAFLOW1 负责人本人报销兜底、OAFRONT6 前端成熟化规划、OAKISS1 全业务 KISS 审查、PCDESIGN1 PC 全页面设计审查、小团队 V1、每日巡检、备份恢复和 P2 冻结口径 |
| `REG` | `docs/文档事实源状态矩阵.md` | 文档台账 | 文档分类和状态事实源 | `CURRENT` | product/dev | `GOV8,QAOPS9,P2D,P2-ORG,P2-FIN-DECISION,P2-FIN-V1,P2-OCR-SAMPLE,P2Q,P2AUTO,P2AF,P2-FIN-LIVE-DECISION,P2-FIN-LIVE,PRELAUNCH,CASHIER-VOUCHER-V1,LAUNCH-DEPLOY-FINANCE,FIN-PROD-ENABLE,ACCOUNTING-HANDOFF-V1,SYSTEM-COMPLETE-GATE,LAUNCH-OPS-V1,REQ-COMPLETE-AUDIT,ATTV1,LAUNCH-AUTO-OPS-V1,AUTO-REMAINING-CLOSEOUT,HR-WECOM-DIRECTORY-V1,WFOC,DBWFOC,WFDG,WDRG,WCP1,WCPC,WHMS,WHMSLIVE,WOUA,WAPI,WRRA,WOUAFIX,WRV1,WRA1,WMSG1,WAPC1,WAPC2,WPROC1,WPROC2,WAPC2F,WAPC2FLIVE,WCBK1,WEGOV1,WARCH1,WARCH2,WROAD2,WARCH3,WCHECK1,WEXT1,WOPS1,WROAD2C,WROAD2B,WAPPR1,WRULE1,WAUTO1,WEXT1LD,WFULLSMOKE1,WTCLOSE2,WREAL1P,OAOPS1,ASSET1,OSMOKE1,OALAUNCH1,OMAT1,OPOLICY1,OAFLOW1,OAFRONT6,OAKISS1,PCDESIGN1` | `audit-docs` | none | 2026-05-25 | `audit-docs --check-registry` | medium | 判断文档权威性;登记当前 OALAUNCH1 最终启用 Go/No-Go、OMAT1 成熟度缺口、OPOLICY1 制度与 OA 对齐、OAFLOW1 负责人本人报销兜底、OAFRONT6 前端成熟化规划、OAKISS1 全业务 KISS 审查、PCDESIGN1 PC 全页面设计审查、OAOPS1、ASSET1、OSMOKE1、每日巡检、阻断即修和冻结项事实 |
| `IDX` | `docs/文档索引.md` | 入口索引 | 最高文档入口 | `CURRENT` | product/dev | `GOV8,QAOPS9,P2D,P2-ORG,P2-FIN-DECISION,P2-FIN-V1,P2-OCR-SAMPLE,P2Q,P2AUTO,P2AF,P2-FIN-LIVE-DECISION,P2-FIN-LIVE,PRELAUNCH,CASHIER-VOUCHER-V1,LAUNCH-DEPLOY-FINANCE,FIN-PROD-ENABLE,ACCOUNTING-HANDOFF-V1,SYSTEM-COMPLETE-GATE,LAUNCH-OPS-V1,REQ-COMPLETE-AUDIT,ATTV1,LAUNCH-AUTO-OPS-V1,AUTO-REMAINING-CLOSEOUT,HR-WECOM-DIRECTORY-V1,WFOC,DBWFOC,WFDG,WDRG,WCP1,WCPC,WHMS,WHMSLIVE,WOUA,WAPI,WRRA,WOUAFIX,WRV1,WRA1,WMSG1,WAPC1,WAPC2,WPROC1,WPROC2,WAPC2F,WAPC2FLIVE,WCBK1,WEGOV1,WARCH1,WARCH2,WROAD2,WARCH3,WCHECK1,WEXT1,WOPS1,WROAD2C,WROAD2B,WAPPR1,WRULE1,WAUTO1,WEXT1LD,WFULLSMOKE1,WTCLOSE2,WREAL1P,OAOPS1,ASSET1,OSMOKE1,OALAUNCH1,OMAT1,OPOLICY1,OAFLOW1,OAFRONT6,OAKISS1,PCDESIGN1,TRELLIS2` | `rg` | none | 2026-05-26 | `node scripts/qa/audit-docs.mjs --check-registry` | medium | 判断当前该读什么;TRELLIS2 后新开发先读当前 Trellis task,旧 Issue CSV 只追溯;仍优先读取 OALAUNCH1、OMAT1、OPOLICY1、OAFLOW1、OAFRONT6、OAKISS1、PCDESIGN1 等业务事实源 |
| `REG` | `docs/文档事实源状态矩阵.md` | 文档台账 | 文档分类和状态事实源 | `CURRENT` | product/dev | `GOV8,QAOPS9,P2D,P2-ORG,P2-FIN-DECISION,P2-FIN-V1,P2-OCR-SAMPLE,P2Q,P2AUTO,P2AF,P2-FIN-LIVE-DECISION,P2-FIN-LIVE,PRELAUNCH,CASHIER-VOUCHER-V1,LAUNCH-DEPLOY-FINANCE,FIN-PROD-ENABLE,ACCOUNTING-HANDOFF-V1,SYSTEM-COMPLETE-GATE,LAUNCH-OPS-V1,REQ-COMPLETE-AUDIT,ATTV1,LAUNCH-AUTO-OPS-V1,AUTO-REMAINING-CLOSEOUT,HR-WECOM-DIRECTORY-V1,WFOC,DBWFOC,WFDG,WDRG,WCP1,WCPC,WHMS,WHMSLIVE,WOUA,WAPI,WRRA,WOUAFIX,WRV1,WRA1,WMSG1,WAPC1,WAPC2,WPROC1,WPROC2,WAPC2F,WAPC2FLIVE,WCBK1,WEGOV1,WARCH1,WARCH2,WROAD2,WARCH3,WCHECK1,WEXT1,WOPS1,WROAD2C,WROAD2B,WAPPR1,WRULE1,WAUTO1,WEXT1LD,WFULLSMOKE1,WTCLOSE2,WREAL1P,OAOPS1,ASSET1,OSMOKE1,OALAUNCH1,OMAT1,OPOLICY1,OAFLOW1,OAFRONT6,OAKISS1,PCDESIGN1,TRELLIS2` | `audit-docs` | none | 2026-05-26 | `audit-docs --check-registry` | medium | 判断文档权威性;登记 TRELLIS2 官方 task-first 口径,以及当前 OALAUNCH1、OMAT1、OPOLICY1、OAFLOW1、OAFRONT6、OAKISS1、PCDESIGN1、OAOPS1、ASSET1、OSMOKE1、每日巡检、阻断即修和冻结项事实 |
| `PRD-MVP` | `docs/海音达OA-MVP需求规格说明书.md` | 需求事实源 | PRD 主事实源 | `CURRENT` | product | `REQ8,P2T,GOV8,HR-WECOM-DIRECTORY-V1,WFOC,DBWFOC,WFDG,WDRG,WCP1,WCPC,WHMS,WHMSLIVE,WOUA,WAPI,WRRA,WAPC1,WAPC2,WAPC2FLIVE,WCBK1,WEGOV1,WACP3,WACP3R,WARCH1,WARCH2,WROAD2,WARCH3,WCHECK1,WEXT1` | Issue CSV | `docs/requirements-specification.md` | 2026-05-20 | `rg` | high | WARCH3/WCHECK1/WEXT1/WOPS1 后定义 HR/考勤企微主办、OA 自建留存、受控测试域、只读历史查询、自动巡检、打卡摘要、外出/加班 dry-run、WEXT1-FORMAL、WREAL1 前置和深度镜像边界;ERP 未来不接入 OA |
| `PRODUCT-SCOPE` | `docs/产品口径.md` | 需求事实源 | 产品边界事实源 | `CURRENT` | product | `REQ8,P2T,WFDG,WDRG,WCP1,WCPC,WHMS,WHMSLIVE,WOUA,WAPI,WRRA,WAPC1,WAPC2FLIVE,WCBK1,WEGOV1` | `rg` | none | 2026-05-19 | `rg` | high | 记录已拍板产品边界、企微/OA 设计门禁、开发路线图、WCBK1 真实回调事件证据、WEGOV1 混合主办边界和 OA 自建留存策略 |
| `DESIGN-UI` | `docs/产品设计规则.md` | 设计事实源 | PC/移动/企业微信设计事实源 | `CURRENT` | design/frontend | `MIA7,MIF7,GOV8,DG8,DG9,WFDG` | Playwright/视觉审查/DG8/DG9/WFDG | none | 2026-05-18 | `rg` | high | 页面改动必须读取;DG8 后飞书为主 UI/布局参考;DG9 后按页面分层和样板选型;WFDG 后区分 OA 主办、企微镜像和 OA 应急接管 |
@@ -136,10 +137,10 @@
| `WECOM-API-CATALOG` | `docs/企微API能力目录.md` | 集成事实源 | 企微 API 能力目录和 Secret 矩阵事实源 | `CURRENT` | product/backend/qa | `WAPI,WRRA,WAPC1,WAPC2,WPROC1,WPROC2,WAPC2F,WAPC2FLIVE,WCBK1,WEGOV1,WACP3,WACP3R,WREAD1,WADM1,WARCH1,WARCH2,WROAD2,WARCH3,WCHECK1,WEXT1,WAPPR1,WTCLOSE1,WRULE1,WTCLOSE2` | 官方企业微信开发者中心链接/Issue CSV | none | 2026-05-22 | `rg` | high | 企微开发先读;只保存摘要、链接和项目决策,不保存 Secret、token、完整 userid、手机号、邮箱或原始 payload;记录审批补偿、打卡摘要、巡检只写 OA 留存、不写企业微信、企微原生审批规则不可只读 API 化、需人工门禁,以及 WRULE1/WTCLOSE2 只读审批链校验和最终收口边界 |
| `DELIVERY` | `docs/开发交付与变更管理规约.md` | 开发治理 | 开发交付事实源 | `CURRENT` | dev/qa | `GOV8,WDRG,WRRA,WAPC1,WPROC1,WPROC2,WCBK1,WEGOV1,WOPS1,WROAD2C,WROAD2B,WAPPR1,WAUTO1,WEXT1LD,WFULLSMOKE1` | `rg` | none | 2026-05-20 | `rg` | high | Issue、review、commit、交付规则;WFULLSMOKE1 后固定 WAUTO1、WEXT1LD、全域最终目标测试和 WEXT1-FORMAL/WREAL1 前置门禁 |
| `QA-GATE` | `docs/测试规约与回归门禁.md` | 测试验收 | 测试和回归门禁事实源 | `CURRENT` | qa | `QAF8,GOV8,WPROC1,WPROC2,WAPC2FLIVE,WCBK1,WEGOV1` | 回归脚本/Playwright | none | 2026-05-19 | `rg` | high | 测试计划、DONE 门禁、企微三层门禁、自动化优先、非自审、无完整 sandbox 假设、WREAD1 真机可读性和 WARCH1 留存验收门禁 |
| `AGENT-PRACTICE` | `docs/Agent开发交付实践.md` | Agent 治理 | Agent 协作事实源 | `CURRENT` | dev | `GOV8,DG8` | Skill 校验 | none | 2026-05-13 | `rg` | medium | Agent 协作开发实践和设计主参考层级 |
| `AGENT-PRACTICE` | `docs/Agent开发交付实践.md` | Agent 治理 | Agent 协作事实源 | `CURRENT` | dev | `GOV8,DG8,TRELLIS2` | Skill 校验 | none | 2026-05-26 | `rg` | medium | Agent 协作开发实践、设计主参考层级和 TRELLIS2 官方 task-first 执行合同口径 |
| `AGENTS` | `AGENTS.md` | 执行硬约束 | 项目硬规则 | `CURRENT` | lead | `GOV8` | 人工核对 | none | 2026-05-13 | `rg` | high | 不可违反约束 |
| `SKILL-HYB` | `.agents/skills/hyb-oa-delivery/SKILL.md` | Skill | 项目交付 Skill | `CURRENT` | dev | `GOV8,DG8,WFDG,WDRG,WCP1,WCPC,WHMS,WHMSLIVE,WOUA,WAPI,WRRA,WRV1,WRA1,WMSG1,WAPC1,WAPC2,WPROC1,WPROC2,WAPC2F,WAPC2FLIVE,WCBK1,WEGOV1,WACP3,WACP3R,WREAD1,WREAD1F,WADM1,WARCH1,WARCH2,WROAD2,WARCH3,WCHECK1,WEXT1,WOPS1,WROAD2C,WROAD2B,WAPPR1,WRULE1,WAUTO1,WEXT1LD,WFULLSMOKE1,WROUTE2,WTCLOSE1,WTCLOSE2,WREAL1P,OAOPS1,ASSET1,OSMOKE1,OALAUNCH1,OMAT1,OPOLICY1,OAFLOW1,OAFRONT6` | quick_validate | none | 2026-05-25 | `quick_validate.py` | medium | 每轮交付操作入口;企微/OA 后续先读 API 能力目录、Secret 矩阵、路线图、ASSET1 资产边界、OSMOKE1 OA-only smoke 账号治理、OALAUNCH1 最终启用门禁、OPOLICY1 小团队 V1 制度对齐、OAFLOW1 负责人本人报销兜底和 OAFRONT6 前端成熟化规划;不得绕过真实业务闭环、权限矩阵、备份恢复、制度签收、Day 7 Go/No-Go 或后续独立合同直接宣布最终启用完成 |
| `TRELLIS-WORKFLOW` | `.trellis/workflow.md` | Trellis | 开发主流程入口 | `CURRENT` | dev | `TRELLIS1` | `check-trellis-governance` | `AGENTS.md,.trellis/spec/hyb-oa/` | 2026-05-26 | `node scripts/qa/check-trellis-governance.mjs` | medium | TRELLIS1 后后续非微小开发默认从 Trellis task 进入;Issue CSV 和 docs 仍是审计/业务事实源 |
| `SKILL-HYB` | `.agents/skills/hyb-oa-delivery/SKILL.md` | Skill | 项目交付 Skill | `CURRENT` | dev | `GOV8,DG8,WFDG,WDRG,WCP1,WCPC,WHMS,WHMSLIVE,WOUA,WAPI,WRRA,WRV1,WRA1,WMSG1,WAPC1,WAPC2,WPROC1,WPROC2,WAPC2F,WAPC2FLIVE,WCBK1,WEGOV1,WACP3,WACP3R,WREAD1,WREAD1F,WADM1,WARCH1,WARCH2,WROAD2,WARCH3,WCHECK1,WEXT1,WOPS1,WROAD2C,WROAD2B,WAPPR1,WRULE1,WAUTO1,WEXT1LD,WFULLSMOKE1,WROUTE2,WTCLOSE1,WTCLOSE2,WREAL1P,OAOPS1,ASSET1,OSMOKE1,OALAUNCH1,OMAT1,OPOLICY1,OAFLOW1,OAFRONT6,TRELLIS2` | quick_validate | none | 2026-05-26 | `quick_validate.py` | medium | 每轮交付操作入口;TRELLIS2 后非微小工作先读当前 Trellis task;企微/OA 后续先读 API 能力目录、Secret 矩阵、路线图、ASSET1 资产边界、OSMOKE1、OALAUNCH1、OPOLICY1、OAFLOW1 和 OAFRONT6;不得绕过真实业务闭环、权限矩阵、备份恢复、制度签收、Day 7 Go/No-Go 或后续独立合同直接宣布最终启用完成 |
| `TRELLIS-WORKFLOW` | `.trellis/workflow.md` | Trellis | 开发主流程入口 | `CURRENT` | dev | `TRELLIS2` | `check-trellis-governance` | `AGENTS.md,.trellis/spec/hyb-oa/` | 2026-05-26 | `node scripts/qa/check-trellis-governance.mjs` | medium | TRELLIS2 后后续非微小开发默认从官方 Trellis task 进入;Issue CSV 只作历史审计或可选导出格式,docs 仍是业务事实源 |
| `REQ-WF` | `docs/需求-统一审批中心规约.md` | 需求事实源 | 审批模块规约 | `CURRENT` | product/backend | `AP6,WF8,WFOC,DBWFOC,WFDG,WOUA,WAPI,WRRA,WRV1,WRA1,WMSG1,WAPC1,WAPC2,WPROC1,WPROC2,WAPC2F,WAPC2FLIVE,WCBK1,WEGOV1,WACP3,WACP3R,WREAD1,WREAD1F,WADM1,WARCH1,WAPPR1,WAUTO1,WEXT1LD,WFULLSMOKE1,WTCLOSE1,WRULE1,WTCLOSE2,OAFLOW1` | workflow 回归 | none | 2026-05-24 | `rg` | high | OA 主办审批、企微主办 HR/考勤审批、OA 自建留存、真实回调事件证据、WACP3R 补偿拉取 findings、WREAD1 请假/补卡真机可读性结论、WARCH1 最小历史留存、WAPPR1 审批规则规范化和 API 不支持读取规则边界、WTCLOSE1 小团队一层审批 + 管理员兜底目标 A、WRULE1 理论审批人与实际审批链校验、WTCLOSE2 测试号最终收口、OAFLOW1 负责人本人报销兜底、WAUTO1/WEXT1LD/WFULLSMOKE1 前置和 OA 应急接管边界 |
| `REQ-OCR` | `docs/需求-报销发票OCR规约.md` | 需求事实源 | OCR 模块规约 | `CURRENT` | product/backend | `RI6,OCR8,BIZ8` | OCR 回归 | none | 2026-05-13 | `rg` | high | OCR 和发票边界 |
| `RULE-REIMB` | `docs/报销发票附件规则.md` | 需求事实源 | 报销发票附件规则 | `CURRENT` | product/finance | `RI6,BIZ8` | 报销回归 | none | 2026-05-13 | `rg` | high | 报销、发票、附件细则 |
@@ -176,7 +177,7 @@
| `docs/需求-项目轻管理规约.md` | 当前事实源 | 项目轻管理 |
| `docs/需求-资产管理规约.md` | 当前事实源 | 统一资产台账、电子资产安全边界和资产编号族 |
| `docs/测试规约与回归门禁.md` | 当前事实源 | 测试和回归门禁 |
| `docs/开发交付与变更管理规约.md` | 当前事实源 | Issue CSV、review、提交和交付 |
| `docs/开发交付与变更管理规约.md` | 当前事实源 | Trellis task、review、提交和交付 |
| `docs/Agent开发交付实践.md` | 当前事实源 | Agent 协作开发实践 |
| `AGENTS.md` | 当前事实源 | 项目硬约束 |
| `.agents/skills/hyb-oa-delivery/SKILL.md` | 当前事实源 | 项目交付 Skill |
+17 -16
查看文件
@@ -10,17 +10,17 @@
## 读取规则
- 判断当前需求、开发、验收:读最新 Issue CSV、当前 PRD、模块规约和本索引。
- 判断当前需求、开发、验收:读当前 Trellis task、当前 PRD、模块规约和本索引。
- 判断历史证据:读轻量历史索引,必要时用 `git show <commit>:<old-path>` 恢复旧文档。
- 判断冲突:最新 Issue CSV > 当前 PRD/模块规约 > 设计和产品规则 > 当前操作手册 > 技术参考 > 历史证据。
- 判断冲突:当前 Trellis task PRD/设计 > 当前 PRD/模块规约 > 设计和产品规则 > 当前操作手册 > 技术参考 > 历史证据。
- 英文文件名只在技术生态或脚本强引用时保留,例如 `docs/mcp-tools.md`。
- 判断当前可执行任务:只读当前活跃治理流和对应连续型 Issue CSV;旧 Issue CSV 默认是历史审计证据。
- 新需求或试运行反馈:优先进入当前同类型连续治理流;只有跨业务域、跨风险等级或阶段收口后,才新建下一版 CSV。
- 新增说明、方案、审计或证据:优先补充现有事实源、模块规约、操作手册、证据文档或当前连续 Issue CSV;只有现有文档无法承载、需要独立审计证据或用户明确要求时,才新建文档并登记本索引和事实源矩阵。
- 判断当前可执行任务:先读当前 Trellis task;旧 Issue CSV 默认是历史审计证据。
- 新需求或试运行反馈:优先创建或更新当前同类型 Trellis task;只有跨业务域、跨风险等级或阶段收口后,才新建下一版 task。
- 新增说明、方案、审计或证据:优先补充现有事实源、模块规约、操作手册、证据文档或当前 Trellis task;只有现有文档无法承载、需要独立审计证据或用户明确要求时,才新建文档并登记本索引和事实源矩阵。
## 最近事实源链
R6 -> PC6 -> PA6 -> FL6 -> AP6 -> RI6 -> LP6 -> ME6/QG6 -> DG7/MRF7 -> MIA7 -> MIF7/MIF7T(公网部署与带凭据公网复检已收口) -> DG8 -> DG9 -> R7E -> FBA -> QAOPS9/P2D -> P2-ORG -> P2-FIN-DECISION -> P2-FIN-V1 -> P2-OCR-SAMPLE -> P2Q -> P2AUTO -> P2AF -> P2-FIN-LIVE-DECISION -> P2-FIN-LIVE -> PRELAUNCH -> CASHIER-VOUCHER-V1 -> LAUNCH-DEPLOY-FINANCE -> FIN-PROD-ENABLE -> ACCOUNTING-HANDOFF-V1 -> SYSTEM-COMPLETE-GATE -> LAUNCH-OPS-V1 -> REQ-COMPLETE-AUDIT -> ATTV1 -> LAUNCH-AUTO-OPS-V1 -> AUTO-REMAINING-CLOSEOUT -> HR-WECOM-DIRECTORY-V1 -> HRWD-CONTACT-LIVE-TEST -> WCFB -> WFOC -> DBWFOC -> WFDG -> WDRG -> WCP1 -> WCPC -> WHMS -> WHMSLIVE -> WOUA -> WAPI -> WRRA -> WOUA-FIX -> WRV1 -> WRA1 -> WMSG1 -> WAPC1 -> WAPC2 -> WPROC1 -> WPROC2 -> WAPC2F dry-run -> WAPC2FLIVE -> WCBK1 -> WEGOV1 -> WACP3/WACP3R -> WREAD1 自动汇总 -> WREAD1F 新样例 -> WREAD1 真机确认 -> WADM1 自建留存模型设计 -> WARCH1 最小审批历史留存 -> WARCH2 正式只读历史查询 -> WROAD2+OPS 受控上线与每日巡检 -> WARCH3 归档稳定化自动巡检 -> WCHECK1 打卡摘要留存 -> WEXT1 外出/加班 dry-run -> WOPS1 巡检告警降噪 -> WROAD2-CLOSEOUT 三天验收 -> WROAD2-BIZ1 三天业务冒烟 -> WAPPR1 审批规则规范化 -> WRULE1 审批链校验器 POC -> WAUTO1 自动证据汇总 -> WEXT1LD live 前 dry-run -> WFULLSMOKE1 三天全域最终目标测试 -> WROUTE2 测试号收口到最小镜像路线锁定 -> WTCLOSE1 小团队自动审批规则与测试号全域收口 dry-run -> WTCLOSE2 测试号最终收口与证据复核 -> WTCLOSE2F 远端可信 IP 执行口径修正 -> WREMOTE1 远端可信 IP 收口 -> WFULLSMOKE2 全域 smoke -> WEXT1-FORMAL/WEXT1F 正式模板外出/加班测试 -> OAOPS1 小团队全员真实使用稳定化 -> ASSET1 电子资产与固定资产统一台账 -> OSMOKE1 OA-only smoke 账号治理与公网自动化恢复 -> OALAUNCH1 最终启用前收口与 Go/No-Go 门禁 -> OMAT1 成熟度缺口审查 -> OPOLICY1 制度与 OA 对齐 -> OAFRONT6 前端成熟化小步收口(标题/资产/移动/合同/长编号已部署并公网复测通过)-> OAKISS1 全业务流程 KISS 审查 -> PCDESIGN1 PC 全页面设计审查 -> TRELLIS1 Trellis 主导开发流程迁移 -> 后续再按需问答 WREAL1/最小镜像。
R6 -> PC6 -> PA6 -> FL6 -> AP6 -> RI6 -> LP6 -> ME6/QG6 -> DG7/MRF7 -> MIA7 -> MIF7/MIF7T(公网部署与带凭据公网复检已收口) -> DG8 -> DG9 -> R7E -> FBA -> QAOPS9/P2D -> P2-ORG -> P2-FIN-DECISION -> P2-FIN-V1 -> P2-OCR-SAMPLE -> P2Q -> P2AUTO -> P2AF -> P2-FIN-LIVE-DECISION -> P2-FIN-LIVE -> PRELAUNCH -> CASHIER-VOUCHER-V1 -> LAUNCH-DEPLOY-FINANCE -> FIN-PROD-ENABLE -> ACCOUNTING-HANDOFF-V1 -> SYSTEM-COMPLETE-GATE -> LAUNCH-OPS-V1 -> REQ-COMPLETE-AUDIT -> ATTV1 -> LAUNCH-AUTO-OPS-V1 -> AUTO-REMAINING-CLOSEOUT -> HR-WECOM-DIRECTORY-V1 -> HRWD-CONTACT-LIVE-TEST -> WCFB -> WFOC -> DBWFOC -> WFDG -> WDRG -> WCP1 -> WCPC -> WHMS -> WHMSLIVE -> WOUA -> WAPI -> WRRA -> WOUA-FIX -> WRV1 -> WRA1 -> WMSG1 -> WAPC1 -> WAPC2 -> WPROC1 -> WPROC2 -> WAPC2F dry-run -> WAPC2FLIVE -> WCBK1 -> WEGOV1 -> WACP3/WACP3R -> WREAD1 自动汇总 -> WREAD1F 新样例 -> WREAD1 真机确认 -> WADM1 自建留存模型设计 -> WARCH1 最小审批历史留存 -> WARCH2 正式只读历史查询 -> WROAD2+OPS 受控上线与每日巡检 -> WARCH3 归档稳定化自动巡检 -> WCHECK1 打卡摘要留存 -> WEXT1 外出/加班 dry-run -> WOPS1 巡检告警降噪 -> WROAD2-CLOSEOUT 三天验收 -> WROAD2-BIZ1 三天业务冒烟 -> WAPPR1 审批规则规范化 -> WRULE1 审批链校验器 POC -> WAUTO1 自动证据汇总 -> WEXT1LD live 前 dry-run -> WFULLSMOKE1 三天全域最终目标测试 -> WROUTE2 测试号收口到最小镜像路线锁定 -> WTCLOSE1 小团队自动审批规则与测试号全域收口 dry-run -> WTCLOSE2 测试号最终收口与证据复核 -> WTCLOSE2F 远端可信 IP 执行口径修正 -> WREMOTE1 远端可信 IP 收口 -> WFULLSMOKE2 全域 smoke -> WEXT1-FORMAL/WEXT1F 正式模板外出/加班测试 -> OAOPS1 小团队全员真实使用稳定化 -> ASSET1 电子资产与固定资产统一台账 -> OSMOKE1 OA-only smoke 账号治理与公网自动化恢复 -> OALAUNCH1 最终启用前收口与 Go/No-Go 门禁 -> OMAT1 成熟度缺口审查 -> OPOLICY1 制度与 OA 对齐 -> OAFRONT6 前端成熟化小步收口(标题/资产/移动/合同/长编号已部署并公网复测通过)-> OAKISS1 全业务流程 KISS 审查 -> PCDESIGN1 PC 全页面设计审查 -> TRELLIS1 Trellis 主导开发流程迁移 -> TRELLIS2 官方 Trellis task 执行合同 -> 后续再按需问答 WREAL1/最小镜像。
- R6、PC6、PA6、FL6、AP6、RI6、LP6 已完成并部署。
- ME6 自动化、公网视觉矩阵和 `ME6-3` 代表性企业微信真机门禁已完成。
@@ -84,7 +84,7 @@ R6 -> PC6 -> PA6 -> FL6 -> AP6 -> RI6 -> LP6 -> ME6/QG6 -> DG7/MRF7 -> MIA7 -> M
## 当前活跃治理流
后续不再为每次聊天、小反馈或单点修正单独创建 Issue CSV。同类型、同目标、同风险域的任务优先进入同一个连续型 Issue CSV,直到该治理流完成明确阶段。
后续不再为每次聊天、小反馈或单点修正单独创建 Issue CSV。同类型、同目标、同风险域的任务优先进入同一个 Trellis task 或子任务,直到该治理流完成明确阶段。
| 治理流 | 当前合同 | 当前状态 | 范围 | 不做 |
| --- | --- | --- | --- | --- |
@@ -178,21 +178,22 @@ R6 -> PC6 -> PA6 -> FL6 -> AP6 -> RI6 -> LP6 -> ME6/QG6 -> DG7/MRF7 -> MIA7 -> M
| `OAFRONT6` | `issues/2026-05-25_12-29-03-oa-frontend-maturity-small-step-v1.csv` | 当前前端成熟化小步收口:承接 OAFRONT5 部署后 PC 硬问题清零和设计审计;审批规则路由标题、资产台账详情分区、移动视觉矩阵稳定等待、合同台账表单分组和长编号压缩均已实施部署,公网 PC 只读视觉矩阵复测 `PASS_PC_READONLY_VISUAL_READY` 且 `findingCount=0`;Portal 继续后置观察 | 页面改动继续读取 `docs/产品设计规则.md` 和 OALAUNCH1 启用门禁;后续 Portal 仍需按真实使用反馈推进 | 不写公网业务数据;不替代真实业务闭环、备份恢复、7 天稳定化或 Day 7 Go/No-Go |
| `OAKISS1` | `issues/2026-05-25_20-53-34-oa-business-flow-kiss-review-v1.csv` | 当前全业务流程 KISS 审查台账:按 MAGI 审视/执行/提升轮次,对报销/OCR、审批、采购/费用、合同/项目、付款/AP、票据池、资产、权限、移动/企微入口逐项做自动化和人工步骤审查 | 已形成 OAOPS1、OALAUNCH1、权限矩阵、PC 视觉、负责人审批链、资产试录和 OCR 辅助证据;建议保留 P0 主流程、简化 TEST/SMOKE 噪声和高密度后台页、后置 P2 复杂能力 | 本台账只做审查和建议,不直接改业务代码;真实业务闭环、备份恢复和 Day 7 Go/No-Go 仍按 OALAUNCH1 人工门禁执行 |
| `PCDESIGN1` | `issues/2026-05-25_21-27-56-oa-pc-page-design-review-v1.csv` | 当前 PC 全页面设计审查台账:以项目经理和设计总监视角按 MAGI 审视/执行/提升轮次盘点 PC 路由、页面分层、交互、内容和 KISS 建议 | 已复跑关键 PC 视觉矩阵 `PASS_PC_READONLY_VISUAL_READY`,并补全 45 条静态 PC 路由扫描 `PASS_PC_STATIC_ROUTE_SCAN_READY`;建议优先收敛 HR/考勤边界、冻结模块入口、高密度 B/C 页默认视图和动态详情页证据 | 本台账只做审查和建议,不直接改业务代码;采纳后必须另建前端实施 Issue CSV |
| `TRELLIS1` | `issues/2026-05-26_09-02-34-trellis-primary-development-workflow-v1.csv` | 当前 Trellis 主导开发流程迁移合同:后续非微小开发默认从 `.trellis/tasks/` 进入,以 `.trellis/workflow.md` 组织计划、实施、检查和复盘 | Trellis 只做开发流程和上下文组织;Issue CSV 仍是执行合同,`docs/` 仍是业务事实源;`.trellis/workspace/` 默认不提交 | 本合同不改业务代码、不部署、不写公网数据;提交前必须通过 `node scripts/qa/check-trellis-governance.mjs` |
| `TRELLIS1` | `issues/2026-05-26_09-02-34-trellis-primary-development-workflow-v1.csv` | 历史迁移合同:完成 Trellis-first 初始接入 | Trellis task/spec/workflow 成为开发入口的第一步,旧口径仍保留 Issue CSV 绑定 | 历史审计;已由 TRELLIS2 官方 task 合同口径替代 |
| `TRELLIS2` | `.trellis/tasks/05-26-trellis2-official-task-contract/` | 当前开发流程合同:采用官方 Trellis task 作为新任务执行合同 | `prd.md` 承载需求/验收/测试,复杂任务补 `design.md` 或 `implement.md`,Issue CSV 降级为历史审计或可选导出格式 | 不改业务代码、不部署、不写公网数据;提交前必须通过 `node scripts/qa/check-trellis-governance.mjs` |
| `WREAL1-PREP` | `issues/2026-05-20_14-35-42-wecom-real-trial-prep-v1.csv` | 当前真实试用准备:不启用真实员工 | 固化候选员工、非自审审批人、回滚联系人、允许流程、暂停条件和验收标准;真实试用必须等请假、补卡、外出、加班四类测试号证据、WAPPR1 和 WFULLSMOKE1 通过后再问 | 当前不创建外出/加班 live 样件;真实员工名单不写入 Issue 或文档,后续通过问答确认 |
旧 Issue CSV 不删除、不批量回写、不移动到归档目录。若新治理流替代旧合同,只在新 CSV 的 `Notes` 或本索引说明 supersedes,旧文件保留历史审计语义。
旧 Issue CSV 不删除、不批量回写、不移动到归档目录。若新治理流替代旧合同,只在新 Trellis task、文档索引或事实源矩阵中说明 supersedes,旧文件保留历史审计语义。
## 按开发阶段阅读
| 阶段 | 必读入口 | 目的 |
| --- | --- | --- |
| 需求阶段 | 最新同类型连续 Issue CSV、[海音达OA-MVP需求规格说明书](./海音达OA-MVP需求规格说明书.md)、对应 `需求-*.md`、[产品口径](./产品口径.md) | 判断做什么、不做什么、验收什么 |
| 需求阶段 | 当前 Trellis task、[海音达OA-MVP需求规格说明书](./海音达OA-MVP需求规格说明书.md)、对应 `需求-*.md`、[产品口径](./产品口径.md) | 判断做什么、不做什么、验收什么 |
| 设计阶段 | 最新设计治理合同、[产品设计规则](./产品设计规则.md)、[架构概览](./架构概览.md)、[集成边界](./集成边界.md)、`docs/ops/*.md`、必要 ADR | 判断页面、权限、状态流、集成和非功能边界 |
| 开发阶段 | 当前连续 Issue CSV、[开发交付与变更管理规约](./开发交付与变更管理规约.md)、`AGENTS.md` | 判断文件范围、依赖、方案批准和交接物 |
| 测试阶段 | [测试规约与回归门禁](./测试规约与回归门禁.md)、[试运行与自动化验证手册](./试运行与自动化验证手册.md)、当前 Issue 的 `Test_Method` | 判断怎么测、何时可回填 DONE |
| 开发阶段 | 当前 Trellis task、[开发交付与变更管理规约](./开发交付与变更管理规约.md)、`AGENTS.md` | 判断文件范围、依赖、方案批准和交接物 |
| 测试阶段 | [测试规约与回归门禁](./测试规约与回归门禁.md)、[试运行与自动化验证手册](./试运行与自动化验证手册.md)、当前 Trellis task 的 Test Plan | 判断怎么测、何时可收口 |
| 发布阶段 | [发布试运行准备清单](./trialrun/发布试运行准备清单.md)、[公网 Live Smoke 准备清单](./trialrun/公网LiveSmoke准备清单.md)、[OPS7 运维交接 Runbook](./trialrun/OPS7运维交接Runbook.md) | 判断公网、企业微信、真实 OCR 和回滚条件 |
| 审计阶段 | [文档事实源状态矩阵](./文档事实源状态矩阵.md)、[人工试运行报告](./trialrun/人工试运行报告.md)、当前连续 Issue CSV、git 历史 | 判断当前事实、历史证据和冲突处理 |
| 审计阶段 | [文档事实源状态矩阵](./文档事实源状态矩阵.md)、[人工试运行报告](./trialrun/人工试运行报告.md)、当前 Trellis task、git 历史 | 判断当前事实、历史证据和冲突处理 |
| 历史追溯 | [历史功能状态矩阵](./历史功能状态矩阵.md)、旧 Issue CSV、git 历史 | 只追溯,不直接派工 |
## 当前事实源
@@ -215,10 +216,10 @@ R6 -> PC6 -> PA6 -> FL6 -> AP6 -> RI6 -> LP6 -> ME6/QG6 -> DG7/MRF7 -> MIA7 -> M
| [需求 - 项目轻管理规约](./需求-项目轻管理规约.md) | 项目轻管理边界 |
| [需求 - 资产管理规约](./需求-资产管理规约.md) | 统一资产台账、编号族、电子资产安全边界和离职交接口径 |
| [测试规约与回归门禁](./测试规约与回归门禁.md) | 自动化、视觉、真机、状态回填 |
| [开发交付与变更管理规约](./开发交付与变更管理规约.md) | Issue CSV、review、提交、交付和企微阶段门禁顺序 |
| [开发交付与变更管理规约](./开发交付与变更管理规约.md) | Trellis task、review、提交、交付和企微阶段门禁顺序 |
| [Agent开发交付实践](./Agent开发交付实践.md) | Agent 协作和交付实践 |
| [AGENTS 项目规则](../AGENTS.md) | 执行硬约束 |
| [Trellis Workflow](../.trellis/workflow.md) | TRELLIS1 后开发主流程入口 |
| [Trellis Workflow](../.trellis/workflow.md) | TRELLIS2 后官方 Trellis task 开发主流程入口 |
## 当前操作手册
@@ -288,7 +289,7 @@ R6 -> PC6 -> PA6 -> FL6 -> AP6 -> RI6 -> LP6 -> ME6/QG6 -> DG7/MRF7 -> MIA7 -> M
## 阅读顺序
1. 新需求:PRD + 对应模块规约 + 最新 Issue CSV。
1. 新需求:当前 Trellis task PRD + 对应模块规约。
2. 页面体验:产品设计规则;DG8 后先按主 UI/布局参考层级判断。
3. 报销/发票:报销发票附件规则 + 报销 OCR 规约。
4. 试运行/部署/真机:试运行手册 + 发布清单 + 真机清单。
+87 -65
查看文件
@@ -25,7 +25,17 @@ const requiredDocMentions = [
".agents/skills/hyb-oa-delivery/SKILL.md",
];
const issueIdPattern = /^TRELLIS\d+-\d+$/;
const validTaskStatuses = new Set(["planning", "in_progress", "review", "completed"]);
const requiredPrdSections = [
{ code: "goal", pattern: /(^|\n)#{1,4}\s*(Goal|目标)\b/i },
{ code: "scope", pattern: /(^|\n)#{1,4}\s*(Scope|范围)\b/i },
{ code: "out_of_scope", pattern: /(^|\n)#{1,4}\s*(Out Of Scope|Out of Scope|不做|范围外|边界)\b/i },
{ code: "acceptance", pattern: /(^|\n)#{1,4}\s*(Acceptance|验收|完成口径)\b/i },
{ code: "test_plan", pattern: /(^|\n)#{1,4}\s*(Test Plan|测试计划|验证|Test Method)\b/i },
];
const complexTaskPattern =
/\b(api|schema|migration|prisma|permission|role|deployment|production|database|remote|wecom|payment)\b|权限|状态机|审批|部署|公网|数据库|数据迁移|企业微信|付款|流程治理|workflow-governance/i;
function readText(relativePath) {
return fs.readFileSync(path.join(repoRoot, relativePath), "utf8");
@@ -60,46 +70,54 @@ function listTaskDirs() {
.map((entry) => `.trellis/tasks/${entry.name}`);
}
function parseCsvLine(line) {
const cells = [];
let current = "";
let quoted = false;
for (let index = 0; index < line.length; index += 1) {
const char = line[index];
const next = line[index + 1];
if (quoted && char === "\"" && next === "\"") {
current += "\"";
index += 1;
continue;
}
if (char === "\"") {
quoted = !quoted;
continue;
}
if (!quoted && char === ",") {
cells.push(current);
current = "";
continue;
}
current += char;
}
cells.push(current);
return cells;
}
function issueIdsFromCsv(relativePath) {
function parseJsonl(relativePath) {
const text = readText(relativePath);
const lines = text.split(/\r?\n/).filter((line) => line.trim());
if (lines.length < 2) return new Set();
const header = parseCsvLine(lines[0]);
const idIndex = header.indexOf("ID");
if (idIndex < 0) return new Set();
return new Set(lines.slice(1).map((line) => parseCsvLine(line)[idIndex]).filter(Boolean));
return text
.split(/\r?\n/)
.map((line) => line.trim())
.filter(Boolean)
.map((line, index) => {
try {
return { value: JSON.parse(line), line: index + 1 };
} catch (error) {
throw new Error(`${relativePath}:${index + 1} invalid JSONL: ${error.message}`);
}
});
}
function normalizeIssueCsv(value) {
if (typeof value !== "string") return "";
return value.trim().replace(/^\.?\//, "");
function checkContextManifest(result, taskDir, action) {
const relativePath = `${taskDir}/${action}.jsonl`;
if (!exists(relativePath)) {
fail(result, `task.${action}_missing`, `${taskDir} missing ${action}.jsonl`);
return;
}
const entries = parseJsonl(relativePath);
let realEntryCount = 0;
for (const { value, line } of entries) {
if (value._example) {
fail(result, `task.${action}_seed`, `${relativePath}:${line} still contains seed _example row`);
continue;
}
if (typeof value.file !== "string" || !value.file.trim()) {
fail(result, `task.${action}_file`, `${relativePath}:${line} missing file`);
continue;
}
if (typeof value.reason !== "string" || !value.reason.trim()) {
fail(result, `task.${action}_reason`, `${relativePath}:${line} missing reason`);
continue;
}
if (!exists(value.file)) {
fail(result, `task.${action}_file_missing`, `${relativePath}:${line} references missing ${value.file}`);
continue;
}
if (!value.file.startsWith(".trellis/spec/") && !value.file.includes("/research/")) {
warn(result, `task.${action}_non_spec_context`, `${relativePath}:${line} should usually reference .trellis/spec/ or task research`);
}
realEntryCount += 1;
}
if (realEntryCount === 0) {
fail(result, `task.${action}_empty`, `${relativePath} must contain at least one real context entry`);
}
}
function createResult() {
@@ -143,6 +161,9 @@ function checkCoreFiles(result) {
} else {
pass(result, "agents.workflow_pointer", "AGENTS.md points to Trellis workflow");
}
if (/每个 task 必须绑定|先有 Issue CSV 再开发/.test(agents)) {
fail(result, "agents.legacy_issue_required", "AGENTS.md still requires Issue CSV before development");
}
}
if (exists(".trellis/config.yaml")) {
@@ -158,7 +179,7 @@ function checkCoreFiles(result) {
}
}
function checkTaskBindings(result) {
function checkTaskContracts(result) {
const taskDirs = listTaskDirs();
if (taskDirs.length === 0) {
fail(result, "tasks.none", "no .trellis/tasks/* directories found");
@@ -173,36 +194,37 @@ function checkTaskBindings(result) {
continue;
}
const task = JSON.parse(readText(taskJsonPath));
const issueCsv = normalizeIssueCsv(task.meta?.issueCsv);
const issueIds = Array.isArray(task.meta?.issueIds) ? task.meta.issueIds : [];
const prdText = exists(prdPath) ? readText(prdPath) : "";
const csvFromPrd = prdText.match(/issues\/[A-Za-z0-9_.-]+\.csv/)?.[0] ?? "";
const boundCsv = issueCsv || csvFromPrd;
if (!boundCsv) {
fail(result, "task.issue_csv", `${dir} must bind an Issue CSV in task.json meta or prd.md`);
if (!task.id || !task.name || !task.title) {
fail(result, "task.identity", `${dir} task.json must include id, name and title`);
}
if (!validTaskStatuses.has(task.status)) {
fail(result, "task.status", `${dir} has invalid status ${task.status}`);
}
if (typeof task.description !== "string" || !task.description.trim()) {
fail(result, "task.description", `${dir} task.json must include description`);
}
if (!exists(prdPath)) {
fail(result, "task.prd_missing", `${dir} missing prd.md`);
continue;
}
if (!exists(boundCsv)) {
fail(result, "task.issue_csv_missing", `${dir} references missing ${boundCsv}`);
continue;
}
const ids = issueIds.length > 0 ? issueIds : [...prdText.matchAll(/TRELLIS\d+-\d+/g)].map((match) => match[0]);
if (ids.length === 0) {
fail(result, "task.issue_ids", `${dir} must bind at least one TRELLIS Issue ID`);
continue;
}
const csvIds = issueIdsFromCsv(boundCsv);
for (const id of ids) {
if (!issueIdPattern.test(id)) {
fail(result, "task.issue_id_format", `${dir} has invalid Issue ID ${id}`);
} else if (!csvIds.has(id)) {
fail(result, "task.issue_id_missing", `${dir} references ${id}, not found in ${boundCsv}`);
for (const section of requiredPrdSections) {
if (!section.pattern.test(prdText)) {
fail(result, `task.prd_${section.code}`, `${prdPath} missing ${section.code} section`);
}
}
if (!task.scope && (!Array.isArray(task.relatedFiles) || task.relatedFiles.length === 0)) {
fail(result, "task.scope", `${dir} must declare scope or relatedFiles in task.json`);
}
const complexText = [task.title, task.description, task.scope, task.notes, prdText].filter(Boolean).join("\n");
if (complexTaskPattern.test(complexText) && !exists(`${dir}/design.md`) && !exists(`${dir}/implement.md`)) {
fail(result, "task.complex_design", `${dir} complex task must include design.md or implement.md`);
}
checkContextManifest(result, dir, "implement");
checkContextManifest(result, dir, "check");
}
if (result.status === "PASS") pass(result, "task_bindings", `${taskDirs.length} task directories are bound`);
if (result.status === "PASS") pass(result, "task_contracts", `${taskDirs.length} task directories have Trellis contracts`);
}
function checkDocsRegistration(result) {
@@ -212,9 +234,9 @@ function checkDocsRegistration(result) {
continue;
}
const text = readText(file);
const hasTrellis = text.includes("TRELLIS1") || text.includes(".trellis") || text.includes("Trellis");
const hasTrellis = text.includes("TRELLIS2") || text.includes(".trellis") || text.includes("Trellis");
if (!hasTrellis) {
fail(result, "docs.trellis_registration", `${file} must mention Trellis/TRELLIS1`);
fail(result, "docs.trellis_registration", `${file} must mention Trellis/TRELLIS2`);
}
}
if (result.status === "PASS") pass(result, "docs_registration", `${requiredDocMentions.length} fact sources mention Trellis`);
@@ -246,7 +268,7 @@ function checkSensitiveData(result) {
const result = createResult();
try {
checkCoreFiles(result);
checkTaskBindings(result);
checkTaskContracts(result);
checkDocsRegistration(result);
checkSensitiveData(result);
} catch (error) {