<feed xmlns='http://www.w3.org/2005/Atom'>
<title>newos4/modules/ext/skill-pack-core.js, branch main</title>
<subtitle>newOS4 - the browser terminal that runs WebX11 user spaces</subtitle>
<id>https://newos.webx11.duckdns.org/newos4/atom?h=main</id>
<link rel='self' href='https://newos.webx11.duckdns.org/newos4/atom?h=main'/>
<link rel='alternate' type='text/html' href='https://newos.webx11.duckdns.org/newos4/'/>
<updated>2026-10-27T13:59:06+00:00</updated>
<entry>
<title>fix(newos4): bound one turn's tool context, honest skill-create, quarantine a corrupt memory graph</title>
<updated>2026-10-27T13:59:06+00:00</updated>
<author>
<name>Agando</name>
<email>roduccomm@gmail.com</email>
</author>
<published>2026-10-27T13:59:06+00:00</published>
<link rel='alternate' type='text/html' href='https://newos.webx11.duckdns.org/newos4/commit/?id=7c0b308358d1721ad687b37dd0348c072d1d2ada'/>
<id>urn:sha1:7c0b308358d1721ad687b37dd0348c072d1d2ada</id>
<content type='text'>
The three items the last review and probes left open, each with a test that is red on HEAD.

- MAINT-023 (module-aiassist.js): one agentic turn grew without limit — every role:'tool' body
  was pushed verbatim and only this.context was trimmed BETWEEN turns (measured 6 -&gt; 112 705
  tokens across 8 model calls against maxContextTokens 12 000). Observations are now clipped to
  maxToolResultChars (6 000) with a note saying how much was withheld and to re-read with
  offset/limit, and _boundToolContext() elides the oldest tool bodies once the running total
  passes toolContextBudgetChars (24 000), always keeping the newest 4 verbatim. The ceiling is
  turn-independent: the same ~26 k chars at 8 turns and at 20.
- MAINT-024 (modules/ext/skill-pack-core.js): the command printed "✅ Skill created" with
  fs.writeFile()'s boolean discarded (probe: fresh VFS, success printed, no file), stripped
  invalid characters instead of rejecting the name (My-Skill -&gt; y-kill, DevOps_Thing -&gt;
  evpshing), and treated an unreadable /path argument as the skill body. Now: kebab-case is
  validated (uppercase normalises and the final name is reported; anything else is refused),
  /skills is created on first use, the write and index results are checked, and an unreadable
  body path is an error.
- MAINT-003 (module-memory-graph.js): a corrupt store looked exactly like a fresh install —
  fsReadJSON returns null on a parse failure, so 85 nodes could vanish with no warning and no
  copy. The probe confirmed the loss: seed 6 nodes, truncate nodes.json and export.json, reload
  -&gt; 1 node, no message, nothing in .trash. _quarantineCorrupt() now keeps the unreadable file
  as &lt;name&gt;.corrupt, warns, and then loads from whatever remains.

Tests: test-tool-context-bound.js (11), test-skill-create.js (16), test-memory-graph-recovery.js
(8). RED on HEAD: tool-context crashes on _clipToolResult (exit 1), skill-create 16 assertions
fail on the missing file/index, memory-graph B1/B2/C1 fail (no warning, no .corrupt copy).
Suite now 13/13 files green; maintain --fix reports "node tests 13/13 pass".
Live on v4.6.107: skill-create My-Skill -&gt; ✅ "my-skill"; DevOps_Thing -&gt; Invalid skill name;
/does/not/exist.md -&gt; Cannot read skill body; only my-skill in the index.
</content>
</entry>
<entry>
<title>fix(newos4): audit names broken refs instead of counting documentation (v4.6.86-87)</title>
<updated>2026-10-23T19:32:41+00:00</updated>
<author>
<name>Agando</name>
<email>roduccomm@gmail.com</email>
</author>
<published>2026-10-23T19:32:41+00:00</published>
<link rel='alternate' type='text/html' href='https://newos.webx11.duckdns.org/newos4/commit/?id=fcee056449e500941ea1ee00db66b0fd7d9d3f44'/>
<id>urn:sha1:fcee056449e500941ea1ee00db66b0fd7d9d3f44</id>
<content type='text'>
The reference checker ran /skill-view \S+/ over every skill's prose, so 'skill-view &lt;name&gt;' and a
quoted example in skills-system-guide were counted as missing skills: 'Broken refs: 2' with no
names, both phantom. Placeholders and quoted names are now ignored (trailing punctuation stripped
first), and the survivors are listed in the audit line and in the suggestion.

Verified: clean tree -&gt; Broken refs: 0. A probe skill referencing 'ghost-skill' -&gt; Broken refs: 1
(probe-broken-ref → ghost-skill), while '&lt;name&gt;.' and '"module-management"' in the same file are
ignored.
</content>
</entry>
<entry>
<title>fix(newos4): the audit stops inventing '999d unused' (v4.6.85)</title>
<updated>2026-10-23T19:24:04+00:00</updated>
<author>
<name>Agando</name>
<email>roduccomm@gmail.com</email>
</author>
<published>2026-10-23T19:24:04+00:00</published>
<link rel='alternate' type='text/html' href='https://newos.webx11.duckdns.org/newos4/commit/?id=0090606421e32bc492f81f1c533bce9a41845a20'/>
<id>urn:sha1:0090606421e32bc492f81f1c533bce9a41845a20</id>
<content type='text'>
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 -&gt; {daysUnused: null, neverUsed: true}; one last used
2026-08-01 -&gt; 83; no 999 anywhere in getStaleSkills() or the audit output.
</content>
</entry>
<entry>
<title>fix(newos4): skill-create stops mangling what the agent wrote (v4.6.82)</title>
<updated>2026-10-23T19:20:19+00:00</updated>
<author>
<name>Agando</name>
<email>roduccomm@gmail.com</email>
</author>
<published>2026-10-23T19:20:19+00:00</published>
<link rel='alternate' type='text/html' href='https://newos.webx11.duckdns.org/newos4/commit/?id=20afa4faf03d863fa796e9edfbb555d3355d5fa2'/>
<id>urn:sha1:20afa4faf03d863fa796e9edfbb555d3355d5fa2</id>
<content type='text'>
Two defects in one parser, both silent:
- content = args.slice(2).join(' ') destroyed every newline, so markdown arrived as one line
- the last argument was treated as tags whenever it contained a comma, and stayed in the body:
  a multi-line skill became a single line with ~13 bogus tags, reported as success

Bodies can now be read from a VFS path (the only way markdown survives an argv splitter),
tags are opt-in via --tags=, category via --category=. skill-patch takes a path too.

Verified: body from file -&gt; 6 newlines preserved, tags [alpha,beta], category testing;
inline body containing four commas -&gt; tags [], body intact.
</content>
</entry>
<entry>
<title>fix(newos4): skill points at the served contract URL, not a VFS path (v4.6.75)</title>
<updated>2026-10-23T18:09:15+00:00</updated>
<author>
<name>Agando</name>
<email>roduccomm@gmail.com</email>
</author>
<published>2026-10-23T18:09:15+00:00</published>
<link rel='alternate' type='text/html' href='https://newos.webx11.duckdns.org/newos4/commit/?id=492cbe7c24bc84b4f541235e62adce19fc690e35'/>
<id>urn:sha1:492cbe7c24bc84b4f541235e62adce19fc690e35</id>
<content type='text'>
The OS4 agent reported the skill cites /_docs/chat-contract.md, which does not exist in its
VFS — correct: the file lives on the host and is served over HTTP. Browser VFS and disk are
two stores, so a path-only pointer is a dead end. Now names the URL.
</content>
</entry>
<entry>
<title>docs(newos4): seed a chatting-with-hermes skill (v4.6.74)</title>
<updated>2026-10-23T17:52:28+00:00</updated>
<author>
<name>Agando</name>
<email>roduccomm@gmail.com</email>
</author>
<published>2026-10-23T17:52:28+00:00</published>
<link rel='alternate' type='text/html' href='https://newos.webx11.duckdns.org/newos4/commit/?id=ec6ca5490edc48afc57187c28e3532336e7619bc'/>
<id>urn:sha1:ec6ca5490edc48afc57187c28e3532336e7619bc</id>
<content type='text'>
A command that exists but is undocumented might as well not exist: the agent had no way to
learn that `hermes` exists, that `chat` is taken, that replies are asynchronous, or that
the cursor is milliseconds. Skill covers the commands, the chat_hermes tool, the failure
table (401/413/429/503/507), the rules that keep it useful, and how to verify a send.

Seeded from skill-pack-core._buildSkills() so every fresh session gets it; mirrored to
skills/chatting-with-hermes.{md,json} + index.json (19 entries).
</content>
</entry>
<entry>
<title>docs(newos4): merge the two shell-composition skills into one seeded skill (v4.6.65)</title>
<updated>2026-10-23T16:27:26+00:00</updated>
<author>
<name>Agando</name>
<email>roduccomm@gmail.com</email>
</author>
<published>2026-10-23T16:27:26+00:00</published>
<link rel='alternate' type='text/html' href='https://newos.webx11.duckdns.org/newos4/commit/?id=e74b3b1d8569c981cc34f1d5078fd19e8de98338'/>
<id>urn:sha1:e74b3b1d8569c981cc34f1d5078fd19e8de98338</id>
<content type='text'>
Packet 9. `terminal-commands-silently-failing` and `command-composition-rules` described
the same bug family from two angles, and since v4.6.58 both were describing behaviour
that is now refused outright.

- new seeded skill `command-composition-rules` in skill-pack-core's _buildSkills():
  the rule, why the refusal exists (with the 42-42 / 34k-a measurement), what works
  (one command per call, wc multi-path, interactive-only pipes, quoted operators),
  how to verify a plausible-looking result, and the pitfalls
- its History section names both retired skills so a reader arriving from either
  search finds the surviving one
- mirrored onto disk as skills/command-composition-rules.md + .json and added to
  skills/index.json (18 entries) so the repo copy matches what sessions receive

Verified live on v4.6.65: seeding reported 15 skills (was 14), the file and index
entry exist in the fresh VFS, and the natural-language query "does the terminal have
a shell and what is refused" returns command-composition-rules first (13.78, 3/4).
</content>
</entry>
<entry>
<title>fix(newos4): unmeasured skills are untracked, world-model writes verified, skill audit</title>
<updated>2026-10-23T12:39:45+00:00</updated>
<author>
<name>Agando</name>
<email>roduccomm@gmail.com</email>
</author>
<published>2026-10-23T12:39:45+00:00</published>
<link rel='alternate' type='text/html' href='https://newos.webx11.duckdns.org/newos4/commit/?id=940bf43ba5cbed2d0a9afa4c70ffbc3df5cb3f90'/>
<id>urn:sha1:940bf43ba5cbed2d0a9afa4c70ffbc3df5cb3f90</id>
<content type='text'>
External review packet (os4-external-review-v4.6.51.html) triaged against the code:
2 findings confirmed and fixed, 4 could not be reproduced and were recorded as such.

- module-memory-graph.js: getStaleSkills() treated a missing lastUsed as 999 days
  unused, so skill-audit recommended archiving every skill (22 of 22). Skills with no
  usage telemetry are now collected by getUntrackedSkills() and never counted stale.
  Live: "Stale: 0" + "Untracked: 22 (no usage telemetry — NOT stale)".
- module-world-model.js: _saveToVFS() ignored fsWriteJSON()'s return value and promoted
  whatever a truthy read returned. Now write -&gt; read-back -&gt; byte compare -&gt; promote,
  with every return checked. Regression test modules/test/test-world-model-save.js
  (red on the old code: promoted=true with errs=[]; green now).
- scripts/newos4-skill-audit.py: 5 mechanical probes (version x3, read_file paging +
  context budget, selection symbols, required scripts, extKeys) + skill presence;
  exits non-zero on drift. 7/7 pass today. Weekly job cb6bc2a16216 runs it Mondays.

Not reproduced (recorded in admin/docs/newos4-external-review-verification-2026-10-23.md):
world_model_query empty-payload throw (live call returns JSON), pipes-as-command-names,
ls skills empty (23 entries via fs.readDir), ~66 agent dirs (4 live).
</content>
</entry>
<entry>
<title>auto: 2026-07-09_06:00 changes</title>
<updated>2026-07-09T04:00:32+00:00</updated>
<author>
<name>Agando</name>
<email>roduccomm@gmail.com</email>
</author>
<published>2026-07-09T04:00:32+00:00</published>
<link rel='alternate' type='text/html' href='https://newos.webx11.duckdns.org/newos4/commit/?id=cf7461ffeb4f53f3f50c9c692a2e4fdcecf17e82'/>
<id>urn:sha1:cf7461ffeb4f53f3f50c9c692a2e4fdcecf17e82</id>
<content type='text'>
</content>
</entry>
<entry>
<title>auto: 2026-06-23_06:00 changes</title>
<updated>2026-06-23T04:00:45+00:00</updated>
<author>
<name>Agando</name>
<email>roduccomm@gmail.com</email>
</author>
<published>2026-06-23T04:00:45+00:00</published>
<link rel='alternate' type='text/html' href='https://newos.webx11.duckdns.org/newos4/commit/?id=e9b75cd3a801689f57bc8a013f14c058e57e3b46'/>
<id>urn:sha1:e9b75cd3a801689f57bc8a013f14c058e57e3b46</id>
<content type='text'>
</content>
</entry>
</feed>
