Ō-Yoroi

Ō-Yoroi.jpg

大鎧

The Great Armor.

Yoroi laced plate over plate.
The great armor closes its gaps.

The first test of armor is not how it shines.

It is what happens when the wearer moves.

A cord draws tight.

A plate shifts.

A joint that seemed closed catches the light.

The craftsman looks again.

LunarWing v2.1.3.0, Ō-Yoroi, returns to the armor built in Yoroi. Not to hang another plate upon it, but to examine the places where protection must bend without giving way.

The space between a credential change and a service restart.

Between preparing a configuration file and replacing the one that works.

Between what the engine produced and what the human actually said.

This release works in those spaces. Machine-generated step records leave the human transcript. Relay credentials gain a managed rotation path. Tenant configuration writes become safer under failure. The sandbox’s own housekeeping stops disturbing the isolation it is meant to maintain.

Around them, workers retain evidence of unfinished work, missions become visible from the gateway, and voice failures begin to explain themselves.

The plates were only the beginning.

Where the armor moves

Highlights

  • The engine’s notes do not become your words. New CodeAct step output is host-classified as SealedStepRecord and kept in internal_messages, outside the visible transcript and operator-facing thread view. The adapter still supplies it as User-role inference data, with the existing neutralization protections, but the application no longer records it as a human statement. Trace diagnostics and channel execution hints remain available.

  • A key can change without losing the lock. rotate-relay-password <tenant> brings managed credential rotation to WeeChat. Lifecycle locking and a launch barrier coordinate the consumers, unsafe credential paths are refused, and staged atomic writes keep the password out of writer arguments and environment. Guarded launchers reload the runtime credential, while relay.conf retains its literal ${env:RELAY_PASSWORD} reference.

  • The old fitting stays until the new one is sound. Tenant environment, capability, and credential writes now pass through a tenant-side atomic writer with ownership checks. Fallible producers first generate complete output in root-private staging; only a successful result reaches the commit. A failed read or parse must not replace a working configuration with a partial or empty file.

  • The armor must not damage its own wearer. Podman detection now uses the client-only podman version path, avoiding the rootless pause-state damage observed from hardened daemon units. Sandbox reaper sweeps use the workload isolation path too, with whole-service or process-tree cleanup on timeout. Stop/export writer quiescence and sandbox-image builds receive further hardening.

  • A slow worker is not necessarily a lost worker. Stuck detection now follows genuine CLI activity rather than total elapsed runtime, and a genuine late result can move a stuck job to Completed. Timeouts preserve up to 16 KiB of real partial output, recoverable through job_status even after restart. Kimi gains a silence watchdog; synthetic keep-alives do not count as progress or manufacture evidence.

  • The watchtower opens onto the missions. A new read-only Missions tab exposes mission lists, summaries, budgets, goals, current focus, approach history, and spawned threads. Management remains with the model-facing mission tools. Active missions also persist their UTC daily-budget rollover at startup and scheduler ticks, including when idle, without firing work or overwriting concurrent reservations.

  • The inventory no longer ends at the edge of the page. tool_list gains bounded pagination for both extension entries and per-server tool names, with explicit continuation metadata and intact identifiers. Existing long-named extensions remain manageable. GitLab tool 0.1.6 also accepts body as a description alias for issue creation and updates, rejecting requests that supply both non-null fields.

  • Voice failures speak more clearly. Long-reply synthesis gets a speed-aware duration check, and the gateway preserves sidecar 422, 503, and 504 responses instead of flattening them into a generic 502. The proxy allows thirty seconds beyond the sidecar timeout, while managed configuration keeps the daemon and sidecar limits aligned.

  • The lacquer is renewed beneath the surface. Wasmtime and wasmtime-wasi advance to 36.0.16 for the release’s runtime security fixes, with the vendor snapshot refreshed. The eight existing advisory exceptions retain documented reasons and dependency chains. A separate CI guard watches for activation of the currently unused, lockfile-only PyO3 dependency; it is not a PyO3 upgrade or another advisory exception.

Upgrading

Back up the database, tenant environments, /etc/lunarwing/ports.json, workspace and channel state, rendered units, worker data, and voice models before upgrading.

There are no new SQL or port-registry migrations. V27__memory_index_outbox.sql remains current, and the port registry stays at v17.

Rebuild the daemon and installed WASM extensions. Channel registry versions advance to darkirc 0.1.9, multica 0.1.12, weechat 0.2.10, and xmpp 0.1.15. Their behavior is unchanged, but rebuilding or reinstalling is required. Rebuild GitLab tool 0.1.6 for the issue-write alias. Refresh any local vendor override for the Wasmtime update.

Refresh the worker images. Kimi Code is pinned at 2.1.1 and OpenCode 2 at v2.0.18; OpenCode v1 remains at v1.18.25, and Pebble remains at 2d0f3786. Use the digests recorded in worker-image-evidence.json. Kimi’s default endpoint returns to the NetBird overlay with FrontierCODEK; explicit KIMI_BASE_URL and KIMI_MODEL settings retain precedence. OpenCode 2 is now selectable in CLI and web provisioning, but not Kawarimi import.

Re-render existing tenant units before rotating relay credentials. Run lunarwing-mt-admin.sh render-units <tenant> through the deployed mt-admin path, then use rotate-relay-password <tenant>. Rotation briefly interrupts running WeeChat consumers and refuses units without the launch guards. If interruption or failed rollback leaves starts blocked, repair the matching credentials and rerun rotation. Do not delete the recovery marker to bypass it.

Update integrations that depended on the old record shapes. New CodeAct step blobs no longer appear in thread.messages or the operator thread view; use trace diagnostics or engine-internal records. Legacy transcripts remain readable. For complete tool inventories, follow both next_offset and tools_next_offset rather than treating one tool_list response as exhaustive.

Keep configuration explicit. Re-renders preserve existing operator values and fill missing keys with the new defaults. Legacy AUTO_APPROVE_TOOLS migrates to AGENT_AUTO_APPROVE_TOOLS; update automation that reads the old key. Re-render managed voice configuration so VOICE_MAX_TTS_AUDIO_SECS and VOICE_REQUEST_TIMEOUT_SECS agree between daemon and sidecar.

Kimi’s silence watchdog defaults to 15 minutes, capped by the task deadline. KIMI_SILENCE_TIMEOUT_MS=0 disables that watchdog, not the deadline. Active mission day counters roll over automatically; undated legacy missions retain their existing count on the upgrade day.

The release identifier is 2.1.3.0. LunarWing-owned Rust crates and channel packages use 2.1.3. Rust 2024 and MSRV 1.96.1 remain unchanged.


Yoroi built the plates.

Ō-Yoroi attends to the places between them.

The cord is tightened.

The old key is replaced.

The engine’s record stays its own.

No promise that the next blow will not come.

Only the patient work of leaving less room for it.

大鎧

For full release notes, check the repository as always.