/** * v5.6 B2 added a load-pattern triple (loadPattern / survivesCompaction / * derivationConfidence) to each TOK hotspot. The frozen v5.0.0 byte-equal * baselines strip it before comparison so they still prove the ORIGINAL schema * is byte-identical; the new fields are purely additive. * * TOK hotspots ride along inside scan-orchestrator and posture payloads too * (`scanners[].hotspots`, `scannerEnvelope.scanners[].hotspots`), so this * strips every hotspots array reachable in a CLI payload / envelope. Mutates * in place and returns the payload for chaining inside a normalizer. * * @template T * @param {T} payload * @returns {T} */ export function stripHotspotLoadPattern(payload) { const drop = (arr) => { if (!Array.isArray(arr)) return; for (const h of arr) { delete h.loadPattern; delete h.survivesCompaction; delete h.derivationConfidence; } }; if (!payload || typeof payload !== 'object') return payload; drop(payload.hotspots); if (Array.isArray(payload.scanners)) { for (const s of payload.scanners) drop(s.hotspots); } if (payload.scannerEnvelope) { drop(payload.scannerEnvelope.hotspots); if (Array.isArray(payload.scannerEnvelope.scanners)) { for (const s of payload.scannerEnvelope.scanners) drop(s.hotspots); } } return payload; }