Conversation
Macros record the command stream off the message bus rather than raw keystrokes, so replay is immune to mode and timing skew. Replay applies as a single undo group: a replay that errors mid-way rolls the buffer back to its pre-replay state instead of leaving a half-applied edit. - q + register starts recording, q stops; [N] @ + register replays with a count - Macros live in per-session a-z registers; durable cross-restart storage lands with the named-register work (issue #3) - Recording indicator in the status bar; replay failures surface as a toast with the rolled-back step - Covered by record/replay round-trip and mid-replay rollback tests
The wasm interpreter now lives in its own library, wick (github.com/ooyeku/wick), extracted from this repo. The in-tree copy is deleted; the loader, plugin CLI, and fuzz targets import the package. The integration contract is wick's docs/stem-contract.md. Every plugin call now runs under an instruction budget (CALL_FUEL_BUDGET, 50M): a runaway plugin fails that one call with OutOfFuel — logged, counted, and contained — instead of hanging the editor. Host calls cost one instruction, so slow subprocesses are not penalized. Containment is observable: the loader keeps per-plugin CallStats (calls, traps, last error, last/max fuel per call), shown in the plugin-manager dashboard JSON and report and in the control center plugin section. Plugin traps feed a new RuntimeAlerts counter, so a misbehaving plugin lights the same check-engine light as dead letters and open circuits.
Docs catch up with the release: - All references to the in-tree wasm interpreter now point at the wick package (plugins.md host-internals section rewritten with the fuel budget and CallStats; dead source link removed) - wick added to the dependency lists in README and docs/stem.md - Plugin dashboard docs describe the per-plugin call/trap/fuel stats; check-engine enumerations include plugin traps - Roadmap 0.14.0 section reflects what shipped (wick + fuel + observability, transactional macros); architecture essay closing updated to match - stem.md: project tree drops interpreter.zig, gains wasm_loader_fuzz.zig; select-mode row mentions macro keys Dead code removed, verified unreferenced: - src/ui/help_view.zig (orphan file; help.zig is the live help UI) - WasmPlugin.readWasmStr and an unused wick import alias in plugin_cli.zig (extraction leftovers)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
0.14.0 is the "Deterministic Editing" release: transactional macros, a plugin host that is now a standalone library with metered, observable calls, and a docs/dead-code polish pass.
Transactional macros (closes #7)
q+ register), replay with counts ([N] @+ register) — immune to the mode/timing skew of keystroke tapes.a–zregisters; durable cross-restart storage arrives with the named-register work (Named registers ("a–"z) with a yank ring #3).Plugin host: wick + fuel + observability
docs/stem-contract.md.CALL_FUEL_BUDGET, 50M). A runaway plugin fails that one call withOutOfFuel— logged, counted, contained — instead of hanging the editor. Host calls cost one instruction, so slow subprocesses aren't penalized.CallStats(calls, traps, last error, last/max fuel) surface in the plugin-manager dashboard (JSON + report) and the control center; plugin traps feed a newRuntimeAlertscounter, lighting the same check-engine light as dead letters and open circuits.Polish
ui/help_view.zig, a leftover loader helper, an unused import.Verification
zig fmtclean.