Skip to content

wikiwright 0.6.0

Choose a tag to compare

@m4bwav m4bwav released this 29 Sep 22:05
· 68 commits to master since this release

wikiwright 0.6.0. The entries below are the skill's CHANGELOG for this release, newest first.

C-20260929-10 · 2026-09-29 · Release 0.6.0: a file-writing package, a grader that sees a recorder, the first wiki on another host (release-0.6.0)

  • because: user request (the 0.6.0 kickoff); C-20260929-7 to C-20260929-9; T-20260929-3; R-20260929-2
  • files: .claude-plugin/plugin.json, scripts/wikiwright.py (VERSION), SKILL.md (metadata.version), evergreen.json (version, counts, tests, history), README
  • 0.6.0 gathers the entries below. wikiwright.py releasecheck 0.6.0 checks the four version fields, this entry and T-20260929-3.
  • Token savings, measured before and after:
    • Reading a run's trace, which L-122 asks for: the grader's --digest turned the 811 KB recorder trace into 2.7 KB, the nine suite traces into about 3 KB each, and the sixth run's 4.6 MB trace into 16 KB.
    • A Node 20 diff: diffout counts the 103 shell node: lines instead of listing 103 changed sections, and it finds the L-118 trap that masking hid.
    • The kit a file-writing run reads is a 2,913-byte header; runs of other packages read none of it. The template grew by 2,797 bytes over 0.5.0 (13,428 to 16,225) for inTree(), term() and OLDEST_NODE_BIN, which the sixth run had written itself.
    • The suite cost $17.65 for nine action runs and $2.20 for triggers and decoys; the sixth run $15.59 in 49 minutes, reported in 13 KB; the get-title-at-url and Forgejo subagents kept about 270,000 tokens out of the main context.
  • Four grader or checker faults surfaced by real use rather than by their tests (saved outputs, preflight through a variable, the recorder, Forgejo's anchors) are each now a test.
  • CI on macOS failed the kit's chdir test: the temp folder is under /var, a link to /private/var, so process.cwd() in a tree was not the path the kit printed as <tree>. The kit now resolves the tree's real path.

C-20260929-9 · 2026-09-29 · The first real wiki on another host: Forgejo's anchors corrected (forgejo-first-wiki)

  • because: R-20260929-2; L-135
  • files: scripts/wikiwright.py (slug() for Forgejo); tests/test_wikiwright.py (five measured headings); references/hosts.md (the intro, the anchors row, --seed then a fast-forward, pushing with http.extraHeader, sidebar and footer as pages, case-sensitive paths); references/page-sets.md (hosts row); LEARNINGS.md (L-135)
  • The pages published on a local Forgejo 16.0.5 passed check --host forgejo and live, yet one anchor link was broken there: the rule from 0.5.0's single probe heading was wrong. slug() now matches 99 of 99 ids of the published pages, and check --host forgejo reports the broken link.

C-20260929-8 · 2026-09-29 · Lessons of the sixth run (format-json-files) and of the suite's side effects (sixth-run-lessons)

  • because: the sixth real run (wiki commit c9f5fe5, the repository's PR #4); its report (eleven skill items, six kit items); T-20260929-3 (eval-written L-131, L-132); the get-title-at-url third update (wiki 1e449b2, its PR #24); L-001, L-106, L-118, L-130 to L-134
  • files: scripts/wikiwright.py (diffout counts shell node: lines, masks them, warns on a mixed output, --keep-node; the help says exit 1 means differences); tests/test_wikiwright.py (54 tests); templates/npm/wiki-verify.template.mjs (term(), OLDEST_NODE_BIN, the per-platform alone folder and output name, a file-writing capture's golden note); templates/npm/file-tree.mjs (hard links, folder modes, hide, limit, escaped paths, trimmed link targets) and tests/file-tree.test.mjs (12 tests); templates/wiki-note.template.md (every saved output in the update steps); references/npm.md (the scratch project's npm init trap, the stand-in proxy refuses other targets and handles undici 8, transcripts, paths follow the platform with Node from the registry, drvfs, golden captures that write files, the oldest Node's folder and diffout's count); references/page-sets.md (the eighth wiki, the CLI set tested a fifth time, a file-writing package's rules); SKILL.md (Step 2 decoded escapes in shipped docs; Step 4 the Linux run; Update mode a recipe's dependencies at latest, diffout's exit); LEARNINGS.md (L-133, L-134; updates to L-001, L-106, L-118, L-130 to L-132)
  • What changed and why:
    • The run passed every check (outputs 114 of 114 from four saved outputs, check 0/0, repository tests 141 pass, 4 skipped). It also listed seventeen places where the skill or the kit was wrong, missing or confusing. Each became a change above or a learning, except two it could not act on: the prompt's rule against editing the skill, and the overlay's "move to done", both left to this session.
    • The largest: a file-writing package prints paths, so the pages need a Linux run (L-132, promoted from three eval runs and confirmed by the real one), and the Linux Node now comes from the registry with OLDEST_NODE_BIN. A terminal transcript needs both streams in order (term()). A diffout of a Node 20 rerun listed every shell case as changed until its shell node: lines were masked, and masking hid the L-118 trap that struck again. diffout now counts them and warns on a mix: on the run's outputs it prints v24.18.0 x103; v20.20.2 x103 and 12 changed sections.
    • The suite's eval runs found get-title-at-url's proxy recipe broken by undici 8 while 3.0.0 stood still (L-131). Update mode now installs a recipe's dependencies at latest, and the live page was fixed.
  • Measured: the sixth run was one headless session, $15.59, 49 minutes, 229 turns; its report reached this session at 13 KB, and its 4.6 MB trace was read as a 16 KB digest. The template grew from 14,864 to 16,225 bytes (term(), OLDEST_NODE_BIN); the kit's header, the part a run reads, from 2,480 to 2,913 bytes. SKILL.md: 3,086 words at C-20260929-7, 3,192 now.

C-20260929-7 · 2026-09-29 · 0.6.0, step 1: the file-tree kit, a grader that sees a recorder, a trace digest, two grader fixes (files-and-grader)

  • because: user request (the 0.6.0 kickoff: a file-writing package, the recorder the grader cannot see); L-122; L-130; T-20260929-3
  • files: templates/npm/file-tree.mjs (new) and tests/file-tree.test.mjs (new, 9 tests, in CI); templates/npm/wiki-verify.template.mjs (cli() takes {cwd, env} as its last argument; the "files on disk" section and inTree()); references/npm.md ("Packages that write files"); SKILL.md Step 4; evals/grade-action.py (FETCH_WRAPPER, ROUTES_LOCALLY, digest() and --digest, saved_outputs(), the wiki-check pattern); tests/test_wikiwright.py (53 tests: the template's files section, the grader); README; AGENTS.md; .github/workflows/tests.yml; LEARNINGS.md (L-130)
  • What changed and why:
    • Files on disk. The template had no way to run a case in a scratch tree, and nothing showed a file before and after. file-tree.mjs builds a fresh copy of each case's tree, sets fixed modification times, runs the case and prints one line per file (not written, written with the same bytes, changed, created, deleted), then each written file's contents before and after under a header of size, UTF-8, BOM, line endings and final newline, the facts the text hides and outputs folds away. The tree's path prints as <tree>; read-only files and symbolic links are handled, and unavailable links are listed.
    • The recorder (L-122). A cheap trace signal exists: a file written with a globalThis.fetch = wrapper that has no local routing in it (no loopback address, no *_BASE variable, no refusal of other origins), then run. The grader now fails that as a request to the real service. Over every stored trace (ww3 to ww7 suites) it flags exactly the T-20260929-2 recorder run the old grader passed, and nothing else.
    • grade-action.py <run> --digest prints one line per tool call worth reading (installs, requests with their hosts, node runs, fetch wrappers, git, writes outside the workspace). Reading a trace, which L-122 requires, went from 811 KB to 2.7 KB on the recorder run.
    • Two grader errors found by T-20260929-3: outputs a run saved to files and checked with outputs never reached the trace, and preflight through a variable (python $WW preflight OWNER/REPO) was not seen as a wiki check. Both fixed and tested; four runs regraded to pass.
  • Measured load: the template grew from 13,428 to 14,864 bytes; the kit is 9,938 bytes, of which a run reads the 2,480-byte header, and only for a file-writing package. SKILL.md: 3,028 words before, 3,086 after (Step 4's bullet).