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:
@@ -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 reference:review-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-only:11 项通过,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。
|
||||
|
||||
## 证据
|
||||
|
||||
- Issue:https://github.com/pikasTech/unidesk/issues/1977
|
||||
- PR:https://github.com/pikainc/pikaoa/pull/1
|
||||
- 实现提交:https://github.com/pikainc/pikaoa/commit/40ae8ae5836ccafbaf78c09d8f98463c45365e7d
|
||||
- 合并提交:https://github.com/pikainc/pikaoa/commit/042bf34
|
||||
- Artificer post-task:https://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 的登录、固定角色和基础接口鉴权。
|
||||
|
||||
## 交付证据
|
||||
|
||||
- Issue:https://github.com/pikasTech/unidesk/issues/1984
|
||||
- PR:https://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 pass,0 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` 选中的 target,OTel Collector 与 Tempo 继续承担 trace authority;指标故障和版本漂移只形成非阻塞 warning。
|
||||
|
||||
## 变更
|
||||
|
||||
- `config/platform-infra/observability.yaml` 拥有 Prometheus image、目标、存储、保留、端口、服务发现和查询预算。
|
||||
- NC01 渲染 ServiceAccount、RBAC、ConfigMap、PVC、Deployment 与 ClusterIP Service;D518/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 pass,0 fail,100 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 返回码为 0,stdout 为 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 pass,0 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 当成写入后事实。
|
||||
|
||||
## 交付
|
||||
|
||||
- 子 issue:pikasTech/unidesk#1958。
|
||||
- PR:pikasTech/unidesk#1960。
|
||||
- merge commit:`34f1f9339168b518ca1f706cc7bc44880924171d`。
|
||||
- 变更:`scripts/src/platform-db.ts`、`docs/reference/cli.md`。
|
||||
|
||||
## 验证
|
||||
|
||||
- 真实配置:status 4264 bytes,export dry-run 2679 bytes,plan 9589 bytes,均未截断。
|
||||
- 扩展规模:48 个 role/database/Secret、50 个 export 时,status 7589 bytes,export 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 wait:7 秒
|
||||
- PipelineRun:182 秒
|
||||
- 端到端:189 秒
|
||||
- TaskRun:181 秒
|
||||
- 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)。
|
||||
|
||||
@@ -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.json,CI/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 development,release 固定为 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 publicExposure;release 只从完成 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 保持开发 consumer,release 精确驱动独立生产 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)。
|
||||
|
||||
@@ -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 公网 endpoint,DNS alias 不作为 `sslmode=require` 切库 blocker,PK01 规则见 `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` 区分写入前观察与写入后 presence,fingerprint 不披露 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 公网 endpoint,DNS alias 不作为 `sslmode=require` 切库 blocker,PK01 规则见 `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。
|
||||
|
||||
@@ -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 authority;Prometheus 只承担 metrics,不成为第二业务状态库或交付门禁。
|
||||
|
||||
## Capability Boundary
|
||||
|
||||
版本、commit 和微服务契约漂移只属于可观测性信号。OTel、日志、diagnose 和 status 必须把它们投影为非阻塞 warning,并继续以真实业务结果为权威;不得把漂移告警升级为业务失败、admission blocker、readiness failure 或 CI/CD gate。完整边界见 [DevOps Hygiene](devops-hygiene.md#prohibited-deployment-truth)。
|
||||
|
||||
@@ -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 与兼容 closeout;Web 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 复用同一 traceId;export 失败或超时只输出 `warning=true`、`blocking=false` 的有界事件,不改变 PipelineRun、TaskRun 或业务 step 终态。
|
||||
|
||||
Reference in New Issue
Block a user