Merge remote-tracking branch 'origin/master' into feat/sub2api-user-feedback-diagnose

# Conflicts:
#	scripts/src/platform-infra-sub2api-codex/types.ts
This commit is contained in:
Codex
2026-07-14 12:47:52 +02:00
78 changed files with 5405 additions and 93 deletions
@@ -117,3 +117,14 @@
### R5.7
解决 [UniDesk #1957](https://github.com/pikasTech/unidesk/issues/1957):修复 Artificer resource bundle 缺失 `$post-task` skill 与 `$unidesk-subagent` 权威收口引用不一致;只沿 owning skill source、AipodSpec、resource bundle 和 runner 投影定位并物化,禁止 prompt 复制规则、手工 Pod/宿主补文件、第二 bundle authority 或人工 CI/CD,完成任务后以真实 Artificer follow-up 加载 `$post-task` 验收,完成任务后将详细报告写入[任务报告](./details/agentrun-runtime-reliability/R5.7_Task_Report.md)。
### R5.8 [in_progress]
解决 [UniDesk #2014](https://github.com/pikasTech/unidesk/issues/2014):把 `config/unidesk-cli.yaml#github.auth.repositoryOverrides` 的既有私有仓凭据通过 YAML-first tool credential/resource bundle 投影给 Artificer,使受控 `unidesk-gh` 可读取、创建和评论任务私有仓 PR;Secret 只披露 SecretRef presence/fingerprint/valuesPrinted=false,不新增第二 GitHub 客户端、权限契约、租约或围栏,并与 PikaOA MVP 主线并行且不作为业务门禁,完成任务后将详细报告写入[任务报告](./details/agentrun-runtime-reliability/R5.8_Task_Report.md)。
## R6 [completed]
将“先恢复运行面再工程化”固化为 unidesk-subagent 的泛化主线规则:运行面恢复关键路径由主代理控制,低耦合工程化任务及时并行,恢复后继续完成工程化交付;将单 PR 收口、复用 guarded merge 内建 preflight、避免仅补 merge SHA 的重复 PR 和减少碎片化 GitHub 查询固化到 unidesk-gh 及相关 reference,并让 merge 默认摘要直接披露 merge commit 与 mergedAt,完成任务后将详细报告写入[任务报告](./details/agentrun-runtime-reliability/R6_Task_Report.md)。
## R7 [completed]
将 Artificer 固化为所有执行型子代理任务的强制默认执行面:用户只说“子代理”时必须使用 Artificer;只有用户明确指定原生子代理,或 Artificer 经有界 readiness/真实派单证据确认故障不可用时,才允许原生子代理执行;禁止主代理因方便、速度、空闲槽或历史习惯自行降级,并要求 Artificer 恢复后立即停止原生扩展并交接,完成任务后将详细报告写入[任务报告](./details/agentrun-runtime-reliability/R7_Task_Report.md)。
@@ -0,0 +1,22 @@
# R6 任务报告
## 结论
已将“先恢复运行面,再工程化”固化为子代理调度的泛化原则:主代理冻结恢复标准并控制恢复关键路径,优先通过既有受控入口做最小、可逆、可验证的恢复;恢复不再阻塞低耦合工程化任务并行,运行面恢复后仍继续完成根因修复、PR、验证与治理收口。
已将减少重复交付固化到 GitHub skill 与 PR referencereview-plan 只建立索引并按需下钻,guarded merge 内建 preflight,功能、skill、MDTODO 报告和完成状态应在同一 PR 收口,禁止仅为补 merge SHA、mergedAt 或重复 closeout 创建第二个 PR。只有 merge 后产生新运行证据且用户明确要求写回 Git 时,才允许第二个 closeout PR。
已更新 GitHub merge 默认文本摘要,成功合并直接披露 mergeCommit 与 mergedAt,并取消机械 pr view 的 Next 提示。
## 验证
- unidesk-subagent skill quick_validate:通过。
- unidesk-gh skill quick_validate:通过。
- bun --check scripts/src/gh/pr-merge.ts:通过。
- bun scripts/cli.ts check --syntax-only11 项通过,0 项失败。
- renderer 定向验证:成功输出包含 mergeCommit=abc123 与 mergedAt=2026-07-14T10:00:00Z,且不包含 gh pr view。
- git diff --check:通过。
## 交付边界
本任务不修改运行面、不新增状态库或门禁。规则、CLI、MDTODO 报告与完成状态在同一功能 PR 中交付;merge 事实由 GitHub 和受控 merge 摘要保存,不回写本报告。
@@ -0,0 +1,7 @@
# R7 任务报告
已将 Artificer 固化为执行型子代理任务的强制默认执行面。用户泛称子代理、并行代理或派代理时必须使用 Artificer;只有用户明确指定原生子代理,或 Artificer 经有界 readiness、最短真实派单或 typed failure 证明确实不可用时,才允许原生执行面。
规则明确禁止主代理因方便、速度、空闲并发槽、已有 worktree、任务较短或历史习惯自行降级。Artificer 故障修复仍可交给原生子代理;管理性和决策性工作由主代理直接完成。临时原生 fallback 必须在 Artificer 恢复后停止扩展并交接。
验证:unidesk-subagent skill quick_validate 通过;git diff --check 通过。
@@ -0,0 +1,508 @@
# PikaOA R1.1 开源办公系统与组件调研报告
## 1. 任务信息
| 字段 | 内容 |
| --- | --- |
| MDTODO | [R1.1](../../pikaoa-enterprise-platform.md) |
| 执行 issue | [pikasTech/unidesk#1953](https://github.com/pikasTech/unidesk/issues/1953) |
| 上层规格 | [PJ2026-03](../../../../project-management/PJ2026-03/specs/PJ2026-03-pikaoa.md) |
| 调研日期 | 2026-07-13 |
| 交付性质 | 隔离选型文档,不包含业务代码、运行面、Secret 或 CI/CD 变更 |
本报告只为 PikaOA 后续实现提供证据和建议,不改变 PJ2026-03 已冻结的模块化单体、CLI-first、
HWLAB v0.3 同族前端和 YAML-first 方向。
## 2. 决策摘要
### 2.1 总体结论
- 不直接采用 ERPNext、Odoo、Twenty、EspoCRM、Dolibarr 或 OpenProject 作为 PikaOA 底座:
- 这些系统的领域边界、扩展模型、技术栈和升级路径会反向约束 PJ2026-03;
- 多数完整系统使用 GPL 或 AGPL,闭源可能性未知时不应复制源码或形成紧耦合派生实现;
- PikaOA 首期需要的是稳定平台内核与合同、发票事实,而不是迁移完整 ERP/CRM 产品。
- 直接采用宽松许可证的 Go、Vue 和可观测性基础组件:
- HTTP`chi`
- PostgreSQL`pgx``sqlc`
- 数据库迁移:`goose`
- CLI`Cobra`
- 授权:首期 `Casbin`,保留以后提取到 `OpenFGA` 的边界;
- 事务消息:PostgreSQL outbox 与 `Watermill`
- 前端:Vue 3、Vite、TypeScript、Vue Router、Pinia、Tailwind
- 可观测性:OpenTelemetry Go、OTLP Collector、Prometheus Go client 和结构化日志关联。
- 仅参考成熟系统的业务建模,不复制实现:
- ERPNext/Frappe 的单据提交、取消、修订和审计思路;
- Odoo 的发票冲销、贷项通知单与会计事实保留思路;
- CRM 的统一伙伴、联系人、标签与上下文角色模型;
- Paperless-ngx 的文档归档、检索、标签和权限思路;
- Documenso 的签署流程与签署证据思路。
- 首期不采用 `OpenFGA``Asynq``Atlas`
- `OpenFGA` 增加独立服务和授权模型运维成本,当前 RBAC 可由 `Casbin` 满足;
- `Asynq` 依赖 Redis,首期已有 PostgreSQL outbox 即可提供可审计异步处理;
- `Atlas``goose` 职责重叠,首期应保持单一迁移真相。
### 2.2 推荐分类
- 直接采用:
- `chi``pgx``sqlc``goose``Cobra``Casbin``Watermill`
- Vue 3、Vue Router、Pinia 和 Tailwind
- OpenTelemetry Go、Prometheus Go client 和 OTLP Collector。
- 组件复用:
- HWLAB v0.3 的前端布局语言、路由守卫和 API 错误呈现;
- HWLAB v0.3 的响应式工作台模式;
- 现有 UniDesk OTel、Tempo 和 Prometheus 运行能力。
- 仅参考:
- ERPNext/Frappe、Odoo、Twenty、EspoCRM 和 Dolibarr
- OpenProject、Documenso 和 Paperless-ngx
- OpenFGA 和 Asynq。
- 不采用:
- 完整 OA、ERP 或 CRM 产品作为 PikaOA 底座;
- GPL 或 AGPL 源码复制;
- 首期微服务拆分;
- 同时使用多套 HTTP、迁移或异步任务框架。
## 3. 调研方法与活跃度口径
- 来源优先级:
- 项目官方 GitHub 仓库及其许可证文件;
- 项目官方文档;
- GitHub Releases 和仓库最近推送时间。
- 活跃度判定:
- `高`:调研日附近仍有提交,并在近数月内发布版本;
- `中`:持续维护,但发布节奏较慢或主要以稳定维护为主;
- 活跃度只说明维护状态,不等于适合 PikaOA。
- 表中版本和活跃度是 2026-07-13 的采样证据:
- 最终依赖版本必须由实现任务根据锁文件、安全公告和兼容性验证选择;
- 不把本报告中的版本固化为部署策略。
## 4. 完整办公、ERP、CRM 与文档系统
### 4.1 ERPNext 与 Frappe
- 来源:
- [ERPNext](https://github.com/frappe/erpnext)
- [Frappe](https://github.com/frappe/frappe)。
- 活跃度与技术栈:
- 高;Python、JavaScript 和元数据驱动框架;
- ERPNext 于调研日仍有发布。
- 许可证:
- ERPNext 为 GPL-3.0
- Frappe 框架和附属组件需按锁定版本逐项复核。
- 可复用层次:
- 单据状态、提交后修改限制、取消与修订;
- 审计时间线和模块元数据思路。
- 成本与风险:
- 领域和框架绑定深;
- 采用整套系统会替换 Go 与既定模块边界;
- GPL 代码复制风险高。
- 结论:仅参考业务语义,不采用产品或源码。
### 4.2 Odoo
- 来源:[Odoo](https://github.com/odoo/odoo)。
- 活跃度与技术栈:高;Python、JavaScript 和模块化 ERP。
- 许可证:
- Community 核心通常为 LGPL-3.0
- Enterprise 和单独模块另有许可,必须逐项核验。
- 可复用层次:
- 发票、贷项通知单和冲销;
- 伙伴、模块注册和工作流。
- 成本与风险:
- 社区版与企业版边界复杂;
- 直接采用会偏离 Go 和 CLI-first。
- 结论:仅参考会计与伙伴模型。
### 4.3 Twenty
- 来源:[Twenty](https://github.com/twentyhq/twenty)。
- 活跃度与技术栈:高;TypeScript、React、NestJS 和 PostgreSQL。
- 许可证:仓库包含开源与商业边界,采用前必须逐文件核对。
- 可复用层次:
- 现代 CRM 交互;
- 统一对象、筛选、视图和活动时间线。
- 成本与风险:
- 技术栈与 HWLAB Vue 不同;
- 许可证与企业功能边界增加合规审查。
- 结论:仅参考产品交互和对象模型。
### 4.4 EspoCRM
- 来源:[EspoCRM](https://github.com/espocrm/espocrm)。
- 活跃度与技术栈:高;PHP 和 JavaScript。
- 许可证:AGPL-3.0。
- 可复用层次:CRM 实体、角色、团队、关系和审计思路。
- 成本与风险:AGPL 网络服务义务,且 PHP 技术栈不匹配。
- 结论:仅参考,不复制源码。
### 4.5 Dolibarr
- 来源:[Dolibarr](https://github.com/Dolibarr/dolibarr)。
- 活跃度与技术栈:高;PHP。
- 许可证:GPL-3.0。
- 可复用层次:
- 轻量 ERP 和 CRM 模块边界;
- 第三方与发票关联。
- 成本与风险:领域覆盖广但架构迁移成本较高,且存在 GPL 风险。
- 结论:仅参考模块目录和业务关系。
### 4.6 OpenProject
- 来源:[OpenProject](https://github.com/opf/openproject)。
- 活跃度与技术栈:高;Ruby 和 TypeScript。
- 许可证:GPL-3.0。
- 可复用层次:项目、工作包、活动记录和权限矩阵。
- 成本与风险:面向项目管理而非企业平台内核,技术栈与许可证不匹配。
- 结论:不作为底座,仅参考工作项审计。
### 4.7 Documenso
- 来源:[Documenso](https://github.com/documenso/documenso)。
- 活跃度与技术栈:高;TypeScript。
- 许可证:AGPL-3.0。
- 可复用层次:文档签署状态、参与者、签署证据和模板体验。
- 成本与风险:
- 电子签名涉及合规、身份与证据链;
- 存在 AGPL 风险。
- 结论:首期仅预留集成边界,不内嵌源码。
### 4.8 Paperless-ngx
- 来源:[Paperless-ngx](https://github.com/paperless-ngx/paperless-ngx)。
- 活跃度与技术栈:高;Python 和 Django。
- 许可证:GPL-3.0。
- 可复用层次:
- 文档归档、标签和对应方;
- 全文检索、权限和消费管线。
- 成本与风险:
- 适合作为独立文档系统,但不是合同事实主库;
- 存在 GPL 风险。
- 结论:参考归档模型,未来可评估松耦合集成。
### 4.9 完整系统不直接采用的根因
- 产品边界不一致:
- ERPNext、Odoo 和 Dolibarr 以 ERP 全域为中心;
- Twenty 和 EspoCRM 以 CRM 为中心;
- OpenProject 以项目协作为中心;
- Documenso 和 Paperless-ngx 只覆盖文档生命周期的一部分。
- 架构代价大于复用收益:
- 直接采用意味着把权限、扩展、数据迁移、前端和运维入口交给上游框架;
- PikaOA 仍需额外实现 CLI-first、YAML-first、UniDesk 交付和既定审计契约。
- 许可证不确定性:
- GPL/AGPL 项目可合法研究、部署和集成,但复制、修改、分发或通过网络提供修改版时存在义务;
- PikaOA 的最终分发模式尚未确定,因此本阶段只提炼思想和公开接口,不复制实现。
## 5. 关键业务语义建议
### 5.1 合同不可变多版本
推荐把“合同身份”和“合同版本”分离:
- `contract`
- 保存稳定编号、业务伙伴、负责人、当前有效版本指针和总体状态;
- 不直接承载会被修订覆盖的条款正文。
- `contract_version`
- 保存版本号、结构化条款、金额、币种、日期、附件摘要、创建人和创建时间;
- `draft` 可编辑;一旦进入 `approved``signed``effective``superseded`,内容不可原地修改;
- 修订必须创建新版本,并记录 `previous_version_id`、修订原因和操作者。
- 证据:
- 附件保存内容摘要、对象存储定位和媒体类型;
- 审批、签署、启用、终止和版本切换进入 append-only 审计记录;
- 查询必须能重建任一时点的有效版本。
该模型吸收 Frappe 的提交、取消、修订理念,但不复刻其 DocType 或框架实现。
### 5.2 发票作废而非物理删除
推荐状态至少区分:
- `draft`:尚未形成对外事实,可按权限编辑或删除;
- `issued`:已开具,不允许物理删除或覆盖关键字段;
- `voided`:保留原编号、金额、关联合同与附件,并记录作废原因、时间和操作者;
- `credited`:未来需要会计冲销时,通过独立贷项记录关联原发票,不改写原事实。
约束:
- 合同与发票使用稳定外键关联,同时保存开具时必要快照,避免伙伴名称后续变更破坏历史显示;
- `issued` 之后的任何纠正都产生新事实;
- 搜索默认可隐藏作废项,但审计、CLI 和明确过滤必须可查询;
- 数据保留策略不得把业务作废等同于数据库删除。
### 5.3 伙伴与甲方分类
采用统一 `business_partner`,不要为甲方、供应商、客户分别复制主表:
- 稳定字段包括法定名称、统一标识、归档状态、联系人和地址;
- `partner_category` 支持层级、标签和有效期;
- “甲方”“供应商”“客户”是上下文角色或分类,可同时存在;
- 合同保存签约时的伙伴快照和角色,伙伴主数据后续变更不覆盖历史合同;
- 分类变更必须审计,归档代替物理删除。
### 5.4 员工、身份与权限
- 身份与员工档案分离:
- 身份负责登录、会话和外部身份提供方映射;
- 员工负责组织、岗位、在职状态和业务归属。
- 首期采用 RBAC
- 资源与动作使用稳定 capability
- 角色只聚合 capability
- 数据范围通过明确条件实现,不把前端路由可见性当作后端授权。
- `Casbin` 适合首期进程内策略判定;
- 当出现跨服务关系授权、对象级共享或多租户关系图时,再评估 `OpenFGA`
### 5.5 审计与 outbox
- 业务写入、审计事件和 outbox 记录必须在同一 PostgreSQL 事务提交;
- outbox 记录包含稳定事件类型、聚合 ID、聚合版本、发生时间和脱敏载荷;
- worker 以至少一次语义处理,消费者通过事件 ID 或业务幂等键去重;
- `Watermill` 负责消息抽象和处理管线,不替代数据库事务真相;
- 审计记录和集成事件分开:
- 审计面向人和合规追溯;
- outbox 面向系统集成和未来服务提取。
### 5.6 模块扩展与未来微服务提取
首期保持模块化单体:
- 每个模块拥有自己的 handler、use case、repository、迁移和事件定义;
- 跨模块写入只能通过应用服务或已声明接口,不允许直接修改他模块表;
- 共享内核只保留身份、伙伴、附件、审计、分页、错误和幂等契约;
- 只有满足以下事实后才提取微服务:
- 独立扩缩容或故障隔离需求持续存在;
- 数据所有权和事件契约稳定;
- 跨模块同步事务已消除;
- 独立部署收益高于网络、可观测性和运维成本。
## 6. Go 后端组件评估
### 6.1 直接采用
- HTTP
- [chi](https://github.com/go-chi/chi)MIT
- 轻量、标准库兼容、路由组合自然,适合模块化单体。
- PostgreSQL
- [pgx](https://github.com/jackc/pgx)MIT
- PostgreSQL 原生能力完整,适配事务、批量和通知。
- SQL 代码生成:
- [sqlc](https://github.com/sqlc-dev/sqlc)MIT
- SQL-first、静态类型,便于审查真实查询。
- 数据库迁移:
- [goose](https://github.com/pressly/goose)MIT
- 简单、Go 生态成熟,适合显式 SQL 迁移。
- CLI
- [Cobra](https://github.com/spf13/cobra)Apache-2.0
- 子命令和 help 生态成熟,输出契约仍遵循 PikaOA CLI 规格。
- RBAC
- [Casbin](https://github.com/casbin/casbin)Apache-2.0
- 进程内、模型灵活,首期运维成本低。
- 事件:
- [Watermill](https://github.com/ThreeDotsLabs/watermill)MIT
- 消息处理抽象成熟,可与事务 outbox 结合。
### 6.2 仅比较或预留
- [Echo](https://github.com/labstack/echo)MIT
- 功能完整但约定较多;
- 不与 chi 并用,仅在发现明确缺口时重新评估。
- [Gin](https://github.com/gin-gonic/gin)MIT
- 生态和认知度高,但自有 Context 侵入更明显;
- 不采用,避免无收益的框架抽象。
- [Atlas](https://github.com/ariga/atlas)Apache-2.0
- 部分能力与商业产品边界需核验;
- 声明式 schema 与检查能力强,但会引入第二套迁移模型;
- 首期不采用。
- [OpenFGA](https://github.com/openfga/openfga)Apache-2.0
- 适合复杂对象关系授权;
- 会增加独立服务和模型治理;
- 预留边界,首期不采用。
- [Asynq](https://github.com/hibiken/asynq)MIT
- Redis 队列成熟;
- 会增加首期基础设施和第二事实源;
- 首期不采用。
### 6.3 推荐最小组合
```text
Cobra CLI / Vue Web
|
chi HTTP
|
应用服务与模块边界
|
sqlc + pgx + PostgreSQL
|
业务表 + audit_log + outbox
|
Watermill worker / 外部集成
```
组合原则:
- 不引入 ORM 作为默认数据访问层;
- 不同时维护 `goose``Atlas` 两套迁移真相;
- 不为异步任务额外引入 Redis,除非后续有独立证据;
- CLI 和 Web 必须调用同一 HTTP API 与业务用例,不形成旁路管理逻辑。
## 7. Vue 3 与 HWLAB v0.3 复用边界
### 7.1 直接采用
| 组件 | 许可证 | 用途 |
| --- | --- | --- |
| [Vue 3](https://github.com/vuejs/core) | MIT | 组件与响应式基础 |
| [Vue Router](https://github.com/vuejs/router) | MIT | 路由、模块入口和守卫 |
| [Pinia](https://github.com/vuejs/pinia) | MIT | 会话、访问摘要和跨页面客户端状态 |
| [Tailwind CSS](https://github.com/tailwindlabs/tailwindcss) | MIT | 设计令牌与响应式布局 |
### 7.2 复用 HWLAB v0.3 的内容
- 复用同族技术栈、设计语言和已验证的响应式布局方法;
- 复用以下模式,而不是复制 HWLAB 业务模块:
- 应用壳、侧边导航、顶栏、内容区和移动端折叠逻辑;
- 登录态、路由守卫、403/404 和 API 错误呈现;
- 表格筛选、分页、详情抽屉、时间线和状态徽标;
- 可访问性、加载态、空态和失败可见性;
- 与 CLI 同源的 capability 驱动导航。
### 7.3 禁止复用
- 不复制 Workbench、AgentRun、Code Queue 等领域组件和状态投影;
- 不把 HWLAB 的 session、run、event 模型引入合同或发票领域;
- 不让前端 Pinia store 成为业务事实真相;
- 不在 CLI 后端契约完成前先冻结 Web 私有接口。
## 8. 可观测性方案
| 组件 | 许可证 | 结论 |
| --- | --- | --- |
| [OpenTelemetry Go](https://github.com/open-telemetry/opentelemetry-go) | Apache-2.0 | 直接采用,负责 trace、metric 和 context 传播 |
| [OpenTelemetry Collector](https://github.com/open-telemetry/opentelemetry-collector) | Apache-2.0 | 直接采用现有平台能力,应用只发 OTLP |
| [Prometheus Go client](https://github.com/prometheus/client_golang) | Apache-2.0 | 直接采用,暴露低基数业务与运行指标 |
| [Tempo](https://github.com/grafana/tempo) | AGPL-3.0 | 复用 UniDesk 独立运行服务,不把源码或服务端实现嵌入 PikaOA |
### 8.1 关联方式
- HTTP、CLI 请求和 worker 消费均传播 `trace_id``span_id`
- 结构化日志至少包含:
- 时间、级别、服务、模块、事件名;
- `trace_id``span_id`、request ID
- 脱敏后的 actor、聚合类型和聚合 ID;
- 稳定错误码,不记录 Secret、令牌或合同敏感正文。
- 指标保持低基数:
- 请求量、错误量、延迟;
- outbox backlog、处理成功和失败;
- 合同与发票状态变化计数;
- 禁止把员工 ID、合同 ID、发票号作为 metric label。
- Collector、采样、保留和导出参数继续由 owning YAML 控制,本报告不固化数值。
## 9. 许可证边界
本节是工程风险提示,不替代法律意见。
- MIT、Apache-2.0
- 可作为首选依赖;
- 仍需保留许可证和版权通知,并维护依赖清单。
- LGPL-3.0
- 动态链接、修改库和分发场景有不同义务;
- Odoo 必须按核心、社区模块、企业模块逐项确认,不以仓库总体印象替代检查。
- GPL-3.0
- ERPNext、Dolibarr、OpenProject 和 Paperless-ngx 等项目只提炼公开业务思想;
- 禁止复制源码、迁移脚本、模板或前端组件进入闭源可能性未知的仓库。
- AGPL-3.0
- EspoCRM、Documenso 和 Tempo 等网络服务软件需要特别审查修改版网络提供义务;
- 优先采用进程外、协议级集成,并保留独立部署和许可证材料;
- 任何修改、再分发或嵌入决定必须先完成法律与架构审查。
- 上游可能调整许可证或采用多许可证:
- 实现任务必须锁定 commit/tag
- 对锁定版本重新读取 `LICENSE``NOTICE`、依赖清单和商业功能说明;
- 自动生成软件物料清单并在发布前执行许可证扫描。
## 10. 实施建议
### 10.1 首期基线
- 建立 Go 模块化单体与单一 PostgreSQL 数据库;
- 用 chi、sqlc、pgx、goose、Cobra 建立最小 API/CLI 骨架;
- 先实现员工/RBAC、伙伴、合同版本、发票作废、审计和 outbox;
- 用 Casbin 做 capability 判定,策略存储与业务事务边界明确分离;
- 用 Watermill worker 消费 PostgreSQL outbox
- 接入 OpenTelemetry Go、OTLP 和 Prometheus 指标;
- CLI 验收通过后再实现 Vue 3 Web。
### 10.2 需要保留的替换边界
- HTTP 框架只暴露在 transport 层,应用用例不依赖 chi 类型;
- Casbin 通过授权接口接入,未来可替换或桥接 OpenFGA;
- Watermill 通过事件发布与消费接口接入,未来可迁移 Kafka 等 broker
- 对 Documenso、Paperless-ngx 等系统只定义外部连接器,不共享业务数据库;
- Tempo 作为 OTel 后端,不让业务代码依赖 Tempo 私有 API。
### 10.3 后续任务门槛
- R1.2 建仓前:
- 确认最终 Go module、Node package 和许可证清单;
- 明确依赖锁定和 SBOM 生成入口。
- R1.3 实现前:
- 先把合同版本、发票作废、伙伴角色、授权和 outbox 写成 API/CLI 验收契约;
- 禁止从完整开源系统复制 schema 或代码。
- R1.4 Web 开发前:
- CLI 后端主路径通过;
- 明确 HWLAB 可复用的布局、基础组件和设计令牌清单;
- Web 不得创建后端没有的隐式状态。
- 评估微服务前:
- 收集独立扩缩容、故障隔离、团队所有权和数据边界证据;
- 没有证据时继续保持模块化单体。
## 11. 来源索引
### 11.1 业务系统
- ERPNext 仓库:<https://github.com/frappe/erpnext>
- Frappe 仓库:<https://github.com/frappe/frappe>
- Frappe 单据状态文档:<https://docs.frappe.io/framework/doctypes/docstatus>
- ERPNext 不可变账本说明:<https://docs.frappe.io/erpnext/user/manual/en/immutable-ledger-in-erpnext>
- Odoo 仓库:<https://github.com/odoo/odoo>
- Odoo 许可证说明:<https://www.odoo.com/documentation/19.0/legal/licenses.html>
- Odoo 贷项与退款文档:<https://www.odoo.com/documentation/19.0/applications/finance/accounting/customer_invoices/credit_notes.html>
- Twenty 仓库:<https://github.com/twentyhq/twenty>
- EspoCRM 仓库:<https://github.com/espocrm/espocrm>
- Dolibarr 仓库:<https://github.com/Dolibarr/dolibarr>
- OpenProject 仓库:<https://github.com/opf/openproject>
- Documenso 仓库:<https://github.com/documenso/documenso>
- Paperless-ngx 仓库:<https://github.com/paperless-ngx/paperless-ngx>
- Paperless-ngx 权限文档:<https://docs.paperless-ngx.com/advanced_usage/#permissions>
### 11.2 Go 组件
- chi<https://github.com/go-chi/chi>
- Echo<https://github.com/labstack/echo>
- Gin<https://github.com/gin-gonic/gin>
- pgx<https://github.com/jackc/pgx>
- sqlc<https://github.com/sqlc-dev/sqlc>
- goose<https://github.com/pressly/goose>
- Atlas<https://github.com/ariga/atlas>
- Cobra<https://github.com/spf13/cobra>
- Casbin<https://github.com/casbin/casbin>
- OpenFGA<https://github.com/openfga/openfga>
- Watermill<https://github.com/ThreeDotsLabs/watermill>
- Asynq<https://github.com/hibiken/asynq>
### 11.3 前端与可观测性
- Vue 3<https://github.com/vuejs/core>
- Vue Router<https://github.com/vuejs/router>
- Pinia<https://github.com/vuejs/pinia>
- Tailwind CSS<https://github.com/tailwindlabs/tailwindcss>
- OpenTelemetry Go<https://github.com/open-telemetry/opentelemetry-go>
- OpenTelemetry Collector<https://github.com/open-telemetry/opentelemetry-collector>
- Prometheus Go client<https://github.com/prometheus/client_golang>
- Tempo<https://github.com/grafana/tempo>
## 12. 风险与未决项
- Odoo、Twenty、Atlas 等项目存在模块级、目录级或商业能力边界,不能只看仓库首页许可证;
- 电子签名、发票与会计凭证的法律效力依赖适用地区,后续需求需单独合规确认;
- Casbin 足以覆盖首期 RBAC,但对象级共享和关系授权增长后可能需要 OpenFGA;
- PostgreSQL outbox 可满足首期,但高吞吐、多消费者和跨区域需求出现后可能需要 Kafka 等 broker
- HWLAB v0.3 的具体组件可复用清单应在 R1.4 基于当时源码逐项确认;
- 本报告没有发现阻塞 PJ2026-03 继续执行的问题。
@@ -0,0 +1,19 @@
# R1.2 任务报告
## 结果
- 产品仓库:`pikainc/pikaoa`,私有远端可通过既有 SSH 身份读取和推送。
- 固定主工作区:`/root/pikaoa`,分支固定为 `master`
- 初始提交:`1fc2353 chore: initialize PikaOA repository`,已推送并建立 `origin/master` 跟踪关系。
- 远端在初始化前无 refs,未覆盖任何既有提交或用户内容。
- 后续执行型任务使用 `/root/pikaoa/.worktree/<task>` 独立 worktree、独立 branch 和 PR。
## 验证
- `git ls-remote origin` 初始化前成功且无输出,证明仓库存在并为空。
- `git push -u origin master` 成功,GitHub 返回 canonical repository `git@github.com:pikainc/pikaoa.git`
- UniDesk GitHub CLI 当前 token 对产品仓返回 `repo-not-found`;这不影响既有 SSH source authority,但产品仓 issue/PR 元数据写入需在后续修复 token scope,当前治理 issue 继续落在 `pikasTech/unidesk`
## 结论
R1.2 已完成;R1.3 可以从 `origin/master` 创建独立 foundation worktree。
@@ -0,0 +1,32 @@
# R1.3.1 任务报告
## 结果
- `pikainc/pikaoa#1` 已通过主代理架构 review 和 guarded preflight,以 merge commit `042bf34` 合入 `master`
- 建立 Go 1.24 API、Worker、CLI 三入口,以及严格 YAML 配置、typed error、模块注册表和优雅停机。
- 模块描述符覆盖稳定 ID、版本、状态、权限、API、事件、导航、迁移、审计动作和健康声明,并校验重复声明与权限引用。
- 建立 pgx-compatible `Executor`/`UnitOfWork`,保证 repository、audit 和 outbox 可共享同一事务句柄。
- goose foundation migration 使用严格 owned-object 创建和逐项非级联回滚,不掩盖 schema drift。
- API、Worker、CLI 已接入 W3C trace 传播、稳定结构化日志字段和 Prometheus 指标;CLI `health``modules` 只调用公开 HTTP API。
- 未连接 PK01 PostgreSQL,未同步 Secret,未执行 PaC bootstrap、K8s rollout、公网变更或 Web 开发。
## 验证
- Artificer 在 NC01 任务 worktree 完成 `gofmt -d``go test ./...``go vet ./...` 和三入口 build。
- 真实 API 进程下 CLI text/JSON、typed readiness、完整 module JSON、API/Worker metrics、SIGTERM 和 OTLP 不可达降级均通过。
- CLI `traceparent` 与 API 返回 `traceId` 一致;API/Worker 日志包含 `traceId``spanId``module``operation``result``errorCode`
- PR preflight`MERGEABLE/CLEAN`,无 pending 或 failed check。
## 证据
- Issuehttps://github.com/pikasTech/unidesk/issues/1977
- PRhttps://github.com/pikainc/pikaoa/pull/1
- 实现提交:https://github.com/pikainc/pikaoa/commit/40ae8ae5836ccafbaf78c09d8f98463c45365e7d
- 合并提交:https://github.com/pikainc/pikaoa/commit/042bf34
- Artificer post-taskhttps://github.com/pikasTech/unidesk/issues/1977#issuecomment-4964589017
## 后续边界
- 真实 PK01 migration apply/rollback、Secret、PaC bootstrap 和运行面验收由 R1.6-R1.7 承接。
- post-task 提到的 GitHub 仓库凭据选择与大小写匹配已由 `#1978``#1980` 修复并关闭,不重复创建 issue。
- 员工/RBAC、伙伴分类、合同多版本、发票废弃和审计/outbox 实现继续在 R1.3 下拆分独立子任务。
@@ -0,0 +1,22 @@
# R1.3.2 任务报告
## 结果
- 已在 `pikainc/pikaoa#2` 建立并合并可插拔模块 HTTP 运行时,产品 `master` 合并提交为 `ebe70a3`
- foundation 路由已由模块自身注册;disabled 模块不启动、不挂载 HTTP、不发布导航。
- 模块挂载路由受 descriptor 的 API BasePath 与 health Path 约束,未声明路由和路由冲突稳定失败。
- PostgreSQL 使用 `otelpgx` 覆盖 query/transaction,并禁用连接详情、SQL 文本和参数属性。
- migration readiness 改为只读比较数据库当前 goose version 与本构建嵌入迁移最新版本。
- Prometheus 已覆盖 HTTP in-flight、Go runtime/process、pgx pool、数据库/迁移 readiness 和 Worker 基线;累计 pool 指标为 Counter,当前状态为 Gauge。
- 共享 observability 暴露标准 `prometheus.Registerer`,业务模块可在不扩展中央 Metrics 结构体的情况下注册自有 collector。
## 验证
- NC01 目标 worktree`go test ./...``go vet ./...``make build``git diff --check` 全部通过。
- 真实 API 下 CLI `health``modules` 的 text/JSON 通过,`/metrics` 类型与 readiness 脱敏通过。
- 受控 PR preflight`MERGEABLE/CLEAN`,合并前无 blocker。
## 边界与后续
- 本任务未连接 PK01、未执行生产 migration、未部署;这些动作保留给 R1.6-R1.7。
- 身份/RBAC 与审计/outbox 从本合并提交创建独立 worktree,并使用不同 migration version 并行实施。
@@ -0,0 +1,24 @@
# R1.3.3 任务报告
## 结论
员工身份、固定管理员/员工角色、会话、基础 capability 授权和 CLI 已合并到 `pikainc/pikaoa` `master`。完整身份/RBAC 契约不作为伙伴、附件、合同、发票或审计查询的开发与合并门禁;仅保留公网 MVP 的登录、固定角色和基础接口鉴权。
## 交付证据
- Issuehttps://github.com/pikasTech/unidesk/issues/1984
- PRhttps://github.com/pikainc/pikaoa/pull/3
- 合并后提交:`f024d6c`
- 最终实现提交:`3f6b3dc366fb606d9b58c245f15433c4964bebc6`
## 验证
- `go test ./...` 通过。
- `go vet ./...` 通过。
- `make build` 通过。
- 管理员与普通员工登录、权限拒绝、停用后禁止新登录及 Secret 不泄露路径通过。
- 受控 PR preflight 为 `MERGEABLE/CLEAN`PR 已合并。
## 剩余边界
动态角色治理、完整共享 RBAC 契约和进一步权限抽象不阻塞第一版 MVP;如后续业务需要,独立 issue 推进。
@@ -0,0 +1,33 @@
# R1.3.4 任务报告
## 交付结果
- 产品 PR [pikainc/pikaoa#4](https://github.com/pikainc/pikaoa/pull/4) 已受控合并到 `master@e1b570188cf39c7cf5e1210b0a477aabe7fd5fb3`
- 通过共享 `transaction.Executor` 实现业务写入、append-only 审计和 PostgreSQL outbox 同事务提交或回滚。
- outbox 提供 `SKIP LOCKED` 有界 claim、成功、重试、失败和处理中断恢复;Watermill handler registry 以事件 ID 为稳定幂等键。
- Worker 暴露纯 liveness `/healthz`、typed readiness `/readyz` 和 Prometheus `/metrics`,处理链写入 OTel span,并保持低基数标签。
- handler 原始错误不进入 `last_error`、日志、trace、metric 或返回值,仅保留稳定 `FailureCode`Secret 输出保持 `valuesPrinted=false`
## 主代理审核纠偏
- 补齐失败信息脱敏,真实 PostgreSQL 测试覆盖包含 password、token 和 secret 的 handler error,确认不泄漏。
- 增加 database、migration、outbox 的 typed readiness 投影,保持 liveness 与依赖健康分离。
## 验证
- `go test -race ./internal/outbox ./internal/worker`
- `go test ./...`
- `go vet ./...`
- `make build`
- 隔离 PostgreSQL 16 集成测试验证事务回滚、提交后 claim、失败恢复、再次 claim 和 processed 终态。
- PR preflight 为 `MERGEABLE/CLEAN`;仓库当前没有 status checks。
## 收口
- 原 Artificer 纠偏与 post-task command 均达到权威 `completed`
- `feat/r134-audit-outbox` 任务 worktree 和已吸收本地分支已清理。
- 本任务按 issue 范围未部署、未连接 PK01;部署与公网验收留在后续 YAML-first/CI/CD 阶段。
## 残余风险
`RecoverProcessing` 会恢复全部 processing 事件,多 Worker 副本可能互相干扰。本阶段不新增租约或围栏,运行面在完成独立水平扩展规格前保持 Worker 单副本。
@@ -0,0 +1,32 @@
# R1.5.1 任务报告
## 结论
PaC 新 consumer 首发 bootstrap 已具备 YAML 唯一匹配、selected repository effective credential、GitHub 上游只读预检、分阶段紧凑输出和 typed failure。该实现保持 GitHub PR merge 为唯一正式交付 authority,没有引入第二 source authority 或人工交付恢复入口。
## 变更
- 默认 human 和显式 JSON 共用有界投影,展示 `yaml-exact-match``github-upstream``gitea-repository` 前置条件,以及 Gitea、PaC、Tekton、GitOps/Argo 阶段。
- YAML 零匹配、多匹配、GitHub 仓库不存在或无权限、Gitea 初始化失败和 PaC apply 失败使用独立 typed code。
- GitHub 预检只校验 selected repositories 各自实际使用的 effective credential,不再被无关 Gitea admin 或默认 credential 形成伪 blocker。
- YAML 匹配失败直接给 `fix-yaml`,失败态不提供 mirror sync、人工 PipelineRun、Argo refresh 等 mutation 恢复命令。
- 未执行 `bootstrap --confirm`、部署或其他运行面 mutation。
## 验证
- Target`NC01:/root/unidesk/.worktree/pikaoa-bootstrap-ux`
- 定向测试:19 pass0 fail。
- `sh -n scripts/src/platform-infra-gitea-remote.sh` 通过。
- `platform-infra pipelines-as-code help platform-bootstrap` 通过。
- `unidesk-host` 默认 credential dry-run 通过。
- `selfmedia-nc01` repository override credential dry-run 通过。
- PikaOA dry-run 返回 `yaml-repository-exact-match``github-repository-not-found-or-no-access`,后续阶段均为 `skipped``mutation=false`,准确暴露当前外部建仓权限阻塞。
- `git diff --check` 通过。
## 交付
- 实现 commit`697b6933``feat: 改进 PaC bootstrap 首发状态投影`)。
- 纠偏 commit`1a04b029``fix: 收窄 PaC bootstrap 预检凭据`)。
- 目标分支已通过 `fa730e1e` 吸收上述实现,并通过 `e808b298` 补齐未执行阶段的 `skipped` 投影。
- 子 issue[pikasTech/unidesk#1955](https://github.com/pikasTech/unidesk/issues/1955)。
- Post-task 未发现需要另建 FEATURE/BUG issue 的残余问题。
@@ -0,0 +1,31 @@
# R1.5.2 任务报告
## 结论
共享 observability 控制面已在同一 YAML-first 架构中加入 Prometheus。Prometheus 只作用于 `metricsBackend.targetIds` 选中的 targetOTel Collector 与 Tempo 继续承担 trace authority;指标故障和版本漂移只形成非阻塞 warning。
## 变更
- `config/platform-infra/observability.yaml` 拥有 Prometheus image、目标、存储、保留、端口、服务发现和查询预算。
- NC01 渲染 ServiceAccount、RBAC、ConfigMap、PVC、Deployment 与 ClusterIP ServiceD518/JD01 不渲染或访问 Prometheus。
- `metrics-query` 提供受 YAML timeout、series 和 response bytes 预算约束的有界 PromQL 查询。
- selector 使用严格 Kubernetes qualified name/value,渲染为锚定且转义的 RE2 字面量;label/annotation meta-label 统一规范化。
- 显式 metrics path 优先,仅在 annotation 缺失时回退到 YAML `defaultPath`
- 未部署、未执行 confirm;真实 StorageClass、镜像拉取和 scrape target 留给 R1.6 受控 rollout 验证。
## 验证
- `bun test scripts/src/platform-infra-observability.test.ts`8 pass0 fail100 assertions。
- `platform-infra observability --help` 暴露 scoped `metrics-query`
- NC01 plan`prometheus=enabled`15 个对象。
- D518/JD01 plan`prometheus=disabled-for-target`,各 8 个对象,无 Prometheus manifest、status capture/probe 或远端 query。
- 模块导入与 `git diff --check` 通过。
## 交付
- 实现 commit`f516691a`
- target 隔离与发现规则纠偏:`ef3b5fde`
- selector 严格渲染纠偏:`c3762b31`
- 目标分支 merge commit`2ee27b0c`
- 子 issue[pikasTech/unidesk#1956](https://github.com/pikasTech/unidesk/issues/1956)。
- Post-task 未建议新增 FEATURE/BUG issue。
@@ -0,0 +1,25 @@
# R1.5.3 任务报告
## 结论
`platform-db postgres plan` 已改为默认返回有界 CLI-first 投影,并保留 `--full``--raw` 完整下钻。默认输出不会再触发 10 KiB 全局截断保护,Secret 值始终不披露。
## 变更
- 默认投影包含 target、config、全部角色和数据库的期望动作、Secret source 摘要、connection string export 摘要、检查汇总、远端事实摘要和下一步命令。
- 失败检查才携带 480 字符以内的有界详情。
- 远端失败输出分别限制为 1,200 字符 stdout/stderr 尾部。
- `--full` 保留完整 `config``secrets``remoteFacts``desired``checks` 和 remote capture`--raw` 继续附加原始 capture。
## 验证
- 默认 CLI 返回码为 0stdout 为 9,589 字节,`outputTruncated=false`
- 默认投影明确包含 `pikaoa` role、`pikaoa` database 和 `pikaoa-database-url``DATABASE_URL` export,且 `valuesPrinted=false`
- `--full` 完整对象为 34,475 字节,由显式 disclosure policy 创建受保护 dump 并返回有界索引。
- `bun test scripts/src/platform-db-monitor-reset.test.ts scripts/src/platform-db-nc01-monitor-config.test.ts`8 pass0 fail。
- `git diff --check` 通过。
## 交付
- Commit`88eb8fdb``fix: 收敛 PostgreSQL 计划输出`)。
- 目标分支:`feat/pikaoa-platform`
@@ -0,0 +1,24 @@
# R1.5.4 任务报告
## 结论
已修复 `platform-db postgres status``export-secrets` 默认输出截断,并将默认投影改为按配置规模有界的计数、异常/待处理预览与 omitted 摘要。confirmed export 明确区分 `before``action``after`,不会把写入前 presence 当成写入后事实。
## 交付
- 子 issuepikasTech/unidesk#1958
- PRpikasTech/unidesk#1960
- merge commit`34f1f9339168b518ca1f706cc7bc44880924171d`
- 变更:`scripts/src/platform-db.ts``docs/reference/cli.md`
## 验证
- 真实配置:status 4264 bytesexport dry-run 2679 bytesplan 9589 bytes,均未截断。
- 扩展规模:48 个 role/database/Secret、50 个 export 时,status 7589 bytesexport 5624 bytes。
- confirmed fixture:首次 `before=false/false``after=true/true`;二次 confirmed 无 actionable 项。
- 相关测试:8 pass、0 fail。
- 合并后的原 CLI 复测准确显示 PikaOA role/database/export 缺失,`mutation=false``valuesPrinted=false`
## 边界
未执行 PostgreSQL apply、Secret sync、PaC bootstrap 或运行面修改。Artificer post-task 评论为 issue #1958 comment 4962360252;未发现需要扩展本轮范围的问题。
@@ -0,0 +1,20 @@
# R1.5.5 任务报告
## 结果
- Issue`pikasTech/unidesk#1978`
- PR`pikasTech/unidesk#1979`,合并提交 `9e4efb50`
- Owning YAML`config/unidesk-cli.yaml#github.auth.repositoryOverrides`
-`pikainc/pikaoa` 增加精确 repository override,复用既有 PikaInc token sourceRef;未读取、打印、复制或提交 token value。
## 验证
- `gh auth status --repo pikainc/pikaoa` 成功,命中 `scope=repository-override``valuesPrinted=false`
- `gh repo view pikainc/pikaoa` 成功,私有仓可见。
- `gh auth status --repo pikasTech/unidesk` 成功,默认全局 sourceRef 未受影响。
- 定向测试 3 pass、0 fail`git diff --check` 通过。
- 本任务无运行面部署,`rollout=not-applicable`
## 边界
Artificer 的当前产品任务仍可通过 SSH 提交代码;产品 PR 的 create/review/merge 由合并后的受控 host CLI 完成。owner 大小写匹配问题已作为独立 BUG 候选登记,不改变本任务完成结论。
@@ -0,0 +1,19 @@
# R1.5.6 任务报告
## 结果
- Issue`pikasTech/unidesk#1980`
- PR`pikasTech/unidesk#1982`,合并提交 `7eebc513`
- GitHub credential resolver 使用统一的小写 lookup key 比较请求仓库与 YAML repository override,并以相同规则拒绝仅大小写不同的重复配置。
- YAML 原值、GitHub API path、CLI 输出和 token sourceRef/value 均未改写。
## 验证
- `pikainc/pikaoa``pikaInc/pikaoa``PIKAINC/PIKAOA` 均命中同一 repository override。
- `pikasTech/unidesk` 继续命中全局 token;所有输出 `valuesPrinted=false`
- 定向测试 4 pass、0 fail`bun --check``git diff --check` 通过。
- 未部署,`rollout=not-applicable`
## Post-task
未发现需要继续转为正式 issue 的新反馈。
@@ -0,0 +1,34 @@
# R1.5 任务报告
## 结论
PikaOA 的 UniDesk 交付基线已完成 YAML-first 声明,并补齐可复用的 PaC bootstrap、PostgreSQL 紧凑 plan/status/export、NC01 Prometheus 控制面和产品仓 GitHub token 路由。全部运行面变更仍处于源码、只读 plan/status 与 dry-run 阶段,未执行首次 bootstrap、数据库 apply 或部署。
## Owning YAML
- `config/pikaoa.yaml`NC01 独立 namespace、Web/API/Worker、Secret、资源、探针、OTel/metrics 标注和 `https://oa.pikapython.com` PK01 公网暴露。
- `config/platform-db/postgres-pk01.yaml`host PostgreSQL 的 PikaOA role、database 与 Secret export。
- `config/secrets-distribution.yaml`:管理员、普通员工和数据库连接的 `sourceRef`/`targetKey`
- `config/platform-infra/gitea.yaml``config/platform-infra/pipelines-as-code.yaml`Gitea repository、PaC consumer、Tekton/GitOps/Argo 首发基线。
- `config/platform-infra/observability.yaml`:共享 OTel/Tempo/Prometheus 与 NC01 target 隔离。
- `config/unidesk-cli.yaml``pikainc/pikaoa` GitHub repository token override。
## CLI 与工具改进
- PaC bootstrap 提供 YAML 精确匹配、effective credential、GitHub 上游预检、分阶段 typed 状态、skipped 阶段和唯一下一步。
- `platform-db postgres plan/status/export-secrets` 默认输出按配置规模保持有界,披露 PikaOA role/database、Secret/export presence/fingerprint、mutation、typed failure 和完整下钻。
- confirmed export 区分写入前、动作与写入后事实。
- `platform-infra observability` 提供 target-scoped Prometheus plan/status/query;指标故障不阻塞业务。
- GitHub CLI 可通过 YAML repository override 访问 PikaOA 私有仓,且保持 `valuesPrinted=false`
## 验证与交付
- PaC bootstrap 定向测试 19 项通过;PikaOA dry-run 为 `mutation=false`
- Prometheus 8 tests、100 assertions 通过;NC01 enabled,其他 target disabled-for-target。
- PostgreSQL status 4264 bytes、export dry-run 2679 bytes;扩大到 48 个 role/database/Secret 和 50 个 export 后仍低于预算;相关测试 8 pass。
- GitHub repository override 定向测试 3 pass;合并后 PikaOA auth/repo view 和默认 UniDesk auth 均成功。
## 未完成边界
- PikaOA role/database 尚未 apply`DATABASE_URL`、session secret 与两个初始账号密码尚未 materialize/sync。
- 首次 bootstrap、正常 source PR 自动交付、NC01 rollout、OTel/Prometheus 运行面与公网入口验收属于 R1.6-R1.7。
@@ -0,0 +1,47 @@
# R7 任务报告
## 结果
- 新增只读命令 `platform-infra pipelines-as-code delivery-timing --target <NODE> --consumer <id>`
- 命令从 `config/platform-infra/pipelines-as-code.yaml``config/platform-infra/gitea.yaml` 精确解析 consumer、上游 GitHub repository 和 branch。
- 单次调用并行读取最新 PaC PipelineRun/TaskRun 与 status closeout,再按 source commit 查询 GitHub 关联 PR;不新增历史库或第二状态源。
- 默认及 JSON 输出包含 source commit、PR、mergedAt、PipelineRun 起止、trigger wait、pipeline duration、end-to-end duration、Argo/runtime health 和 `evidenceGaps`
- PR、时间戳或 provenance 缺失时保持 `partial/unknown`,不使用 commit 时间冒充 mergedAt;入口固定 `mutation=false`
## 真实只读验收
命令:
`bun scripts/cli.ts platform-infra pipelines-as-code delivery-timing --target NC01 --consumer selfmedia-nc01 --json`
结果:
- source commit`11bfcf2657cd4f62e5e7221803872e53143e5f0c`
- GitHub PR`pikainc/selfmedia#26`
- mergedAt`2026-07-14T05:54:19Z`
- PipelineRun`2026-07-14T05:54:26Z``2026-07-14T05:57:28Z`
- trigger wait7 秒
- PipelineRun182 秒
- 端到端:189 秒
- TaskRun181 秒
- Argo`Synced/Healthy`
- runtime`1/1` ready
- 状态:`partial`,保留既有 `runtime-provenance-unknown` 缺口
- mutation`false`
## 验证
- `bun --check scripts/src/platform-infra-pipelines-as-code.ts`:通过。
- `bun scripts/cli.ts check --syntax-only`11/11 通过。
- `bun test scripts/src/cicd-pr-merge-auto-delivery-doc-contract.test.ts`8/8 通过。
- `quick_validate.py .agents/skills/unidesk-cicd`:通过。
- `git diff --check`:通过。
- 受控 scripts typecheck 已安装锁文件声明的 TypeScript 后执行;仓库现有 364 条诊断、94 个路径,本次新模块路径匹配 0 条。
## Skill 入口复核
已在 `unidesk-cicd/SKILL.md` 高频入口加入 SELFMEDIA 唯一推荐命令,并明确一次调用直接披露 `mergedAt`、trigger wait、PipelineRun/TaskRun、端到端耗时、Argo、runtime health 与 `evidenceGaps``partial` 保留已成立字段,入口固定 `mutation=false`
`bun scripts/cli.ts platform-infra pipelines-as-code delivery-timing --target NC01 --consumer selfmedia-nc01`
吸收最新 master 时保留 checkpoint `7e8b8396` 原生提交语义。由于 master 已并发占用顶层 MDTODO R7,索引将本任务记为“原 MDTODO R7”的 R6.1 completed 条目;本报告身份、issue #2005 与任务上下文仍保持 MDTODO R7。
@@ -77,3 +77,7 @@
## R2 [in_progress]
执行 [HWLAB #2537](https://github.com/pikasTech/HWLAB/issues/2537):纠正此前名义完成但真实效果不达标的问题,依据 OA SPEC 和 R1_Context 全量重写 HWLAB v0.3 非 Workbench 页面代码;先抽取工业风高信息密度通用表格、卡片、弹窗、日志/Markdown/JSON/Trace Viewer、Inspector 和图标/列表/密度切换,再重写 AC/SK/UR/AB、MDTODO、HWPOD 与 HWPOD Node,补 Python 单文件节点下载及分阶段接入引导;保留 MDTODO 三栏布局思想、typed API、权限/Secret/硬件/账务 authority 和 Workbench 主路径,完成 1920/960/390、ARIA、reduced-motion 与完整异步状态验收,完成任务后将详细报告写入[任务报告](./details/hwlab-web-product-experience/R2_Task_Report.md)。
## R3 [in_progress]
设计并实现 HWLAB v0.3 AgentRun 智能体运行观察页([HWLAB #2541](https://github.com/pikasTech/HWLAB/issues/2541)):集成“智能体管理”,默认表格并可切换卡片/树状视图;三视图共享唯一 snapshot BFF、Pinia 规范化 store、selector 和页面级轮询控制器,禁止 SSE、组件级请求、状态猜测及任何 fallback;默认 5 秒且用户可在 Web 调频,页面隐藏/离线暂停,以 singleflight、取消、退避、抖动、条件请求和 BFF 请求合并防过载;可调参数 YAML-first,并在 NC01/v03 公网原入口完成响应式、可访问性、数据一致性和限载验收,完成任务后将详细报告写入[任务报告](./details/hwlab-web-product-experience/R3_Task_Report.md)。
@@ -109,4 +109,4 @@
##### R4.4.2.10 [in_progress]
执行 [HWLAB #2538](https://github.com/pikasTech/HWLAB/issues/2538):删除六个架构 capability env 及 direct/live/refresh 分支,把 agentrun.event.v1→transactional projector→PostgreSQL facts/outbox→hwlab.event.v1→实时/回放 SSE 固定为代码不变量;新增 config/feature-config.schema.json 只描述 Trace、原始事件、调试重放和视图等产品功能,一个功能只用一个规范变量;保持 canonical duration、同 cursor/reducer 和纯 Kafka,禁止 HTTP 补链、页面轮询、双 authority、额外锁租约状态库,schema warning 不关闭功能、不改配置且不阻塞滚动上线,完成任务后将详细报告写入[任务报告](./details/observability-trace-reliability/R4.4.2.10_Task_Report.md)。
执行 [HWLAB #2538](https://github.com/pikasTech/HWLAB/issues/2538) P0 架构纠偏:确认 PR #2540 把已工作的 agentrun.event.v1→hwlab.event.v1→实时 SSE/Kafka retention 回放错误替换为强制 PostgreSQL transactional projector,构成重大架构偏移;从最新 v0.3 分析偏移提交并创建新的精确纠偏提交,恢复 direct publish、live Kafka SSE、Kafka refresh replay 及其单一 Kafka authority,删除强制 v8 schema 启动门禁和数据库迁移依赖,保留 canonical duration 修复、feature-config schema、HTTP fallback 禁令及其他无关改动;通过新 PR 和自动 PaC/GitOps/Argo 上线后校对实时、回放、terminal/final 与 canonical duration,完成任务后将详细报告写入[任务报告](./details/observability-trace-reliability/R4.4.2.10_Task_Report.md)。
+93
View File
@@ -0,0 +1,93 @@
# PikaOA 企业办公平台
- 规格真相:`project-management/PJ2026-03/specs/PJ2026-03-pikaoa.md`
- 主执行记录:[pikasTech/unidesk#1952](https://github.com/pikasTech/unidesk/issues/1952)。
- 产品仓库:`pikaInc/pikaoa`,固定主工作区为 `/root/pikaoa`
- 目标运行面:owning YAML 选中的 NC01 Kubernetes 独立 namespace。
- 公网原入口:`https://oa.pikapython.com`
- 数据真相:PK01 host PostgreSQL 中的独立数据库与角色。
- 执行证据:GitHub issue/PR、任务报告、PaC/PipelineRun/GitOps/Argo 和 Web 原入口验证。
## R1 [in_progress]
依据 PJ2026-03 建设企业级可扩展 PikaOA:在 /root/pikaoa 建立 pikaInc 仓库,采用 HWLAB v0.3 同族 Vue 技术栈和 Go 后端;CLI-first 完成员工/RBAC、甲方分类、合同多版本、发票关联与废弃、审计、OTel/Prometheus,再开发 Web;通过独立 K8s namespace、PK01 host PostgreSQL、YAML-first、PaC bootstrap、自动 CI/CD 和 https://oa.pikapython.com 原入口交付,完成任务后将详细报告写入[任务报告](./details/pikaoa-enterprise-platform/R1_Task_Report.md)。
### R1.1 [completed]
调研成熟开源 OA、ERP、合同、发票、Go 微服务与 Vue 组件方案,形成采用/复用/不采用结论,依赖 R1 规格,执行记录见 [pikasTech/unidesk#1953](https://github.com/pikasTech/unidesk/issues/1953),完成任务后将详细报告写入[任务报告](./details/pikaoa-enterprise-platform/R1.1_Task_Report.md)。
### R1.2 [completed]
建立 pikainc/pikaoa 私有仓库、/root/pikaoa 固定 master 和独立任务 worktree;远端已由 SSH 验证并以 [1fc2353](https://github.com/pikainc/pikaoa/commit/1fc2353) 建立唯一初始提交,完成任务后将详细报告写入[任务报告](./details/pikaoa-enterprise-platform/R1.2_Task_Report.md)。
### R1.3 [in_progress]
实现企业模块内核、Go API/Worker、PostgreSQL 迁移、员工/RBAC、伙伴分类、合同版本、发票废弃、审计、OTel/Prometheus 与 CLI,并通过 CLI 后端验收,依赖 R1.1-R1.2,完成任务后将详细报告写入[任务报告](./details/pikaoa-enterprise-platform/R1.3_Task_Report.md)。
#### R1.3.1 [completed]
建立 Go API/Worker/CLI 企业模块共享内核、PostgreSQL 迁移与审计/outbox 端口、OTel/Prometheus 基线和 CLI health/modules 验收,执行记录见 [pikasTech/unidesk#1977](https://github.com/pikasTech/unidesk/issues/1977),完成任务后将详细报告写入[任务报告](./details/pikaoa-enterprise-platform/R1.3.1_Task_Report.md)。
#### R1.3.2 [completed]
采用 chi 建立可插拔模块 HTTP 运行时、disabled 模块关闭入口、示例模块扩展验收,并补齐 PostgreSQL OTel 与 HTTP/runtime/pool/migration Prometheus 基线,执行记录见 [pikasTech/unidesk#1983](https://github.com/pikasTech/unidesk/issues/1983),完成任务后将详细报告写入[任务报告](./details/pikaoa-enterprise-platform/R1.3.2_Task_Report.md)。
#### R1.3.3 [completed]
实现员工身份、Casbin RBAC、会话与 CLI login/logout/whoami/employees/roles,使用 YAML Secret 投影初始管理员和员工,执行记录见 [pikasTech/unidesk#1984](https://github.com/pikasTech/unidesk/issues/1984),完成任务后将详细报告写入[任务报告](./details/pikaoa-enterprise-platform/R1.3.3_Task_Report.md)。
#### R1.3.4 [completed]
实现 pgx 同事务审计、PostgreSQL outbox、Watermill handler pipeline、幂等 Worker 与 OTel/Prometheus,执行记录见 [pikasTech/unidesk#1985](https://github.com/pikasTech/unidesk/issues/1985),完成任务后将详细报告写入[任务报告](./details/pikaoa-enterprise-platform/R1.3.4_Task_Report.md)。
#### R1.3.5 [in_progress]
实现统一业务伙伴、甲方分类、角色、联系人、标签、归档、筛选和 CLI;持久化 REST 资源使用 UUIDv7,伙伴与分类只通过 typed ID 关联,并将业务、审计、outbox 保持同事务,执行记录见 [pikasTech/unidesk#1990](https://github.com/pikasTech/unidesk/issues/1990),完成任务后将详细报告写入[任务报告](./details/pikaoa-enterprise-platform/R1.3.5_Task_Report.md)。
#### R1.3.6 [in_progress]
实现统一附件元数据、对象引用、可替换存储端口、完整性校验、授权 API 和 CLI;附件使用 UUIDv7 平级资源身份,业务对象仅通过 typed ID 关联,执行记录见 [pikasTech/unidesk#1991](https://github.com/pikasTech/unidesk/issues/1991),完成任务后将详细报告写入[任务报告](./details/pikaoa-enterprise-platform/R1.3.6_Task_Report.md)。
#### R1.3.7
实现合同与合同版本平级 UUIDv7 REST 资源,通过 contractId、previousVersionId、currentVersionId 建立 ID 关系,保证版本不可变、并发序号唯一、附件关联和全量 CLI,执行记录见 [pikasTech/unidesk#1992](https://github.com/pikasTech/unidesk/issues/1992),完成任务后将详细报告写入[任务报告](./details/pikaoa-enterprise-platform/R1.3.7_Task_Report.md)。
#### R1.3.8
实现平级 UUIDv7 发票资源,通过 partnerId、contractId、contractVersionId 和 attachmentId 建立关联,支持定点金额、typed 一致性校验、不可删除废弃事实、筛选汇总和全量 CLI,执行记录见 [pikasTech/unidesk#1993](https://github.com/pikasTech/unidesk/issues/1993),完成任务后将详细报告写入[任务报告](./details/pikaoa-enterprise-platform/R1.3.8_Task_Report.md)。
#### R1.3.9 [in_progress]
复用 append-only 审计唯一真相实现 UUIDv7 平级审计资源、RBAC 查询 API、actor/resource/action/time/requestId/traceId 筛选和 audit list/get CLI,执行记录见 [pikasTech/unidesk#1994](https://github.com/pikasTech/unidesk/issues/1994),完成任务后将详细报告写入[任务报告](./details/pikaoa-enterprise-platform/R1.3.9_Task_Report.md)。
### R1.4
在 R1.3 CLI 后端验收通过后实现 HWLAB v0.3 同族 Vue 工作台、响应式页面与同路径业务流,完成任务后将详细报告写入[任务报告](./details/pikaoa-enterprise-platform/R1.4_Task_Report.md)。
### R1.5 [completed]
在 UniDesk 中声明 PK01 PostgreSQL、Secret、NC01 独立 namespace、Gitea/PaC、GitOps、OTel/Prometheus 和 PK01 公网暴露,并改进可复用 bootstrap 工具,依赖 R1.1-R1.2,完成任务后将详细报告写入[任务报告](./details/pikaoa-enterprise-platform/R1.5_Task_Report.md)。
#### R1.5.1 [completed]
改进 PaC bootstrap 的新服务首发预检、分阶段紧凑输出、typed failure 与中文说明,保持 PR merge 唯一交付 authority,执行记录见 [pikasTech/unidesk#1955](https://github.com/pikasTech/unidesk/issues/1955),完成任务后将详细报告写入[任务报告](./details/pikaoa-enterprise-platform/R1.5.1_Task_Report.md)。
#### R1.5.2 [completed]
扩展 NC01 共享 observability,使 OTel/Tempo 与 Prometheus 由同一 YAML-first 控制面管理并提供跨 namespace 指标抓取和有界查询,执行记录见 [pikasTech/unidesk#1956](https://github.com/pikasTech/unidesk/issues/1956),完成任务后将详细报告写入[任务报告](./details/pikaoa-enterprise-platform/R1.5.2_Task_Report.md)。
#### R1.5.3 [completed]
修复 `platform-db postgres plan` 默认 30KB JSON 被输出预算截断的可见性缺陷,提供数据库、角色、Secret/export、检查与下一步的紧凑 CLI-first 投影,执行记录沿用 [主 issue](https://github.com/pikasTech/unidesk/issues/1952),完成任务后将详细报告写入[任务报告](./details/pikaoa-enterprise-platform/R1.5.3_Task_Report.md)。
#### R1.5.4 [completed]
修复 `platform-db postgres status``export-secrets --dry-run` 默认输出超预算截断,提供与 plan 同族的 Secret/export 有界投影并保持 valuesPrinted=false,执行记录见 [pikasTech/unidesk#1958](https://github.com/pikasTech/unidesk/issues/1958),完成任务后将详细报告写入[任务报告](./details/pikaoa-enterprise-platform/R1.5.4_Task_Report.md)。
#### R1.5.5 [completed]
为 pikainc/pikaoa 补齐 YAML-first GitHub token repository override,使受控 CLI 可管理产品 PR 且不打印凭据,执行记录见 [pikasTech/unidesk#1978](https://github.com/pikasTech/unidesk/issues/1978),完成任务后将详细报告写入[任务报告](./details/pikaoa-enterprise-platform/R1.5.5_Task_Report.md)。
#### R1.5.6 [completed]
修复 GitHub repository override 对 owner/repo 大小写敏感,确保 pikaInc/pikaoa 与 canonical 名称选择同一受控 token,执行记录见 [pikasTech/unidesk#1980](https://github.com/pikasTech/unidesk/issues/1980),完成任务后将详细报告写入[任务报告](./details/pikaoa-enterprise-platform/R1.5.6_Task_Report.md)。
### R1.6
审核并合并双仓 PR,执行首次受控 PaC bootstrap,由正常 source PR merge 自动发布,依赖 R1.3-R1.5,完成任务后将详细报告写入[任务报告](./details/pikaoa-enterprise-platform/R1.6_Task_Report.md)。
### R1.7
通过 CLI、OTel、Prometheus 和 https://oa.pikapython.com 桌面/移动原入口验证完整主路径,依赖 R1.6,完成任务后将详细报告写入[任务报告](./details/pikaoa-enterprise-platform/R1.7_Task_Report.md)。
### R1.8
完成 issue、MDTODO、阶段报告、post-task、已吸收 worktree 与分支清理,依赖 R1.7,完成任务后将详细报告写入[任务报告](./details/pikaoa-enterprise-platform/R1.8_Task_Report.md)。
@@ -86,3 +86,19 @@
## R6 [in_progress]
执行 [UniDesk #1981](https://github.com/pikasTech/unidesk/issues/1981):固定仓库产品功能 schema 路径为 config/feature-config.schema.jsonCI/CD 只读校验 schema 语法、值匹配和功能到唯一配置变量的一对一关系;缺失、非法、不匹配或重复仅输出 typed warning 并投影到 OTel/status/history/debug-step,必须继续 artifact、GitOps/Argo 和滚动上线,禁止写回、默认值、变量删除、功能关闭、架构切换及其他补救操作,完成任务后将详细报告写入[任务报告](./details/pr-merge-driven-automatic-delivery/R6_Task_Report.md)。
### R6.1 [completed]
原 MDTODO R7 依据 [UniDesk #2005](https://github.com/pikasTech/unidesk/issues/2005) 实现 SELFMEDIA CI/CD 单次只读查询:从 owning YAML 解析 selfmedia-nc01,在一次受控 CLI 调用内关联 pikainc/selfmedia GitHub mergedAt、PaC PipelineRun/TaskRun、Argo/runtime health,直接披露 trigger wait、pipeline duration、end-to-end duration 与证据缺口;同步 unidesk-cicd skill 的唯一推荐入口,禁止新增第二状态源或交付 mutation,完成任务后将详细报告写入[任务报告](./details/pr-merge-driven-automatic-delivery/R7_Task_Report.md)。最新 master 已占用顶层 R7,本条仅调整索引层级,不改写任务报告身份与 checkpoint 语义。
## R7 [in_progress]
执行 [UniDesk #2008](https://github.com/pikasTech/unidesk/issues/2008):按 PJ2026-01060106 建立 HWLAB 开发/生产双环境发布;v0.3 固定为 NC01 developmentrelease 固定为 production,两个环境在 source、Pipeline、GitOps、Argo、namespace、public origin、PostgreSQL database/role/Secret/migration ledger 和 Kafka consumer group 上隔离,所有值由 owning YAML 控制,完成任务后将详细报告写入[任务报告](./details/pr-merge-driven-automatic-delivery/R7_Task_Report.md)。
### R7.1 [in_progress]
迁移 [UniDesk #2009](https://github.com/pikasTech/unidesk/issues/2009):保持 v0.3 开发 branch/namespace/DB consumer,删除其对 hwlab.pikapython.com 的所有权,选择并 YAML 固化 NC01 公网 IP 的空闲 HTTP 端口和同源 API/health/probe,通过新 PR 和自动链完成原入口验证,完成任务后将详细报告写入[任务报告](./details/pr-merge-driven-automatic-delivery/R7.1_Task_Report.md)。
### R7.2 [in_progress]
建立 [UniDesk #2010](https://github.com/pikasTech/unidesk/issues/2010):跟随 release branch 的独立 production PaC/Tekton/GitOps/Argo、namespace、host PostgreSQL database/role/Secret/migration ledger、Kafka consumer group 与 https://hwlab.pikapython.com YAML publicExposurerelease 只从完成 P0 Kafka 纠偏并验证的 v0.3 commit 初始化,完成任务后将详细报告写入[任务报告](./details/pr-merge-driven-automatic-delivery/R7.2_Task_Report.md)。
@@ -15,3 +15,11 @@
### R1.3 [completed]
重新分发用户更新后的 SelfMedia 管理员凭据,并将 owning YAML、Secret sync/status、自动交付与公网鉴权验收最短路径沉淀到 `unidesk-selfmedia` skill;不得读取或输出凭据值,不得影响其他仓库 token 选择,完成任务后将详细报告写入[任务报告](./details/selfmedia-production-delivery/R1.3_Task_Report.md)。
## R2 [in_progress]
依据 [UniDesk #2006](https://github.com/pikasTech/unidesk/issues/2006) 优化 selfmedia-nc01 PaC 流水线的 env reuse 与依赖缓存:由 owning YAML、lockfile 和 source artifact 生成环境身份,依赖不变时复用并披露 hit/miss 与阶段耗时,依赖变化时正确失效;通过正常 SELFMEDIA PR merge 自动交付验收,保持 commit-pinned artifact、GitOps/Argo、runtime health 和单一 source authority,完成任务后将详细报告写入[任务报告](./details/selfmedia-production-delivery/R2_Task_Report.md)。
## R3 [in_progress]
依据 [UniDesk #2007](https://github.com/pikasTech/unidesk/issues/2007) 为 pikainc/selfmedia release 分支建立独立生产 PaC/GitOps 流水线:master 保持开发 consumerrelease 精确驱动独立生产 namespace、Pipeline、GitOps branch/Application、runtime/PVC/Secret 与 YAML-first 公网端口;禁止 branch follower、手工同步和共享可写状态,以正常 release PR merge 验收生产公网入口、登录、digest 与 health,完成任务后将详细报告写入[任务报告](./details/selfmedia-production-delivery/R3_Task_Report.md)。
+5 -1
View File
@@ -115,7 +115,11 @@ PipelineRun 失败或长时间未完成时,先按定点 `control-plane status
- `gc plan|run --confirm|db-trace|policy|remote` 是主 server 和受控 provider 的磁盘高水位一次性缓解与长期防膨胀入口。`plan` 只读输出候选、风险、估算收益和保护对象;`run` 必须显式 `--confirm``gc remote <providerId> ...` 通过 UniDesk SSH 透传执行远端 GC`--target-use-percent N` 会在 `summary.target` 中报告目标水位所需释放量、候选估算、预计水位、缺口和 safe-stop 决策。默认只包含 allowlisted `/tmp` 诊断目录;非 allowlist stale `/tmp` 直接子项必须显式 `--include-stale-tmp`,并只允许删除 `/tmp` 一级子项且避开系统 socket/session 前缀。G14/HWLAB registry retention、受限 core dump、保护对象、safe-stop 线和长期收益表的权威规则见 `docs/reference/gc.md`
- `server rebuild <backend-core|frontend|dev-frontend-proxy|provider-gateway|code-queue-mgr|project-manager|baidu-netdisk|oa-event-flow>` 创建异步 job,先构建目标服务镜像,随后在 `.state/locks/server-compose.lock` 串行保护下用 `--no-deps --force-recreate` 替换目标 service 并等待容器 `healthy/running`。Todo Note 的 CC01/旧 Compose 回退入口已在迁移验收后删除;正式发布只走 NC01 PaC/Argo。D601 Code Queue 执行面不由 `server rebuild` 管理;Rust backend-core 常规迭代不得用该命令在 master server 编译,只有明确的 backend-core 主 server 上线例外可以按限流、异步轮询和 health 证据执行,规则见 `docs/reference/dev-environment.md`
- `provider attach <providerId> [--master-server URL] [--up] [--force]` 在新计算节点生成两项配置的 provider-gateway 挂载包:`.state/provider-<ID>.env` 默认只包含 `UNIDESK_MASTER_SERVER``PROVIDER_ID``provider-<ID>.yml` 固定 Docker socket、`pid: "host"``restart: always`、只读 `/workspace` 和 SSH 维护私钥挂载;`--up` 会立即执行生成的 `docker compose up -d --build``provider triage <providerId> [--observed-error text] [--observed-scope scope] [--microservice id ...] [--full|--raw]` 是只读多信号健康裁决入口,会把单路径 `provider is not online`、SSH 超时、registry 失败和 service proxy 失败归类成 `runner-local-observation-gap``service-degraded``provider-degraded``global-blocker`。默认输出只返回裁决、scope、失败/降级/未知信号和有界 evidence 摘要,完整 evidence 必须显式加 `--full``--raw`;推荐交叉验证命令仍包含 `debug health``debug dispatch <providerId> host.ssh --wait-ms 15000``trans <providerId> argv true``artifact-registry health --provider-id <providerId>``microservice health k3sctl-adapter``microservice health code-queue``codex tasks --view supervisor --limit 20`
- `platform-db postgres plan|status|export-secrets|apply --config config/platform-db/postgres-pk01.yaml` 管理 YAML 声明的 PK01 host-native PostgreSQL`plan``status` 只读采集远端 host、PostgreSQL、TLS、DNS alias 和 Secret 形态;`export-secrets --confirm` 只按 YAML 物化本地 Secret source/export 文件,不触碰远端 PostgreSQL`apply --confirm` 默认创建本地异步 job`apply --confirm --wait` 用远端 root-owned job 收敛 systemd PostgreSQL、TLS、`pg_hba`、role/database、Secret export 和备份 timer。输出不得打印密码或完整 `DATABASE_URL`。跨节点消费者使用 YAML 中的 `connectionHost` 直连 PK01 公网 endpointDNS alias 不作为 `sslmode=require` 切库 blockerPK01 规则见 `docs/reference/pk01.md`
- `platform-db postgres plan|status|export-secrets|apply --config config/platform-db/postgres-pk01.yaml` 管理 YAML 声明的 PK01 host-native PostgreSQL
- `plan``status``export-secrets` 默认返回有界摘要;配置项使用 total/passed/missing/actionable/omitted 计数,只预览固定数量的失败、缺失或待处理项,并保留 mutation、typed failure、`valuesPrinted=false` 和语义化下钻。只有显式 `--full` / `--raw` 才披露完整结构化结果。
- `plan``status` 只读采集远端 host、PostgreSQL、TLS、DNS alias 和 Secret 形态;`export-secrets --confirm` 只按 YAML 物化本地 Secret source/export 文件,不触碰远端 PostgreSQL。export 结果用 `before` / `after` 区分写入前观察与写入后 presencefingerprint 不披露 Secret value。
- `apply --confirm` 默认创建本地异步 job`apply --confirm --wait` 用远端 root-owned job 收敛 systemd PostgreSQL、TLS、`pg_hba`、role/database、Secret export 和备份 timer。
- 输出不得打印密码或完整 `DATABASE_URL`;跨节点消费者使用 YAML 中的 `connectionHost` 直连 PK01 公网 endpointDNS alias 不作为 `sslmode=require` 切库 blockerPK01 规则见 `docs/reference/pk01.md`
- `trans <route> [operation args...]` / `tran <route> [operation args...]` 通过 backend-core 内网 WebSocket broker 和 provider-gateway 的 Host SSH / WSL SSH 维护桥连接目标节点:
- `route` 基础形态是 provider id,例如 `D601``G14`;也可以扩展为纯定位路径 `provider:plane[:namespace:resource[:container]]`,例如 `D601:win``D601:win/c/test``G14:k3s``D601:k3s``G14:k3s:<namespace>:<workload>`
- WSL provider 的 Windows plane 固定使用 `win`,不得使用 `win32`Windows route 中 `win` 只负责定位,operation 直接写 `ps``cmd``git` 或 fs helper。
+10
View File
@@ -2,6 +2,16 @@
UniDesk 的可观测性优先级高于静默成功。CLI、服务日志、Docker 日志和数据库状态都必须能通过短命令查询。
## 共享 Prometheus 指标面
- `config/platform-infra/observability.yaml` 同时拥有 Collector、Tempo 和 Prometheus 的 image、retention、storage、port、目标 `targetIds`、服务发现与查询预算;TypeScript 只校验和渲染。
- Prometheus 仅作用于 `metricsBackend.targetIds` 选中的 observability target;其他 target 的 plan 显示 `disabled-for-target`manifest、status probe/capture 和 `metrics-query` 均不访问 Prometheus。
- Prometheus 使用 Kubernetes 原生 pod 服务发现。YAML 通过结构化 `labelSelector.key/value` 声明稳定 label,并用 `prometheus.io/scrape=true``prometheus.io/path``prometheus.io/port` annotation 声明抓取;显式 path 优先,仅在 annotation 缺失时使用 `defaultPath`,不允许业务专属分支。
- `bun scripts/cli.ts platform-infra observability plan --target <NODE>` 展示 Prometheus enabled/disabled、Service、发现选择器和 manifest 摘要。
- `bun scripts/cli.ts platform-infra observability status --target <NODE>``validate` 将 Prometheus readiness 单列为 warning;不得改变业务 readiness 或交付成功结论。
- `bun scripts/cli.ts platform-infra observability metrics-query --target <NODE> --query <promql>` 只执行 YAML 预算约束的瞬时 PromQL 查询;默认有界,`--full` 展开结构,`--raw` 仅用于解析诊断。
- Collector + Tempo 继续是 trace authorityPrometheus 只承担 metrics,不成为第二业务状态库或交付门禁。
## Capability Boundary
版本、commit 和微服务契约漂移只属于可观测性信号。OTel、日志、diagnose 和 status 必须把它们投影为非阻塞 warning,并继续以真实业务结果为权威;不得把漂移告警升级为业务失败、admission blocker、readiness failure 或 CI/CD gate。完整边界见 [DevOps Hygiene](devops-hygiene.md#prohibited-deployment-truth)。
+1
View File
@@ -24,6 +24,7 @@
- 同 deliveryId 与同 payload 必须幂等,异 payload 返回 `409`。PVC 不可用或容量满返回 `503` 且 readiness=false。inbox worker 按 YAML 有界 backoff 自动重试并在重启后恢复 `accepted` / `processing`;Caddy 只对尚未持久化的请求做小于 10 秒的 body-safe 有界重试。
- Durable inbox 只是 webhook delivery 的持久接收与重试 journal,不是业务 source/ref 的第二份真相,也不得被 PaC、Tekton、GitOps、Argo 或 runtime 当作源码/read model。最终 source authority 仍只有 Gitea authority branch 与 immutable snapshot;禁止新增 polling/read-model fallback 或第二 source authority。
- 默认 PaC 入口是 `bun scripts/cli.ts platform-infra pipelines-as-code status|history --target <node>``status` 应显示 webhook、PipelineRun/TaskRun duration、image status、env identity、digest、GitOps commit、Argo revision 和 runtime provenance`history` 必须读取 target node 上的实时对象、显式报告 read error,并支持 consumer 与 PipelineRun id 下钻。`history --id` 必须通过运行面 provenance 与 PipelineRun prefix 唯一解析实际 consumer;零匹配、多匹配或显式 consumer 不一致都 fail-closed,不能回退到默认 consumer 或默认 node。
- 最新一次端到端耗时使用 `bun scripts/cli.ts platform-infra pipelines-as-code delivery-timing --target <node> --consumer <id>` 一次查询。命令从两份 owning YAML 解析 source repository、branch 与 consumer,按 PipelineRun source commit 关联 GitHub PR `mergedAt`,并投影 trigger wait、PipelineRun、端到端耗时、Argo/runtime closeout 与证据缺口;缺失关联时保持 `partial/unknown`,不得使用 commit 时间冒充 `mergedAt`,且始终 `mutation=false`
- Sentinel 内部 publish capability 由 `config/platform-infra/pipelines-as-code.yaml#capabilities.sentinelInternalPublish` 单一拥有,默认 `enabled=false`。Pod env、ownerReferences、ServiceAccount、label 与 annotation 不能证明 creator#1769 的 admission-owned provenance 与最小权限边界落地前不得启用。`.tekton` 继续走既有自动 `publish-current`,不能退化成人工 publish。
- PaC 观察必须把 PipelineRun 分类为外层 `outer-pac-event`、历史内层 `inner-deterministic-publish``unknown`。只有唯一外层 PaC push event 能驱动 latest、status、debug-step 与兼容 closeoutWeb sentinel 的 source、image、artifact、GitOps 步骤必须直接位于该 outer PipelineRun,禁止再创建 nested PipelineRun。历史内层运行只作为未绑定执行观察,缺少 admission-owned 父子证据时标记 `unproven`,禁止按名称前缀推断关系。
- CI/CD OTel endpoint、service/resource 属性、采样与 exporter timeout/failure policy 由 `config/platform-infra/pipelines-as-code.yaml` 引用现有 `config/platform-infra/observability.yaml` 并负责渲染。outer PaC 在最早可控 step 生成 W3C trace context,后续 source、image、artifact、GitOps 与 helper 复用同一 traceIdexport 失败或超时只输出 `warning=true``blocking=false` 的有界事件,不改变 PipelineRun、TaskRun 或业务 step 终态。