mirror of
https://github.com/Studio-Saelix/sencho.git
synced 2026-08-22 08:06:42 +00:00
fix: reconcile sticky update indicators with Anatomy preview (#1698)
* fix: reconcile sticky update indicators with Anatomy preview Sidebar, Updates filter, and Fleet treated retained partial/failed scanner has_update as confirmed. Keep raw state for retention/notifications, project confirmed-only to APIs, show distinct incomplete indicators, and clear sticky rows only after an authoritative-negative preview. Closes #1685 * test: align sidebar truncate E2E with failed-over-retained precedence Purple update indicators are confirmed-only; hasUpdate with a failed check correctly shows the failed trailing icon. * fix: clear confirmed update rows on authoritative-negative preview Address audit SF-1/SF-2/SF-3: observation-watermark clears for older ok+has_update rows (DB + memory gens), Fleet checkability parity with backend not_checkable, and Updates chip confirmed-only regressions. * fix: tombstone equal-generation writers on preview clear Advance the per-stack write generation when clearing at the observation watermark so a scanner reserved before preview cannot recreate the row after an authoritative-negative reconcile. * fix: clear sticky updates with digest and tag preview parity Share detection across scanner and preview, keep GET read-only with POST reconcile, gate Apply to digest and rebuild updates, and invalidate the hub fleet cache on clear. * test: set digestUpdate on auto-update checkImage mocks Scheduler and execute routes now gate Compose on digest drift; fixtures that expect an apply need digestUpdate so they exercise the update path. * fix: clear unused lint errors on sticky update branch Drop unused partial helper and fleet invalidate import; keep the CacheService inflight self-ref as let with an eslint exception so tsc stays green. * fix: use inflight holder for CacheService prefer-const Keep generation-aware ownership without a let self-reference that fights ESLint and tsc.
This commit is contained in:
@@ -63,3 +63,36 @@ export interface StackUpdateInfo {
|
||||
/** Per-service breakdown; absent when the stack has no persisted per-service data yet. */
|
||||
services?: StackServiceUpdateStatus[];
|
||||
}
|
||||
|
||||
/**
|
||||
* Confirmed update for sidebar / Updates filter / dashboard / Fleet.
|
||||
* Missing checkStatus is treated as 'ok' for older-node /detail fallbacks.
|
||||
* Partial or failed rows with hasUpdate=true are NOT confirmed.
|
||||
*/
|
||||
export function isConfirmedImageUpdate(info: { hasUpdate: boolean; checkStatus?: CheckStatus }): boolean {
|
||||
return info.hasUpdate && (info.checkStatus ?? 'ok') === 'ok';
|
||||
}
|
||||
|
||||
/** Confirmed per-service update for editor Update badges. */
|
||||
export function isConfirmedServiceUpdate(info: {
|
||||
hasUpdate: boolean;
|
||||
checkStatus?: ServiceCheckStatus;
|
||||
}): boolean {
|
||||
return info.hasUpdate && (info.checkStatus ?? 'ok') === 'ok';
|
||||
}
|
||||
|
||||
/**
|
||||
* True when a live update-preview is safe to treat as "no update" for Fleet
|
||||
* card drops and similar UI reconcile. Mirrors backend
|
||||
* UpdatePreviewService.isAuthoritativeNegativePreview: every image must be
|
||||
* explicitly ok, and !has_update. Empty / mixed not_checkable previews never clear.
|
||||
*/
|
||||
export function isAuthoritativeNegativePreview(preview: {
|
||||
images: Array<{ check_status?: string | null }>;
|
||||
summary: { has_update: boolean; check_status?: string | null };
|
||||
} | null | undefined): boolean {
|
||||
if (!preview) return false;
|
||||
return preview.images.length > 0
|
||||
&& preview.images.every((i) => i.check_status === 'ok')
|
||||
&& preview.summary.has_update === false;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user