diff options
| author | Agando <roduccomm@gmail.com> | 2026-10-23 21:24:04 +0200 |
|---|---|---|
| committer | Agando <roduccomm@gmail.com> | 2026-10-23 21:24:04 +0200 |
| commit | a31cdb8f9186f3603583b5e3433d8f1cbf688e6a (patch) | |
| tree | 0f89b95fd076d602dfbb36b43d7ef79b3ff6caa9 | |
| parent | cdba58ccda05d10dd02f9dcb447f624377744b21 (diff) | |
fix(newos4): the audit stops inventing '999d unused' (v4.6.85)
getStaleSkills() returned daysUnused=999 for a skill that had useCount 0 and no lastUsed — a
placeholder rendered by the audit as '999d unused', indistinguishable from a measurement. It told
the operator to archive procedural memory that had simply never been instrumented.
Now: daysUnused null + neverUsed true when there is no lastUsed; real day count otherwise; the
audit prints '(never used)'.
Verified: probe skill with no telemetry -> {daysUnused: null, neverUsed: true}; one last used
2026-08-01 -> 83; no 999 anywhere in getStaleSkills() or the audit output.
| -rw-r--r-- | help.html | 15 | ||||
| -rw-r--r-- | main.html | 6 | ||||
| -rw-r--r-- | modules/core/core-bundle.js | 7 | ||||
| -rw-r--r-- | modules/core/module-loader.js | 2 | ||||
| -rw-r--r-- | modules/core/module-memory-graph.js | 7 | ||||
| -rw-r--r-- | modules/ext/skill-pack-core.js | 4 |
6 files changed, 32 insertions, 9 deletions
@@ -1689,6 +1689,21 @@ listmods</pre> <h2>📋 Changelog</h2> <div class="version-item"> + <div class="v-header"><span class="v-num">v4.6.85 — October 2026</span> + <span class="v-date">no invented numbers</span></div> + <ul> + <li><strong>"999d unused" was a placeholder, printed as if measured.</strong> A skill with no + usage telemetry got <code>daysUnused = 999</code>, so the audit listed it as unused for + nearly three years — a fabricated figure that invited archiving good skills. It now + separates the two real cases: <code>(never used)</code> when there is no + <code>lastUsed</code> at all, and a genuine day count otherwise.</li> + <li><strong>The audit already distinguished untracked skills.</strong> 24 skills with no + telemetry are reported as <em>untracked</em>, not stale — the sentinel was the one place + that still pretended to know.</li> + </ul> + </div> + + <div class="version-item"> <div class="v-header"><span class="v-num">v4.6.83–84 — October 2026</span> <span class="v-date">world_model_query</span></div> <ul> @@ -1349,13 +1349,13 @@ </script> <!-- v4.5.63: A2A scratchpad fixes + agent-register arg fix --> -<script src="modules/core/core-bundle.js?v=v4.6.84"></script> +<script src="modules/core/core-bundle.js?v=v4.6.85"></script> <!-- Async dependency-ordered module loader now only initializes terminal and loads optional ext modules --> -<script src="modules/core/module-loader.js?v=v4.6.84"></script> +<script src="modules/core/module-loader.js?v=v4.6.85"></script> <!-- Critical ext bundle loads AFTER webx11 exists so registerModule calls work --> -<script src="modules/ext/critical-ext-bundle.js?v=v4.6.84"></script> +<script src="modules/ext/critical-ext-bundle.js?v=v4.6.85"></script> <script> // ═══ ONE TRUE VERSION SOURCE ═══ diff --git a/modules/core/core-bundle.js b/modules/core/core-bundle.js index 0b2795a..c8a4c2e 100644 --- a/modules/core/core-bundle.js +++ b/modules/core/core-bundle.js @@ -17912,8 +17912,11 @@ class MemoryGraphModule { var useCount = stats.useCount || 0; var lastUsed = stats.lastUsed ? new Date(stats.lastUsed).getTime() : 0; if (useCount === 0 && (now - lastUsed > staleThreshold || lastUsed === 0)) { - var daysUnused = lastUsed > 0 ? Math.floor((now - lastUsed) / 86400000) : 999; - stale.push({ name: name, daysUnused: daysUnused }); + // v4.6.85: never fabricate a measurement. A skill with useCount 0 and no + // lastUsed has NEVER been used — reporting it as "999d unused" invented a + // number that then appeared in the audit as if it had been observed. + var daysUnused = lastUsed > 0 ? Math.floor((now - lastUsed) / 86400000) : null; + stale.push({ name: name, daysUnused: daysUnused, neverUsed: lastUsed === 0 }); } } this._untrackedSkills = untracked; diff --git a/modules/core/module-loader.js b/modules/core/module-loader.js index 9a373a6..1b0f6d9 100644 --- a/modules/core/module-loader.js +++ b/modules/core/module-loader.js @@ -4,7 +4,7 @@ // Core module bundle loaded synchronously in main.html. // This loader only handles version cache-busting, splash, terminal init, and optional ext modules. - const LATEST_VER = 'v4.6.84'; + const LATEST_VER = 'v4.6.85'; const CACHE = '?v=' + LATEST_VER; const stored = localStorage.getItem('webx11_cache_ver'); if (stored !== LATEST_VER) { diff --git a/modules/core/module-memory-graph.js b/modules/core/module-memory-graph.js index 093d2e4..1cb0919 100644 --- a/modules/core/module-memory-graph.js +++ b/modules/core/module-memory-graph.js @@ -482,8 +482,11 @@ class MemoryGraphModule { var useCount = stats.useCount || 0; var lastUsed = stats.lastUsed ? new Date(stats.lastUsed).getTime() : 0; if (useCount === 0 && (now - lastUsed > staleThreshold || lastUsed === 0)) { - var daysUnused = lastUsed > 0 ? Math.floor((now - lastUsed) / 86400000) : 999; - stale.push({ name: name, daysUnused: daysUnused }); + // v4.6.85: never fabricate a measurement. A skill with useCount 0 and no + // lastUsed has NEVER been used — reporting it as "999d unused" invented a + // number that then appeared in the audit as if it had been observed. + var daysUnused = lastUsed > 0 ? Math.floor((now - lastUsed) / 86400000) : null; + stale.push({ name: name, daysUnused: daysUnused, neverUsed: lastUsed === 0 }); } } this._untrackedSkills = untracked; diff --git a/modules/ext/skill-pack-core.js b/modules/ext/skill-pack-core.js index 67adf80..cba77b6 100644 --- a/modules/ext/skill-pack-core.js +++ b/modules/ext/skill-pack-core.js @@ -1206,7 +1206,9 @@ after the behaviour itself was fixed in v4.6.58.`), } for (var s of staleSkills) { if (!index[s.name] || index[s.name].immune) continue; - stale.push(s.name + ' (' + s.daysUnused + 'd unused)'); + stale.push(s.name + (s.daysUnused === null || s.daysUnused === undefined + ? ' (never used)' + : ' (' + s.daysUnused + 'd unused)')); } // 2. Duplicate check (simple Levenshtein on name) |