fix: bound PaC history JSON summaries

This commit is contained in:
pikastech
2026-07-20 20:01:16 +02:00
parent 690507b25d
commit 8e01c98d03
2 changed files with 61 additions and 47 deletions
+3
View File
@@ -295,6 +295,9 @@ bun scripts/cli.ts hwlab nodes control-plane legacy-cicd --help
- 镜像构建、manifest/digest 和 push 仍可阻塞;
- registry cache export 必须使用 BuildKit 原生 `ignore-error=true` 或等价非阻塞配置,禁止在镜像已成功发布后仅因 cache 写入抖动把 TaskRun 判失败。
- PaC `status|closeout|history``--json` 是有界 machine contract`--full` 展开单条详情,`--raw` 才展开目标侧原始 payload。`history --id --full` 不得重复嵌套同一 rows/consumer payload或依赖 `/tmp/unidesk-cli-output` 才可读。
- `history --json` 默认 list 只保留 run id、consumer、时间、终态、耗时、完整 source commit、delivery class/owner、env reuse、trace、首断点、typed error、读取 observation、warning 和只读 next
- source observation、classification、artifact、collector 与 TaskRun 详情只进入 `--id` 精确下钻或显式 `--full|--raw`
- 默认 JSON 超过输出预算并退化成 `outputTruncated` 时,优先继续收紧 projector,不要求操作者使用临时 dump。
- PaC `status` 必须在 `observability.readOnlyCapture.timeoutMs` 内完成:
- 目标侧通过 `pac-status-progress` 披露最后阶段,CLI 将其投影为 `observation.remoteStage`
- PipelineRun 按 YAML 选中的 Repository CR label 做服务端 selectorTaskRun 与 Argo 原始对象各只读取一次并复用,禁止 status 为同一 run 串行读取每个 Pod 日志或重复读取 Argo;
+58 -47
View File
@@ -2883,6 +2883,8 @@ function compactCloseoutJson(result: Record<string, unknown>): Record<string, un
export function compactHistoryJson(result: Record<string, unknown>, includeTaskDetails = false): Record<string, unknown> {
const detailRequested = stringValue(result.detailId) !== "-";
const deliveryBudget = record(result.deliveryBudget);
const deliveryBudgetPolicy = record(deliveryBudget.policy);
return {
ok: result.ok === true,
action: result.action,
@@ -2891,7 +2893,13 @@ export function compactHistoryJson(result: Record<string, unknown>, includeTaskD
config: result.config,
consumers: result.consumers,
detailId: result.detailId,
deliveryBudget: result.deliveryBudget,
deliveryBudget: {
state: deliveryBudget.state,
policy: { endToEndBudgetSeconds: deliveryBudgetPolicy.endToEndBudgetSeconds },
exactCommand: deliveryBudget.exactCommand,
blocking: deliveryBudget.blocking,
mutation: false,
},
observation: result.observation,
rows: arrayRecords(result.rows).map((row) => {
const taskRuns = record(row.taskRuns);
@@ -2901,67 +2909,70 @@ export function compactHistoryJson(result: Record<string, unknown>, includeTaskD
return {
id: row.id ?? row.pipelineRun,
consumer: row.consumer,
repo: row.repo,
pipeline: row.pipeline,
triggeredAt: row.triggeredAt,
startTime: row.startTime,
completionTime: row.completionTime,
displayTime: row.displayTime,
displayTimeZone: row.displayTimeZone,
durationSeconds: row.durationSeconds,
status: row.status,
reason: row.reason,
commit: row.commit,
branch: row.branch,
deliveryClass: row.deliveryClass,
deliveryAuthorityEligible: row.deliveryAuthorityEligible === true,
deliveryOwner: row.deliveryOwner,
parentRelation: row.parentRelation,
classification: row.classification,
executionOwner: row.executionOwner,
envReuse: row.envReuse,
sourceObservation: row.sourceObservation,
traceId: row.traceId,
firstBreak: row.firstBreak,
error: row.error,
artifact: detailRequested ? {
imageStatus: artifact.imageStatus,
envReuse: artifact.envReuse,
digest: artifact.digest,
digests: artifact.digests,
gitopsCommit: artifact.gitopsCommit,
sourceCommit: artifact.sourceCommit,
action: artifact.action,
reason: artifact.reason,
catalog: {
present: catalog.present === true,
status: catalog.status,
sourceCommit: catalog.sourceCommit,
registryVerified: catalog.registryVerified === true,
publishedCount: catalog.publishedCount,
reusedCount: catalog.reusedCount,
requiredServiceCount: catalog.requiredServiceCount,
digestCount: catalog.digestCount,
source: catalog.source,
...(detailRequested ? {
repo: row.repo,
pipeline: row.pipeline,
startTime: row.startTime,
completionTime: row.completionTime,
branch: row.branch,
deliveryAuthorityEligible: row.deliveryAuthorityEligible === true,
parentRelation: row.parentRelation,
classification: row.classification,
sourceObservation: row.sourceObservation,
artifact: {
imageStatus: artifact.imageStatus,
envReuse: artifact.envReuse,
digest: artifact.digest,
digests: artifact.digests,
gitopsCommit: artifact.gitopsCommit,
sourceCommit: artifact.sourceCommit,
action: artifact.action,
reason: artifact.reason,
catalog: {
present: catalog.present === true,
status: catalog.status,
sourceCommit: catalog.sourceCommit,
registryVerified: catalog.registryVerified === true,
publishedCount: catalog.publishedCount,
reusedCount: catalog.reusedCount,
requiredServiceCount: catalog.requiredServiceCount,
digestCount: catalog.digestCount,
source: catalog.source,
valuesPrinted: false,
},
valuesPrinted: false,
},
valuesPrinted: false,
} : undefined,
collector: detailRequested ? {
mode: collector.mode,
matchingTaskCount: collector.matchingTaskCount,
contractTaskCount: collector.contractTaskCount,
terminalRecordCount: collector.terminalRecordCount,
logErrorCount: collector.logErrorCount,
logErrors: collector.logErrors,
valuesPrinted: false,
} : undefined,
taskRuns: {
count: taskRuns.count,
longest: taskRuns.longest,
failed: taskRuns.failed,
details: includeTaskDetails ? taskRuns.details : undefined,
logsCommand: taskRuns.logsCommand,
},
collector: {
mode: collector.mode,
matchingTaskCount: collector.matchingTaskCount,
contractTaskCount: collector.contractTaskCount,
terminalRecordCount: collector.terminalRecordCount,
logErrorCount: collector.logErrorCount,
logErrors: collector.logErrors,
valuesPrinted: false,
},
taskRuns: {
count: taskRuns.count,
longest: taskRuns.longest,
failed: taskRuns.failed,
details: includeTaskDetails ? taskRuns.details : undefined,
logsCommand: taskRuns.logsCommand,
},
} : {}),
};
}),
historyErrors: result.historyErrors,