0.36.0 2026-10-06

release 0.36.0 on GitHub →

A correctness and UI-surface release. Three data-integrity bugs in the collaborative-document layer are fixed — a cold-miss op could discard every shape on a board, the doc cache grew without limit, and a stale op could silently overwrite a newer edit to the same shape. The Basecoat skin is repaired (it had been rendering without most of its CSS) and the Morpheus skin is removed. Adds a versioned, drift-checked dependency on the vendored stelow coding standards.

Added

LayerMechanismRole
1. Detectbin/check-stelow-drift.sh (advisory pre-commit; --strict via make check-stelow-drift)Warns locally when the vendored copy or the pin is off
2. Report.github/workflows/stelow-drift.yml (weekly)Fails its own run when upstream has moved
3. Fixscripts/refresh-stelow.sh, proposed by .github/workflows/stelow-auto-bump.yml (weekly)Opens a PR against the new pin

scripts/refresh-stelow.sh fetches each file from raw.githubusercontent.com/<repo>/<sha>/<path>, which returns byte-identical content without cloning the stelow repo and without spending GitHub API rate budget on content. It resolves a branch or an explicit commit, discovers the upstream file list (API tree → local clone → local files, warning loudly in the last case because only the upstream tree can reveal a new reference), fetches and verifies, installs, bumps UPSTREAM_SHA, and re-runs the strict drift check. Any fetch failure aborts before touching the tree, so a partial upstream change cannot land.

The update lands as a PR, never an auto-commit: the vendored copy is normative — it is the universal coding principles this template enforces — and a silent commit would change the rules the project holds itself to with nobody reading the diff. This mirrors the existing "human must approve all AGENTS.md changes" rule.

Removed

Removed rather than rewritten: web/skins/morpheus/ (the vendored bundle and its neolib/ component set), web/resources/static/morpheus/, the SkinMorpheus constant, the _ "…/web/skins/morpheus" registration, the handleIndex / renderTodoListRegion dispatch branches, the skins-extra trim-unit entries, and the Morpheus leg of the Playwright skin sweep. An unknown UI_SKIN or ?skin= value still falls back to DaisyUI, so a bookmarked ?skin=morpheus URL degrades to the default skin rather than erroring. DaisyUI remains the default; Basecoat remains the supported option.

Fixed

The TTL floor is what makes eviction correct without reference counting: a single request mutates a doc for microseconds, so a doc idle for minutes cannot be mid-mutation. Without it an LRU could evict a doc between the GetOrCreate and the ApplyOp of the same request, putting two concurrent ops on two different Doc instances and losing one. A doc in active use is therefore never evicted even when that briefly exceeds the cap — exceeding the cap is the correct trade. Both properties are pinned by tests, and the bound test is red-proofed.

Scope, stated plainly: the canvas today only adds shapes, so this was not yet reachable from the UI — it becomes load-bearing as soon as shapes can be moved or resized. Two consequences worth knowing: a replayed duplicate add is now a 409 rather than a silent no-op (the safer answer, and the state is still unchanged), and clear still takes no version because it cannot conflict.

Verification