From 6c9d0eef11f52970206402e979ad2decbc74fae6 Mon Sep 17 00:00:00 2001 From: Paul Trowbridge Date: Thu, 17 Sep 2026 14:40:22 -0400 Subject: [PATCH] Actually instrument the ordering sync MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The earlier attempt at this never landed: its patch failed an assertion, and I read a `grep -c "pf-order"` of 1 as confirmation when that count is just the logger's own template literal — every call site was missing. So the function was reached, returned silently, and reported nothing, twice over. Logs on entry, the inputs it resolved, the expressions already in the saved config, and each exit. Verified against the source and against the individual strings in the built bundle rather than a count. Co-Authored-By: Claude Opus 5 (1M context) --- ui/src/views/Forecast.jsx | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/ui/src/views/Forecast.jsx b/ui/src/views/Forecast.jsx index 59e8d0f..1530b5c 100644 --- a/ui/src/views/Forecast.jsx +++ b/ui/src/views/Forecast.jsx @@ -933,12 +933,24 @@ export default function Forecast({ sources = [], sourceId, versions = [], versio } async function syncOrderExpressions() { + dbgOrder('enter') const viewer = viewerRef.current - if (!viewer) return + if (!viewer) { dbgOrder('exit: no viewer'); return } const version = versions.find(v => String(v.id) === String(versionId)) const wanted = buildOrderExpressions(version?.bucket_order, logMeta) + dbgOrder('inputs', { + versionId, + versionFound: !!version, + bucket_order: version?.bucket_order ?? null, + logMetaCount: Object.keys(logMeta || {}).length, + seqs: Object.entries(logMeta || {}) + .filter(([, m]) => m.seq != null) + .map(([id, m]) => `${id}=${m.seq}`), + wanted: Object.keys(wanted), + }) const { table: _t, ...cfg } = await viewer.save() + dbgOrder('saved config read', { existing: Object.keys(cfg.expressions || {}) }) const current = cfg.expressions || {} const managed = Object.values(ORDER_EXPR_NAMES) @@ -958,8 +970,10 @@ export default function Forecast({ sources = [], sourceId, versions = [], versio .map(([id, m]) => `${id}:${m.tag || m.note}=${m.seq}`), }) } + else dbgOrder('exit: already applied', Object.keys(next)) return } + dbgOrder('applying', Object.keys(next)) // An expression the pivot is using cannot simply vanish; drop it from the // axes first or restore() rejects the config.