From 1ff8df65ffefbd2eaa9100374fbcfb7828fdb717 Mon Sep 17 00:00:00 2001 From: Agando Date: Fri, 23 Oct 2026 19:01:46 +0200 Subject: feat(newos4): on-demand worker labels and a server-canonical predictor store (v4.6.70) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Two decisions recorded by the operator on 2026-10-23, implemented. 6 โ€” spawn-on-demand is the design, so stop reporting it as a defect: - OrchestratorModule counts delegations inside delegateTask() - status prints "Mode: on-demand โ€” N/M worker(s) available, X delegation(s) this session" and drops the "spawning is not dispatching" warning - per-agent lines read "available, no delegations yet (spawned ...)" / "N delegation(s), last ..." 10 โ€” per-user, server file canonical, browser VFS a TTL'd read-through cache: - store = the user's own WebDAV space (/_data/predictor.json), so identity comes from credentials the app already has; no new endpoint, no unauthenticated write surface - 5 min TTL: cache wins while fresh, server wins when it differs; a banner naming both counts prints only on divergence - write-through on save (debounced 5 s) with a MKCOL retry when the collection does not exist yet; store mode is printed by predictor-status - the cache write is guarded and verified โ€” a missing /system/metrics made writeFile fail silently, which is how the first version lost a pull Verified live on v4.6.70 with a stubbed transport: pull applies 5 pts/5 paired and writes a stamped cache, the divergence banner fires once and not on the second (equal) pull, write-through PUT is issued, status reads "Store: server". A real WebDAV round-trip still needs the user's WebDAV config in-app; the agando space has no _data collection yet, so GET returns 404 -> "server (empty)". --- help.html | 4 +- main.html | 6 +- modules/core/core-bundle.js | 125 ++++++++++++++++++++++++++++++++++-- modules/core/module-loader.js | 2 +- modules/core/module-orchestrator.js | 18 ++++-- modules/core/module-predictor.js | 107 ++++++++++++++++++++++++++++++ 6 files changed, 245 insertions(+), 17 deletions(-) diff --git a/help.html b/help.html index 4de3a9c..8967db2 100644 --- a/help.html +++ b/help.html @@ -1689,13 +1689,15 @@ listmods

๐Ÿ“‹ Changelog

-
v4.6.57โ€“66 โ€” October 20262026-10-23
+
v4.6.57โ€“68 โ€” October 20262026-10-23
  • No shell โ€” and it now says so โ€” ;, && and || are refused with an explicit message instead of being folded into the command's argv (where wc -l f && grep -c x f returned a plausible wrong number). A | arriving from the AI run_command tool is refused too, because that path bypasses the pipe splitter and degraded the pattern to empty. Documented at the top of the command reference.
  • Multiple paths in wc โ€” wc -c a b printed only a and exited clean. It now prints one line per file plus a total, and reports each missing file separately.
  • ls prints text โ€” it rendered only clickable chips (DOM-only), so any capture โ€” the AI run_command tool, the diagnostics sweep โ€” saw an empty result and reported "directory empty".
  • view_module shows what is deployed โ€” it returned the _mods/<Class>.js edit cache first, unversioned, so after a rebuild it showed pre-fix source while the bundle was new. It now fetches the deployed file and prefixes the version; the cache is a labelled fallback.
  • load_skills searches tokens, not one phrase โ€” the query used to be tested whole against name+description+tags, so "telemetry dashboard" returned 0 while "telemetry" returned 1, and a sentence could never match. Skill bodies were never searched. It now tokenises (stopwords dropped), scores name > description/tags > body, weights by how many tokens matched, keeps a phrase bonus so word order cannot zero a real hit, and reports matchedTokens: 2/3 with each result.
  • +
  • On-demand workers, named as such โ€” orchestrator-status no longer reports a dispatch ratio as a defect: it prints Mode: on-demand โ€” N/M worker(s) available, X delegation(s) this session, counted inside delegateTask(). Spawn-on-demand is the design; a worker with nothing to do is healthy.
  • +
  • Predictor store: server canonical โ€” the file under the user's WebDAV space is authoritative; the browser copy is a 5-minute read-through cache written through on save. A banner appears only when the two disagree, naming both counts. No new endpoint and no unauthenticated write path was added.
  • grep, head and tail take several paths โ€” they read only the first path argument and exited clean on the rest, the same silent drop wc had. Multiple files now print file:line: text (grep) or ==> file <== (head/tail), and grep -c prints one count per file. tail -f stays single-file and says so.
  • An invalid grep pattern is an answer, not a crash โ€” it used to throw out of the command handler into the error ledger, which is the ledger that has to stay trustworthy. It now prints grep: invalid pattern: โ€ฆ and returns.
  • Agent status says what it means โ€” four agents showed sleeping with no way to tell "waiting for work" from "never handed a task". They now read parked โ€” NEVER SCHEDULED (0 tasks since โ€ฆ) or waiting for work (3 tasks, last โ€ฆ), plus a dispatch line and a warning when spawning happened but nothing was ever dispatched.
  • diff --git a/main.html b/main.html index 8a6ee5d..5107a40 100644 --- a/main.html +++ b/main.html @@ -1349,13 +1349,13 @@ - + - + - +