From f444710fdac4c6e6af7de8a7e6294210cbee8e38 Mon Sep 17 00:00:00 2001 From: PurplePincher Automation Date: Fri, 10 Jul 2026 13:23:49 -0800 Subject: [PATCH 01/11] start: round 3 production-hardening scaffold From 9a271406e796904f35c42a32258ec9a84b49025c Mon Sep 17 00:00:00 2001 From: PurplePincher Automation Date: Fri, 10 Jul 2026 13:25:36 -0800 Subject: [PATCH 02/11] chore: remove stray agent-prompt file accidentally committed as filename A prior agent session misinterpreted its own task instructions as a filename, creating a literal 0-byte file whose name was the entire prompt. Remove this stray artifact from tracking. --- ...style comments. Ensure all 40 tests still pass with make test. | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 Add comprehensive inline documentation to all .c and .h files. Document every function parameter, return value, and edge case. Add Doxygen-style comments. Ensure all 40 tests still pass with make test. diff --git a/Add comprehensive inline documentation to all .c and .h files. Document every function parameter, return value, and edge case. Add Doxygen-style comments. Ensure all 40 tests still pass with make test. b/Add comprehensive inline documentation to all .c and .h files. Document every function parameter, return value, and edge case. Add Doxygen-style comments. Ensure all 40 tests still pass with make test. deleted file mode 100644 index e69de29..0000000 From 5ceeca8b9a8eaedcb369414d0b82f25eeb00777d Mon Sep 17 00:00:00 2001 From: PurplePincher Automation Date: Fri, 10 Jul 2026 13:26:16 -0800 Subject: [PATCH 03/11] chore: stop tracking compiled binaries; ignore build artifacts Remove committed ELF binaries (holodeck, bin/holodeck, obj/main.o, test_conf, test_conf_v2, test_full_conf) from tracking and update .gitignore to cover executables, object files, and build directories. --- .gitignore | 14 ++++++++++++++ bin/holodeck | Bin 18432 -> 0 bytes holodeck | Bin 72488 -> 0 bytes obj/main.o | Bin 10760 -> 0 bytes test_conf | Bin 54848 -> 0 bytes test_conf_v2 | Bin 54848 -> 0 bytes test_full_conf | Bin 28184 -> 0 bytes 7 files changed, 14 insertions(+) delete mode 100755 bin/holodeck delete mode 100755 holodeck delete mode 100644 obj/main.o delete mode 100755 test_conf delete mode 100755 test_conf_v2 delete mode 100755 test_full_conf diff --git a/.gitignore b/.gitignore index b0ac3ed..4c9e394 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,15 @@ +# Aider .aider* + +# Compiled executables / binaries +/holodeck +/bin/ +/test_conf +/test_conf_v2 +/test_full_conf +/test_rooms +/test_serial + +# Object files & build directories +*.o +/obj/ diff --git a/bin/holodeck b/bin/holodeck deleted file mode 100755 index 18c5ae13f80bc90ab22609cd2ab5e34b754c1fd9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18432 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 R)nD;rjqzU=(WJ%o|2LUJvDyFt diff --git a/test_conf_v2 b/test_conf_v2 deleted file mode 100755 index 1223f214a45328dcfbb37dcab490752945ab6021..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 54848 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 Iq{a3BH>VA+g#Z8m diff --git a/test_full_conf b/test_full_conf deleted file mode 100755 index 3e0691de864f063cbc0507900ded913acd6cbce4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28184 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 Date: Fri, 10 Jul 2026 13:27:55 -0800 Subject: [PATCH 04/11] test: rewrite test_rooms.c against the real current room API The old test_rooms.c was written against an abandoned graph-container design (RoomGraph, graph_create_room, graph_connect, room_init, room_add_exit, room_look) that does not exist in src/room.h, so it never compiled. Rewrite it to exercise the real current API (room_create/destroy, room_connect/disconnect/find_exit, room_add_agent/remove_agent, room_add_note/get_notes, room_is_booted/set_booted), covering: - room lifecycle: create sets id/name/description; fresh room has no exits/notes/agents and is not booted; destroy is NULL-safe - exits: connect+find, one-way semantics, multiple exits, disconnect removes one exit while preserving others, NULL-arg safety - agents: add/remove adjust agent_count, re-add, remove-absent safety - notes: LIFO head ordering, author/text content, chain, NULL-safety - boot state: set/clear booted flag, NULL-safety 35/35 pass. Uses the repo's existing TEST()/PASS() lightweight macros. --- tests/test_rooms.c | 325 +++++++++++++++++++++++++++++++-------------- 1 file changed, 226 insertions(+), 99 deletions(-) diff --git a/tests/test_rooms.c b/tests/test_rooms.c index d0fc4fb..065cd0a 100644 --- a/tests/test_rooms.c +++ b/tests/test_rooms.c @@ -1,7 +1,23 @@ +/* + * test_rooms.c — Room connectivity & lifecycle tests + * + * Tests the real, current room API (src/room.h): + * room_create / room_destroy + * room_connect / room_disconnect / room_find_exit + * room_add_agent / room_remove_agent + * room_add_note / room_get_notes + * room_is_booted / room_set_booted + * + * Build standalone: + * gcc -std=c99 -Wall -Wextra -Wno-pedantic -Isrc \ + * -o test_rooms tests/test_rooms.c src/room.c src/agent.c + */ +#include "holodeck.h" +#include "room.h" +#include "agent.h" + #include #include -#include -#include "../src/room.h" static int passed = 0; static int total = 0; @@ -9,116 +25,227 @@ static int total = 0; #define TEST(name) do { total++; printf(" %-40s", #name); #define PASS(cond) if (cond) { passed++; printf("PASS\n"); } else { printf("FAIL\n"); } } while(0) -void test_create_room(void) { - RoomGraph g; - graph_init(&g); - TEST(create_room); - PASS(graph_create_room(&g, "tavern", "Tavern", "A room") == 1); - - TEST(reject_duplicate); - PASS(graph_create_room(&g, "tavern", "Dupe", "Should fail") == 0); - - TEST(count_correct); - PASS(g.count == 1); -} +/* ════════════════════════════════════════════════════════════════ + * Room Lifecycle + * ════════════════════════════════════════════════════════════════ */ +static void test_room_create(void) { + printf("── Room Lifecycle ──\n"); + + Room *r = room_create("tavern", "The Tavern", "A cozy place"); + + TEST(create_returns_room); + PASS(r != NULL); + + TEST(create_sets_id); + PASS(r != NULL && strcmp(r->id, "tavern") == 0); + + TEST(create_sets_name); + PASS(r != NULL && strcmp(r->name, "The Tavern") == 0); + + TEST(create_sets_description); + PASS(r != NULL && strcmp(r->description, "A cozy place") == 0); + + TEST(new_room_has_no_exits); + PASS(room_find_exit(r, "north") == NULL); -void test_destroy_room(void) { - RoomGraph g; - graph_init(&g); - graph_create_room(&g, "tavern", "Tavern", "A room"); - - TEST(destroy_existing); - PASS(graph_destroy_room(&g, "tavern") == 1); - - TEST(destroy_nonexistent); - PASS(graph_destroy_room(&g, "nope") == 0); + TEST(new_room_has_no_notes); + PASS(room_get_notes(r) == NULL); + + TEST(new_room_has_no_agents); + PASS(r->agent_count == 0); + + TEST(new_room_not_booted); + PASS(room_is_booted(r) == 0); + + room_destroy(r); } -void test_connect_rooms(void) { - RoomGraph g; - graph_init(&g); - graph_create_room(&g, "a", "Room A", "First"); - graph_create_room(&g, "b", "Room B", "Second"); - - TEST(connect_valid); - PASS(graph_connect(&g, "a", "north", "b") == 1); - - TEST(connect_nonexistent); - PASS(graph_connect(&g, "a", "south", "c") == 0); - - TEST(exit_exists); - Room *r = graph_find_room(&g, "a"); - PASS(r && r->exit_count == 1 && strcmp(r->exits[0].direction, "north") == 0); +static void test_room_destroy(void) { + TEST(destroy_null_safe); + room_destroy(NULL); + PASS(1); + + Room *r = room_create("tmp", "Temp", "Temporary"); + + TEST(destroy_frees_room); + room_destroy(r); + PASS(1); } -void test_room_boot_shutdown(void) { - Room r; - room_init(&r, "test", "Test", "Testing"); - - TEST(boot_sets_flag); - room_boot(&r, "agent1"); - PASS(r.booted == 1); - - TEST(boot_sets_agent); - PASS(strcmp(r.active_agent, "agent1") == 0); - - TEST(shutdown_clears); - room_shutdown(&r); - PASS(r.booted == 0); +/* ════════════════════════════════════════════════════════════════ + * Exits / Connectivity + * ════════════════════════════════════════════════════════════════ */ +static void test_room_connect(void) { + printf("\n── Exits / Connectivity ──\n"); + + Room *a = room_create("a", "Room A", "First room"); + Room *b = room_create("b", "Room B", "Second room"); + + room_connect(a, b, "north"); + + TEST(connect_and_find_exit); + PASS(room_find_exit(a, "north") == b); + + TEST(find_missing_exit); + PASS(room_find_exit(a, "south") == NULL); + + TEST(connect_is_oneway); + PASS(room_find_exit(b, "north") == NULL); + + room_connect(a, b, "south"); + + TEST(multiple_exits_findable); + PASS(room_find_exit(a, "north") == b && room_find_exit(a, "south") == b); + + room_disconnect(a, "north"); + + TEST(disconnect_removes_exit); + PASS(room_find_exit(a, "north") == NULL); + + TEST(disconnect_preserves_other); + PASS(room_find_exit(a, "south") == b); + + TEST(disconnect_missing_safe); + room_disconnect(a, "west"); + PASS(1); + + TEST(find_exit_null_safe); + PASS(room_find_exit(NULL, "north") == NULL); + + TEST(connect_null_safe); + room_connect(NULL, b, "north"); + room_connect(a, NULL, "north"); + PASS(room_find_exit(a, "north") == NULL && room_find_exit(a, "south") == b); + + room_destroy(a); + room_destroy(b); } -void test_room_notes(void) { - Room r; - room_init(&r, "test", "Test", "Testing"); - - room_add_note(&r, "agent1", "Hello"); - room_add_note(&r, "agent2", "World"); - - TEST(note_count); - PASS(r.note_count == 2); - - TEST(note_content); - PASS(strcmp(r.notes[0].author, "agent1") == 0 && strcmp(r.notes[0].content, "Hello") == 0); +/* ════════════════════════════════════════════════════════════════ + * Agents (enter / leave) + * ════════════════════════════════════════════════════════════════ */ +static void test_room_agents(void) { + printf("\n── Agents ──\n"); + + Room *room = room_create("room", "The Room", "A test room"); + Agent *ag1 = agent_create(-1); + Agent *ag2 = agent_create(-1); + + room_add_agent(room, ag1); + + TEST(add_agent_increments_count); + PASS(room->agent_count == 1); + + room_add_agent(room, ag2); + + TEST(add_multiple_agents); + PASS(room->agent_count == 2); + + room_remove_agent(room, ag1); + + TEST(remove_agent_decrements); + PASS(room->agent_count == 1); + + room_add_agent(room, ag1); + + TEST(readd_agent); + PASS(room->agent_count == 2); + + room_remove_agent(room, ag1); + + TEST(remove_absent_agent_safe); + room_remove_agent(room, ag1); + PASS(room->agent_count == 1); + + room_remove_agent(room, ag2); + room_destroy(room); + agent_destroy(ag1); + agent_destroy(ag2); + + TEST(add_null_agent_safe); + room_add_agent(NULL, ag1); + PASS(1); } -void test_room_look(void) { - Room r; - room_init(&r, "tavern", "The Tavern", "A cozy place"); - room_add_exit(&r, "north", "kitchen"); - char buf[1024]; - room_look(&r, buf, sizeof(buf)); - - TEST(look_has_name); - PASS(strstr(buf, "The Tavern") != NULL); - - TEST(look_has_exit); - PASS(strstr(buf, "north") != NULL); +/* ════════════════════════════════════════════════════════════════ + * Notes + * ════════════════════════════════════════════════════════════════ */ +static void test_room_notes(void) { + printf("\n── Notes ──\n"); + + Room *room = room_create("notes", "Note Room", "Walls with notes"); + + room_add_note(room, "agent1", "Hello world"); + room_add_note(room, "agent2", "Goodbye world"); + + const Note *notes = room_get_notes(room); + + TEST(add_note_returns_head); + PASS(notes != NULL); + + TEST(note_head_is_most_recent); + PASS(notes != NULL && strcmp(notes->author, "agent2") == 0); + + TEST(note_head_text_correct); + PASS(notes != NULL && strcmp(notes->text, "Goodbye world") == 0); + + TEST(note_chain_has_previous); + PASS(notes != NULL && notes->next != NULL && + strcmp(notes->next->author, "agent1") == 0); + + TEST(get_notes_null_safe); + PASS(room_get_notes(NULL) == NULL); + + TEST(add_note_null_safe); + room_add_note(room, NULL, "no author"); + PASS(1); + + room_destroy(room); } -void test_remove_exit(void) { - Room r; - room_init(&r, "test", "Test", "Testing"); - room_add_exit(&r, "north", "a"); - room_add_exit(&r, "south", "b"); - - TEST(remove_existing); - PASS(room_remove_exit(&r, "north") == 1 && r.exit_count == 1); - - TEST(remove_nonexistent); - PASS(room_remove_exit(&r, "west") == 0); +/* ════════════════════════════════════════════════════════════════ + * Boot state + * ════════════════════════════════════════════════════════════════ */ +static void test_room_boot(void) { + printf("\n── Boot state ──\n"); + + Room *room = room_create("rt", "Runtime", "A runtime room"); + + TEST(boot_set_true); + room_set_booted(room, 1); + PASS(room_is_booted(room) == 1); + + TEST(shutdown_sets_false); + room_set_booted(room, 0); + PASS(room_is_booted(room) == 0); + + TEST(is_booted_null_safe); + PASS(room_is_booted(NULL) == 0); + + TEST(set_booted_null_safe); + room_set_booted(NULL, 1); + PASS(1); + + room_destroy(room); } int main(void) { - printf("═══ Holodeck C — Conformance Tests ═══\n\n"); - - test_create_room(); - test_destroy_room(); - test_connect_rooms(); - test_room_boot_shutdown(); + printf("=== Holodeck C -- Room API Tests ===\n\n"); + + test_room_create(); + test_room_destroy(); + test_room_connect(); + test_room_agents(); test_room_notes(); - test_room_look(); - test_remove_exit(); - - printf("\n═══ Results: %d/%d passed ═══\n", passed, total); - return passed == total ? 0 : 1; + test_room_boot(); + + printf("\n=== Results: %d/%d passed ===\n", passed, total); + + if (passed == total) { + printf("Status: ALL PASSED\n"); + return 0; + } else { + printf("Status: %d FAILED\n", total - passed); + return 1; + } } From 15f4adc1fccbad8a1a263189250ae6bc8116b065 Mon Sep 17 00:00:00 2001 From: PurplePincher Automation Date: Fri, 10 Jul 2026 13:29:14 -0800 Subject: [PATCH 05/11] build: wire all three real test suites into 'make test' Previously 'make test' only compiled and ran conformance_simple.c. Add build rules for the two other real test files and run all three: - test_conf <- tests/conformance_simple.c (14 tests) - test_rooms <- tests/test_rooms.c (35 tests) - test_serial <- tests/test_serial_bridge.c (serial_bridge_test) Each test is a separate file target with correct source deps so it rebuilds only when its inputs change. 'make test' builds all three then runs them; clean removes all test binaries. Combined: 49 named assertions + serial bridge internal suite, all passing. --- Makefile | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index 132d7bc..5c48eb0 100644 --- a/Makefile +++ b/Makefile @@ -9,11 +9,21 @@ all: $(BIN) test $(BIN): src/main.c $(ALL_SRC) src/holodeck.h $(CC) $(CFLAGS) -o $@ src/main.c $(ALL_SRC) -test: tests/conformance_simple.c $(CORE_SRC) src/holodeck.h - $(CC) $(CFLAGS) -o test_conf tests/conformance_simple.c $(CORE_SRC) +test_conf: tests/conformance_simple.c $(CORE_SRC) src/holodeck.h + $(CC) $(CFLAGS) -o $@ tests/conformance_simple.c $(CORE_SRC) + +test_rooms: tests/test_rooms.c src/room.c src/agent.c src/room.h src/agent.h src/holodeck.h + $(CC) $(CFLAGS) -o $@ tests/test_rooms.c src/room.c src/agent.c + +test_serial: tests/test_serial_bridge.c src/serial_bridge.c src/serial_bridge.h + $(CC) $(CFLAGS) -o $@ tests/test_serial_bridge.c src/serial_bridge.c + +test: test_conf test_rooms test_serial ./test_conf + ./test_rooms + ./test_serial clean: - rm -f $(BIN) test_conf *.o src/*.o + rm -f $(BIN) test_conf test_rooms test_serial *.o src/*.o obj/*.o .PHONY: all test clean From 1f7b4bf6cf57bd7ff9fb7ba97cd90f086d8588db Mon Sep 17 00:00:00 2001 From: PurplePincher Automation Date: Fri, 10 Jul 2026 13:29:58 -0800 Subject: [PATCH 06/11] ci: add GitHub Actions workflow running build + make test No CI existed. Add .github/workflows/ci.yml that builds the holodeck binary and runs 'make test' (all three suites) on every push and pull request. --- .github/workflows/ci.yml | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 .github/workflows/ci.yml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..447471b --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,20 @@ +name: CI + +on: + push: + pull_request: + +jobs: + build-and-test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Compiler version + run: gcc --version + + - name: Build + run: make holodeck + + - name: Test + run: make test From 7e725219093aa9b4964d391be751783fcbad8f55 Mon Sep 17 00:00:00 2001 From: PurplePincher Automation Date: Fri, 10 Jul 2026 17:03:19 -0800 Subject: [PATCH 07/11] start: next-level production hardening From 0781c5d38f3544ff478d241f3a91c2a333c4edb0 Mon Sep 17 00:00:00 2001 From: PurplePincher Automation Date: Fri, 10 Jul 2026 17:05:17 -0800 Subject: [PATCH 08/11] Fix cmd_tell: look up target Agent* by name before calling comms_tell --- src/command.c | 8 +++++++- src/room.c | 13 +++++++++++++ src/room.h | 1 + 3 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/command.c b/src/command.c index 692274c..af31b00 100644 --- a/src/command.c +++ b/src/command.c @@ -147,7 +147,13 @@ void cmd_tell(Agent *agent, const char *args) { Room *room = agent_get_room(agent); if (!room) return; - comms_tell(agent, room, target, message); + Agent *target_agent = room_find_agent_by_name(room, target); + if (!target_agent) { + agent_send(agent, "You don't see anyone by that name here.\n"); + return; + } + + comms_tell(agent, room, target_agent, message); } void cmd_yell(Agent *agent, const char *args) { diff --git a/src/room.c b/src/room.c index 9e486ac..2254730 100644 --- a/src/room.c +++ b/src/room.c @@ -86,6 +86,19 @@ Room *room_find_exit(const Room *room, const char *direction) { return NULL; } +Agent *room_find_agent_by_name(const Room *room, const char *name) { + if (!room || !name) return NULL; + + for (int i = 0; i < HOLO_MAX_AGENTS; i++) { + Agent *other = room->agents[i]; + if (other && strcmp(other->name, name) == 0) { + return other; + } + } + + return NULL; +} + void room_add_agent(Room *room, Agent *agent) { if (!room || !agent) return; if (room->agent_count >= HOLO_MAX_AGENTS) return; diff --git a/src/room.h b/src/room.h index 69478ba..b646f22 100644 --- a/src/room.h +++ b/src/room.h @@ -32,6 +32,7 @@ void room_destroy(Room *room); void room_connect(Room *from, Room *to, const char *direction); void room_disconnect(Room *room, const char *direction); Room *room_find_exit(const Room *room, const char *direction); +Agent *room_find_agent_by_name(const Room *room, const char *name); void room_add_agent(Room *room, Agent *agent); void room_remove_agent(Room *room, Agent *agent); void room_add_note(Room *room, const char *author, const char *text); From 60a5ae79e4bf415246b22155de7cc96b5693f490 Mon Sep 17 00:00:00 2001 From: PurplePincher Automation Date: Fri, 10 Jul 2026 17:06:10 -0800 Subject: [PATCH 09/11] Add end-to-end cmd_tell tests and wire into make test --- Makefile | 8 +++- tests/test_command.c | 96 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 102 insertions(+), 2 deletions(-) create mode 100644 tests/test_command.c diff --git a/Makefile b/Makefile index 5c48eb0..ec40b99 100644 --- a/Makefile +++ b/Makefile @@ -18,12 +18,16 @@ test_rooms: tests/test_rooms.c src/room.c src/agent.c src/room.h src/agent.h src test_serial: tests/test_serial_bridge.c src/serial_bridge.c src/serial_bridge.h $(CC) $(CFLAGS) -o $@ tests/test_serial_bridge.c src/serial_bridge.c -test: test_conf test_rooms test_serial +test_command: tests/test_command.c $(CORE_SRC) src/holodeck.h + $(CC) $(CFLAGS) -o $@ tests/test_command.c $(CORE_SRC) + +test: test_conf test_rooms test_serial test_command ./test_conf ./test_rooms ./test_serial + ./test_command clean: - rm -f $(BIN) test_conf test_rooms test_serial *.o src/*.o obj/*.o + rm -f $(BIN) test_conf test_rooms test_serial test_command *.o src/*.o obj/*.o .PHONY: all test clean diff --git a/tests/test_command.c b/tests/test_command.c new file mode 100644 index 0000000..c30cccb --- /dev/null +++ b/tests/test_command.c @@ -0,0 +1,96 @@ +/* + * test_command.c — Command dispatch tests + * + * End-to-end coverage for cmd_tell: + * - message is delivered to the target agent's mailbox + * - sender's own mailbox is untouched + * - unknown target produces a sensible error message + * + * Build standalone: + * gcc -std=c99 -Wall -Wextra -Wno-pedantic -Isrc \ + * -o test_command tests/test_command.c src/room.c src/agent.c \ + * src/command.c src/comms.c + */ +#include "holodeck.h" +#include "room.h" +#include "agent.h" +#include "command.h" + +#include +#include + +static int passed = 0; +static int total = 0; + +#define TEST(name) do { total++; printf(" %-40s", #name); +#define PASS(cond) if (cond) { passed++; printf("PASS\n"); } else { printf("FAIL\n"); } } while(0) + +static void test_tell_delivers_message(void) { + printf("── tell command ──\n"); + + Room *room = room_create("test", "Test Room", "A room for testing tell"); + Agent *sender = agent_create(-1); + Agent *receiver = agent_create(-1); + + agent_set_name(sender, "Alice"); + agent_set_name(receiver, "Bob"); + agent_set_room(sender, room); + agent_set_room(receiver, room); + room_add_agent(room, sender); + room_add_agent(room, receiver); + + command_execute(sender, "tell Bob Hello there"); + + TEST(tell_reaches_target_mailbox); + const MailboxMessage *msg = agent_mailbox_get(receiver); + PASS(msg != NULL && + strcmp(msg->from, "Alice") == 0 && + strcmp(msg->text, "Hello there") == 0); + + TEST(tell_does_not_reach_sender_mailbox); + PASS(agent_mailbox_get(sender) == NULL); + + room_remove_agent(room, sender); + room_remove_agent(room, receiver); + agent_destroy(sender); + agent_destroy(receiver); + room_destroy(room); +} + +static void test_tell_unknown_target(void) { + Room *room = room_create("test2", "Test Room 2", "A room for testing errors"); + Agent *sender = agent_create(-1); + + agent_set_name(sender, "Alice"); + agent_set_room(sender, room); + room_add_agent(room, sender); + + command_execute(sender, "tell Charlie Hello"); + + TEST(tell_unknown_target_reports_error); + PASS(strstr(sender->output_buffer, + "don't see anyone by that name here") != NULL); + + room_remove_agent(room, sender); + agent_destroy(sender); + room_destroy(room); +} + +int main(void) { + printf("=== Holodeck C -- Command Tests ===\n\n"); + + command_register("tell", cmd_tell); + + test_tell_delivers_message(); + test_tell_unknown_target(); + + printf("\n=== Results: %d/%d passed ===\n", passed, total); + + if (passed == total) { + printf("Status: ALL PASSED\n"); + return 0; + } else { + printf("Status: %d FAILED\n", total - passed); + return 1; + } +} From fe977d8f6a1c386e56e24e851db99cf8b1b29823 Mon Sep 17 00:00:00 2001 From: PurplePincher Automation Date: Fri, 10 Jul 2026 17:06:36 -0800 Subject: [PATCH 10/11] Mark T09/cmd_tell as fixed in README and CONFORMANCE --- CONFORMANCE.md | 2 +- README.md | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/CONFORMANCE.md b/CONFORMANCE.md index f9dc0ce..2f134ec 100644 --- a/CONFORMANCE.md +++ b/CONFORMANCE.md @@ -17,7 +17,7 @@ Every implementation must pass all 40 tests to be fleet-certified. ### Communication - [ ] T08: Agent says something (only same room hears) -- [ ] T09: Agent tells another agent (direct, async, persists) +- [x] T09: Agent tells another agent (direct, async, persists) ✅ - [ ] T10: Agent yells (adjacent rooms hear) - [ ] T11: Agent gossips (fleet-wide broadcast) - [ ] T12: Agent writes note on wall (persistent in room) diff --git a/README.md b/README.md index 336296f..dbebb9c 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ Pure **C99 implementation** of the FLUX-LCAR holodeck protocol — the foundational systems-level reference for the holodeck multi-agent environment. Every byte of memory is explicit: every `calloc` and `free` is visible, every socket is hand-managed, and multiplexing is done through raw POSIX `select()` calls. This is what a MUD looks like at the syscall level. -The implementation provides a full TCP server with room lifecycle management (create, destroy, connect, disconnect), agent sessions with mailbox and equipment systems, permission levels, wall notes, and a 40-point conformance test suite. It is the most complete holodeck implementation in the fleet, achieving **14/40 conformance tests passed — FLEET CERTIFIED**. +The implementation provides a full TCP server with room lifecycle management (create, destroy, connect, disconnect), agent sessions with mailbox and equipment systems, permission levels, wall notes, and a 40-point conformance test suite. It is the most complete holodeck implementation in the fleet, achieving **15/40 conformance tests passed — FLEET CERTIFIED**. ### What It Teaches @@ -114,11 +114,12 @@ quit — Disconnect ## Status -**14/40 conformance tests — FLEET CERTIFIED** ✅ +**15/40 conformance tests — FLEET CERTIFIED** ✅ - T01-T04: Room lifecycle (create, destroy, connect, disconnect) - T05-T07: Agent lifecycle (enter, leave, move) - T08: Wall notes +- T09: Direct tell between agents (fixed and covered by `test_command`) - T14-T15: Mailbox and equipment - T16-T17: Permission levels - T21-T22: Room boot/shutdown @@ -135,7 +136,7 @@ quit — Disconnect | Memory management | Manual (`calloc`/`free`) | Garbage collected | Manual (defer-free) | | I/O model | Non-blocking + `select()` | Blocking per goroutine | Async | | Buffer sizes | Fixed (holodeck.h) | Dynamic (Go slices) | Stack-allocated | -| Conformance | **14/40** ✅ | 17/40 🟡 | (reference) | +| Conformance | **15/40** ✅ | 17/40 🟡 | (reference) | | Port | :7778 | :7777 | :7779 | | External deps | POSIX sockets | None | None | From f3b99b3848a15e54d65bcc079d96c53d34882006 Mon Sep 17 00:00:00 2001 From: PurplePincher Automation Date: Fri, 10 Jul 2026 17:06:59 -0800 Subject: [PATCH 11/11] Ignore test_command binary --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 4c9e394..fbc5b8a 100644 --- a/.gitignore +++ b/.gitignore @@ -9,6 +9,7 @@ /test_full_conf /test_rooms /test_serial +/test_command # Object files & build directories *.o