aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAgando <roduccomm@gmail.com>2026-10-23 21:24:04 +0200
committerAgando <roduccomm@gmail.com>2026-10-23 21:24:04 +0200
commit0090606421e32bc492f81f1c533bce9a41845a20 (patch)
treeacd872fa05c7425c426799068bb5773351f891f2
parent70d7da9dc07f19661a74b19157473de86819e4eb (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.html15
-rw-r--r--main.html6
-rw-r--r--modules/core/core-bundle.js7
-rw-r--r--modules/core/module-loader.js2
-rw-r--r--modules/core/module-memory-graph.js7
-rw-r--r--modules/ext/skill-pack-core.js4
6 files changed, 32 insertions, 9 deletions
diff --git a/help.html b/help.html
index 5bf3543..9b39849 100644
--- a/help.html
+++ b/help.html
@@ -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>
diff --git a/main.html b/main.html
index 41a7c82..a8586ce 100644
--- a/main.html
+++ b/main.html
@@ -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)