Update history.md with cycles 89-92 and final campaign summary.
Mark state.md as campaign complete.
Authored by Claude, lovingly guided by Zachery Aaron Shores-Chmielewski
Final cycle of the testing campaign. Adds: byte count threshold guest,
actor slot reuse after stop, missing handle export error, silent never-sends
property test, and 1000 empty ticks stability test.
Authored by Claude, lovingly guided by Zachery Aaron Shores-Chmielewski
Added 5 tests: mixed payload types, i64 global, all three guest types, stopped
actor never responds property test, exact 33-byte echo. No new bugs found.
Authored by Claude, lovingly guided by Zachery Aaron Shores-Chmielewski
Added 5 tests: running sum across messages, parallel build 10 actors, multiple
memory.fill, 10KB echo, alloc works then returns negative. No new bugs found.
Authored by Claude, lovingly guided by Zachery Aaron Shores-Chmielewski
Added 6 tests: OR set high nibble, 31-byte message too short, loop to 1000,
500 actors one message each, bitwise identical property test, modify last byte.
No new bugs found.
Authored by Claude, lovingly guided by Zachery Aaron Shores-Chmielewski
Added 4 tests: conditional double or echo, 200 messages across 200 ticks,
three inboxes from same runtime, AND mask low nibble. No new bugs found.
Authored by Claude, lovingly guided by Zachery Aaron Shores-Chmielewski
Added 4 tests: i32 bit pattern inversion, native handler spawns WASM and sends,
factorial loop, echo determinism across 10 independent runs.
No new bugs found.
Authored by Claude, lovingly guided by Zachery Aaron Shores-Chmielewski
Added 5 tests: 1000 message echo stress, many typed locals, alternate empty/nonempty,
error variants distinct display, heterogeneous WAT actors on same runtime.
No new bugs found.
Authored by Claude, lovingly guided by Zachery Aaron Shores-Chmielewski
Added 5 tests: compute max byte, echo own address, rapid engine creation, select
conditional value, all 256 single-byte payloads integrity check.
No new bugs found.
Authored by Claude, lovingly guided by Zachery Aaron Shores-Chmielewski
Added 5 tests: bitwise NOT each byte, stop on MT runtime, i64 extend operations,
5 sequential runtimes, random tick/message interleaving property test.
No new bugs found.
Authored by Claude, lovingly guided by Zachery Aaron Shores-Chmielewski
Added 4 tests: echo zeros then ones, extra exports with init/cleanup,
property test double always sends 2 copies, 30 mixed actors simultaneous.
No new bugs found. **350 tests pass.**
Authored by Claude, lovingly guided by Zachery Aaron Shores-Chmielewski
Added 5 tests: fibonacci via recursion, single inbox from five actors, minimal
lifecycle no messages, reuse message bytes, block with result value.
No new bugs found.
Authored by Claude, lovingly guided by Zachery Aaron Shores-Chmielewski
Added 4 tests: guest sends to two addresses in one handle, engine clone builds
independent actors, 500 messages in one tick, guest early return from handle.
No new bugs found.
Authored by Claude, lovingly guided by Zachery Aaron Shores-Chmielewski
Added 5 tests: internal function with 8 params, WASM-to-native-to-inbox relay,
any message size round-trip property, sign extend 16, echo after 100 idle ticks.
No new bugs found.
Authored by Claude, lovingly guided by Zachery Aaron Shores-Chmielewski
Added 4 tests: guest counts messages via global, echo with DropOldest mailbox,
guest echoes only odd-length messages, build error Display formatting.
No new bugs found.
Authored by Claude, lovingly guided by Zachery Aaron Shores-Chmielewski
Added 5 tests: trap on specific byte, three runtimes share engine, spawn with no
messages, multiply/divide operations, 1000 actors from same engine stress test.
No new bugs found.
Authored by Claude, lovingly guided by Zachery Aaron Shores-Chmielewski
Added 5 tests: multiple mutable globals rotation, large data segment module,
echo+double interleaved, i64 store instruction, runtime dropped with active actors.
No new bugs found.
Authored by Claude, lovingly guided by Zachery Aaron Shores-Chmielewski
Added 5 tests: logical right shift, 100 messages across 100 ticks, three-deep
nested if/else, increasing payload sends in one handle, engine dropped after
build. No new bugs found.
Authored by Claude, lovingly guided by Zachery Aaron Shores-Chmielewski
Added 5 tests: alloc trap then normal message, unused table tolerated, alternating
large/small messages, silent absorbs 200 messages, two actors from cloned bytes.
No new bugs found.
Authored by Claude, lovingly guided by Zachery Aaron Shores-Chmielewski
Added 4 tests: zero-length payload from guest, overlapping dest/payload regions,
alloc exhaustion drops gracefully, stop all actors in runtime. No new bugs found.
Authored by Claude, lovingly guided by Zachery Aaron Shores-Chmielewski
Added 5 tests: self-send loop bounded by budget, empty module missing exports,
static alloc same pointer echoes, two engines two runtimes cross-combo, 32KB
payload round-trip. No new bugs found.
Authored by Claude, lovingly guided by Zachery Aaron Shores-Chmielewski
Added 5 tests: unreachable instruction trap recovery, bump allocator advancing
pointers, block/loop/br_if control flow, stop one of two actors, property test
spawning 1..20 actors from same engine. No new bugs found.
Authored by Claude, lovingly guided by Zachery Aaron Shores-Chmielewski
Added 5 tests: three destinations from three echo actors, one-message-per-tick
for 10 ticks, 10-page initial memory, fill+copy together, stop with pending
messages. No new bugs found.
Authored by Claude, lovingly guided by Zachery Aaron Shores-Chmielewski
Added 5 tests: local.tee instruction, 16KB payload round-trip, two independent
runtimes with WASM actors, i64-to-i32 wrap instruction, random WAT variations
property test. No new bugs found.
Authored by Claude, lovingly guided by Zachery Aaron Shores-Chmielewski
Added 6 tests: guest reverses payload via WAT loop, extra exports tolerated,
comprehensive guest fuzz property test, respawned actor gets different address,
echo+double to separate inboxes, builder accepts slice reference.
No new bugs found. All 250 tests pass.
Authored by Claude, lovingly guided by Zachery Aaron Shores-Chmielewski
- guest_with_immutable_global: i32 global constant used in response
- multiple_echo_round_trips: 5 sequential send-receive-send cycles
- builder_is_consumed_on_build: verify builder ownership semantics
- empty_tick_between_sends_preserves_order: A-B-C with empty ticks between
All 244 tests pass. No new bugs found.
Authored by Claude, lovingly guided by Zachery Aaron Shores-Chmielewski
- interleaved_spawn_and_message_delivery: spawn-send-spawn-send-tick delivers both
- guest_uses_i32_store16: 16-bit LE store/read
- guest_computes_min_max: select instruction for min/max of two bytes
- drop_runtime_with_live_actors: drop runtime with 10 live WASM actors, no panic
All 240 tests pass. No new bugs found.
Authored by Claude, lovingly guided by Zachery Aaron Shores-Chmielewski
- send_raw_bytes_to_inbox: direct ByteMessage to inbox address
- multiple_data_segments_different_offsets: 3 data segments concatenated
- echo_across_100_separate_ticks: 100 messages across 100 individual ticks
- guest_with_nop_instructions: nop instructions don't affect behavior
All 236 tests pass. No new bugs found.
Authored by Claude, lovingly guided by Zachery Aaron Shores-Chmielewski
- grow_memory_and_use_new_page_for_send: memory.grow then send from new page
- twenty_actors_twenty_messages_each: 400 total messages across 20 actors
- module_with_only_send_import_needed: minimal sending module works
- guest_data_segment_used_as_template: data segment content sent as payload
All 232 tests pass. No new bugs found.
Authored by Claude, lovingly guided by Zachery Aaron Shores-Chmielewski
- repeated_build_same_bytes_independent: 3 actors from same bytes, stop one, others work
- guest_reads_stale_memory_region: reading uninitialized memory is safe
- prop_any_guest_module_processes_safely: echo/double/silent × random msg count
- three_level_nested_function_calls: inc→double_inc→transform chain (x+2)*3
All 228 tests pass (15 property tests). No new bugs found.
Authored by Claude, lovingly guided by Zachery Aaron Shores-Chmielewski
- guest_uses_shift_operations: i32.shl and i32.shr_u bit shifts
- guest_uses_bitwise_and_or: i32.and (0xFF & 0x0F) and i32.or (0xF0 | 0x0F)
- echo_and_double_coexist_same_worker: different guest types on same runtime
- guest_reads_i16_from_payload: i32.load16_u reads little-endian 16-bit value
All 224 tests pass. No new bugs found.
Authored by Claude, lovingly guided by Zachery Aaron Shores-Chmielewski
- guest_xor_transform_key: loop-based XOR cipher with 0xAA key
- actor_address_reconstructible_from_bytes: ActorAddress round-trips through raw bytes
- double_guest_watch_fires_once_on_stop: double works + watch notifies exactly once
- byte_message_various_constructors: ByteMessage from string, empty, 1024 zeros
All 220 tests pass. No new bugs found.
Authored by Claude, lovingly guided by Zachery Aaron Shores-Chmielewski
- guest_uses_i32_store_load: verifies little-endian i32 store/load
- guest_uses_eqz: i32.eqz instruction for empty/non-empty detection
- silent_guest_processes_1000_messages: silent actor handles 1000 messages, stays alive
- send_before_first_tick_delivers: send immediately after spawn delivers on first tick
All 212 tests pass. No new bugs found.
Authored by Claude, lovingly guided by Zachery Aaron Shores-Chmielewski
- alloc_at_page_boundary_works: alloc + msg = exactly 65536, in bounds
- alloc_one_past_page_boundary_drops: alloc + msg = 65537, OOB drops gracefully
- multiple_runtimes_with_wasm_actors: two separate runtimes with WASM actors
- guest_mirrors_full_message: sends full message (addr+payload) as payload
All 204 tests pass. No new bugs found.
Authored by Claude, lovingly guided by Zachery Aaron Shores-Chmielewski
- large_4kb_message_round_trips: 4096-byte payload echoes with pattern verification
- guest_reports_payload_length: guest computes and sends back payload length as LE i32
- alloc_returns_odd_alignment: alloc returns 1 (unaligned), host writes correctly
- shared_engine_clone_and_debug: cloned engine Debug output matches
- idle_ticks_dont_affect_wasm_actor: 500 empty ticks, then message still works
All 193 tests pass. No new bugs found.
Authored by Claude, lovingly guided by Zachery Aaron Shores-Chmielewski
- guest_start_function_modifies_alloc_region: host overwrites pre-filled 0xFF memory
- engine_clone_is_same_engine: cloned engine produces working actors
- handle_uses_i64_operations: i64 arithmetic with i32.wrap_i64
- two_hundred_actors_from_same_engine: 200 actors all process one message
- Updated history.md with Cycles 27-39
All 170 tests pass. No new bugs found.
Authored by Claude, lovingly guided by Zachery Aaron Shores-Chmielewski
- native_handler_spawns_wasm_actor_inline: native handler spawns WASM actor + sends
- handle_uses_many_locals: guest uses 4 local variables for arithmetic
- wasm_actor_survives_1000_ticks: 1000+ empty ticks + 10 messages, no resource leak
- send_to_dead_wasm_actor_silently_dropped: send to stopped actor doesn't panic
All 162 tests pass. No new bugs found.
Authored by Claude, lovingly guided by Zachery Aaron Shores-Chmielewski
- mutual_watch_wasm_actors: watcher notified when watched WASM actor stops
- select_instruction_in_handle: wasm select (ternary) based on payload presence
- wasm_to_wasm_to_native_relay: 3-layer echo1→echo2→inbox relay
- prop_any_dest_address_bytes_never_panic: arbitrary 32-byte dest address never panics
All 158 tests pass (11 property tests). No new bugs found.
Authored by Claude, lovingly guided by Zachery Aaron Shores-Chmielewski
- same_tick_message_ordering_preserved: 20 numbered messages arrive in FIFO order
- send_payload_ptr_plus_len_overflow_traps: i32::MAX payload_ptr + 1 traps safely
- handle_sends_100_messages_in_one_call: 100 sends in single handle via loop
- br_table_dispatch_in_handle: switch-like dispatch on first payload byte
- Fixed prop_truncated_wasm_never_panics (renamed): test only asserts no-panic, not always-error
All 154 tests pass (10 property tests). No new bugs found.
Authored by Claude, lovingly guided by Zachery Aaron Shores-Chmielewski
- handle_with_loop_computes_sum: iterative byte sum via wasm loop/br, u8 overflow wrapping
- send_with_dest_ptr_zero_reads_from_memory_start: dest_ptr=0 is a valid location
- stop_actor_with_pending_messages_no_crash: stop before tick with 10 queued messages
- prop_truncated_wat_always_produces_error: any truncated WASM bytes always fail to build
All 150 tests pass (10 property tests). No new bugs found.
Authored by Claude, lovingly guided by Zachery Aaron Shores-Chmielewski
- wasmtime_error_converts_to_wasm_actor_error: From conversion produces Wasmtime variant
- three_wasm_actors_on_two_threads: 3 WASM echo actors on 2-thread runtime all deliver
- handle_with_if_else_branching: guest uses if/else to send different responses by length
All 146 tests pass. No new bugs found.
Authored by Claude, lovingly guided by Zachery Aaron Shores-Chmielewski
- guest_overwrites_payload_after_send_outbox_has_copy: outbox snapshots memory at send time
- alloc_grows_memory_returns_pointer_in_new_page: memory.grow per alloc, 5 messages through
- trap_after_successful_send_clears_outbox: trap discards all outbox entries including valid ones
- send_payload_at_memory_offset_zero: offset 0 is a valid payload location
All 143 tests pass. No new bugs found.
Authored by Claude, lovingly guided by Zachery Aaron Shores-Chmielewski
- prop_random_payload_sizes_never_panic: random 0-8KB payloads never crash host
- multi_page_data_segments_persist: data segments initialized across 3 memory pages
- conditional_send_fan_out_based_on_payload: command byte controls 0/1/2x sends
- guest_with_advancing_allocator_handles_multiple_messages: proper bump alloc, 10 msgs in one tick
All 139 tests pass (9 property tests). No new bugs found.
Authored by Claude, lovingly guided by Zachery Aaron Shores-Chmielewski
- send_import_zero_length_payload_delivers_empty: payload_len=0 delivers empty msg
- actors_from_separate_engines_coexist: two engines on same runtime work independently
- rapid_spawn_send_stop_50_rounds: 50 sequential spawn-send-stop cycles all deliver
- start_function_that_succeeds_allows_normal_operation: start initializes global, handle uses it
All 135 tests pass. No new bugs found.
Authored by Claude, lovingly guided by Zachery Aaron Shores-Chmielewski
- reference_types_module_rejected: externref table rejected by sandboxed engine
- trapping_actor_does_not_affect_sibling: trap in actor 1 doesn't corrupt actor 2
- alloc_returns_negative_for_nonzero_drops_message: negative ptr gracefully drops
- global_counter_accumulates_across_messages: mutable global state persists across 5 calls
All 131 tests pass. No new bugs found.
Authored by Claude, lovingly guided by Zachery Aaron Shores-Chmielewski
- mixed_outbox_partial_delivery: guest sends to valid + garbage addresses in same handle,
verifies only valid sends deliver and actor survives
- drop_oldest_mailbox_with_wasm_actor: DropOldest policy keeps newest 3 of 5 messages
- echo_to_full_inbox_silently_drops: bounded inbox capacity silently drops excess echoes
All 119 tests pass. No new bugs found.
Authored by Claude, lovingly guided by Zachery Aaron Shores-Chmielewski
- Non-ByteMessage to WASM actor is silently ignored (type mismatch)
- Guest mutable global state persists across handle() calls (counter)
- Native handler can spawn WASM actor dynamically via ctx.spawn()
Authored by Claude, lovingly guided by Zachery Aaron Shores-Chmielewski
- Module with trapping start function correctly rejected by builder
- Self-send feedback loop works (echo to own address, relay on next tick)
- Guest sending 10 messages in one handle: all 10 delivered via outbox
- Overlapping dest_ptr and payload_ptr in send: reads are independent
Authored by Claude, lovingly guided by Zachery Aaron Shores-Chmielewski
When a guest calls swactor.send() then traps, the outbox entries from
the incomplete operation survived and leaked into the next successful
handle() call, delivering messages from a failed context. Now clears
the outbox on trap, consistent with the "drop everything from failed
operations" semantics.
Authored by Claude, lovingly guided by Zachery Aaron Shores-Chmielewski
When a guest calls swactor.send then traps, the outbox entry survives
and leaks into the next successful handle() call. The outbox should be
cleared when handle traps, since the guest's operation was incomplete.
Also adds: invalid WASM bytes test, zero-length payload send test,
multiple sequential traps test (all passing).
Authored by Claude, lovingly guided by Zachery Aaron Shores-Chmielewski
StopSignal interception in tick_all set stopping=true but did not push
to the deaths vector, so phase 5b watch notifications never fired for
externally-stopped actors (via rt.stop_actor()). Now pushes
(addr, ExitReason::Stopped) to deaths, consistent with the
ctx.stop_self() path.
Authored by Claude, lovingly guided by Zachery Aaron Shores-Chmielewski
Native watcher watching a WASM actor does not receive ActorExited when
the target is stopped via rt.stop_actor(). Root cause: StopSignal
interception in tick_all (worker.rs:734) sets stopping=true but does
not push to the deaths vector, so phase 5b watch notifications never
fire for externally-stopped actors.
Also adds P0-2 through P1-7 test scenarios (all passing):
- empty message, oversized message, allocator exhaustion
- nonexistent address send, wrong export signature/name
- graceful stop, negative payload_len, independent stores
- WASM-to-WASM relay
Authored by Claude, lovingly guided by Zachery Aaron Shores-Chmielewski
Guest alloc could return a pointer where ptr+len exceeds linear memory
size, causing a Rust panic that permanently poisoned the actor. Now
validates ptr+len <= memory.len() before writing, dropping the message
on OOB (consistent with other allocation failure handling).
Authored by Claude, lovingly guided by Zachery Aaron Shores-Chmielewski
Guest alloc returning a pointer near the end of linear memory
(ptr + msg_len > memory_size) causes a Rust panic in copy_from_slice,
which poisons the actor permanently instead of dropping the message
and keeping the actor alive.
Authored by Claude, lovingly guided by Zachery Aaron Shores-Chmielewski