fix: keep all follower status compact

This commit is contained in:
Codex
2026-07-03 19:18:25 +00:00
parent e2810d02d7
commit 419f4502ee
2 changed files with 8 additions and 4 deletions
@@ -42,6 +42,8 @@ Target-side state summaries used by `status`, `events`, `logs` and `debug-step s
Follower-scoped commands such as `status --follower`, `events --follower`, `logs --follower` and `debug-step --follower` must ask the target summary helper for only that follower's state. Do not fetch every follower and filter locally at the operator side; multi-follower summaries have different size budgets and should use lower per-follower stage limits. Follower-scoped commands such as `status --follower`, `events --follower`, `logs --follower` and `debug-step --follower` must ask the target summary helper for only that follower's state. Do not fetch every follower and filter locally at the operator side; multi-follower summaries have different size budgets and should use lower per-follower stage limits.
Multi-follower status summaries should omit per-follower `command.payload`/native drill-down payloads entirely; those belong to follower-scoped `events`/`logs`/`debug-step` queries. Default all-follower status must remain parseable below the transport stdout limit.
`scripts/src/cicd.ts` should stay a thin branch-follower route/orchestration entry, not a catch-all implementation file. Rendering, debug steps, controller manifests, native K8s helpers, adapter-specific trigger/status logic and large data compactors must live in responsibility-specific modules before `cicd.ts` approaches the 3000-line hard split point. `scripts/src/cicd.ts` should stay a thin branch-follower route/orchestration entry, not a catch-all implementation file. Rendering, debug steps, controller manifests, native K8s helpers, adapter-specific trigger/status logic and large data compactors must live in responsibility-specific modules before `cicd.ts` approaches the 3000-line hard split point.
`status-read`, `events`, `logs` and debug summaries must expose compact closeout gate details when a follower is not aligned: git-mirror readiness, Tekton PipelineRun condition, Argo sync/health, runtime target sha/readiness and short errors. Repeating only phase/observed/target/message is a visibility defect and must be fixed before further rollout tuning. `status-read`, `events`, `logs` and debug summaries must expose compact closeout gate details when a follower is not aligned: git-mirror readiness, Tekton PipelineRun condition, Argo sync/health, runtime target sha/readiness and short errors. Repeating only phase/observed/target/message is a visibility defect and must be fixed before further rollout tuning.
+6 -4
View File
@@ -71,7 +71,7 @@ function readConfigMapViaKubectl() {
} }
} }
function compactStateText(text) { function compactStateText(text, includeCommand) {
if (typeof text !== "string" || text.length === 0) return null; if (typeof text !== "string" || text.length === 0) return null;
let state; let state;
try { try {
@@ -79,7 +79,7 @@ function compactStateText(text) {
} catch { } catch {
return null; return null;
} }
return { const compact = {
id: stringOrNull(state.id), id: stringOrNull(state.id),
adapter: stringOrNull(state.adapter), adapter: stringOrNull(state.adapter),
enabled: state.enabled === true, enabled: state.enabled === true,
@@ -97,8 +97,9 @@ function compactStateText(text) {
timings: compactTimings(state.timings), timings: compactTimings(state.timings),
warnings: arrayStrings(state.warnings).slice(0, 6), warnings: arrayStrings(state.warnings).slice(0, 6),
stateFormat: stringOrNull(state.stateFormat), stateFormat: stringOrNull(state.stateFormat),
command: compactCommand(state.command),
}; };
if (includeCommand) compact.command = compactCommand(state.command);
return compact;
} }
function compactCommand(command) { function compactCommand(command) {
@@ -335,11 +336,12 @@ const valueBytes = {};
if (result.ok && result.present) { if (result.ok && result.present) {
const data = recordOrNull(result.object?.data) || {}; const data = recordOrNull(result.object?.data) || {};
const includeCommand = followerIds.length === 1;
for (const id of followerIds) { for (const id of followerIds) {
const text = typeof data[id] === "string" ? data[id] : ""; const text = typeof data[id] === "string" ? data[id] : "";
if (text.length === 0) continue; if (text.length === 0) continue;
valueBytes[id] = Buffer.byteLength(text, "utf8"); valueBytes[id] = Buffer.byteLength(text, "utf8");
const compact = compactStateText(text); const compact = compactStateText(text, includeCommand);
if (compact === null) errors.push(`${id}: invalid state json`); if (compact === null) errors.push(`${id}: invalid state json`);
else stateByFollower[id] = compact; else stateByFollower[id] = compact;
} }