mirror of
https://github.com/cliffe/BreakEscape.git
synced 2026-02-21 11:18:08 +00:00
- Move scenarios from app/assets/scenarios/ to scenarios/ - Update Mission model to use BreakEscape::Engine.root instead of Rails.root - Update seeds.rb to use engine root for scenario discovery - Update tests to use engine root for path assertions This ensures scenarios are found correctly in both mounted (Hacktivity) and standalone (test) environments. All 12 tests now passing with 19 assertions!
249 KiB
249 KiB
Generating image variants require the image_processing gem. Please add `gem "image_processing", "~> 1.2"` to your Gemfile or set `config.active_storage.variant_processor = :disabled`.
(3.4ms) CREATE TABLE "schema_migrations" ("version" varchar NOT NULL PRIMARY KEY)
(0.2ms) CREATE TABLE "ar_internal_metadata" ("key" varchar NOT NULL PRIMARY KEY, "value" varchar, "created_at" datetime(6) NOT NULL, "updated_at" datetime(6) NOT NULL)
ActiveRecord::SchemaMigration Load (0.3ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
Generating image variants require the image_processing gem. Please add `gem "image_processing", "~> 1.2"` to your Gemfile or set `config.active_storage.variant_processor = :disabled`.
ActiveRecord::InternalMetadata Load (0.6ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = ? ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 [[nil, "environment"]]
ActiveRecord::InternalMetadata Create (5.2ms) INSERT INTO "ar_internal_metadata" ("key", "value", "created_at", "updated_at") VALUES ('environment', 'test', '2025-11-20 17:13:54.117520', '2025-11-20 17:13:54.117523') RETURNING "key"
ActiveRecord::SchemaMigration Load (0.2ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
Migrating to CreateBreakEscapeMissions (20251120155357)
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.6ms) CREATE TABLE "break_escape_missions" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "name" varchar NOT NULL, "display_name" varchar NOT NULL, "description" text, "published" boolean DEFAULT FALSE NOT NULL, "difficulty_level" integer DEFAULT 1 NOT NULL, "created_at" datetime(6) NOT NULL, "updated_at" datetime(6) NOT NULL)
(0.1ms) CREATE UNIQUE INDEX "index_break_escape_missions_on_name" ON "break_escape_missions" ("name")
(0.1ms) CREATE INDEX "index_break_escape_missions_on_published" ON "break_escape_missions" ("published")
ActiveRecord::SchemaMigration Create (0.1ms) INSERT INTO "schema_migrations" ("version") VALUES ('20251120155357') RETURNING "version"
TRANSACTION (0.1ms) COMMIT TRANSACTION
Migrating to CreateBreakEscapeGames (20251120155358)
Generating image variants require the image_processing gem. Please add `gem "image_processing", "~> 1.2"` to your Gemfile or set `config.active_storage.variant_processor = :disabled`.
ActiveRecord::SchemaMigration Load (0.4ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
ActiveRecord::InternalMetadata Load (0.2ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = ? ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 [[nil, "environment"]]
ActiveRecord::SchemaMigration Load (0.0ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
ActiveRecord::InternalMetadata Load (0.1ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = ? ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 [[nil, "environment"]]
ActiveRecord::SchemaMigration Load (0.1ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
ActiveRecord::InternalMetadata Load (0.1ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = ? ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 [[nil, "environment"]]
ActiveRecord::InternalMetadata Load (0.1ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = ? ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 [[nil, "environment"]]
ActiveRecord::SchemaMigration Load (0.0ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
Migrating to CreateBreakEscapeGames (20251120155358)
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.4ms) CREATE TABLE "break_escape_games" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "player_type" varchar NOT NULL, "player_id" integer NOT NULL, "mission_id" integer NOT NULL, "scenario_data" json NOT NULL, "player_state" json DEFAULT '"{\"currentRoom\":null,\"unlockedRooms\":[],\"unlockedObjects\":[],\"inventory\":[],\"encounteredNPCs\":[],\"globalVariables\":{},\"biometricSamples\":[],\"biometricUnlocks\":[],\"bluetoothDevices\":[],\"notes\":[],\"health\":100}"' NOT NULL, "status" varchar DEFAULT 'in_progress' NOT NULL, "started_at" datetime(6), "completed_at" datetime(6), "score" integer DEFAULT 0 NOT NULL, "created_at" datetime(6) NOT NULL, "updated_at" datetime(6) NOT NULL, CONSTRAINT "fk_rails_ce758a8dd4"
FOREIGN KEY ("mission_id")
REFERENCES "break_escape_missions" ("id")
)
(0.1ms) CREATE INDEX "index_break_escape_games_on_player" ON "break_escape_games" ("player_type", "player_id")
(0.1ms) CREATE INDEX "index_break_escape_games_on_mission_id" ON "break_escape_games" ("mission_id")
(0.1ms) CREATE UNIQUE INDEX "index_games_on_player_and_mission" ON "break_escape_games" ("player_type", "player_id", "mission_id")
(0.1ms) CREATE INDEX "index_break_escape_games_on_status" ON "break_escape_games" ("status")
ActiveRecord::SchemaMigration Create (0.1ms) INSERT INTO "schema_migrations" ("version") VALUES ('20251120155358') RETURNING "version"
TRANSACTION (5.3ms) COMMIT TRANSACTION
Migrating to CreateBreakEscapeDemoUsers (20251120160000)
TRANSACTION (0.0ms) BEGIN immediate TRANSACTION
(0.3ms) CREATE TABLE "break_escape_demo_users" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "handle" varchar NOT NULL, "role" varchar DEFAULT 'user' NOT NULL, "created_at" datetime(6) NOT NULL, "updated_at" datetime(6) NOT NULL)
(0.2ms) CREATE UNIQUE INDEX "index_break_escape_demo_users_on_handle" ON "break_escape_demo_users" ("handle")
ActiveRecord::SchemaMigration Create (0.1ms) INSERT INTO "schema_migrations" ("version") VALUES ('20251120160000') RETURNING "version"
TRANSACTION (0.1ms) COMMIT TRANSACTION
ActiveRecord::SchemaMigration Load (0.1ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
Generating image variants require the image_processing gem. Please add `gem "image_processing", "~> 1.2"` to your Gemfile or set `config.active_storage.variant_processor = :disabled`.
Generating image variants require the image_processing gem. Please add `gem "image_processing", "~> 1.2"` to your Gemfile or set `config.active_storage.variant_processor = :disabled`.
(1.2ms) DROP TABLE IF EXISTS "break_escape_demo_users"
(3.7ms) CREATE TABLE "break_escape_demo_users" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "created_at" datetime(6) NOT NULL, "handle" varchar NOT NULL, "role" varchar DEFAULT 'user' NOT NULL, "updated_at" datetime(6) NOT NULL)
(0.2ms) CREATE UNIQUE INDEX "index_break_escape_demo_users_on_handle" ON "break_escape_demo_users" ("handle")
(0.1ms) DROP TABLE IF EXISTS "break_escape_games"
(0.3ms) CREATE TABLE "break_escape_games" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "completed_at" datetime(6), "created_at" datetime(6) NOT NULL, "mission_id" integer NOT NULL, "player_id" integer NOT NULL, "player_state" json DEFAULT '"{\"currentRoom\":null,\"unlockedRooms\":[],\"unlockedObjects\":[],\"inventory\":[],\"encounteredNPCs\":[],\"globalVariables\":{},\"biometricSamples\":[],\"biometricUnlocks\":[],\"bluetoothDevices\":[],\"notes\":[],\"health\":100}"' NOT NULL, "player_type" varchar NOT NULL, "scenario_data" json NOT NULL, "score" integer DEFAULT 0 NOT NULL, "started_at" datetime(6), "status" varchar DEFAULT 'in_progress' NOT NULL, "updated_at" datetime(6) NOT NULL)
(0.2ms) CREATE INDEX "index_break_escape_games_on_mission_id" ON "break_escape_games" ("mission_id")
(0.3ms) CREATE UNIQUE INDEX "index_games_on_player_and_mission" ON "break_escape_games" ("player_type", "player_id", "mission_id")
(0.2ms) CREATE INDEX "index_break_escape_games_on_player" ON "break_escape_games" ("player_type", "player_id")
(0.2ms) CREATE INDEX "index_break_escape_games_on_status" ON "break_escape_games" ("status")
(0.1ms) DROP TABLE IF EXISTS "break_escape_missions"
(0.3ms) CREATE TABLE "break_escape_missions" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "created_at" datetime(6) NOT NULL, "description" text, "difficulty_level" integer DEFAULT 1 NOT NULL, "display_name" varchar NOT NULL, "name" varchar NOT NULL, "published" boolean DEFAULT FALSE NOT NULL, "updated_at" datetime(6) NOT NULL)
(0.3ms) CREATE UNIQUE INDEX "index_break_escape_missions_on_name" ON "break_escape_missions" ("name")
(0.2ms) CREATE INDEX "index_break_escape_missions_on_published" ON "break_escape_missions" ("published")
(0.1ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.2ms) CREATE TEMPORARY TABLE "abreak_escape_games" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "completed_at" datetime(6), "created_at" datetime(6) NOT NULL, "mission_id" integer NOT NULL, "player_id" integer NOT NULL, "player_state" json DEFAULT '"{\"currentRoom\":null,\"unlockedRooms\":[],\"unlockedObjects\":[],\"inventory\":[],\"encounteredNPCs\":[],\"globalVariables\":{},\"biometricSamples\":[],\"biometricUnlocks\":[],\"bluetoothDevices\":[],\"notes\":[],\"health\":100}"' NOT NULL, "player_type" varchar NOT NULL, "scenario_data" json NOT NULL, "score" integer DEFAULT 0 NOT NULL, "started_at" datetime(6), "status" varchar DEFAULT 'in_progress' NOT NULL, "updated_at" datetime(6) NOT NULL)
(0.1ms) CREATE INDEX "tindex_abreak_escape_games_on_status" ON "abreak_escape_games" ("status")
(0.1ms) CREATE INDEX "tindex_abreak_escape_games_on_player" ON "abreak_escape_games" ("player_type", "player_id")
(0.1ms) CREATE UNIQUE INDEX "tindex_games_on_player_and_mission" ON "abreak_escape_games" ("player_type", "player_id", "mission_id")
(0.1ms) CREATE INDEX "tindex_abreak_escape_games_on_mission_id" ON "abreak_escape_games" ("mission_id")
SQL (0.4ms) INSERT INTO "abreak_escape_games" ("id","completed_at","created_at","mission_id","player_id","player_state","player_type","scenario_data","score","started_at","status","updated_at")
SELECT "id","completed_at","created_at","mission_id","player_id","player_state","player_type","scenario_data","score","started_at","status","updated_at" FROM "break_escape_games"
(0.4ms) DROP TABLE "break_escape_games"
(0.2ms) CREATE TABLE "break_escape_games" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "completed_at" datetime(6), "created_at" datetime(6) NOT NULL, "mission_id" integer NOT NULL, "player_id" integer NOT NULL, "player_state" json DEFAULT '"{\"currentRoom\":null,\"unlockedRooms\":[],\"unlockedObjects\":[],\"inventory\":[],\"encounteredNPCs\":[],\"globalVariables\":{},\"biometricSamples\":[],\"biometricUnlocks\":[],\"bluetoothDevices\":[],\"notes\":[],\"health\":100}"' NOT NULL, "player_type" varchar NOT NULL, "scenario_data" json NOT NULL, "score" integer DEFAULT 0 NOT NULL, "started_at" datetime(6), "status" varchar DEFAULT 'in_progress' NOT NULL, "updated_at" datetime(6) NOT NULL, CONSTRAINT "fk_rails_ce758a8dd4"
FOREIGN KEY ("mission_id")
REFERENCES "break_escape_missions" ("id")
)
(0.1ms) CREATE INDEX "index_break_escape_games_on_mission_id" ON "break_escape_games" ("mission_id")
(0.1ms) CREATE UNIQUE INDEX "index_games_on_player_and_mission" ON "break_escape_games" ("player_type", "player_id", "mission_id")
(0.1ms) CREATE INDEX "index_break_escape_games_on_player" ON "break_escape_games" ("player_type", "player_id")
(0.1ms) CREATE INDEX "index_break_escape_games_on_status" ON "break_escape_games" ("status")
SQL (0.1ms) INSERT INTO "break_escape_games" ("id","completed_at","created_at","mission_id","player_id","player_state","player_type","scenario_data","score","started_at","status","updated_at")
SELECT "id","completed_at","created_at","mission_id","player_id","player_state","player_type","scenario_data","score","started_at","status","updated_at" FROM "abreak_escape_games"
(0.2ms) DROP TABLE "abreak_escape_games"
TRANSACTION (0.2ms) COMMIT TRANSACTION
(0.1ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
(0.2ms) CREATE TABLE "schema_migrations" ("version" varchar NOT NULL PRIMARY KEY)
ActiveRecord::SchemaMigration Load (0.2ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
(0.2ms) INSERT INTO "schema_migrations" (version) VALUES (20251120160000)
(0.1ms) INSERT INTO "schema_migrations" (version) VALUES
(20251120155358),
(20251120155357);
(0.3ms) CREATE TABLE "ar_internal_metadata" ("key" varchar NOT NULL PRIMARY KEY, "value" varchar, "created_at" datetime(6) NOT NULL, "updated_at" datetime(6) NOT NULL)
ActiveRecord::InternalMetadata Load (0.1ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = ? ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 [[nil, "environment"]]
ActiveRecord::InternalMetadata Create (0.3ms) INSERT INTO "ar_internal_metadata" ("key", "value", "created_at", "updated_at") VALUES ('environment', 'test', '2025-11-20 17:15:26.896212', '2025-11-20 17:15:26.896218') RETURNING "key"
ActiveRecord::InternalMetadata Load (0.1ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = ? ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 [[nil, "environment"]]
ActiveRecord::InternalMetadata Load (0.1ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = ? ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 [[nil, "schema_sha1"]]
ActiveRecord::InternalMetadata Create (0.3ms) INSERT INTO "ar_internal_metadata" ("key", "value", "created_at", "updated_at") VALUES ('schema_sha1', '33181f3d58f9bab484a9b348ce1e6b298e81ba9b', '2025-11-20 17:15:26.897909', '2025-11-20 17:15:26.897911') RETURNING "key"
ActiveRecord::SchemaMigration Load (0.6ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.5ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.4ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_games";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (149617800, '2025-11-20 17:15:27.433387', 'test_user', 'user', '2025-11-20 17:15:27.433387'), (618102942, '2025-11-20 17:15:27.433387', 'other_user', 'user', '2025-11-20 17:15:27.433387');
INSERT INTO "break_escape_games" ("id", "completed_at", "created_at", "mission_id", "player_id", "player_state", "player_type", "scenario_data", "score", "started_at", "status", "updated_at") VALUES (223060831, NULL, '2025-11-20 17:15:27.438207', 418560898, 149617800, '{"currentRoom":"reception","unlockedRooms":["reception"]}', 'BreakEscape::DemoUser', '{"startRoom":"reception","rooms":{}}', 0, NULL, 'in_progress', '2025-11-20 17:15:27.438207');
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (418560898, '2025-11-20 17:15:27.442020', 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, '2025-11-20 17:15:27.442020'), (636030761, '2025-11-20 17:15:27.442020', 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, '2025-11-20 17:15:27.442020')
(0.1ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (4.9ms) COMMIT TRANSACTION
(0.1ms) PRAGMA foreign_key_check
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
---------------------------------------------------------------
BreakEscape::MissionTest: test_should_validate_presence_of_name
---------------------------------------------------------------
BreakEscape::Mission Exists? (0.3ms) SELECT 1 AS one FROM "break_escape_missions" WHERE "break_escape_missions"."name" IS NULL LIMIT ? [["LIMIT", 1]]
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
------------------------------------------------------------------------------
BreakEscape::MissionTest: test_published_scope_returns_only_published_missions
------------------------------------------------------------------------------
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
-----------------------------------------------------------------
BreakEscape::MissionTest: test_scenario_path_returns_correct_path
-----------------------------------------------------------------
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
-----------------------------------------------------------------
BreakEscape::MissionTest: test_should_validate_uniqueness_of_name
-----------------------------------------------------------------
TRANSACTION (0.1ms) SAVEPOINT active_record_1
BreakEscape::Mission Exists? (0.4ms) SELECT 1 AS one FROM "break_escape_missions" WHERE "break_escape_missions"."name" = ? LIMIT ? [["name", "test"], ["LIMIT", 1]]
BreakEscape::Mission Create (0.4ms) INSERT INTO "break_escape_missions" ("created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (?, ?, ?, ?, ?, ?, ?) RETURNING "id" [["created_at", "2025-11-20 17:15:27.595654"], ["description", nil], ["difficulty_level", 1], ["display_name", "Test"], ["name", "test"], ["published", 0], ["updated_at", "2025-11-20 17:15:27.595654"]]
TRANSACTION (0.1ms) RELEASE SAVEPOINT active_record_1
BreakEscape::Mission Exists? (1.8ms) SELECT 1 AS one FROM "break_escape_missions" WHERE "break_escape_missions"."name" = ? LIMIT ? [["name", "test"], ["LIMIT", 1]]
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
---------------------------------------------
BreakEscapeTest: test_it_has_a_version_number
---------------------------------------------
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
----------------------------------------------------------
BreakEscape::MissionsControllerTest: test_should_get_index
----------------------------------------------------------
Started GET "/break_escape/missions" for 127.0.0.1 at 2025-11-20 17:15:27 +0000
Processing by BreakEscape::MissionsController#index as HTML
Completed 500 Internal Server Error in 7ms (ActiveRecord: 0.0ms (0 queries, 0 cached) | GC: 0.0ms)
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
-----------------------------------------------------------------------
BreakEscape::MissionsControllerTest: test_should_show_published_mission
-----------------------------------------------------------------------
BreakEscape::Mission Load (0.3ms) SELECT "break_escape_missions".* FROM "break_escape_missions" WHERE "break_escape_missions"."id" = ? LIMIT ? [["id", 418560898], ["LIMIT", 1]]
Started GET "/break_escape/missions/418560898" for 127.0.0.1 at 2025-11-20 17:15:28 +0000
Processing by BreakEscape::MissionsController#show as HTML
Parameters: {"id"=>"418560898"}
BreakEscape::Mission Load (0.2ms) SELECT "break_escape_missions".* FROM "break_escape_missions" WHERE "break_escape_missions"."id" = ? LIMIT ? [["id", 418560898], ["LIMIT", 1]]
Completed 500 Internal Server Error in 14ms (ActiveRecord: 0.1ms (1 query, 0 cached) | GC: 10.0ms)
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
------------------------------------------------
BreakEscape::GameTest: test_should_update_health
------------------------------------------------
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
---------------------------------------------------------------
BreakEscape::GameTest: test_should_belong_to_player_and_mission
---------------------------------------------------------------
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.0ms) BEGIN deferred TRANSACTION
--------------------------------------------------
BreakEscape::GameTest: test_should_track_inventory
--------------------------------------------------
TRANSACTION (0.0ms) ROLLBACK TRANSACTION
TRANSACTION (0.0ms) BEGIN deferred TRANSACTION
-----------------------------------------------------------------
BreakEscape::GameTest: test_should_clamp_health_between_0_and_100
-----------------------------------------------------------------
TRANSACTION (0.0ms) ROLLBACK TRANSACTION
TRANSACTION (0.0ms) BEGIN deferred TRANSACTION
----------------------------------------------
BreakEscape::GameTest: test_should_unlock_room
----------------------------------------------
TRANSACTION (0.0ms) ROLLBACK TRANSACTION
Generating image variants require the image_processing gem. Please add `gem "image_processing", "~> 1.2"` to your Gemfile or set `config.active_storage.variant_processor = :disabled`.
ActiveRecord::InternalMetadata Load (0.4ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = ? ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 [[nil, "schema_sha1"]]
ActiveRecord::SchemaMigration Load (0.2ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
Generating image variants require the image_processing gem. Please add `gem "image_processing", "~> 1.2"` to your Gemfile or set `config.active_storage.variant_processor = :disabled`.
ActiveRecord::InternalMetadata Load (0.6ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = ? ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 [[nil, "schema_sha1"]]
ActiveRecord::SchemaMigration Load (0.2ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
Generating image variants require the image_processing gem. Please add `gem "image_processing", "~> 1.2"` to your Gemfile or set `config.active_storage.variant_processor = :disabled`.
ActiveRecord::InternalMetadata Load (0.6ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = ? ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 [[nil, "schema_sha1"]]
ActiveRecord::SchemaMigration Load (0.2ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.4ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.1ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.3ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_games";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, NULL, 'test_user', 'user', NULL), (NULL, NULL, 'other_user', 'user', NULL);
INSERT INTO "break_escape_games" ("id", "completed_at", "created_at", "mission_id", "player_id", "player_state", "player_type", "scenario_data", "score", "started_at", "status", "updated_at") VALUES (NULL, NULL, NULL, 418560898, 149617800, '"{\"currentRoom\": \"reception\", \"unlockedRooms\": [\"reception\"], \"unlockedObjects\": [], \"inventory\": [], \"encounteredNPCs\": [], \"globalVariables\": {}, \"biometricSamples\": [], \"biometricUnlocks\": [], \"bluetoothDevices\": [], \"notes\": [], \"health\": 100}"', 'BreakEscape::DemoUser', '"{\"startRoom\": \"reception\", \"rooms\": {}}"', 0, NULL, 'in_progress', NULL);
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, NULL, 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, NULL), (NULL, NULL, 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, NULL)
(0.0ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (0.0ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.5ms) PRAGMA foreign_keys
(0.1ms) PRAGMA defer_foreign_keys
(0.1ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.3ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_games";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, NULL, 'test_user', 'user', NULL), (NULL, NULL, 'other_user', 'user', NULL);
INSERT INTO "break_escape_games" ("id", "completed_at", "created_at", "mission_id", "player_id", "player_state", "player_type", "scenario_data", "score", "started_at", "status", "updated_at") VALUES (NULL, NULL, NULL, 418560898, 149617800, '"{\"currentRoom\": \"reception\", \"unlockedRooms\": [\"reception\"], \"unlockedObjects\": [], \"inventory\": [], \"encounteredNPCs\": [], \"globalVariables\": {}, \"biometricSamples\": [], \"biometricUnlocks\": [], \"bluetoothDevices\": [], \"notes\": [], \"health\": 100}"', 'BreakEscape::DemoUser', '"{\"startRoom\": \"reception\", \"rooms\": {}}"', 0, NULL, 'in_progress', NULL);
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, NULL, 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, NULL), (NULL, NULL, 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, NULL)
(0.1ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.5ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.3ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_games";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, NULL, 'test_user', 'user', NULL), (NULL, NULL, 'other_user', 'user', NULL);
INSERT INTO "break_escape_games" ("id", "completed_at", "created_at", "mission_id", "player_id", "player_state", "player_type", "scenario_data", "score", "started_at", "status", "updated_at") VALUES (NULL, NULL, NULL, 418560898, 149617800, '"{\"currentRoom\": \"reception\", \"unlockedRooms\": [\"reception\"], \"unlockedObjects\": [], \"inventory\": [], \"encounteredNPCs\": [], \"globalVariables\": {}, \"biometricSamples\": [], \"biometricUnlocks\": [], \"bluetoothDevices\": [], \"notes\": [], \"health\": 100}"', 'BreakEscape::DemoUser', '"{\"startRoom\": \"reception\", \"rooms\": {}}"', 0, NULL, 'in_progress', NULL);
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, NULL, 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, NULL), (NULL, NULL, 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, NULL)
(0.0ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (0.0ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.3ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.2ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_games";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, NULL, 'test_user', 'user', NULL), (NULL, NULL, 'other_user', 'user', NULL);
INSERT INTO "break_escape_games" ("id", "completed_at", "created_at", "mission_id", "player_id", "player_state", "player_type", "scenario_data", "score", "started_at", "status", "updated_at") VALUES (NULL, NULL, NULL, 418560898, 149617800, '"{\"currentRoom\": \"reception\", \"unlockedRooms\": [\"reception\"], \"unlockedObjects\": [], \"inventory\": [], \"encounteredNPCs\": [], \"globalVariables\": {}, \"biometricSamples\": [], \"biometricUnlocks\": [], \"bluetoothDevices\": [], \"notes\": [], \"health\": 100}"', 'BreakEscape::DemoUser', '"{\"startRoom\": \"reception\", \"rooms\": {}}"', 0, NULL, 'in_progress', NULL);
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, NULL, 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, NULL), (NULL, NULL, 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, NULL)
(0.1ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (0.0ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.3ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.2ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_games";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, NULL, 'test_user', 'user', NULL), (NULL, NULL, 'other_user', 'user', NULL);
INSERT INTO "break_escape_games" ("id", "completed_at", "created_at", "mission_id", "player_id", "player_state", "player_type", "scenario_data", "score", "started_at", "status", "updated_at") VALUES (NULL, NULL, NULL, 418560898, 149617800, '"{\"currentRoom\": \"reception\", \"unlockedRooms\": [\"reception\"], \"unlockedObjects\": [], \"inventory\": [], \"encounteredNPCs\": [], \"globalVariables\": {}, \"biometricSamples\": [], \"biometricUnlocks\": [], \"bluetoothDevices\": [], \"notes\": [], \"health\": 100}"', 'BreakEscape::DemoUser', '"{\"startRoom\": \"reception\", \"rooms\": {}}"', 0, NULL, 'in_progress', NULL);
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, NULL, 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, NULL), (NULL, NULL, 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, NULL)
(0.0ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (0.0ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.3ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.3ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_games";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, NULL, 'test_user', 'user', NULL), (NULL, NULL, 'other_user', 'user', NULL);
INSERT INTO "break_escape_games" ("id", "completed_at", "created_at", "mission_id", "player_id", "player_state", "player_type", "scenario_data", "score", "started_at", "status", "updated_at") VALUES (NULL, NULL, NULL, 418560898, 149617800, '"{\"currentRoom\": \"reception\", \"unlockedRooms\": [\"reception\"], \"unlockedObjects\": [], \"inventory\": [], \"encounteredNPCs\": [], \"globalVariables\": {}, \"biometricSamples\": [], \"biometricUnlocks\": [], \"bluetoothDevices\": [], \"notes\": [], \"health\": 100}"', 'BreakEscape::DemoUser', '"{\"startRoom\": \"reception\", \"rooms\": {}}"', 0, NULL, 'in_progress', NULL);
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, NULL, 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, NULL), (NULL, NULL, 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, NULL)
(0.0ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (0.0ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.2ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.2ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_games";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, NULL, 'test_user', 'user', NULL), (NULL, NULL, 'other_user', 'user', NULL);
INSERT INTO "break_escape_games" ("id", "completed_at", "created_at", "mission_id", "player_id", "player_state", "player_type", "scenario_data", "score", "started_at", "status", "updated_at") VALUES (NULL, NULL, NULL, 418560898, 149617800, '"{\"currentRoom\": \"reception\", \"unlockedRooms\": [\"reception\"], \"unlockedObjects\": [], \"inventory\": [], \"encounteredNPCs\": [], \"globalVariables\": {}, \"biometricSamples\": [], \"biometricUnlocks\": [], \"bluetoothDevices\": [], \"notes\": [], \"health\": 100}"', 'BreakEscape::DemoUser', '"{\"startRoom\": \"reception\", \"rooms\": {}}"', 0, NULL, 'in_progress', NULL);
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, NULL, 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, NULL), (NULL, NULL, 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, NULL)
(0.0ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (0.0ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.2ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.2ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_games";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, NULL, 'test_user', 'user', NULL), (NULL, NULL, 'other_user', 'user', NULL);
INSERT INTO "break_escape_games" ("id", "completed_at", "created_at", "mission_id", "player_id", "player_state", "player_type", "scenario_data", "score", "started_at", "status", "updated_at") VALUES (NULL, NULL, NULL, 418560898, 149617800, '"{\"currentRoom\": \"reception\", \"unlockedRooms\": [\"reception\"], \"unlockedObjects\": [], \"inventory\": [], \"encounteredNPCs\": [], \"globalVariables\": {}, \"biometricSamples\": [], \"biometricUnlocks\": [], \"bluetoothDevices\": [], \"notes\": [], \"health\": 100}"', 'BreakEscape::DemoUser', '"{\"startRoom\": \"reception\", \"rooms\": {}}"', 0, NULL, 'in_progress', NULL);
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, NULL, 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, NULL), (NULL, NULL, 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, NULL)
(0.1ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (0.0ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.3ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.2ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_games";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, NULL, 'test_user', 'user', NULL), (NULL, NULL, 'other_user', 'user', NULL);
INSERT INTO "break_escape_games" ("id", "completed_at", "created_at", "mission_id", "player_id", "player_state", "player_type", "scenario_data", "score", "started_at", "status", "updated_at") VALUES (NULL, NULL, NULL, 418560898, 149617800, '"{\"currentRoom\": \"reception\", \"unlockedRooms\": [\"reception\"], \"unlockedObjects\": [], \"inventory\": [], \"encounteredNPCs\": [], \"globalVariables\": {}, \"biometricSamples\": [], \"biometricUnlocks\": [], \"bluetoothDevices\": [], \"notes\": [], \"health\": 100}"', 'BreakEscape::DemoUser', '"{\"startRoom\": \"reception\", \"rooms\": {}}"', 0, NULL, 'in_progress', NULL);
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, NULL, 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, NULL), (NULL, NULL, 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, NULL)
(0.0ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (0.0ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.2ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.2ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_games";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, NULL, 'test_user', 'user', NULL), (NULL, NULL, 'other_user', 'user', NULL);
INSERT INTO "break_escape_games" ("id", "completed_at", "created_at", "mission_id", "player_id", "player_state", "player_type", "scenario_data", "score", "started_at", "status", "updated_at") VALUES (NULL, NULL, NULL, 418560898, 149617800, '"{\"currentRoom\": \"reception\", \"unlockedRooms\": [\"reception\"], \"unlockedObjects\": [], \"inventory\": [], \"encounteredNPCs\": [], \"globalVariables\": {}, \"biometricSamples\": [], \"biometricUnlocks\": [], \"bluetoothDevices\": [], \"notes\": [], \"health\": 100}"', 'BreakEscape::DemoUser', '"{\"startRoom\": \"reception\", \"rooms\": {}}"', 0, NULL, 'in_progress', NULL);
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, NULL, 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, NULL), (NULL, NULL, 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, NULL)
(0.0ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (0.0ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.3ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.2ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_games";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, NULL, 'test_user', 'user', NULL), (NULL, NULL, 'other_user', 'user', NULL);
INSERT INTO "break_escape_games" ("id", "completed_at", "created_at", "mission_id", "player_id", "player_state", "player_type", "scenario_data", "score", "started_at", "status", "updated_at") VALUES (NULL, NULL, NULL, 418560898, 149617800, '"{\"currentRoom\": \"reception\", \"unlockedRooms\": [\"reception\"], \"unlockedObjects\": [], \"inventory\": [], \"encounteredNPCs\": [], \"globalVariables\": {}, \"biometricSamples\": [], \"biometricUnlocks\": [], \"bluetoothDevices\": [], \"notes\": [], \"health\": 100}"', 'BreakEscape::DemoUser', '"{\"startRoom\": \"reception\", \"rooms\": {}}"', 0, NULL, 'in_progress', NULL);
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, NULL, 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, NULL), (NULL, NULL, 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, NULL)
(0.1ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (0.0ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.3ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.2ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_games";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, NULL, 'test_user', 'user', NULL), (NULL, NULL, 'other_user', 'user', NULL);
INSERT INTO "break_escape_games" ("id", "completed_at", "created_at", "mission_id", "player_id", "player_state", "player_type", "scenario_data", "score", "started_at", "status", "updated_at") VALUES (NULL, NULL, NULL, 418560898, 149617800, '"{\"currentRoom\": \"reception\", \"unlockedRooms\": [\"reception\"], \"unlockedObjects\": [], \"inventory\": [], \"encounteredNPCs\": [], \"globalVariables\": {}, \"biometricSamples\": [], \"biometricUnlocks\": [], \"bluetoothDevices\": [], \"notes\": [], \"health\": 100}"', 'BreakEscape::DemoUser', '"{\"startRoom\": \"reception\", \"rooms\": {}}"', 0, NULL, 'in_progress', NULL);
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, NULL, 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, NULL), (NULL, NULL, 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, NULL)
(0.0ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (0.0ms) ROLLBACK TRANSACTION
Generating image variants require the image_processing gem. Please add `gem "image_processing", "~> 1.2"` to your Gemfile or set `config.active_storage.variant_processor = :disabled`.
ActiveRecord::InternalMetadata Load (0.6ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = ? ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 [[nil, "schema_sha1"]]
ActiveRecord::SchemaMigration Load (0.3ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.4ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.2ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_games";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, '2025-11-20 17:20:11', 'test_user', 'user', '2025-11-20 17:20:11'), (NULL, '2025-11-20 17:20:11', 'other_user', 'user', '2025-11-20 17:20:11');
INSERT INTO "break_escape_games" ("id", "completed_at", "created_at", "mission_id", "player_id", "player_state", "player_type", "scenario_data", "score", "started_at", "status", "updated_at") VALUES (NULL, NULL, '2025-11-20 17:20:11', 418560898, 149617800, '"{\"currentRoom\": \"reception\", \"unlockedRooms\": [\"reception\"], \"unlockedObjects\": [], \"inventory\": [], \"encounteredNPCs\": [], \"globalVariables\": {}, \"biometricSamples\": [], \"biometricUnlocks\": [], \"bluetoothDevices\": [], \"notes\": [], \"health\": 100}"', 'BreakEscape::DemoUser', '"{\"startRoom\": \"reception\", \"rooms\": {}}"', 0, '2025-11-20 17:20:11', 'in_progress', '2025-11-20 17:20:11');
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, '2025-11-20 17:20:11', 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, '2025-11-20 17:20:11'), (NULL, '2025-11-20 17:20:11', 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, '2025-11-20 17:20:11')
(0.0ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (5.2ms) COMMIT TRANSACTION
(0.1ms) PRAGMA foreign_key_check
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.4ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.1ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.2ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_games";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, '2025-11-20 17:20:11', 'test_user', 'user', '2025-11-20 17:20:11'), (NULL, '2025-11-20 17:20:11', 'other_user', 'user', '2025-11-20 17:20:11');
INSERT INTO "break_escape_games" ("id", "completed_at", "created_at", "mission_id", "player_id", "player_state", "player_type", "scenario_data", "score", "started_at", "status", "updated_at") VALUES (NULL, NULL, '2025-11-20 17:20:11', 418560898, 149617800, '"{\"currentRoom\": \"reception\", \"unlockedRooms\": [\"reception\"], \"unlockedObjects\": [], \"inventory\": [], \"encounteredNPCs\": [], \"globalVariables\": {}, \"biometricSamples\": [], \"biometricUnlocks\": [], \"bluetoothDevices\": [], \"notes\": [], \"health\": 100}"', 'BreakEscape::DemoUser', '"{\"startRoom\": \"reception\", \"rooms\": {}}"', 0, '2025-11-20 17:20:11', 'in_progress', '2025-11-20 17:20:11');
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, '2025-11-20 17:20:11', 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, '2025-11-20 17:20:11'), (NULL, '2025-11-20 17:20:11', 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, '2025-11-20 17:20:11')
(0.0ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (0.2ms) COMMIT TRANSACTION
(0.1ms) PRAGMA foreign_key_check
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.3ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.2ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_games";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, '2025-11-20 17:20:11', 'test_user', 'user', '2025-11-20 17:20:11'), (NULL, '2025-11-20 17:20:11', 'other_user', 'user', '2025-11-20 17:20:11');
INSERT INTO "break_escape_games" ("id", "completed_at", "created_at", "mission_id", "player_id", "player_state", "player_type", "scenario_data", "score", "started_at", "status", "updated_at") VALUES (NULL, NULL, '2025-11-20 17:20:11', 418560898, 149617800, '"{\"currentRoom\": \"reception\", \"unlockedRooms\": [\"reception\"], \"unlockedObjects\": [], \"inventory\": [], \"encounteredNPCs\": [], \"globalVariables\": {}, \"biometricSamples\": [], \"biometricUnlocks\": [], \"bluetoothDevices\": [], \"notes\": [], \"health\": 100}"', 'BreakEscape::DemoUser', '"{\"startRoom\": \"reception\", \"rooms\": {}}"', 0, '2025-11-20 17:20:11', 'in_progress', '2025-11-20 17:20:11');
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, '2025-11-20 17:20:11', 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, '2025-11-20 17:20:11'), (NULL, '2025-11-20 17:20:11', 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, '2025-11-20 17:20:11')
(0.0ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (0.2ms) COMMIT TRANSACTION
(0.1ms) PRAGMA foreign_key_check
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.4ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.2ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_games";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, '2025-11-20 17:20:11', 'test_user', 'user', '2025-11-20 17:20:11'), (NULL, '2025-11-20 17:20:11', 'other_user', 'user', '2025-11-20 17:20:11');
INSERT INTO "break_escape_games" ("id", "completed_at", "created_at", "mission_id", "player_id", "player_state", "player_type", "scenario_data", "score", "started_at", "status", "updated_at") VALUES (NULL, NULL, '2025-11-20 17:20:11', 418560898, 149617800, '"{\"currentRoom\": \"reception\", \"unlockedRooms\": [\"reception\"], \"unlockedObjects\": [], \"inventory\": [], \"encounteredNPCs\": [], \"globalVariables\": {}, \"biometricSamples\": [], \"biometricUnlocks\": [], \"bluetoothDevices\": [], \"notes\": [], \"health\": 100}"', 'BreakEscape::DemoUser', '"{\"startRoom\": \"reception\", \"rooms\": {}}"', 0, '2025-11-20 17:20:11', 'in_progress', '2025-11-20 17:20:11');
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, '2025-11-20 17:20:11', 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, '2025-11-20 17:20:11'), (NULL, '2025-11-20 17:20:11', 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, '2025-11-20 17:20:11')
(0.0ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (0.2ms) COMMIT TRANSACTION
(0.1ms) PRAGMA foreign_key_check
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.5ms) PRAGMA foreign_keys
(0.1ms) PRAGMA defer_foreign_keys
(0.1ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.2ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_games";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, '2025-11-20 17:20:11', 'test_user', 'user', '2025-11-20 17:20:11'), (NULL, '2025-11-20 17:20:11', 'other_user', 'user', '2025-11-20 17:20:11');
INSERT INTO "break_escape_games" ("id", "completed_at", "created_at", "mission_id", "player_id", "player_state", "player_type", "scenario_data", "score", "started_at", "status", "updated_at") VALUES (NULL, NULL, '2025-11-20 17:20:11', 418560898, 149617800, '"{\"currentRoom\": \"reception\", \"unlockedRooms\": [\"reception\"], \"unlockedObjects\": [], \"inventory\": [], \"encounteredNPCs\": [], \"globalVariables\": {}, \"biometricSamples\": [], \"biometricUnlocks\": [], \"bluetoothDevices\": [], \"notes\": [], \"health\": 100}"', 'BreakEscape::DemoUser', '"{\"startRoom\": \"reception\", \"rooms\": {}}"', 0, '2025-11-20 17:20:11', 'in_progress', '2025-11-20 17:20:11');
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, '2025-11-20 17:20:11', 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, '2025-11-20 17:20:11'), (NULL, '2025-11-20 17:20:11', 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, '2025-11-20 17:20:11')
(0.0ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (0.2ms) COMMIT TRANSACTION
(0.1ms) PRAGMA foreign_key_check
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.4ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.2ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_games";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, '2025-11-20 17:20:11', 'test_user', 'user', '2025-11-20 17:20:11'), (NULL, '2025-11-20 17:20:11', 'other_user', 'user', '2025-11-20 17:20:11');
INSERT INTO "break_escape_games" ("id", "completed_at", "created_at", "mission_id", "player_id", "player_state", "player_type", "scenario_data", "score", "started_at", "status", "updated_at") VALUES (NULL, NULL, '2025-11-20 17:20:11', 418560898, 149617800, '"{\"currentRoom\": \"reception\", \"unlockedRooms\": [\"reception\"], \"unlockedObjects\": [], \"inventory\": [], \"encounteredNPCs\": [], \"globalVariables\": {}, \"biometricSamples\": [], \"biometricUnlocks\": [], \"bluetoothDevices\": [], \"notes\": [], \"health\": 100}"', 'BreakEscape::DemoUser', '"{\"startRoom\": \"reception\", \"rooms\": {}}"', 0, '2025-11-20 17:20:11', 'in_progress', '2025-11-20 17:20:11');
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, '2025-11-20 17:20:11', 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, '2025-11-20 17:20:11'), (NULL, '2025-11-20 17:20:11', 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, '2025-11-20 17:20:11')
(0.1ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (0.2ms) COMMIT TRANSACTION
(0.1ms) PRAGMA foreign_key_check
TRANSACTION (0.2ms) BEGIN immediate TRANSACTION
(0.5ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.2ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_games";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, '2025-11-20 17:20:11', 'test_user', 'user', '2025-11-20 17:20:11'), (NULL, '2025-11-20 17:20:11', 'other_user', 'user', '2025-11-20 17:20:11');
INSERT INTO "break_escape_games" ("id", "completed_at", "created_at", "mission_id", "player_id", "player_state", "player_type", "scenario_data", "score", "started_at", "status", "updated_at") VALUES (NULL, NULL, '2025-11-20 17:20:11', 418560898, 149617800, '"{\"currentRoom\": \"reception\", \"unlockedRooms\": [\"reception\"], \"unlockedObjects\": [], \"inventory\": [], \"encounteredNPCs\": [], \"globalVariables\": {}, \"biometricSamples\": [], \"biometricUnlocks\": [], \"bluetoothDevices\": [], \"notes\": [], \"health\": 100}"', 'BreakEscape::DemoUser', '"{\"startRoom\": \"reception\", \"rooms\": {}}"', 0, '2025-11-20 17:20:11', 'in_progress', '2025-11-20 17:20:11');
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, '2025-11-20 17:20:11', 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, '2025-11-20 17:20:11'), (NULL, '2025-11-20 17:20:11', 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, '2025-11-20 17:20:11')
(0.1ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (0.2ms) COMMIT TRANSACTION
(0.1ms) PRAGMA foreign_key_check
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.3ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.2ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_games";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, '2025-11-20 17:20:11', 'test_user', 'user', '2025-11-20 17:20:11'), (NULL, '2025-11-20 17:20:11', 'other_user', 'user', '2025-11-20 17:20:11');
INSERT INTO "break_escape_games" ("id", "completed_at", "created_at", "mission_id", "player_id", "player_state", "player_type", "scenario_data", "score", "started_at", "status", "updated_at") VALUES (NULL, NULL, '2025-11-20 17:20:11', 418560898, 149617800, '"{\"currentRoom\": \"reception\", \"unlockedRooms\": [\"reception\"], \"unlockedObjects\": [], \"inventory\": [], \"encounteredNPCs\": [], \"globalVariables\": {}, \"biometricSamples\": [], \"biometricUnlocks\": [], \"bluetoothDevices\": [], \"notes\": [], \"health\": 100}"', 'BreakEscape::DemoUser', '"{\"startRoom\": \"reception\", \"rooms\": {}}"', 0, '2025-11-20 17:20:11', 'in_progress', '2025-11-20 17:20:11');
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, '2025-11-20 17:20:11', 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, '2025-11-20 17:20:11'), (NULL, '2025-11-20 17:20:11', 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, '2025-11-20 17:20:11')
(0.0ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (0.2ms) COMMIT TRANSACTION
(0.1ms) PRAGMA foreign_key_check
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.3ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.2ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_games";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, '2025-11-20 17:20:11', 'test_user', 'user', '2025-11-20 17:20:11'), (NULL, '2025-11-20 17:20:11', 'other_user', 'user', '2025-11-20 17:20:11');
INSERT INTO "break_escape_games" ("id", "completed_at", "created_at", "mission_id", "player_id", "player_state", "player_type", "scenario_data", "score", "started_at", "status", "updated_at") VALUES (NULL, NULL, '2025-11-20 17:20:11', 418560898, 149617800, '"{\"currentRoom\": \"reception\", \"unlockedRooms\": [\"reception\"], \"unlockedObjects\": [], \"inventory\": [], \"encounteredNPCs\": [], \"globalVariables\": {}, \"biometricSamples\": [], \"biometricUnlocks\": [], \"bluetoothDevices\": [], \"notes\": [], \"health\": 100}"', 'BreakEscape::DemoUser', '"{\"startRoom\": \"reception\", \"rooms\": {}}"', 0, '2025-11-20 17:20:11', 'in_progress', '2025-11-20 17:20:11');
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, '2025-11-20 17:20:11', 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, '2025-11-20 17:20:11'), (NULL, '2025-11-20 17:20:11', 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, '2025-11-20 17:20:11')
(0.0ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (0.2ms) COMMIT TRANSACTION
(0.1ms) PRAGMA foreign_key_check
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.3ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.4ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_games";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, '2025-11-20 17:20:11', 'test_user', 'user', '2025-11-20 17:20:11'), (NULL, '2025-11-20 17:20:11', 'other_user', 'user', '2025-11-20 17:20:11');
INSERT INTO "break_escape_games" ("id", "completed_at", "created_at", "mission_id", "player_id", "player_state", "player_type", "scenario_data", "score", "started_at", "status", "updated_at") VALUES (NULL, NULL, '2025-11-20 17:20:11', 418560898, 149617800, '"{\"currentRoom\": \"reception\", \"unlockedRooms\": [\"reception\"], \"unlockedObjects\": [], \"inventory\": [], \"encounteredNPCs\": [], \"globalVariables\": {}, \"biometricSamples\": [], \"biometricUnlocks\": [], \"bluetoothDevices\": [], \"notes\": [], \"health\": 100}"', 'BreakEscape::DemoUser', '"{\"startRoom\": \"reception\", \"rooms\": {}}"', 0, '2025-11-20 17:20:11', 'in_progress', '2025-11-20 17:20:11');
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, '2025-11-20 17:20:11', 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, '2025-11-20 17:20:11'), (NULL, '2025-11-20 17:20:11', 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, '2025-11-20 17:20:11')
(0.1ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (0.2ms) COMMIT TRANSACTION
(0.1ms) PRAGMA foreign_key_check
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.3ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.1ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_games";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, '2025-11-20 17:20:11', 'test_user', 'user', '2025-11-20 17:20:11'), (NULL, '2025-11-20 17:20:11', 'other_user', 'user', '2025-11-20 17:20:11');
INSERT INTO "break_escape_games" ("id", "completed_at", "created_at", "mission_id", "player_id", "player_state", "player_type", "scenario_data", "score", "started_at", "status", "updated_at") VALUES (NULL, NULL, '2025-11-20 17:20:11', 418560898, 149617800, '"{\"currentRoom\": \"reception\", \"unlockedRooms\": [\"reception\"], \"unlockedObjects\": [], \"inventory\": [], \"encounteredNPCs\": [], \"globalVariables\": {}, \"biometricSamples\": [], \"biometricUnlocks\": [], \"bluetoothDevices\": [], \"notes\": [], \"health\": 100}"', 'BreakEscape::DemoUser', '"{\"startRoom\": \"reception\", \"rooms\": {}}"', 0, '2025-11-20 17:20:11', 'in_progress', '2025-11-20 17:20:11');
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, '2025-11-20 17:20:11', 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, '2025-11-20 17:20:11'), (NULL, '2025-11-20 17:20:11', 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, '2025-11-20 17:20:11')
(0.0ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (0.2ms) COMMIT TRANSACTION
(0.1ms) PRAGMA foreign_key_check
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.4ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.2ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_games";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, '2025-11-20 17:20:11', 'test_user', 'user', '2025-11-20 17:20:11'), (NULL, '2025-11-20 17:20:11', 'other_user', 'user', '2025-11-20 17:20:11');
INSERT INTO "break_escape_games" ("id", "completed_at", "created_at", "mission_id", "player_id", "player_state", "player_type", "scenario_data", "score", "started_at", "status", "updated_at") VALUES (NULL, NULL, '2025-11-20 17:20:11', 418560898, 149617800, '"{\"currentRoom\": \"reception\", \"unlockedRooms\": [\"reception\"], \"unlockedObjects\": [], \"inventory\": [], \"encounteredNPCs\": [], \"globalVariables\": {}, \"biometricSamples\": [], \"biometricUnlocks\": [], \"bluetoothDevices\": [], \"notes\": [], \"health\": 100}"', 'BreakEscape::DemoUser', '"{\"startRoom\": \"reception\", \"rooms\": {}}"', 0, '2025-11-20 17:20:11', 'in_progress', '2025-11-20 17:20:11');
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, '2025-11-20 17:20:11', 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, '2025-11-20 17:20:11'), (NULL, '2025-11-20 17:20:11', 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, '2025-11-20 17:20:11')
(0.0ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (0.2ms) COMMIT TRANSACTION
(0.1ms) PRAGMA foreign_key_check
Generating image variants require the image_processing gem. Please add `gem "image_processing", "~> 1.2"` to your Gemfile or set `config.active_storage.variant_processor = :disabled`.
ActiveRecord::InternalMetadata Load (0.5ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = ? ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 [[nil, "schema_sha1"]]
ActiveRecord::SchemaMigration Load (0.3ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.5ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.1ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.2ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, '2025-11-20 17:21:12', 'test_user', 'user', '2025-11-20 17:21:12'), (NULL, '2025-11-20 17:21:12', 'other_user', 'user', '2025-11-20 17:21:12');
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, '2025-11-20 17:21:12', 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, '2025-11-20 17:21:12'), (NULL, '2025-11-20 17:21:12', 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, '2025-11-20 17:21:12')
(0.0ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (5.0ms) COMMIT TRANSACTION
(0.1ms) PRAGMA foreign_key_check
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.4ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.2ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, '2025-11-20 17:21:13', 'test_user', 'user', '2025-11-20 17:21:13'), (NULL, '2025-11-20 17:21:13', 'other_user', 'user', '2025-11-20 17:21:13');
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, '2025-11-20 17:21:13', 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, '2025-11-20 17:21:13'), (NULL, '2025-11-20 17:21:13', 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, '2025-11-20 17:21:13')
(0.1ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (0.1ms) COMMIT TRANSACTION
(0.1ms) PRAGMA foreign_key_check
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.4ms) PRAGMA foreign_keys
(0.1ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.2ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, '2025-11-20 17:21:13', 'test_user', 'user', '2025-11-20 17:21:13'), (NULL, '2025-11-20 17:21:13', 'other_user', 'user', '2025-11-20 17:21:13');
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, '2025-11-20 17:21:13', 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, '2025-11-20 17:21:13'), (NULL, '2025-11-20 17:21:13', 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, '2025-11-20 17:21:13')
(0.0ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (0.2ms) COMMIT TRANSACTION
(0.1ms) PRAGMA foreign_key_check
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.2ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.2ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, '2025-11-20 17:21:13', 'test_user', 'user', '2025-11-20 17:21:13'), (NULL, '2025-11-20 17:21:13', 'other_user', 'user', '2025-11-20 17:21:13');
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, '2025-11-20 17:21:13', 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, '2025-11-20 17:21:13'), (NULL, '2025-11-20 17:21:13', 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, '2025-11-20 17:21:13')
(0.0ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (0.1ms) COMMIT TRANSACTION
(0.1ms) PRAGMA foreign_key_check
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.3ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.3ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, '2025-11-20 17:21:13', 'test_user', 'user', '2025-11-20 17:21:13'), (NULL, '2025-11-20 17:21:13', 'other_user', 'user', '2025-11-20 17:21:13');
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, '2025-11-20 17:21:13', 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, '2025-11-20 17:21:13'), (NULL, '2025-11-20 17:21:13', 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, '2025-11-20 17:21:13')
(0.0ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (0.1ms) COMMIT TRANSACTION
(0.1ms) PRAGMA foreign_key_check
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.2ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.2ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, '2025-11-20 17:21:13', 'test_user', 'user', '2025-11-20 17:21:13'), (NULL, '2025-11-20 17:21:13', 'other_user', 'user', '2025-11-20 17:21:13');
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, '2025-11-20 17:21:13', 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, '2025-11-20 17:21:13'), (NULL, '2025-11-20 17:21:13', 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, '2025-11-20 17:21:13')
(0.1ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (0.1ms) COMMIT TRANSACTION
(0.1ms) PRAGMA foreign_key_check
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.2ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.3ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, '2025-11-20 17:21:13', 'test_user', 'user', '2025-11-20 17:21:13'), (NULL, '2025-11-20 17:21:13', 'other_user', 'user', '2025-11-20 17:21:13');
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, '2025-11-20 17:21:13', 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, '2025-11-20 17:21:13'), (NULL, '2025-11-20 17:21:13', 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, '2025-11-20 17:21:13')
(0.0ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (0.1ms) COMMIT TRANSACTION
(0.1ms) PRAGMA foreign_key_check
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.2ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.1ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, '2025-11-20 17:21:13', 'test_user', 'user', '2025-11-20 17:21:13'), (NULL, '2025-11-20 17:21:13', 'other_user', 'user', '2025-11-20 17:21:13');
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, '2025-11-20 17:21:13', 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, '2025-11-20 17:21:13'), (NULL, '2025-11-20 17:21:13', 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, '2025-11-20 17:21:13')
(0.0ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (0.1ms) COMMIT TRANSACTION
(0.1ms) PRAGMA foreign_key_check
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.2ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.1ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.1ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, '2025-11-20 17:21:13', 'test_user', 'user', '2025-11-20 17:21:13'), (NULL, '2025-11-20 17:21:13', 'other_user', 'user', '2025-11-20 17:21:13');
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, '2025-11-20 17:21:13', 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, '2025-11-20 17:21:13'), (NULL, '2025-11-20 17:21:13', 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, '2025-11-20 17:21:13')
(0.0ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (0.1ms) COMMIT TRANSACTION
(0.1ms) PRAGMA foreign_key_check
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.2ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.1ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, '2025-11-20 17:21:13', 'test_user', 'user', '2025-11-20 17:21:13'), (NULL, '2025-11-20 17:21:13', 'other_user', 'user', '2025-11-20 17:21:13');
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, '2025-11-20 17:21:13', 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, '2025-11-20 17:21:13'), (NULL, '2025-11-20 17:21:13', 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, '2025-11-20 17:21:13')
(0.0ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (0.2ms) COMMIT TRANSACTION
(0.1ms) PRAGMA foreign_key_check
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.2ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.3ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, '2025-11-20 17:21:13', 'test_user', 'user', '2025-11-20 17:21:13'), (NULL, '2025-11-20 17:21:13', 'other_user', 'user', '2025-11-20 17:21:13');
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, '2025-11-20 17:21:13', 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, '2025-11-20 17:21:13'), (NULL, '2025-11-20 17:21:13', 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, '2025-11-20 17:21:13')
(0.0ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (0.1ms) COMMIT TRANSACTION
(0.1ms) PRAGMA foreign_key_check
TRANSACTION (0.0ms) BEGIN immediate TRANSACTION
(0.2ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.1ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, '2025-11-20 17:21:13', 'test_user', 'user', '2025-11-20 17:21:13'), (NULL, '2025-11-20 17:21:13', 'other_user', 'user', '2025-11-20 17:21:13');
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, '2025-11-20 17:21:13', 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, '2025-11-20 17:21:13'), (NULL, '2025-11-20 17:21:13', 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, '2025-11-20 17:21:13')
(0.0ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (0.1ms) COMMIT TRANSACTION
(0.1ms) PRAGMA foreign_key_check
Generating image variants require the image_processing gem. Please add `gem "image_processing", "~> 1.2"` to your Gemfile or set `config.active_storage.variant_processor = :disabled`.
ActiveRecord::InternalMetadata Load (0.6ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = ? ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 [[nil, "schema_sha1"]]
ActiveRecord::SchemaMigration Load (0.2ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.3ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.2ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, '2025-11-20 17:22:17', 'test_user', 'user', '2025-11-20 17:22:17'), (NULL, '2025-11-20 17:22:17', 'other_user', 'user', '2025-11-20 17:22:17');
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, '2025-11-20 17:22:17', 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, '2025-11-20 17:22:17'), (NULL, '2025-11-20 17:22:17', 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, '2025-11-20 17:22:17')
(0.0ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (5.1ms) COMMIT TRANSACTION
(0.1ms) PRAGMA foreign_key_check
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.3ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.2ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, '2025-11-20 17:22:17', 'test_user', 'user', '2025-11-20 17:22:17'), (NULL, '2025-11-20 17:22:17', 'other_user', 'user', '2025-11-20 17:22:17');
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, '2025-11-20 17:22:17', 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, '2025-11-20 17:22:17'), (NULL, '2025-11-20 17:22:17', 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, '2025-11-20 17:22:17')
(0.0ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (0.1ms) COMMIT TRANSACTION
(0.1ms) PRAGMA foreign_key_check
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.3ms) PRAGMA foreign_keys
(0.1ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.1ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, '2025-11-20 17:22:17', 'test_user', 'user', '2025-11-20 17:22:17'), (NULL, '2025-11-20 17:22:17', 'other_user', 'user', '2025-11-20 17:22:17');
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, '2025-11-20 17:22:17', 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, '2025-11-20 17:22:17'), (NULL, '2025-11-20 17:22:17', 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, '2025-11-20 17:22:17')
(0.0ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (0.1ms) COMMIT TRANSACTION
(0.1ms) PRAGMA foreign_key_check
TRANSACTION (0.0ms) BEGIN immediate TRANSACTION
(0.2ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.2ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, '2025-11-20 17:22:17', 'test_user', 'user', '2025-11-20 17:22:17'), (NULL, '2025-11-20 17:22:17', 'other_user', 'user', '2025-11-20 17:22:17');
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, '2025-11-20 17:22:17', 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, '2025-11-20 17:22:17'), (NULL, '2025-11-20 17:22:17', 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, '2025-11-20 17:22:17')
(0.0ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (0.1ms) COMMIT TRANSACTION
(0.1ms) PRAGMA foreign_key_check
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.4ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.2ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, '2025-11-20 17:22:17', 'test_user', 'user', '2025-11-20 17:22:17'), (NULL, '2025-11-20 17:22:17', 'other_user', 'user', '2025-11-20 17:22:17');
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, '2025-11-20 17:22:17', 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, '2025-11-20 17:22:17'), (NULL, '2025-11-20 17:22:17', 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, '2025-11-20 17:22:17')
(0.0ms) PRAGMA defer_foreign_keys = 0
(0.1ms) PRAGMA foreign_keys = 1
TRANSACTION (0.1ms) COMMIT TRANSACTION
(0.1ms) PRAGMA foreign_key_check
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.4ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.1ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.2ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, '2025-11-20 17:22:18', 'test_user', 'user', '2025-11-20 17:22:18'), (NULL, '2025-11-20 17:22:18', 'other_user', 'user', '2025-11-20 17:22:18');
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, '2025-11-20 17:22:18', 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, '2025-11-20 17:22:18'), (NULL, '2025-11-20 17:22:18', 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, '2025-11-20 17:22:18')
(0.0ms) PRAGMA defer_foreign_keys = 0
(0.1ms) PRAGMA foreign_keys = 1
TRANSACTION (0.2ms) COMMIT TRANSACTION
(0.1ms) PRAGMA foreign_key_check
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.3ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.2ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, '2025-11-20 17:22:18', 'test_user', 'user', '2025-11-20 17:22:18'), (NULL, '2025-11-20 17:22:18', 'other_user', 'user', '2025-11-20 17:22:18');
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, '2025-11-20 17:22:18', 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, '2025-11-20 17:22:18'), (NULL, '2025-11-20 17:22:18', 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, '2025-11-20 17:22:18')
(0.0ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (0.1ms) COMMIT TRANSACTION
(0.1ms) PRAGMA foreign_key_check
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.2ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.4ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, '2025-11-20 17:22:18', 'test_user', 'user', '2025-11-20 17:22:18'), (NULL, '2025-11-20 17:22:18', 'other_user', 'user', '2025-11-20 17:22:18');
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, '2025-11-20 17:22:18', 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, '2025-11-20 17:22:18'), (NULL, '2025-11-20 17:22:18', 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, '2025-11-20 17:22:18')
(0.0ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (0.1ms) COMMIT TRANSACTION
(0.1ms) PRAGMA foreign_key_check
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.2ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.1ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, '2025-11-20 17:22:18', 'test_user', 'user', '2025-11-20 17:22:18'), (NULL, '2025-11-20 17:22:18', 'other_user', 'user', '2025-11-20 17:22:18');
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, '2025-11-20 17:22:18', 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, '2025-11-20 17:22:18'), (NULL, '2025-11-20 17:22:18', 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, '2025-11-20 17:22:18')
(0.0ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (0.1ms) COMMIT TRANSACTION
(0.1ms) PRAGMA foreign_key_check
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.3ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.1ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, '2025-11-20 17:22:18', 'test_user', 'user', '2025-11-20 17:22:18'), (NULL, '2025-11-20 17:22:18', 'other_user', 'user', '2025-11-20 17:22:18');
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, '2025-11-20 17:22:18', 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, '2025-11-20 17:22:18'), (NULL, '2025-11-20 17:22:18', 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, '2025-11-20 17:22:18')
(0.1ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (0.1ms) COMMIT TRANSACTION
(0.1ms) PRAGMA foreign_key_check
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.2ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.1ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, '2025-11-20 17:22:18', 'test_user', 'user', '2025-11-20 17:22:18'), (NULL, '2025-11-20 17:22:18', 'other_user', 'user', '2025-11-20 17:22:18');
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, '2025-11-20 17:22:18', 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, '2025-11-20 17:22:18'), (NULL, '2025-11-20 17:22:18', 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, '2025-11-20 17:22:18')
(0.0ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (0.1ms) COMMIT TRANSACTION
(0.1ms) PRAGMA foreign_key_check
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.3ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.1ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, '2025-11-20 17:22:18', 'test_user', 'user', '2025-11-20 17:22:18'), (NULL, '2025-11-20 17:22:18', 'other_user', 'user', '2025-11-20 17:22:18');
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, '2025-11-20 17:22:18', 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, '2025-11-20 17:22:18'), (NULL, '2025-11-20 17:22:18', 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, '2025-11-20 17:22:18')
(0.0ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (0.1ms) COMMIT TRANSACTION
(0.1ms) PRAGMA foreign_key_check
Generating image variants require the image_processing gem. Please add `gem "image_processing", "~> 1.2"` to your Gemfile or set `config.active_storage.variant_processor = :disabled`.
ActiveRecord::SchemaMigration Load (0.5ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
ActiveRecord::InternalMetadata Load (0.2ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = ? ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 [[nil, "environment"]]
ActiveRecord::SchemaMigration Load (0.1ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
ActiveRecord::InternalMetadata Load (0.1ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = ? ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 [[nil, "environment"]]
ActiveRecord::SchemaMigration Load (0.1ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
ActiveRecord::InternalMetadata Load (0.1ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = ? ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 [[nil, "environment"]]
(4.9ms) DROP TABLE IF EXISTS "break_escape_demo_users"
(0.2ms) CREATE TABLE "break_escape_demo_users" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "created_at" datetime(6) NOT NULL, "handle" varchar NOT NULL, "role" varchar DEFAULT 'user' NOT NULL, "updated_at" datetime(6) NOT NULL)
(0.2ms) CREATE UNIQUE INDEX "index_break_escape_demo_users_on_handle" ON "break_escape_demo_users" ("handle")
(0.4ms) DROP TABLE IF EXISTS "break_escape_games"
(0.2ms) CREATE TABLE "break_escape_games" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "completed_at" datetime(6), "created_at" datetime(6) NOT NULL, "mission_id" integer NOT NULL, "player_id" integer NOT NULL, "player_state" json DEFAULT '"{\"currentRoom\":null,\"unlockedRooms\":[],\"unlockedObjects\":[],\"inventory\":[],\"encounteredNPCs\":[],\"globalVariables\":{},\"biometricSamples\":[],\"biometricUnlocks\":[],\"bluetoothDevices\":[],\"notes\":[],\"health\":100}"' NOT NULL, "player_type" varchar NOT NULL, "scenario_data" json NOT NULL, "score" integer DEFAULT 0 NOT NULL, "started_at" datetime(6), "status" varchar DEFAULT 'in_progress' NOT NULL, "updated_at" datetime(6) NOT NULL)
(0.1ms) CREATE INDEX "index_break_escape_games_on_mission_id" ON "break_escape_games" ("mission_id")
(0.1ms) CREATE UNIQUE INDEX "index_games_on_player_and_mission" ON "break_escape_games" ("player_type", "player_id", "mission_id")
(0.1ms) CREATE INDEX "index_break_escape_games_on_player" ON "break_escape_games" ("player_type", "player_id")
(0.1ms) CREATE INDEX "index_break_escape_games_on_status" ON "break_escape_games" ("status")
(0.2ms) DROP TABLE IF EXISTS "break_escape_missions"
(0.2ms) CREATE TABLE "break_escape_missions" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "created_at" datetime(6) NOT NULL, "description" text, "difficulty_level" integer DEFAULT 1 NOT NULL, "display_name" varchar NOT NULL, "name" varchar NOT NULL, "published" boolean DEFAULT FALSE NOT NULL, "updated_at" datetime(6) NOT NULL)
(0.1ms) CREATE UNIQUE INDEX "index_break_escape_missions_on_name" ON "break_escape_missions" ("name")
(0.1ms) CREATE INDEX "index_break_escape_missions_on_published" ON "break_escape_missions" ("published")
(0.1ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
TRANSACTION (0.0ms) BEGIN immediate TRANSACTION
(0.2ms) CREATE TEMPORARY TABLE "abreak_escape_games" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "completed_at" datetime(6), "created_at" datetime(6) NOT NULL, "mission_id" integer NOT NULL, "player_id" integer NOT NULL, "player_state" json DEFAULT '"{\"currentRoom\":null,\"unlockedRooms\":[],\"unlockedObjects\":[],\"inventory\":[],\"encounteredNPCs\":[],\"globalVariables\":{},\"biometricSamples\":[],\"biometricUnlocks\":[],\"bluetoothDevices\":[],\"notes\":[],\"health\":100}"' NOT NULL, "player_type" varchar NOT NULL, "scenario_data" json NOT NULL, "score" integer DEFAULT 0 NOT NULL, "started_at" datetime(6), "status" varchar DEFAULT 'in_progress' NOT NULL, "updated_at" datetime(6) NOT NULL)
(0.1ms) CREATE INDEX "tindex_abreak_escape_games_on_status" ON "abreak_escape_games" ("status")
(0.1ms) CREATE INDEX "tindex_abreak_escape_games_on_player" ON "abreak_escape_games" ("player_type", "player_id")
(0.1ms) CREATE UNIQUE INDEX "tindex_games_on_player_and_mission" ON "abreak_escape_games" ("player_type", "player_id", "mission_id")
(0.1ms) CREATE INDEX "tindex_abreak_escape_games_on_mission_id" ON "abreak_escape_games" ("mission_id")
SQL (0.1ms) INSERT INTO "abreak_escape_games" ("id","completed_at","created_at","mission_id","player_id","player_state","player_type","scenario_data","score","started_at","status","updated_at")
SELECT "id","completed_at","created_at","mission_id","player_id","player_state","player_type","scenario_data","score","started_at","status","updated_at" FROM "break_escape_games"
(0.2ms) DROP TABLE "break_escape_games"
(0.1ms) CREATE TABLE "break_escape_games" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "completed_at" datetime(6), "created_at" datetime(6) NOT NULL, "mission_id" integer NOT NULL, "player_id" integer NOT NULL, "player_state" json DEFAULT '"{\"currentRoom\":null,\"unlockedRooms\":[],\"unlockedObjects\":[],\"inventory\":[],\"encounteredNPCs\":[],\"globalVariables\":{},\"biometricSamples\":[],\"biometricUnlocks\":[],\"bluetoothDevices\":[],\"notes\":[],\"health\":100}"' NOT NULL, "player_type" varchar NOT NULL, "scenario_data" json NOT NULL, "score" integer DEFAULT 0 NOT NULL, "started_at" datetime(6), "status" varchar DEFAULT 'in_progress' NOT NULL, "updated_at" datetime(6) NOT NULL, CONSTRAINT "fk_rails_ce758a8dd4"
FOREIGN KEY ("mission_id")
REFERENCES "break_escape_missions" ("id")
)
(0.1ms) CREATE INDEX "index_break_escape_games_on_mission_id" ON "break_escape_games" ("mission_id")
(0.1ms) CREATE UNIQUE INDEX "index_games_on_player_and_mission" ON "break_escape_games" ("player_type", "player_id", "mission_id")
(0.1ms) CREATE INDEX "index_break_escape_games_on_player" ON "break_escape_games" ("player_type", "player_id")
(0.1ms) CREATE INDEX "index_break_escape_games_on_status" ON "break_escape_games" ("status")
SQL (0.1ms) INSERT INTO "break_escape_games" ("id","completed_at","created_at","mission_id","player_id","player_state","player_type","scenario_data","score","started_at","status","updated_at")
SELECT "id","completed_at","created_at","mission_id","player_id","player_state","player_type","scenario_data","score","started_at","status","updated_at" FROM "abreak_escape_games"
(0.1ms) DROP TABLE "abreak_escape_games"
TRANSACTION (0.2ms) COMMIT TRANSACTION
(0.0ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
ActiveRecord::SchemaMigration Load (0.1ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
ActiveRecord::InternalMetadata Load (0.1ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = ? ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 [[nil, "environment"]]
ActiveRecord::InternalMetadata Load (0.1ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = ? ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 [[nil, "environment"]]
ActiveRecord::InternalMetadata Load (0.1ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = ? ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 [[nil, "schema_sha1"]]
ActiveRecord::SchemaMigration Load (0.0ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
Generating image variants require the image_processing gem. Please add `gem "image_processing", "~> 1.2"` to your Gemfile or set `config.active_storage.variant_processor = :disabled`.
Generating image variants require the image_processing gem. Please add `gem "image_processing", "~> 1.2"` to your Gemfile or set `config.active_storage.variant_processor = :disabled`.
(1.1ms) DROP TABLE IF EXISTS "break_escape_demo_users"
(3.7ms) CREATE TABLE "break_escape_demo_users" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "created_at" datetime(6) NOT NULL, "handle" varchar NOT NULL, "role" varchar DEFAULT 'user' NOT NULL, "updated_at" datetime(6) NOT NULL)
(0.2ms) CREATE UNIQUE INDEX "index_break_escape_demo_users_on_handle" ON "break_escape_demo_users" ("handle")
(0.1ms) DROP TABLE IF EXISTS "break_escape_games"
(0.2ms) CREATE TABLE "break_escape_games" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "completed_at" datetime(6), "created_at" datetime(6) NOT NULL, "mission_id" integer NOT NULL, "player_id" integer NOT NULL, "player_state" json DEFAULT '"{\"currentRoom\":null,\"unlockedRooms\":[],\"unlockedObjects\":[],\"inventory\":[],\"encounteredNPCs\":[],\"globalVariables\":{},\"biometricSamples\":[],\"biometricUnlocks\":[],\"bluetoothDevices\":[],\"notes\":[],\"health\":100}"' NOT NULL, "player_type" varchar NOT NULL, "scenario_data" json NOT NULL, "score" integer DEFAULT 0 NOT NULL, "started_at" datetime(6), "status" varchar DEFAULT 'in_progress' NOT NULL, "updated_at" datetime(6) NOT NULL)
(0.1ms) CREATE INDEX "index_break_escape_games_on_mission_id" ON "break_escape_games" ("mission_id")
(0.1ms) CREATE UNIQUE INDEX "index_games_on_player_and_mission" ON "break_escape_games" ("player_type", "player_id", "mission_id")
(0.1ms) CREATE INDEX "index_break_escape_games_on_player" ON "break_escape_games" ("player_type", "player_id")
(0.2ms) CREATE INDEX "index_break_escape_games_on_status" ON "break_escape_games" ("status")
(0.1ms) DROP TABLE IF EXISTS "break_escape_missions"
(0.2ms) CREATE TABLE "break_escape_missions" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "created_at" datetime(6) NOT NULL, "description" text, "difficulty_level" integer DEFAULT 1 NOT NULL, "display_name" varchar NOT NULL, "name" varchar NOT NULL, "published" boolean DEFAULT FALSE NOT NULL, "updated_at" datetime(6) NOT NULL)
(0.2ms) CREATE UNIQUE INDEX "index_break_escape_missions_on_name" ON "break_escape_missions" ("name")
(0.2ms) CREATE INDEX "index_break_escape_missions_on_published" ON "break_escape_missions" ("published")
(0.0ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
TRANSACTION (0.0ms) BEGIN immediate TRANSACTION
(0.2ms) CREATE TEMPORARY TABLE "abreak_escape_games" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "completed_at" datetime(6), "created_at" datetime(6) NOT NULL, "mission_id" integer NOT NULL, "player_id" integer NOT NULL, "player_state" json DEFAULT '"{\"currentRoom\":null,\"unlockedRooms\":[],\"unlockedObjects\":[],\"inventory\":[],\"encounteredNPCs\":[],\"globalVariables\":{},\"biometricSamples\":[],\"biometricUnlocks\":[],\"bluetoothDevices\":[],\"notes\":[],\"health\":100}"' NOT NULL, "player_type" varchar NOT NULL, "scenario_data" json NOT NULL, "score" integer DEFAULT 0 NOT NULL, "started_at" datetime(6), "status" varchar DEFAULT 'in_progress' NOT NULL, "updated_at" datetime(6) NOT NULL)
(0.1ms) CREATE INDEX "tindex_abreak_escape_games_on_status" ON "abreak_escape_games" ("status")
(0.1ms) CREATE INDEX "tindex_abreak_escape_games_on_player" ON "abreak_escape_games" ("player_type", "player_id")
(0.2ms) CREATE UNIQUE INDEX "tindex_games_on_player_and_mission" ON "abreak_escape_games" ("player_type", "player_id", "mission_id")
(0.1ms) CREATE INDEX "tindex_abreak_escape_games_on_mission_id" ON "abreak_escape_games" ("mission_id")
SQL (0.2ms) INSERT INTO "abreak_escape_games" ("id","completed_at","created_at","mission_id","player_id","player_state","player_type","scenario_data","score","started_at","status","updated_at")
SELECT "id","completed_at","created_at","mission_id","player_id","player_state","player_type","scenario_data","score","started_at","status","updated_at" FROM "break_escape_games"
(0.4ms) DROP TABLE "break_escape_games"
(0.2ms) CREATE TABLE "break_escape_games" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "completed_at" datetime(6), "created_at" datetime(6) NOT NULL, "mission_id" integer NOT NULL, "player_id" integer NOT NULL, "player_state" json DEFAULT '"{\"currentRoom\":null,\"unlockedRooms\":[],\"unlockedObjects\":[],\"inventory\":[],\"encounteredNPCs\":[],\"globalVariables\":{},\"biometricSamples\":[],\"biometricUnlocks\":[],\"bluetoothDevices\":[],\"notes\":[],\"health\":100}"' NOT NULL, "player_type" varchar NOT NULL, "scenario_data" json NOT NULL, "score" integer DEFAULT 0 NOT NULL, "started_at" datetime(6), "status" varchar DEFAULT 'in_progress' NOT NULL, "updated_at" datetime(6) NOT NULL, CONSTRAINT "fk_rails_ce758a8dd4"
FOREIGN KEY ("mission_id")
REFERENCES "break_escape_missions" ("id")
)
(0.1ms) CREATE INDEX "index_break_escape_games_on_mission_id" ON "break_escape_games" ("mission_id")
(0.1ms) CREATE UNIQUE INDEX "index_games_on_player_and_mission" ON "break_escape_games" ("player_type", "player_id", "mission_id")
(0.1ms) CREATE INDEX "index_break_escape_games_on_player" ON "break_escape_games" ("player_type", "player_id")
(0.1ms) CREATE INDEX "index_break_escape_games_on_status" ON "break_escape_games" ("status")
SQL (0.7ms) INSERT INTO "break_escape_games" ("id","completed_at","created_at","mission_id","player_id","player_state","player_type","scenario_data","score","started_at","status","updated_at")
SELECT "id","completed_at","created_at","mission_id","player_id","player_state","player_type","scenario_data","score","started_at","status","updated_at" FROM "abreak_escape_games"
(0.2ms) DROP TABLE "abreak_escape_games"
TRANSACTION (0.1ms) COMMIT TRANSACTION
(0.0ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
(0.2ms) CREATE TABLE "schema_migrations" ("version" varchar NOT NULL PRIMARY KEY)
ActiveRecord::SchemaMigration Load (0.2ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
(0.2ms) INSERT INTO "schema_migrations" (version) VALUES (20251120160000)
(0.3ms) INSERT INTO "schema_migrations" (version) VALUES
(20251120155358),
(20251120155357);
(0.3ms) CREATE TABLE "ar_internal_metadata" ("key" varchar NOT NULL PRIMARY KEY, "value" varchar, "created_at" datetime(6) NOT NULL, "updated_at" datetime(6) NOT NULL)
ActiveRecord::InternalMetadata Load (0.1ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = ? ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 [[nil, "environment"]]
ActiveRecord::InternalMetadata Create (0.2ms) INSERT INTO "ar_internal_metadata" ("key", "value", "created_at", "updated_at") VALUES ('environment', 'test', '2025-11-20 17:23:21.162347', '2025-11-20 17:23:21.162351') RETURNING "key"
ActiveRecord::InternalMetadata Load (0.1ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = ? ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 [[nil, "environment"]]
ActiveRecord::InternalMetadata Load (0.1ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = ? ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 [[nil, "schema_sha1"]]
ActiveRecord::InternalMetadata Create (0.1ms) INSERT INTO "ar_internal_metadata" ("key", "value", "created_at", "updated_at") VALUES ('schema_sha1', '33181f3d58f9bab484a9b348ce1e6b298e81ba9b', '2025-11-20 17:23:21.163822', '2025-11-20 17:23:21.163824') RETURNING "key"
ActiveRecord::SchemaMigration Load (0.6ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.4ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.3ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, '2025-11-20 17:23:21', 'test_user', 'user', '2025-11-20 17:23:21'), (NULL, '2025-11-20 17:23:21', 'other_user', 'user', '2025-11-20 17:23:21');
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, '2025-11-20 17:23:21', 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, '2025-11-20 17:23:21'), (NULL, '2025-11-20 17:23:21', 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, '2025-11-20 17:23:21')
(0.1ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (3.5ms) COMMIT TRANSACTION
(0.1ms) PRAGMA foreign_key_check
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
----------------------------------------------------------
BreakEscape::MissionsControllerTest: test_should_get_index
----------------------------------------------------------
Started GET "/break_escape/missions" for 127.0.0.1 at 2025-11-20 17:23:22 +0000
Processing by BreakEscape::MissionsController#index as HTML
Completed 500 Internal Server Error in 43ms (ActiveRecord: 0.0ms (0 queries, 0 cached) | GC: 0.0ms)
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
-----------------------------------------------------------------------
BreakEscape::MissionsControllerTest: test_should_show_published_mission
-----------------------------------------------------------------------
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
------------------------------------------------
BreakEscape::GameTest: test_should_update_health
------------------------------------------------
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
Generating image variants require the image_processing gem. Please add `gem "image_processing", "~> 1.2"` to your Gemfile or set `config.active_storage.variant_processor = :disabled`.
ActiveRecord::InternalMetadata Load (0.5ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = ? ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 [[nil, "schema_sha1"]]
ActiveRecord::SchemaMigration Load (0.3ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.3ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.1ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, '2025-11-20 17:24:03', 'test_user', 'user', '2025-11-20 17:24:03'), (NULL, '2025-11-20 17:24:03', 'other_user', 'user', '2025-11-20 17:24:03');
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, '2025-11-20 17:24:03', 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, '2025-11-20 17:24:03'), (NULL, '2025-11-20 17:24:03', 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, '2025-11-20 17:24:03')
(0.0ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (5.3ms) COMMIT TRANSACTION
(0.2ms) PRAGMA foreign_key_check
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
---------------------------------------------------------------
BreakEscape::MissionTest: test_should_validate_presence_of_name
---------------------------------------------------------------
BreakEscape::Mission Exists? (0.2ms) SELECT 1 AS one FROM "break_escape_missions" WHERE "break_escape_missions"."name" IS NULL LIMIT ? [["LIMIT", 1]]
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
-----------------------------------------------------------------
BreakEscape::MissionTest: test_should_validate_uniqueness_of_name
-----------------------------------------------------------------
TRANSACTION (0.1ms) SAVEPOINT active_record_1
BreakEscape::Mission Exists? (0.3ms) SELECT 1 AS one FROM "break_escape_missions" WHERE "break_escape_missions"."name" = ? LIMIT ? [["name", "test"], ["LIMIT", 1]]
BreakEscape::Mission Create (0.2ms) INSERT INTO "break_escape_missions" ("created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (?, ?, ?, ?, ?, ?, ?) RETURNING "id" [["created_at", "2025-11-20 17:24:03.653615"], ["description", nil], ["difficulty_level", 1], ["display_name", "Test"], ["name", "test"], ["published", 0], ["updated_at", "2025-11-20 17:24:03.653615"]]
TRANSACTION (0.1ms) RELEASE SAVEPOINT active_record_1
BreakEscape::Mission Exists? (0.1ms) SELECT 1 AS one FROM "break_escape_missions" WHERE "break_escape_missions"."name" = ? LIMIT ? [["name", "test"], ["LIMIT", 1]]
TRANSACTION (0.0ms) ROLLBACK TRANSACTION
TRANSACTION (0.0ms) BEGIN deferred TRANSACTION
------------------------------------------------------------------------------
BreakEscape::MissionTest: test_published_scope_returns_only_published_missions
------------------------------------------------------------------------------
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
-----------------------------------------------------------------
BreakEscape::MissionTest: test_scenario_path_returns_correct_path
-----------------------------------------------------------------
TRANSACTION (0.0ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
----------------------------------------------------------
BreakEscape::MissionsControllerTest: test_should_get_index
----------------------------------------------------------
Started GET "/break_escape/missions" for 127.0.0.1 at 2025-11-20 17:24:04 +0000
Processing by BreakEscape::MissionsController#index as HTML
BreakEscape::DemoUser Load (0.1ms) SELECT "break_escape_demo_users".* FROM "break_escape_demo_users" ORDER BY "break_escape_demo_users"."id" ASC LIMIT ? [["LIMIT", 1]]
Rendering layout /home/user/BreakEscape/app/views/layouts/break_escape/application.html.erb
Rendering /home/user/BreakEscape/app/views/break_escape/missions/index.html.erb within layouts/break_escape/application
BreakEscape::Mission Load (0.4ms) SELECT "break_escape_missions".* FROM "break_escape_missions" WHERE "break_escape_missions"."published" = ? [["published", 1]]
Rendered /home/user/BreakEscape/app/views/break_escape/missions/index.html.erb within layouts/break_escape/application (Duration: 2.9ms | GC: 0.0ms)
Rendered layout /home/user/BreakEscape/app/views/layouts/break_escape/application.html.erb (Duration: 3.8ms | GC: 0.0ms)
Completed 200 OK in 62ms (Views: 19.1ms | ActiveRecord: 0.9ms (2 queries, 0 cached) | GC: 0.0ms)
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
-----------------------------------------------------------------------
BreakEscape::MissionsControllerTest: test_should_show_published_mission
-----------------------------------------------------------------------
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
---------------------------------------------
BreakEscapeTest: test_it_has_a_version_number
---------------------------------------------
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
--------------------------------------------------
BreakEscape::GameTest: test_should_track_inventory
--------------------------------------------------
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
----------------------------------------------
BreakEscape::GameTest: test_should_unlock_room
----------------------------------------------
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
------------------------------------------------
BreakEscape::GameTest: test_should_update_health
------------------------------------------------
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
---------------------------------------------------------------
BreakEscape::GameTest: test_should_belong_to_player_and_mission
---------------------------------------------------------------
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
-----------------------------------------------------------------
BreakEscape::GameTest: test_should_clamp_health_between_0_and_100
-----------------------------------------------------------------
TRANSACTION (0.0ms) ROLLBACK TRANSACTION
Generating image variants require the image_processing gem. Please add `gem "image_processing", "~> 1.2"` to your Gemfile or set `config.active_storage.variant_processor = :disabled`.
ActiveRecord::InternalMetadata Load (0.5ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = ? ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 [[nil, "schema_sha1"]]
ActiveRecord::SchemaMigration Load (0.2ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.5ms) PRAGMA foreign_keys
(0.1ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.1ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, '2025-11-20 17:24:29', 'test_user', 'user', '2025-11-20 17:24:29'), (NULL, '2025-11-20 17:24:29', 'other_user', 'user', '2025-11-20 17:24:29');
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, '2025-11-20 17:24:29', 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, '2025-11-20 17:24:29'), (NULL, '2025-11-20 17:24:29', 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, '2025-11-20 17:24:29')
(0.1ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (4.6ms) COMMIT TRANSACTION
(0.1ms) PRAGMA foreign_key_check
TRANSACTION (0.0ms) BEGIN deferred TRANSACTION
---------------------------------------------------------------
BreakEscape::MissionTest: test_should_validate_presence_of_name
---------------------------------------------------------------
BreakEscape::Mission Exists? (0.2ms) SELECT 1 AS one FROM "break_escape_missions" WHERE "break_escape_missions"."name" IS NULL LIMIT ? [["LIMIT", 1]]
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
-----------------------------------------------------------------
BreakEscape::MissionTest: test_should_validate_uniqueness_of_name
-----------------------------------------------------------------
TRANSACTION (0.1ms) SAVEPOINT active_record_1
BreakEscape::Mission Exists? (0.3ms) SELECT 1 AS one FROM "break_escape_missions" WHERE "break_escape_missions"."name" = ? LIMIT ? [["name", "test"], ["LIMIT", 1]]
BreakEscape::Mission Create (0.3ms) INSERT INTO "break_escape_missions" ("created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (?, ?, ?, ?, ?, ?, ?) RETURNING "id" [["created_at", "2025-11-20 17:24:30.005081"], ["description", nil], ["difficulty_level", 1], ["display_name", "Test"], ["name", "test"], ["published", 0], ["updated_at", "2025-11-20 17:24:30.005081"]]
TRANSACTION (0.1ms) RELEASE SAVEPOINT active_record_1
BreakEscape::Mission Exists? (0.1ms) SELECT 1 AS one FROM "break_escape_missions" WHERE "break_escape_missions"."name" = ? LIMIT ? [["name", "test"], ["LIMIT", 1]]
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
-----------------------------------------------------------------
BreakEscape::MissionTest: test_scenario_path_returns_correct_path
-----------------------------------------------------------------
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
------------------------------------------------------------------------------
BreakEscape::MissionTest: test_published_scope_returns_only_published_missions
------------------------------------------------------------------------------
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
---------------------------------------------
BreakEscapeTest: test_it_has_a_version_number
---------------------------------------------
TRANSACTION (0.0ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
-----------------------------------------------------------------------
BreakEscape::MissionsControllerTest: test_should_show_published_mission
-----------------------------------------------------------------------
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.4ms) BEGIN deferred TRANSACTION
----------------------------------------------------------
BreakEscape::MissionsControllerTest: test_should_get_index
----------------------------------------------------------
Started GET "/break_escape/missions" for 127.0.0.1 at 2025-11-20 17:24:30 +0000
Processing by BreakEscape::MissionsController#index as HTML
BreakEscape::DemoUser Load (0.2ms) SELECT "break_escape_demo_users".* FROM "break_escape_demo_users" ORDER BY "break_escape_demo_users"."id" ASC LIMIT ? [["LIMIT", 1]]
Rendering layout /home/user/BreakEscape/app/views/layouts/break_escape/application.html.erb
Rendering /home/user/BreakEscape/app/views/break_escape/missions/index.html.erb within layouts/break_escape/application
BreakEscape::Mission Load (0.2ms) SELECT "break_escape_missions".* FROM "break_escape_missions" WHERE "break_escape_missions"."published" = ? [["published", 1]]
Rendered /home/user/BreakEscape/app/views/break_escape/missions/index.html.erb within layouts/break_escape/application (Duration: 2.2ms | GC: 0.0ms)
Rendered layout /home/user/BreakEscape/app/views/layouts/break_escape/application.html.erb (Duration: 3.2ms | GC: 0.0ms)
Completed 200 OK in 57ms (Views: 17.5ms | ActiveRecord: 0.7ms (2 queries, 0 cached) | GC: 0.0ms)
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
----------------------------------------------
BreakEscape::GameTest: test_should_unlock_room
----------------------------------------------
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.0ms) BEGIN deferred TRANSACTION
------------------------------------------------
BreakEscape::GameTest: test_should_update_health
------------------------------------------------
TRANSACTION (0.0ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
--------------------------------------------------
BreakEscape::GameTest: test_should_track_inventory
--------------------------------------------------
TRANSACTION (0.0ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
-----------------------------------------------------------------
BreakEscape::GameTest: test_should_clamp_health_between_0_and_100
-----------------------------------------------------------------
TRANSACTION (0.0ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
---------------------------------------------------------------
BreakEscape::GameTest: test_should_belong_to_player_and_mission
---------------------------------------------------------------
TRANSACTION (0.0ms) ROLLBACK TRANSACTION
Generating image variants require the image_processing gem. Please add `gem "image_processing", "~> 1.2"` to your Gemfile or set `config.active_storage.variant_processor = :disabled`.
ActiveRecord::InternalMetadata Load (0.6ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = ? ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 [[nil, "schema_sha1"]]
ActiveRecord::SchemaMigration Load (0.3ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.4ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.2ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (149617800, '2025-11-20 17:25:07', 'test_user', 'user', '2025-11-20 17:25:07'), (618102942, '2025-11-20 17:25:07', 'other_user', 'user', '2025-11-20 17:25:07');
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (418560898, '2025-11-20 17:25:07', 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, '2025-11-20 17:25:07'), (636030761, '2025-11-20 17:25:07', 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, '2025-11-20 17:25:07')
(0.0ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (54.5ms) COMMIT TRANSACTION
(0.1ms) PRAGMA foreign_key_check
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
-----------------------------------------------------------------
BreakEscape::MissionTest: test_scenario_path_returns_correct_path
-----------------------------------------------------------------
BreakEscape::Mission Load (0.3ms) SELECT "break_escape_missions".* FROM "break_escape_missions" WHERE "break_escape_missions"."id" = ? LIMIT ? [["id", 418560898], ["LIMIT", 1]]
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
------------------------------------------------------------------------------
BreakEscape::MissionTest: test_published_scope_returns_only_published_missions
------------------------------------------------------------------------------
BreakEscape::Mission Load (0.2ms) SELECT "break_escape_missions".* FROM "break_escape_missions" WHERE "break_escape_missions"."id" = ? LIMIT ? [["id", 418560898], ["LIMIT", 1]]
BreakEscape::Mission Exists? (0.1ms) SELECT 1 AS one FROM "break_escape_missions" WHERE "break_escape_missions"."published" = ? AND "break_escape_missions"."id" = ? LIMIT ? [["published", 1], ["id", 418560898], ["LIMIT", 1]]
BreakEscape::Mission Load (0.1ms) SELECT "break_escape_missions".* FROM "break_escape_missions" WHERE "break_escape_missions"."id" = ? LIMIT ? [["id", 636030761], ["LIMIT", 1]]
BreakEscape::Mission Exists? (0.1ms) SELECT 1 AS one FROM "break_escape_missions" WHERE "break_escape_missions"."published" = ? AND "break_escape_missions"."id" = ? LIMIT ? [["published", 1], ["id", 636030761], ["LIMIT", 1]]
TRANSACTION (0.0ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
---------------------------------------------------------------
BreakEscape::MissionTest: test_should_validate_presence_of_name
---------------------------------------------------------------
BreakEscape::Mission Exists? (0.1ms) SELECT 1 AS one FROM "break_escape_missions" WHERE "break_escape_missions"."name" IS NULL LIMIT ? [["LIMIT", 1]]
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
-----------------------------------------------------------------
BreakEscape::MissionTest: test_should_validate_uniqueness_of_name
-----------------------------------------------------------------
TRANSACTION (0.0ms) SAVEPOINT active_record_1
BreakEscape::Mission Exists? (0.3ms) SELECT 1 AS one FROM "break_escape_missions" WHERE "break_escape_missions"."name" = ? LIMIT ? [["name", "test"], ["LIMIT", 1]]
BreakEscape::Mission Create (0.2ms) INSERT INTO "break_escape_missions" ("created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (?, ?, ?, ?, ?, ?, ?) RETURNING "id" [["created_at", "2025-11-20 17:25:07.298681"], ["description", nil], ["difficulty_level", 1], ["display_name", "Test"], ["name", "test"], ["published", 0], ["updated_at", "2025-11-20 17:25:07.298681"]]
TRANSACTION (0.0ms) RELEASE SAVEPOINT active_record_1
BreakEscape::Mission Exists? (0.1ms) SELECT 1 AS one FROM "break_escape_missions" WHERE "break_escape_missions"."name" = ? LIMIT ? [["name", "test"], ["LIMIT", 1]]
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
----------------------------------------------------------
BreakEscape::MissionsControllerTest: test_should_get_index
----------------------------------------------------------
Started GET "/break_escape/missions" for 127.0.0.1 at 2025-11-20 17:25:07 +0000
Processing by BreakEscape::MissionsController#index as HTML
BreakEscape::DemoUser Load (0.2ms) SELECT "break_escape_demo_users".* FROM "break_escape_demo_users" ORDER BY "break_escape_demo_users"."id" ASC LIMIT ? [["LIMIT", 1]]
Rendering layout /home/user/BreakEscape/app/views/layouts/break_escape/application.html.erb
Rendering /home/user/BreakEscape/app/views/break_escape/missions/index.html.erb within layouts/break_escape/application
BreakEscape::Mission Load (0.3ms) SELECT "break_escape_missions".* FROM "break_escape_missions" WHERE "break_escape_missions"."published" = ? [["published", 1]]
Rendered /home/user/BreakEscape/app/views/break_escape/missions/index.html.erb within layouts/break_escape/application (Duration: 2.4ms | GC: 0.0ms)
Rendered layout /home/user/BreakEscape/app/views/layouts/break_escape/application.html.erb (Duration: 3.3ms | GC: 0.0ms)
Completed 200 OK in 56ms (Views: 17.6ms | ActiveRecord: 0.5ms (2 queries, 0 cached) | GC: 0.0ms)
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
-----------------------------------------------------------------------
BreakEscape::MissionsControllerTest: test_should_show_published_mission
-----------------------------------------------------------------------
BreakEscape::Mission Load (0.1ms) SELECT "break_escape_missions".* FROM "break_escape_missions" WHERE "break_escape_missions"."id" = ? LIMIT ? [["id", 418560898], ["LIMIT", 1]]
Started GET "/break_escape/missions/418560898" for 127.0.0.1 at 2025-11-20 17:25:07 +0000
Processing by BreakEscape::MissionsController#show as HTML
Parameters: {"id"=>"418560898"}
BreakEscape::Mission Load (0.1ms) SELECT "break_escape_missions".* FROM "break_escape_missions" WHERE "break_escape_missions"."id" = ? LIMIT ? [["id", 418560898], ["LIMIT", 1]]
BreakEscape::DemoUser Load (0.1ms) SELECT "break_escape_demo_users".* FROM "break_escape_demo_users" ORDER BY "break_escape_demo_users"."id" ASC LIMIT ? [["LIMIT", 1]]
BreakEscape::Game Load (0.2ms) SELECT "break_escape_games".* FROM "break_escape_games" WHERE "break_escape_games"."player_type" = ? AND "break_escape_games"."player_id" = ? AND "break_escape_games"."mission_id" = ? LIMIT ? [["player_type", "BreakEscape::DemoUser"], ["player_id", 149617800], ["mission_id", 418560898], ["LIMIT", 1]]
TRANSACTION (0.1ms) SAVEPOINT active_record_1
TRANSACTION (0.1ms) ROLLBACK TO SAVEPOINT active_record_1
Completed 500 Internal Server Error in 56ms (ActiveRecord: 1.0ms (3 queries, 0 cached) | GC: 0.0ms)
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
-----------------------------------------------------------------
BreakEscape::GameTest: test_should_clamp_health_between_0_and_100
-----------------------------------------------------------------
BreakEscape::Mission Load (0.2ms) SELECT "break_escape_missions".* FROM "break_escape_missions" WHERE "break_escape_missions"."id" = ? LIMIT ? [["id", 418560898], ["LIMIT", 1]]
BreakEscape::DemoUser Load (0.1ms) SELECT "break_escape_demo_users".* FROM "break_escape_demo_users" WHERE "break_escape_demo_users"."id" = ? LIMIT ? [["id", 149617800], ["LIMIT", 1]]
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.0ms) BEGIN deferred TRANSACTION
------------------------------------------------
BreakEscape::GameTest: test_should_update_health
------------------------------------------------
BreakEscape::Mission Load (0.1ms) SELECT "break_escape_missions".* FROM "break_escape_missions" WHERE "break_escape_missions"."id" = ? LIMIT ? [["id", 418560898], ["LIMIT", 1]]
BreakEscape::DemoUser Load (0.1ms) SELECT "break_escape_demo_users".* FROM "break_escape_demo_users" WHERE "break_escape_demo_users"."id" = ? LIMIT ? [["id", 149617800], ["LIMIT", 1]]
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
---------------------------------------------------------------
BreakEscape::GameTest: test_should_belong_to_player_and_mission
---------------------------------------------------------------
BreakEscape::Mission Load (0.1ms) SELECT "break_escape_missions".* FROM "break_escape_missions" WHERE "break_escape_missions"."id" = ? LIMIT ? [["id", 418560898], ["LIMIT", 1]]
BreakEscape::DemoUser Load (0.1ms) SELECT "break_escape_demo_users".* FROM "break_escape_demo_users" WHERE "break_escape_demo_users"."id" = ? LIMIT ? [["id", 149617800], ["LIMIT", 1]]
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
--------------------------------------------------
BreakEscape::GameTest: test_should_track_inventory
--------------------------------------------------
BreakEscape::Mission Load (0.2ms) SELECT "break_escape_missions".* FROM "break_escape_missions" WHERE "break_escape_missions"."id" = ? LIMIT ? [["id", 418560898], ["LIMIT", 1]]
BreakEscape::DemoUser Load (0.1ms) SELECT "break_escape_demo_users".* FROM "break_escape_demo_users" WHERE "break_escape_demo_users"."id" = ? LIMIT ? [["id", 149617800], ["LIMIT", 1]]
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
----------------------------------------------
BreakEscape::GameTest: test_should_unlock_room
----------------------------------------------
BreakEscape::Mission Load (0.1ms) SELECT "break_escape_missions".* FROM "break_escape_missions" WHERE "break_escape_missions"."id" = ? LIMIT ? [["id", 418560898], ["LIMIT", 1]]
BreakEscape::DemoUser Load (0.1ms) SELECT "break_escape_demo_users".* FROM "break_escape_demo_users" WHERE "break_escape_demo_users"."id" = ? LIMIT ? [["id", 149617800], ["LIMIT", 1]]
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
---------------------------------------------
BreakEscapeTest: test_it_has_a_version_number
---------------------------------------------
TRANSACTION (0.0ms) ROLLBACK TRANSACTION
Generating image variants require the image_processing gem. Please add `gem "image_processing", "~> 1.2"` to your Gemfile or set `config.active_storage.variant_processor = :disabled`.
ActiveRecord::InternalMetadata Load (0.5ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = ? ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 [[nil, "schema_sha1"]]
ActiveRecord::SchemaMigration Load (0.2ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.7ms) PRAGMA foreign_keys
(0.1ms) PRAGMA defer_foreign_keys
(0.1ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.2ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (149617800, '2025-11-20 17:59:19', 'test_user', 'user', '2025-11-20 17:59:19'), (618102942, '2025-11-20 17:59:19', 'other_user', 'user', '2025-11-20 17:59:19');
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (418560898, '2025-11-20 17:59:19', 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, '2025-11-20 17:59:19'), (636030761, '2025-11-20 17:59:19', 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, '2025-11-20 17:59:19')
(0.0ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (5.5ms) COMMIT TRANSACTION
(0.1ms) PRAGMA foreign_key_check
TRANSACTION (0.0ms) BEGIN deferred TRANSACTION
------------------------------------------------
BreakEscape::GameTest: test_should_update_health
------------------------------------------------
BreakEscape::Mission Load (0.2ms) SELECT "break_escape_missions".* FROM "break_escape_missions" WHERE "break_escape_missions"."id" = ? LIMIT ? [["id", 418560898], ["LIMIT", 1]]
BreakEscape::DemoUser Load (0.1ms) SELECT "break_escape_demo_users".* FROM "break_escape_demo_users" WHERE "break_escape_demo_users"."id" = ? LIMIT ? [["id", 149617800], ["LIMIT", 1]]
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
---------------------------------------------------------------
BreakEscape::GameTest: test_should_belong_to_player_and_mission
---------------------------------------------------------------
BreakEscape::Mission Load (0.2ms) SELECT "break_escape_missions".* FROM "break_escape_missions" WHERE "break_escape_missions"."id" = ? LIMIT ? [["id", 418560898], ["LIMIT", 1]]
BreakEscape::DemoUser Load (0.1ms) SELECT "break_escape_demo_users".* FROM "break_escape_demo_users" WHERE "break_escape_demo_users"."id" = ? LIMIT ? [["id", 149617800], ["LIMIT", 1]]
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
-----------------------------------------------------------------
BreakEscape::GameTest: test_should_clamp_health_between_0_and_100
-----------------------------------------------------------------
BreakEscape::Mission Load (0.1ms) SELECT "break_escape_missions".* FROM "break_escape_missions" WHERE "break_escape_missions"."id" = ? LIMIT ? [["id", 418560898], ["LIMIT", 1]]
BreakEscape::DemoUser Load (0.1ms) SELECT "break_escape_demo_users".* FROM "break_escape_demo_users" WHERE "break_escape_demo_users"."id" = ? LIMIT ? [["id", 149617800], ["LIMIT", 1]]
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
----------------------------------------------
BreakEscape::GameTest: test_should_unlock_room
----------------------------------------------
BreakEscape::Mission Load (0.1ms) SELECT "break_escape_missions".* FROM "break_escape_missions" WHERE "break_escape_missions"."id" = ? LIMIT ? [["id", 418560898], ["LIMIT", 1]]
BreakEscape::DemoUser Load (0.1ms) SELECT "break_escape_demo_users".* FROM "break_escape_demo_users" WHERE "break_escape_demo_users"."id" = ? LIMIT ? [["id", 149617800], ["LIMIT", 1]]
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
--------------------------------------------------
BreakEscape::GameTest: test_should_track_inventory
--------------------------------------------------
BreakEscape::Mission Load (0.1ms) SELECT "break_escape_missions".* FROM "break_escape_missions" WHERE "break_escape_missions"."id" = ? LIMIT ? [["id", 418560898], ["LIMIT", 1]]
BreakEscape::DemoUser Load (0.1ms) SELECT "break_escape_demo_users".* FROM "break_escape_demo_users" WHERE "break_escape_demo_users"."id" = ? LIMIT ? [["id", 149617800], ["LIMIT", 1]]
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
-----------------------------------------------------------------------
BreakEscape::MissionsControllerTest: test_should_show_published_mission
-----------------------------------------------------------------------
BreakEscape::Mission Load (0.2ms) SELECT "break_escape_missions".* FROM "break_escape_missions" WHERE "break_escape_missions"."id" = ? LIMIT ? [["id", 418560898], ["LIMIT", 1]]
Started GET "/break_escape/missions/418560898" for 127.0.0.1 at 2025-11-20 17:59:19 +0000
Processing by BreakEscape::MissionsController#show as HTML
Parameters: {"id"=>"418560898"}
BreakEscape::Mission Load (0.3ms) SELECT "break_escape_missions".* FROM "break_escape_missions" WHERE "break_escape_missions"."id" = ? LIMIT ? [["id", 418560898], ["LIMIT", 1]]
BreakEscape::DemoUser Load (0.2ms) SELECT "break_escape_demo_users".* FROM "break_escape_demo_users" ORDER BY "break_escape_demo_users"."id" ASC LIMIT ? [["LIMIT", 1]]
BreakEscape::Game Load (0.2ms) SELECT "break_escape_games".* FROM "break_escape_games" WHERE "break_escape_games"."player_type" = ? AND "break_escape_games"."player_id" = ? AND "break_escape_games"."mission_id" = ? LIMIT ? [["player_type", "BreakEscape::DemoUser"], ["player_id", 149617800], ["mission_id", 418560898], ["LIMIT", 1]]
Completed 500 Internal Server Error in 15ms (ActiveRecord: 0.5ms (3 queries, 0 cached) | GC: 0.0ms)
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
----------------------------------------------------------
BreakEscape::MissionsControllerTest: test_should_get_index
----------------------------------------------------------
Started GET "/break_escape/missions" for 127.0.0.1 at 2025-11-20 17:59:20 +0000
Processing by BreakEscape::MissionsController#index as HTML
BreakEscape::DemoUser Load (0.1ms) SELECT "break_escape_demo_users".* FROM "break_escape_demo_users" ORDER BY "break_escape_demo_users"."id" ASC LIMIT ? [["LIMIT", 1]]
Rendering layout /home/user/BreakEscape/app/views/layouts/break_escape/application.html.erb
Rendering /home/user/BreakEscape/app/views/break_escape/missions/index.html.erb within layouts/break_escape/application
BreakEscape::Mission Load (0.2ms) SELECT "break_escape_missions".* FROM "break_escape_missions" WHERE "break_escape_missions"."published" = ? [["published", 1]]
Rendered /home/user/BreakEscape/app/views/break_escape/missions/index.html.erb within layouts/break_escape/application (Duration: 2.2ms | GC: 0.0ms)
Rendered layout /home/user/BreakEscape/app/views/layouts/break_escape/application.html.erb (Duration: 3.1ms | GC: 0.0ms)
Completed 200 OK in 53ms (Views: 19.4ms | ActiveRecord: 0.3ms (2 queries, 0 cached) | GC: 0.0ms)
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
-----------------------------------------------------------------
BreakEscape::MissionTest: test_should_validate_uniqueness_of_name
-----------------------------------------------------------------
TRANSACTION (0.1ms) SAVEPOINT active_record_1
BreakEscape::Mission Exists? (0.4ms) SELECT 1 AS one FROM "break_escape_missions" WHERE "break_escape_missions"."name" = ? LIMIT ? [["name", "test"], ["LIMIT", 1]]
BreakEscape::Mission Create (0.3ms) INSERT INTO "break_escape_missions" ("created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (?, ?, ?, ?, ?, ?, ?) RETURNING "id" [["created_at", "2025-11-20 17:59:20.159340"], ["description", nil], ["difficulty_level", 1], ["display_name", "Test"], ["name", "test"], ["published", 0], ["updated_at", "2025-11-20 17:59:20.159340"]]
TRANSACTION (0.1ms) RELEASE SAVEPOINT active_record_1
BreakEscape::Mission Exists? (0.1ms) SELECT 1 AS one FROM "break_escape_missions" WHERE "break_escape_missions"."name" = ? LIMIT ? [["name", "test"], ["LIMIT", 1]]
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
------------------------------------------------------------------------------
BreakEscape::MissionTest: test_published_scope_returns_only_published_missions
------------------------------------------------------------------------------
BreakEscape::Mission Load (0.2ms) SELECT "break_escape_missions".* FROM "break_escape_missions" WHERE "break_escape_missions"."id" = ? LIMIT ? [["id", 418560898], ["LIMIT", 1]]
BreakEscape::Mission Exists? (0.1ms) SELECT 1 AS one FROM "break_escape_missions" WHERE "break_escape_missions"."published" = ? AND "break_escape_missions"."id" = ? LIMIT ? [["published", 1], ["id", 418560898], ["LIMIT", 1]]
BreakEscape::Mission Load (0.1ms) SELECT "break_escape_missions".* FROM "break_escape_missions" WHERE "break_escape_missions"."id" = ? LIMIT ? [["id", 636030761], ["LIMIT", 1]]
BreakEscape::Mission Exists? (0.1ms) SELECT 1 AS one FROM "break_escape_missions" WHERE "break_escape_missions"."published" = ? AND "break_escape_missions"."id" = ? LIMIT ? [["published", 1], ["id", 636030761], ["LIMIT", 1]]
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
-----------------------------------------------------------------
BreakEscape::MissionTest: test_scenario_path_returns_correct_path
-----------------------------------------------------------------
BreakEscape::Mission Load (0.1ms) SELECT "break_escape_missions".* FROM "break_escape_missions" WHERE "break_escape_missions"."id" = ? LIMIT ? [["id", 418560898], ["LIMIT", 1]]
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
---------------------------------------------------------------
BreakEscape::MissionTest: test_should_validate_presence_of_name
---------------------------------------------------------------
BreakEscape::Mission Exists? (0.2ms) SELECT 1 AS one FROM "break_escape_missions" WHERE "break_escape_missions"."name" IS NULL LIMIT ? [["LIMIT", 1]]
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
---------------------------------------------
BreakEscapeTest: test_it_has_a_version_number
---------------------------------------------
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
Generating image variants require the image_processing gem. Please add `gem "image_processing", "~> 1.2"` to your Gemfile or set `config.active_storage.variant_processor = :disabled`.
ActiveRecord::InternalMetadata Load (0.6ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = ? ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 [[nil, "schema_sha1"]]
ActiveRecord::SchemaMigration Load (0.2ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.5ms) PRAGMA foreign_keys
(0.1ms) PRAGMA defer_foreign_keys
(0.1ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.2ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (149617800, '2025-11-20 18:00:25', 'test_user', 'user', '2025-11-20 18:00:25'), (618102942, '2025-11-20 18:00:25', 'other_user', 'user', '2025-11-20 18:00:25');
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (418560898, '2025-11-20 18:00:25', 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, '2025-11-20 18:00:25'), (636030761, '2025-11-20 18:00:25', 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, '2025-11-20 18:00:25')
(0.0ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (7.3ms) COMMIT TRANSACTION
(0.1ms) PRAGMA foreign_key_check
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
---------------------------------------------
BreakEscapeTest: test_it_has_a_version_number
---------------------------------------------
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
----------------------------------------------------------
BreakEscape::MissionsControllerTest: test_should_get_index
----------------------------------------------------------
Started GET "/break_escape/missions" for 127.0.0.1 at 2025-11-20 18:00:25 +0000
Processing by BreakEscape::MissionsController#index as HTML
BreakEscape::DemoUser Load (0.3ms) SELECT "break_escape_demo_users".* FROM "break_escape_demo_users" ORDER BY "break_escape_demo_users"."id" ASC LIMIT ? [["LIMIT", 1]]
Rendering layout /home/user/BreakEscape/app/views/layouts/break_escape/application.html.erb
Rendering /home/user/BreakEscape/app/views/break_escape/missions/index.html.erb within layouts/break_escape/application
BreakEscape::Mission Load (0.2ms) SELECT "break_escape_missions".* FROM "break_escape_missions" WHERE "break_escape_missions"."published" = ? [["published", 1]]
Rendered /home/user/BreakEscape/app/views/break_escape/missions/index.html.erb within layouts/break_escape/application (Duration: 5.0ms | GC: 0.0ms)
Rendered layout /home/user/BreakEscape/app/views/layouts/break_escape/application.html.erb (Duration: 5.9ms | GC: 0.0ms)
Completed 200 OK in 129ms (Views: 33.4ms | ActiveRecord: 0.4ms (2 queries, 0 cached) | GC: 20.0ms)
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.0ms) BEGIN deferred TRANSACTION
-----------------------------------------------------------------------
BreakEscape::MissionsControllerTest: test_should_show_published_mission
-----------------------------------------------------------------------
BreakEscape::Mission Load (0.1ms) SELECT "break_escape_missions".* FROM "break_escape_missions" WHERE "break_escape_missions"."id" = ? LIMIT ? [["id", 418560898], ["LIMIT", 1]]
Started GET "/break_escape/missions/418560898" for 127.0.0.1 at 2025-11-20 18:00:26 +0000
Processing by BreakEscape::MissionsController#show as HTML
Parameters: {"id"=>"418560898"}
BreakEscape::Mission Load (0.1ms) SELECT "break_escape_missions".* FROM "break_escape_missions" WHERE "break_escape_missions"."id" = ? LIMIT ? [["id", 418560898], ["LIMIT", 1]]
BreakEscape::DemoUser Load (0.1ms) SELECT "break_escape_demo_users".* FROM "break_escape_demo_users" ORDER BY "break_escape_demo_users"."id" ASC LIMIT ? [["LIMIT", 1]]
BreakEscape::Game Load (0.2ms) SELECT "break_escape_games".* FROM "break_escape_games" WHERE "break_escape_games"."player_type" = ? AND "break_escape_games"."player_id" = ? AND "break_escape_games"."mission_id" = ? LIMIT ? [["player_type", "BreakEscape::DemoUser"], ["player_id", 149617800], ["mission_id", 418560898], ["LIMIT", 1]]
TRANSACTION (0.0ms) SAVEPOINT active_record_1
BreakEscape::Game Create (0.3ms) INSERT INTO "break_escape_games" ("completed_at", "created_at", "mission_id", "player_id", "player_state", "player_type", "scenario_data", "score", "started_at", "status", "updated_at") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) RETURNING "id" [["completed_at", nil], ["created_at", "2025-11-20 18:00:26.131316"], ["mission_id", 418560898], ["player_id", 149617800], ["player_state", "\"{\\\"currentRoom\\\":null,\\\"unlockedRooms\\\":[],\\\"unlockedObjects\\\":[],\\\"inventory\\\":[],\\\"encounteredNPCs\\\":[],\\\"globalVariables\\\":{},\\\"biometricSamples\\\":[],\\\"biometricUnlocks\\\":[],\\\"bluetoothDevices\\\":[],\\\"notes\\\":[],\\\"health\\\":100}\""], ["player_type", "BreakEscape::DemoUser"], ["scenario_data", "{\"scenario_brief\":\"Hi! You are a cyber investigator tasked with uncovering evidence of corporate espionage. Anonymous tips suggest the CEO has been selling company secrets, but you need proof.\",\"startRoom\":\"reception\",\"startItemsInInventory\":[{\"type\":\"phone\",\"name\":\"Your Phone\",\"takeable\":true,\"phoneId\":\"player_phone\",\"npcIds\":[\"neye_eve\",\"gossip_girl\",\"helper_npc\"],\"observations\":\"Your personal phone with some interesting contacts\"},{\"type\":\"workstation\",\"name\":\"Crypto Analysis Station\",\"takeable\":true,\"observations\":\"A powerful workstation for cryptographic analysis\"},{\"type\":\"lockpick\",\"name\":\"Lock Pick Kit\",\"takeable\":true,\"observations\":\"A professional lock picking kit with various picks and tension wrenches\"}],\"rooms\":{\"reception\":{\"type\":\"room_reception\",\"connections\":{\"north\":\"office1\"},\"npcs\":[{\"id\":\"neye_eve\",\"displayName\":\"Neye Eve\",\"storyPath\":\"scenarios/ink/neye-eve.json\",\"avatar\":\"assets/npc/avatars/npc_adversary.png\",\"phoneId\":\"player_phone\",\"currentKnot\":\"start\",\"npcType\":\"phone\"},{\"id\":\"gossip_girl\",\"displayName\":\"Gossip Girl\",\"storyPath\":\"scenarios/ink/gossip-girl.json\",\"avatar\":\"assets/npc/avatars/npc_neutral.png\",\"phoneId\":\"player_phone\",\"currentKnot\":\"start\",\"npcType\":\"phone\",\"timedMessages\":[{\"delay\":5000,\"message\":\"Hey! 👋 Got any juicy gossip for me today?\",\"type\":\"text\"}]},{\"id\":\"helper_npc\",\"displayName\":\"Helpful Contact\",\"storyPath\":\"scenarios/ink/helper-npc.json\",\"avatar\":\"assets/npc/avatars/npc_helper.png\",\"phoneId\":\"player_phone\",\"currentKnot\":\"start\",\"npcType\":\"phone\",\"eventMappings\":[{\"eventPattern\":\"item_picked_up:lockpick\",\"targetKnot\":\"on_lockpick_pickup\",\"onceOnly\":true,\"cooldown\":0},{\"eventPattern\":\"minigame_completed\",\"targetKnot\":\"on_lockpick_success\",\"condition\":\"data.minigameName && data.minigameName.includes('Lockpick')\",\"cooldown\":10000},{\"eventPattern\":\"minigame_failed\",\"targetKnot\":\"on_lockpick_failed\",\"condition\":\"data.minigameName && data.minigameName.includes('Lockpick')\",\"cooldown\":15000},{\"eventPattern\":\"door_unlocked\",\"targetKnot\":\"on_door_unlocked\",\"cooldown\":8000},{\"eventPattern\":\"door_unlock_attempt\",\"targetKnot\":\"on_door_attempt\",\"cooldown\":12000},{\"eventPattern\":\"object_interacted\",\"targetKnot\":\"on_ceo_desk_interact\",\"condition\":\"data.objectType === 'desk_ceo'\",\"cooldown\":10000},{\"eventPattern\":\"item_picked_up:*\",\"targetKnot\":\"on_item_found\",\"cooldown\":20000},{\"eventPattern\":\"room_entered\",\"targetKnot\":\"on_room_entered\",\"cooldown\":45000,\"maxTriggers\":3},{\"eventPattern\":\"room_discovered\",\"targetKnot\":\"on_room_discovered\",\"cooldown\":15000,\"maxTriggers\":5},{\"eventPattern\":\"room_entered:ceo\",\"targetKnot\":\"on_ceo_office_entered\",\"onceOnly\":true}]}],\"objects\":[{\"type\":\"phone\",\"name\":\"Reception Phone\",\"takeable\":false,\"readable\":true,\"voice\":\"Hi, this is the IT Team. Security breach detected in server room. Changed access code to 4829.\",\"sender\":\"IT Team\",\"timestamp\":\"2:15 AM\",\"observations\":\"The reception phone's message light is blinking urgently\"},{\"type\":\"notes\",\"name\":\"Security Log\",\"takeable\":true,\"readable\":true,\"text\":\"Unusual after-hours access detected:\\n- CEO office: 11:30 PM\\n- Server room: 2:15 AM\\n- CEO office again: 3:45 AM\",\"observations\":\"A concerning security log from last night\"},{\"type\":\"pc\",\"name\":\"Reception Computer\",\"takeable\":false,\"lockType\":\"password\",\"passwordHint\":\"Optional hint text\",\"showHint\":true,\"showKeyboard\":true,\"maxAttempts\":3,\"locked\":true,\"requires\":\"secret123\",\"observations\":\"The reception's computer, currently locked\",\"postitNote\":\"Password: secret123\",\"showPostit\":true,\"contents\":[{\"type\":\"text_file\",\"name\":\"Private\",\"takeable\":false,\"readable\":true,\"text\":\"Closet keypad code: 7391 - Must move evidence to safe before audit\"}]},{\"type\":\"tablet\",\"name\":\"Tablet Device\",\"takeable\":true,\"locked\":true,\"lockType\":\"bluetooth\",\"requires\":\"bluetooth\",\"mac\":\"00:11:22:33:44:55\",\"observations\":\"A locked tablet device that requires Bluetooth pairing\"},{\"type\":\"bluetooth_scanner\",\"name\":\"Bluetooth Scanner\",\"takeable\":true,\"observations\":\"A device for detecting nearby Bluetooth signals\",\"canScanBluetooth\":true},{\"type\":\"key\",\"name\":\"Office Key\",\"takeable\":true,\"key_id\":\"office1_key\",\"keyPins\":[100,0,100,0],\"observations\":\"A key to access the office areas\"},{\"type\":\"pin-cracker\",\"name\":\"PIN Cracker\",\"takeable\":true,\"observations\":\"A sophisticated device that can analyze PIN entry patterns and provide feedback on attempts\"},{\"type\":\"safe\",\"name\":\"Reception Safe\",\"takeable\":false,\"locked\":true,\"lockType\":\"pin\",\"requires\":\"9573\",\"observations\":\"A small wall safe behind the reception desk. Looks like it needs a 4-digit code.\",\"contents\":[{\"type\":\"notes\",\"name\":\"IT Access Credentials\",\"takeable\":true,\"readable\":true,\"text\":\"Emergency IT Admin Credentials:\\nUsername: admin\\nPassword: ITsecure2024\\n\\nServer Room Backup Code: 4829\\nCEO Office Alarm Override: 1337\",\"observations\":\"Sensitive IT credentials that could be very useful\"}]}]},\"office1\":{\"type\":\"room_office\",\"locked\":true,\"lockType\":\"key\",\"requires\":\"office1_key\",\"keyPins\":[100,0,100,0],\"difficulty\":\"easy\",\"door_sign\":\"4A Hot Desks\",\"connections\":{\"north\":[\"office2\",\"office3\"],\"south\":\"reception\"},\"objects\":[{\"type\":\"pc\",\"name\":\"Office Computer\",\"takeable\":false,\"requires\":\"password\",\"hasFingerprint\":true,\"fingerprintOwner\":\"ceo\",\"fingerprintDifficulty\":\"medium\",\"observations\":\"A computer with a cybersecurity alert on screen. There might be fingerprints on the keyboard.\"},{\"type\":\"notes\",\"name\":\"IT Memo\",\"takeable\":true,\"readable\":true,\"text\":\"URGENT: Multiple unauthorized access attempts detected from CEO's office IP address\",\"observations\":\"A concerning IT department memo\"},{\"type\":\"fingerprint_kit\",\"name\":\"Fingerprint Kit\",\"takeable\":true,\"observations\":\"A kit used for collecting fingerprints from surfaces\"}]},\"office2\":{\"type\":\"room_office\",\"connections\":{\"north\":\"ceo\",\"south\":\"office1\"},\"objects\":[{\"type\":\"pc\",\"name\":\"Office Computer\",\"takeable\":false,\"lockType\":\"password\",\"requires\":\"office2024\",\"showKeyboard\":true,\"maxAttempts\":3,\"locked\":true,\"postitNote\":\"Password: office2024\",\"showPostit\":true,\"observations\":\"A standard office computer with a sticky note on the monitor\"},{\"type\":\"notes\",\"name\":\"Shredded Document\",\"takeable\":true,\"readable\":true,\"text\":\"Partially readable: '...offshore account...transfer complete...delete all traces...'\",\"observations\":\"A partially shredded document that someone failed to dispose of properly\"},{\"type\":\"key\",\"name\":\"CEO Office Key\",\"takeable\":true,\"key_id\":\"ceo_office_key\",\"keyPins\":[0,50,100,150],\"observations\":\"A spare key to the CEO's office, carelessly left behind\"}]},\"office3\":{\"type\":\"room_office\",\"connections\":{\"north\":\"server1\",\"south\":\"office1\"},\"objects\":[{\"type\":\"pc\",\"name\":\"IT Staff Computer\",\"takeable\":false,\"requires\":\"bluetooth\",\"lockType\":\"bluetooth\",\"mac\":\"00:11:22:33:44:55\",\"observations\":\"An IT staff computer showing network security logs\"},{\"type\":\"notes\",\"name\":\"Network Logs\",\"takeable\":true,\"readable\":true,\"text\":\"Large data transfers detected to unknown external IPs - All originating from CEO's office\",\"observations\":\"Suspicious network activity logs\"}]},\"ceo\":{\"type\":\"room_ceo\",\"connections\":{\"north\":\"closet\",\"south\":\"office2\"},\"locked\":true,\"lockType\":\"key\",\"requires\":\"ceo_office_key\",\"keyPins\":[0,50,100,150],\"difficulty\":\"easy\",\"objects\":[{\"type\":\"pc\",\"name\":\"CEO Computer\",\"takeable\":false,\"lockType\":\"password\",\"requires\":\"ceo2024\",\"showKeyboard\":true,\"maxAttempts\":3,\"locked\":true,\"postitNote\":\"Password: ceo2024\",\"showPostit\":true,\"observations\":\"The CEO's laptop, still warm - recently used. A sticky note is attached to the screen.\"},{\"type\":\"suitcase\",\"name\":\"CEO Briefcase\",\"takeable\":false,\"locked\":true,\"lockType\":\"key\",\"requires\":\"briefcase_key\",\"keyPins\":[50,25,0,75],\"difficulty\":\"medium\",\"observations\":\"An expensive leather briefcase with a sturdy lock\",\"contents\":[{\"type\":\"notes\",\"name\":\"Private Note\",\"takeable\":true,\"readable\":true,\"text\":\"Closet keypad code: 7391 - Must move evidence to safe before audit\",\"observations\":\"A hastily written note on expensive paper\"},{\"type\":\"key\",\"name\":\"Safe Key\",\"takeable\":true,\"key_id\":\"safe_key\",\"keyPins\":[68,10,48,30],\"observations\":\"A heavy-duty safe key hidden behind server equipment\"}]},{\"type\":\"phone\",\"name\":\"CEO Phone\",\"takeable\":false,\"readable\":true,\"text\":\"Recent calls: 'Offshore Bank', 'Unknown', 'Data Buyer'\",\"sender\":\"Call Log\",\"timestamp\":\"Last 24 hours\",\"observations\":\"The CEO's phone shows suspicious recent calls\"}]},\"closet\":{\"type\":\"room_closet\",\"connections\":{\"south\":\"ceo\"},\"locked\":true,\"lockType\":\"pin\",\"requires\":\"7391\",\"objects\":[{\"type\":\"safe\",\"name\":\"Hidden Safe\",\"takeable\":false,\"locked\":true,\"lockType\":\"key\",\"requires\":\"safe_key\",\"keyPins\":[68,10,48,30],\"difficulty\":\"hard\",\"observations\":\"A well-hidden wall safe behind a painting\",\"contents\":[{\"type\":\"notes\",\"name\":\"Incriminating Documents\",\"takeable\":true,\"readable\":true,\"text\":\"Contract for sale of proprietary technology\\nBank transfers from competing companies\\nDetails of upcoming corporate espionage operations\",\"observations\":\"A folder containing damning evidence of corporate espionage. Congratulations! You've recovered the incriminating documents. flag{ceo_exfil_flag}\"}]}]},\"server1\":{\"type\":\"room_servers\",\"connections\":{\"south\":\"office3\"},\"locked\":true,\"lockType\":\"pin\",\"requires\":\"4829\",\"objects\":[{\"type\":\"pc\",\"name\":\"Server Terminal\",\"takeable\":false,\"observations\":\"The main server terminal showing massive data exfiltration\"},{\"type\":\"key\",\"name\":\"Briefcase Key\",\"takeable\":true,\"key_id\":\"briefcase_key\",\"keyPins\":[50,25,0,75],\"observations\":\"A small key labeled 'Personal - Do Not Copy'\"}]}}}"], ["score", 0], ["started_at", "2025-11-20 18:00:26.136014"], ["status", "in_progress"], ["updated_at", "2025-11-20 18:00:26.131316"]]
TRANSACTION (0.1ms) RELEASE SAVEPOINT active_record_1
Redirected to http://www.example.com/break_escape/games/1
Completed 302 Found in 71ms (ActiveRecord: 1.2ms (4 queries, 0 cached) | GC: 10.0ms)
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
---------------------------------------------------------------
BreakEscape::MissionTest: test_should_validate_presence_of_name
---------------------------------------------------------------
BreakEscape::Mission Exists? (0.2ms) SELECT 1 AS one FROM "break_escape_missions" WHERE "break_escape_missions"."name" IS NULL LIMIT ? [["LIMIT", 1]]
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
------------------------------------------------------------------------------
BreakEscape::MissionTest: test_published_scope_returns_only_published_missions
------------------------------------------------------------------------------
BreakEscape::Mission Load (0.1ms) SELECT "break_escape_missions".* FROM "break_escape_missions" WHERE "break_escape_missions"."id" = ? LIMIT ? [["id", 418560898], ["LIMIT", 1]]
BreakEscape::Mission Exists? (0.1ms) SELECT 1 AS one FROM "break_escape_missions" WHERE "break_escape_missions"."published" = ? AND "break_escape_missions"."id" = ? LIMIT ? [["published", 1], ["id", 418560898], ["LIMIT", 1]]
BreakEscape::Mission Load (0.1ms) SELECT "break_escape_missions".* FROM "break_escape_missions" WHERE "break_escape_missions"."id" = ? LIMIT ? [["id", 636030761], ["LIMIT", 1]]
BreakEscape::Mission Exists? (0.1ms) SELECT 1 AS one FROM "break_escape_missions" WHERE "break_escape_missions"."published" = ? AND "break_escape_missions"."id" = ? LIMIT ? [["published", 1], ["id", 636030761], ["LIMIT", 1]]
TRANSACTION (0.0ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
-----------------------------------------------------------------
BreakEscape::MissionTest: test_should_validate_uniqueness_of_name
-----------------------------------------------------------------
TRANSACTION (0.1ms) SAVEPOINT active_record_1
BreakEscape::Mission Exists? (0.3ms) SELECT 1 AS one FROM "break_escape_missions" WHERE "break_escape_missions"."name" = ? LIMIT ? [["name", "test"], ["LIMIT", 1]]
BreakEscape::Mission Create (1.5ms) INSERT INTO "break_escape_missions" ("created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (?, ?, ?, ?, ?, ?, ?) RETURNING "id" [["created_at", "2025-11-20 18:00:26.168627"], ["description", nil], ["difficulty_level", 1], ["display_name", "Test"], ["name", "test"], ["published", 0], ["updated_at", "2025-11-20 18:00:26.168627"]]
TRANSACTION (0.1ms) RELEASE SAVEPOINT active_record_1
BreakEscape::Mission Exists? (0.1ms) SELECT 1 AS one FROM "break_escape_missions" WHERE "break_escape_missions"."name" = ? LIMIT ? [["name", "test"], ["LIMIT", 1]]
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
-----------------------------------------------------------------
BreakEscape::MissionTest: test_scenario_path_returns_correct_path
-----------------------------------------------------------------
BreakEscape::Mission Load (0.1ms) SELECT "break_escape_missions".* FROM "break_escape_missions" WHERE "break_escape_missions"."id" = ? LIMIT ? [["id", 418560898], ["LIMIT", 1]]
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
----------------------------------------------
BreakEscape::GameTest: test_should_unlock_room
----------------------------------------------
BreakEscape::Mission Load (0.1ms) SELECT "break_escape_missions".* FROM "break_escape_missions" WHERE "break_escape_missions"."id" = ? LIMIT ? [["id", 418560898], ["LIMIT", 1]]
BreakEscape::DemoUser Load (1.6ms) SELECT "break_escape_demo_users".* FROM "break_escape_demo_users" WHERE "break_escape_demo_users"."id" = ? LIMIT ? [["id", 149617800], ["LIMIT", 1]]
TRANSACTION (0.1ms) SAVEPOINT active_record_1
BreakEscape::Game Create (1.8ms) INSERT INTO "break_escape_games" ("completed_at", "created_at", "mission_id", "player_id", "player_state", "player_type", "scenario_data", "score", "started_at", "status", "updated_at") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) RETURNING "id" [["completed_at", nil], ["created_at", "2025-11-20 18:00:26.185151"], ["mission_id", 418560898], ["player_id", 149617800], ["player_state", "{\"currentRoom\":\"reception\",\"unlockedRooms\":[\"reception\"],\"unlockedObjects\":[],\"inventory\":[],\"encounteredNPCs\":[],\"globalVariables\":{},\"biometricSamples\":[],\"biometricUnlocks\":[],\"bluetoothDevices\":[],\"notes\":[],\"health\":100}"], ["player_type", "BreakEscape::DemoUser"], ["scenario_data", "{\"scenario_brief\":\"Hi! You are a cyber investigator tasked with uncovering evidence of corporate espionage. Anonymous tips suggest the CEO has been selling company secrets, but you need proof.\",\"startRoom\":\"reception\",\"startItemsInInventory\":[{\"type\":\"phone\",\"name\":\"Your Phone\",\"takeable\":true,\"phoneId\":\"player_phone\",\"npcIds\":[\"neye_eve\",\"gossip_girl\",\"helper_npc\"],\"observations\":\"Your personal phone with some interesting contacts\"},{\"type\":\"workstation\",\"name\":\"Crypto Analysis Station\",\"takeable\":true,\"observations\":\"A powerful workstation for cryptographic analysis\"},{\"type\":\"lockpick\",\"name\":\"Lock Pick Kit\",\"takeable\":true,\"observations\":\"A professional lock picking kit with various picks and tension wrenches\"}],\"rooms\":{\"reception\":{\"type\":\"room_reception\",\"connections\":{\"north\":\"office1\"},\"npcs\":[{\"id\":\"neye_eve\",\"displayName\":\"Neye Eve\",\"storyPath\":\"scenarios/ink/neye-eve.json\",\"avatar\":\"assets/npc/avatars/npc_adversary.png\",\"phoneId\":\"player_phone\",\"currentKnot\":\"start\",\"npcType\":\"phone\"},{\"id\":\"gossip_girl\",\"displayName\":\"Gossip Girl\",\"storyPath\":\"scenarios/ink/gossip-girl.json\",\"avatar\":\"assets/npc/avatars/npc_neutral.png\",\"phoneId\":\"player_phone\",\"currentKnot\":\"start\",\"npcType\":\"phone\",\"timedMessages\":[{\"delay\":5000,\"message\":\"Hey! 👋 Got any juicy gossip for me today?\",\"type\":\"text\"}]},{\"id\":\"helper_npc\",\"displayName\":\"Helpful Contact\",\"storyPath\":\"scenarios/ink/helper-npc.json\",\"avatar\":\"assets/npc/avatars/npc_helper.png\",\"phoneId\":\"player_phone\",\"currentKnot\":\"start\",\"npcType\":\"phone\",\"eventMappings\":[{\"eventPattern\":\"item_picked_up:lockpick\",\"targetKnot\":\"on_lockpick_pickup\",\"onceOnly\":true,\"cooldown\":0},{\"eventPattern\":\"minigame_completed\",\"targetKnot\":\"on_lockpick_success\",\"condition\":\"data.minigameName && data.minigameName.includes('Lockpick')\",\"cooldown\":10000},{\"eventPattern\":\"minigame_failed\",\"targetKnot\":\"on_lockpick_failed\",\"condition\":\"data.minigameName && data.minigameName.includes('Lockpick')\",\"cooldown\":15000},{\"eventPattern\":\"door_unlocked\",\"targetKnot\":\"on_door_unlocked\",\"cooldown\":8000},{\"eventPattern\":\"door_unlock_attempt\",\"targetKnot\":\"on_door_attempt\",\"cooldown\":12000},{\"eventPattern\":\"object_interacted\",\"targetKnot\":\"on_ceo_desk_interact\",\"condition\":\"data.objectType === 'desk_ceo'\",\"cooldown\":10000},{\"eventPattern\":\"item_picked_up:*\",\"targetKnot\":\"on_item_found\",\"cooldown\":20000},{\"eventPattern\":\"room_entered\",\"targetKnot\":\"on_room_entered\",\"cooldown\":45000,\"maxTriggers\":3},{\"eventPattern\":\"room_discovered\",\"targetKnot\":\"on_room_discovered\",\"cooldown\":15000,\"maxTriggers\":5},{\"eventPattern\":\"room_entered:ceo\",\"targetKnot\":\"on_ceo_office_entered\",\"onceOnly\":true}]}],\"objects\":[{\"type\":\"phone\",\"name\":\"Reception Phone\",\"takeable\":false,\"readable\":true,\"voice\":\"Hi, this is the IT Team. Security breach detected in server room. Changed access code to 4829.\",\"sender\":\"IT Team\",\"timestamp\":\"2:15 AM\",\"observations\":\"The reception phone's message light is blinking urgently\"},{\"type\":\"notes\",\"name\":\"Security Log\",\"takeable\":true,\"readable\":true,\"text\":\"Unusual after-hours access detected:\\n- CEO office: 11:30 PM\\n- Server room: 2:15 AM\\n- CEO office again: 3:45 AM\",\"observations\":\"A concerning security log from last night\"},{\"type\":\"pc\",\"name\":\"Reception Computer\",\"takeable\":false,\"lockType\":\"password\",\"passwordHint\":\"Optional hint text\",\"showHint\":true,\"showKeyboard\":true,\"maxAttempts\":3,\"locked\":true,\"requires\":\"secret123\",\"observations\":\"The reception's computer, currently locked\",\"postitNote\":\"Password: secret123\",\"showPostit\":true,\"contents\":[{\"type\":\"text_file\",\"name\":\"Private\",\"takeable\":false,\"readable\":true,\"text\":\"Closet keypad code: 7391 - Must move evidence to safe before audit\"}]},{\"type\":\"tablet\",\"name\":\"Tablet Device\",\"takeable\":true,\"locked\":true,\"lockType\":\"bluetooth\",\"requires\":\"bluetooth\",\"mac\":\"00:11:22:33:44:55\",\"observations\":\"A locked tablet device that requires Bluetooth pairing\"},{\"type\":\"bluetooth_scanner\",\"name\":\"Bluetooth Scanner\",\"takeable\":true,\"observations\":\"A device for detecting nearby Bluetooth signals\",\"canScanBluetooth\":true},{\"type\":\"key\",\"name\":\"Office Key\",\"takeable\":true,\"key_id\":\"office1_key\",\"keyPins\":[100,0,100,0],\"observations\":\"A key to access the office areas\"},{\"type\":\"pin-cracker\",\"name\":\"PIN Cracker\",\"takeable\":true,\"observations\":\"A sophisticated device that can analyze PIN entry patterns and provide feedback on attempts\"},{\"type\":\"safe\",\"name\":\"Reception Safe\",\"takeable\":false,\"locked\":true,\"lockType\":\"pin\",\"requires\":\"9573\",\"observations\":\"A small wall safe behind the reception desk. Looks like it needs a 4-digit code.\",\"contents\":[{\"type\":\"notes\",\"name\":\"IT Access Credentials\",\"takeable\":true,\"readable\":true,\"text\":\"Emergency IT Admin Credentials:\\nUsername: admin\\nPassword: ITsecure2024\\n\\nServer Room Backup Code: 4829\\nCEO Office Alarm Override: 1337\",\"observations\":\"Sensitive IT credentials that could be very useful\"}]}]},\"office1\":{\"type\":\"room_office\",\"locked\":true,\"lockType\":\"key\",\"requires\":\"office1_key\",\"keyPins\":[100,0,100,0],\"difficulty\":\"easy\",\"door_sign\":\"4A Hot Desks\",\"connections\":{\"north\":[\"office2\",\"office3\"],\"south\":\"reception\"},\"objects\":[{\"type\":\"pc\",\"name\":\"Office Computer\",\"takeable\":false,\"requires\":\"password\",\"hasFingerprint\":true,\"fingerprintOwner\":\"ceo\",\"fingerprintDifficulty\":\"medium\",\"observations\":\"A computer with a cybersecurity alert on screen. There might be fingerprints on the keyboard.\"},{\"type\":\"notes\",\"name\":\"IT Memo\",\"takeable\":true,\"readable\":true,\"text\":\"URGENT: Multiple unauthorized access attempts detected from CEO's office IP address\",\"observations\":\"A concerning IT department memo\"},{\"type\":\"fingerprint_kit\",\"name\":\"Fingerprint Kit\",\"takeable\":true,\"observations\":\"A kit used for collecting fingerprints from surfaces\"}]},\"office2\":{\"type\":\"room_office\",\"connections\":{\"north\":\"ceo\",\"south\":\"office1\"},\"objects\":[{\"type\":\"pc\",\"name\":\"Office Computer\",\"takeable\":false,\"lockType\":\"password\",\"requires\":\"office2024\",\"showKeyboard\":true,\"maxAttempts\":3,\"locked\":true,\"postitNote\":\"Password: office2024\",\"showPostit\":true,\"observations\":\"A standard office computer with a sticky note on the monitor\"},{\"type\":\"notes\",\"name\":\"Shredded Document\",\"takeable\":true,\"readable\":true,\"text\":\"Partially readable: '...offshore account...transfer complete...delete all traces...'\",\"observations\":\"A partially shredded document that someone failed to dispose of properly\"},{\"type\":\"key\",\"name\":\"CEO Office Key\",\"takeable\":true,\"key_id\":\"ceo_office_key\",\"keyPins\":[0,50,100,150],\"observations\":\"A spare key to the CEO's office, carelessly left behind\"}]},\"office3\":{\"type\":\"room_office\",\"connections\":{\"north\":\"server1\",\"south\":\"office1\"},\"objects\":[{\"type\":\"pc\",\"name\":\"IT Staff Computer\",\"takeable\":false,\"requires\":\"bluetooth\",\"lockType\":\"bluetooth\",\"mac\":\"00:11:22:33:44:55\",\"observations\":\"An IT staff computer showing network security logs\"},{\"type\":\"notes\",\"name\":\"Network Logs\",\"takeable\":true,\"readable\":true,\"text\":\"Large data transfers detected to unknown external IPs - All originating from CEO's office\",\"observations\":\"Suspicious network activity logs\"}]},\"ceo\":{\"type\":\"room_ceo\",\"connections\":{\"north\":\"closet\",\"south\":\"office2\"},\"locked\":true,\"lockType\":\"key\",\"requires\":\"ceo_office_key\",\"keyPins\":[0,50,100,150],\"difficulty\":\"easy\",\"objects\":[{\"type\":\"pc\",\"name\":\"CEO Computer\",\"takeable\":false,\"lockType\":\"password\",\"requires\":\"ceo2024\",\"showKeyboard\":true,\"maxAttempts\":3,\"locked\":true,\"postitNote\":\"Password: ceo2024\",\"showPostit\":true,\"observations\":\"The CEO's laptop, still warm - recently used. A sticky note is attached to the screen.\"},{\"type\":\"suitcase\",\"name\":\"CEO Briefcase\",\"takeable\":false,\"locked\":true,\"lockType\":\"key\",\"requires\":\"briefcase_key\",\"keyPins\":[50,25,0,75],\"difficulty\":\"medium\",\"observations\":\"An expensive leather briefcase with a sturdy lock\",\"contents\":[{\"type\":\"notes\",\"name\":\"Private Note\",\"takeable\":true,\"readable\":true,\"text\":\"Closet keypad code: 7391 - Must move evidence to safe before audit\",\"observations\":\"A hastily written note on expensive paper\"},{\"type\":\"key\",\"name\":\"Safe Key\",\"takeable\":true,\"key_id\":\"safe_key\",\"keyPins\":[68,10,48,30],\"observations\":\"A heavy-duty safe key hidden behind server equipment\"}]},{\"type\":\"phone\",\"name\":\"CEO Phone\",\"takeable\":false,\"readable\":true,\"text\":\"Recent calls: 'Offshore Bank', 'Unknown', 'Data Buyer'\",\"sender\":\"Call Log\",\"timestamp\":\"Last 24 hours\",\"observations\":\"The CEO's phone shows suspicious recent calls\"}]},\"closet\":{\"type\":\"room_closet\",\"connections\":{\"south\":\"ceo\"},\"locked\":true,\"lockType\":\"pin\",\"requires\":\"7391\",\"objects\":[{\"type\":\"safe\",\"name\":\"Hidden Safe\",\"takeable\":false,\"locked\":true,\"lockType\":\"key\",\"requires\":\"safe_key\",\"keyPins\":[68,10,48,30],\"difficulty\":\"hard\",\"observations\":\"A well-hidden wall safe behind a painting\",\"contents\":[{\"type\":\"notes\",\"name\":\"Incriminating Documents\",\"takeable\":true,\"readable\":true,\"text\":\"Contract for sale of proprietary technology\\nBank transfers from competing companies\\nDetails of upcoming corporate espionage operations\",\"observations\":\"A folder containing damning evidence of corporate espionage. Congratulations! You've recovered the incriminating documents. flag{ceo_exfil_flag}\"}]}]},\"server1\":{\"type\":\"room_servers\",\"connections\":{\"south\":\"office3\"},\"locked\":true,\"lockType\":\"pin\",\"requires\":\"4829\",\"objects\":[{\"type\":\"pc\",\"name\":\"Server Terminal\",\"takeable\":false,\"observations\":\"The main server terminal showing massive data exfiltration\"},{\"type\":\"key\",\"name\":\"Briefcase Key\",\"takeable\":true,\"key_id\":\"briefcase_key\",\"keyPins\":[50,25,0,75],\"observations\":\"A small key labeled 'Personal - Do Not Copy'\"}]}}}"], ["score", 0], ["started_at", "2025-11-20 18:00:26.190791"], ["status", "in_progress"], ["updated_at", "2025-11-20 18:00:26.185151"]]
TRANSACTION (0.1ms) RELEASE SAVEPOINT active_record_1
TRANSACTION (0.1ms) SAVEPOINT active_record_1
BreakEscape::Game Update (1.6ms) UPDATE "break_escape_games" SET "player_state" = ?, "updated_at" = ? WHERE "break_escape_games"."id" = ? [["player_state", "{\"currentRoom\":\"reception\",\"unlockedRooms\":[\"reception\",\"office\"],\"unlockedObjects\":[],\"inventory\":[],\"encounteredNPCs\":[],\"globalVariables\":{},\"biometricSamples\":[],\"biometricUnlocks\":[],\"bluetoothDevices\":[],\"notes\":[],\"health\":100}"], ["updated_at", "2025-11-20 18:00:26.198136"], ["id", 1]]
TRANSACTION (0.0ms) RELEASE SAVEPOINT active_record_1
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
---------------------------------------------------------------
BreakEscape::GameTest: test_should_belong_to_player_and_mission
---------------------------------------------------------------
BreakEscape::Mission Load (0.1ms) SELECT "break_escape_missions".* FROM "break_escape_missions" WHERE "break_escape_missions"."id" = ? LIMIT ? [["id", 418560898], ["LIMIT", 1]]
BreakEscape::DemoUser Load (0.1ms) SELECT "break_escape_demo_users".* FROM "break_escape_demo_users" WHERE "break_escape_demo_users"."id" = ? LIMIT ? [["id", 149617800], ["LIMIT", 1]]
TRANSACTION (0.1ms) SAVEPOINT active_record_1
BreakEscape::Game Create (0.6ms) INSERT INTO "break_escape_games" ("completed_at", "created_at", "mission_id", "player_id", "player_state", "player_type", "scenario_data", "score", "started_at", "status", "updated_at") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) RETURNING "id" [["completed_at", nil], ["created_at", "2025-11-20 18:00:26.202787"], ["mission_id", 418560898], ["player_id", 149617800], ["player_state", "{\"currentRoom\":\"reception\",\"unlockedRooms\":[\"reception\"],\"unlockedObjects\":[],\"inventory\":[],\"encounteredNPCs\":[],\"globalVariables\":{},\"biometricSamples\":[],\"biometricUnlocks\":[],\"bluetoothDevices\":[],\"notes\":[],\"health\":100}"], ["player_type", "BreakEscape::DemoUser"], ["scenario_data", "{\"scenario_brief\":\"Hi! You are a cyber investigator tasked with uncovering evidence of corporate espionage. Anonymous tips suggest the CEO has been selling company secrets, but you need proof.\",\"startRoom\":\"reception\",\"startItemsInInventory\":[{\"type\":\"phone\",\"name\":\"Your Phone\",\"takeable\":true,\"phoneId\":\"player_phone\",\"npcIds\":[\"neye_eve\",\"gossip_girl\",\"helper_npc\"],\"observations\":\"Your personal phone with some interesting contacts\"},{\"type\":\"workstation\",\"name\":\"Crypto Analysis Station\",\"takeable\":true,\"observations\":\"A powerful workstation for cryptographic analysis\"},{\"type\":\"lockpick\",\"name\":\"Lock Pick Kit\",\"takeable\":true,\"observations\":\"A professional lock picking kit with various picks and tension wrenches\"}],\"rooms\":{\"reception\":{\"type\":\"room_reception\",\"connections\":{\"north\":\"office1\"},\"npcs\":[{\"id\":\"neye_eve\",\"displayName\":\"Neye Eve\",\"storyPath\":\"scenarios/ink/neye-eve.json\",\"avatar\":\"assets/npc/avatars/npc_adversary.png\",\"phoneId\":\"player_phone\",\"currentKnot\":\"start\",\"npcType\":\"phone\"},{\"id\":\"gossip_girl\",\"displayName\":\"Gossip Girl\",\"storyPath\":\"scenarios/ink/gossip-girl.json\",\"avatar\":\"assets/npc/avatars/npc_neutral.png\",\"phoneId\":\"player_phone\",\"currentKnot\":\"start\",\"npcType\":\"phone\",\"timedMessages\":[{\"delay\":5000,\"message\":\"Hey! 👋 Got any juicy gossip for me today?\",\"type\":\"text\"}]},{\"id\":\"helper_npc\",\"displayName\":\"Helpful Contact\",\"storyPath\":\"scenarios/ink/helper-npc.json\",\"avatar\":\"assets/npc/avatars/npc_helper.png\",\"phoneId\":\"player_phone\",\"currentKnot\":\"start\",\"npcType\":\"phone\",\"eventMappings\":[{\"eventPattern\":\"item_picked_up:lockpick\",\"targetKnot\":\"on_lockpick_pickup\",\"onceOnly\":true,\"cooldown\":0},{\"eventPattern\":\"minigame_completed\",\"targetKnot\":\"on_lockpick_success\",\"condition\":\"data.minigameName && data.minigameName.includes('Lockpick')\",\"cooldown\":10000},{\"eventPattern\":\"minigame_failed\",\"targetKnot\":\"on_lockpick_failed\",\"condition\":\"data.minigameName && data.minigameName.includes('Lockpick')\",\"cooldown\":15000},{\"eventPattern\":\"door_unlocked\",\"targetKnot\":\"on_door_unlocked\",\"cooldown\":8000},{\"eventPattern\":\"door_unlock_attempt\",\"targetKnot\":\"on_door_attempt\",\"cooldown\":12000},{\"eventPattern\":\"object_interacted\",\"targetKnot\":\"on_ceo_desk_interact\",\"condition\":\"data.objectType === 'desk_ceo'\",\"cooldown\":10000},{\"eventPattern\":\"item_picked_up:*\",\"targetKnot\":\"on_item_found\",\"cooldown\":20000},{\"eventPattern\":\"room_entered\",\"targetKnot\":\"on_room_entered\",\"cooldown\":45000,\"maxTriggers\":3},{\"eventPattern\":\"room_discovered\",\"targetKnot\":\"on_room_discovered\",\"cooldown\":15000,\"maxTriggers\":5},{\"eventPattern\":\"room_entered:ceo\",\"targetKnot\":\"on_ceo_office_entered\",\"onceOnly\":true}]}],\"objects\":[{\"type\":\"phone\",\"name\":\"Reception Phone\",\"takeable\":false,\"readable\":true,\"voice\":\"Hi, this is the IT Team. Security breach detected in server room. Changed access code to 4829.\",\"sender\":\"IT Team\",\"timestamp\":\"2:15 AM\",\"observations\":\"The reception phone's message light is blinking urgently\"},{\"type\":\"notes\",\"name\":\"Security Log\",\"takeable\":true,\"readable\":true,\"text\":\"Unusual after-hours access detected:\\n- CEO office: 11:30 PM\\n- Server room: 2:15 AM\\n- CEO office again: 3:45 AM\",\"observations\":\"A concerning security log from last night\"},{\"type\":\"pc\",\"name\":\"Reception Computer\",\"takeable\":false,\"lockType\":\"password\",\"passwordHint\":\"Optional hint text\",\"showHint\":true,\"showKeyboard\":true,\"maxAttempts\":3,\"locked\":true,\"requires\":\"secret123\",\"observations\":\"The reception's computer, currently locked\",\"postitNote\":\"Password: secret123\",\"showPostit\":true,\"contents\":[{\"type\":\"text_file\",\"name\":\"Private\",\"takeable\":false,\"readable\":true,\"text\":\"Closet keypad code: 7391 - Must move evidence to safe before audit\"}]},{\"type\":\"tablet\",\"name\":\"Tablet Device\",\"takeable\":true,\"locked\":true,\"lockType\":\"bluetooth\",\"requires\":\"bluetooth\",\"mac\":\"00:11:22:33:44:55\",\"observations\":\"A locked tablet device that requires Bluetooth pairing\"},{\"type\":\"bluetooth_scanner\",\"name\":\"Bluetooth Scanner\",\"takeable\":true,\"observations\":\"A device for detecting nearby Bluetooth signals\",\"canScanBluetooth\":true},{\"type\":\"key\",\"name\":\"Office Key\",\"takeable\":true,\"key_id\":\"office1_key\",\"keyPins\":[100,0,100,0],\"observations\":\"A key to access the office areas\"},{\"type\":\"pin-cracker\",\"name\":\"PIN Cracker\",\"takeable\":true,\"observations\":\"A sophisticated device that can analyze PIN entry patterns and provide feedback on attempts\"},{\"type\":\"safe\",\"name\":\"Reception Safe\",\"takeable\":false,\"locked\":true,\"lockType\":\"pin\",\"requires\":\"9573\",\"observations\":\"A small wall safe behind the reception desk. Looks like it needs a 4-digit code.\",\"contents\":[{\"type\":\"notes\",\"name\":\"IT Access Credentials\",\"takeable\":true,\"readable\":true,\"text\":\"Emergency IT Admin Credentials:\\nUsername: admin\\nPassword: ITsecure2024\\n\\nServer Room Backup Code: 4829\\nCEO Office Alarm Override: 1337\",\"observations\":\"Sensitive IT credentials that could be very useful\"}]}]},\"office1\":{\"type\":\"room_office\",\"locked\":true,\"lockType\":\"key\",\"requires\":\"office1_key\",\"keyPins\":[100,0,100,0],\"difficulty\":\"easy\",\"door_sign\":\"4A Hot Desks\",\"connections\":{\"north\":[\"office2\",\"office3\"],\"south\":\"reception\"},\"objects\":[{\"type\":\"pc\",\"name\":\"Office Computer\",\"takeable\":false,\"requires\":\"password\",\"hasFingerprint\":true,\"fingerprintOwner\":\"ceo\",\"fingerprintDifficulty\":\"medium\",\"observations\":\"A computer with a cybersecurity alert on screen. There might be fingerprints on the keyboard.\"},{\"type\":\"notes\",\"name\":\"IT Memo\",\"takeable\":true,\"readable\":true,\"text\":\"URGENT: Multiple unauthorized access attempts detected from CEO's office IP address\",\"observations\":\"A concerning IT department memo\"},{\"type\":\"fingerprint_kit\",\"name\":\"Fingerprint Kit\",\"takeable\":true,\"observations\":\"A kit used for collecting fingerprints from surfaces\"}]},\"office2\":{\"type\":\"room_office\",\"connections\":{\"north\":\"ceo\",\"south\":\"office1\"},\"objects\":[{\"type\":\"pc\",\"name\":\"Office Computer\",\"takeable\":false,\"lockType\":\"password\",\"requires\":\"office2024\",\"showKeyboard\":true,\"maxAttempts\":3,\"locked\":true,\"postitNote\":\"Password: office2024\",\"showPostit\":true,\"observations\":\"A standard office computer with a sticky note on the monitor\"},{\"type\":\"notes\",\"name\":\"Shredded Document\",\"takeable\":true,\"readable\":true,\"text\":\"Partially readable: '...offshore account...transfer complete...delete all traces...'\",\"observations\":\"A partially shredded document that someone failed to dispose of properly\"},{\"type\":\"key\",\"name\":\"CEO Office Key\",\"takeable\":true,\"key_id\":\"ceo_office_key\",\"keyPins\":[0,50,100,150],\"observations\":\"A spare key to the CEO's office, carelessly left behind\"}]},\"office3\":{\"type\":\"room_office\",\"connections\":{\"north\":\"server1\",\"south\":\"office1\"},\"objects\":[{\"type\":\"pc\",\"name\":\"IT Staff Computer\",\"takeable\":false,\"requires\":\"bluetooth\",\"lockType\":\"bluetooth\",\"mac\":\"00:11:22:33:44:55\",\"observations\":\"An IT staff computer showing network security logs\"},{\"type\":\"notes\",\"name\":\"Network Logs\",\"takeable\":true,\"readable\":true,\"text\":\"Large data transfers detected to unknown external IPs - All originating from CEO's office\",\"observations\":\"Suspicious network activity logs\"}]},\"ceo\":{\"type\":\"room_ceo\",\"connections\":{\"north\":\"closet\",\"south\":\"office2\"},\"locked\":true,\"lockType\":\"key\",\"requires\":\"ceo_office_key\",\"keyPins\":[0,50,100,150],\"difficulty\":\"easy\",\"objects\":[{\"type\":\"pc\",\"name\":\"CEO Computer\",\"takeable\":false,\"lockType\":\"password\",\"requires\":\"ceo2024\",\"showKeyboard\":true,\"maxAttempts\":3,\"locked\":true,\"postitNote\":\"Password: ceo2024\",\"showPostit\":true,\"observations\":\"The CEO's laptop, still warm - recently used. A sticky note is attached to the screen.\"},{\"type\":\"suitcase\",\"name\":\"CEO Briefcase\",\"takeable\":false,\"locked\":true,\"lockType\":\"key\",\"requires\":\"briefcase_key\",\"keyPins\":[50,25,0,75],\"difficulty\":\"medium\",\"observations\":\"An expensive leather briefcase with a sturdy lock\",\"contents\":[{\"type\":\"notes\",\"name\":\"Private Note\",\"takeable\":true,\"readable\":true,\"text\":\"Closet keypad code: 7391 - Must move evidence to safe before audit\",\"observations\":\"A hastily written note on expensive paper\"},{\"type\":\"key\",\"name\":\"Safe Key\",\"takeable\":true,\"key_id\":\"safe_key\",\"keyPins\":[68,10,48,30],\"observations\":\"A heavy-duty safe key hidden behind server equipment\"}]},{\"type\":\"phone\",\"name\":\"CEO Phone\",\"takeable\":false,\"readable\":true,\"text\":\"Recent calls: 'Offshore Bank', 'Unknown', 'Data Buyer'\",\"sender\":\"Call Log\",\"timestamp\":\"Last 24 hours\",\"observations\":\"The CEO's phone shows suspicious recent calls\"}]},\"closet\":{\"type\":\"room_closet\",\"connections\":{\"south\":\"ceo\"},\"locked\":true,\"lockType\":\"pin\",\"requires\":\"7391\",\"objects\":[{\"type\":\"safe\",\"name\":\"Hidden Safe\",\"takeable\":false,\"locked\":true,\"lockType\":\"key\",\"requires\":\"safe_key\",\"keyPins\":[68,10,48,30],\"difficulty\":\"hard\",\"observations\":\"A well-hidden wall safe behind a painting\",\"contents\":[{\"type\":\"notes\",\"name\":\"Incriminating Documents\",\"takeable\":true,\"readable\":true,\"text\":\"Contract for sale of proprietary technology\\nBank transfers from competing companies\\nDetails of upcoming corporate espionage operations\",\"observations\":\"A folder containing damning evidence of corporate espionage. Congratulations! You've recovered the incriminating documents. flag{ceo_exfil_flag}\"}]}]},\"server1\":{\"type\":\"room_servers\",\"connections\":{\"south\":\"office3\"},\"locked\":true,\"lockType\":\"pin\",\"requires\":\"4829\",\"objects\":[{\"type\":\"pc\",\"name\":\"Server Terminal\",\"takeable\":false,\"observations\":\"The main server terminal showing massive data exfiltration\"},{\"type\":\"key\",\"name\":\"Briefcase Key\",\"takeable\":true,\"key_id\":\"briefcase_key\",\"keyPins\":[50,25,0,75],\"observations\":\"A small key labeled 'Personal - Do Not Copy'\"}]}}}"], ["score", 0], ["started_at", "2025-11-20 18:00:26.204368"], ["status", "in_progress"], ["updated_at", "2025-11-20 18:00:26.202787"]]
TRANSACTION (0.1ms) RELEASE SAVEPOINT active_record_1
TRANSACTION (0.0ms) ROLLBACK TRANSACTION
TRANSACTION (0.0ms) BEGIN deferred TRANSACTION
--------------------------------------------------
BreakEscape::GameTest: test_should_track_inventory
--------------------------------------------------
BreakEscape::Mission Load (0.1ms) SELECT "break_escape_missions".* FROM "break_escape_missions" WHERE "break_escape_missions"."id" = ? LIMIT ? [["id", 418560898], ["LIMIT", 1]]
BreakEscape::DemoUser Load (0.1ms) SELECT "break_escape_demo_users".* FROM "break_escape_demo_users" WHERE "break_escape_demo_users"."id" = ? LIMIT ? [["id", 149617800], ["LIMIT", 1]]
TRANSACTION (0.1ms) SAVEPOINT active_record_1
BreakEscape::Game Create (0.6ms) INSERT INTO "break_escape_games" ("completed_at", "created_at", "mission_id", "player_id", "player_state", "player_type", "scenario_data", "score", "started_at", "status", "updated_at") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) RETURNING "id" [["completed_at", nil], ["created_at", "2025-11-20 18:00:26.208849"], ["mission_id", 418560898], ["player_id", 149617800], ["player_state", "{\"currentRoom\":\"reception\",\"unlockedRooms\":[\"reception\"],\"unlockedObjects\":[],\"inventory\":[],\"encounteredNPCs\":[],\"globalVariables\":{},\"biometricSamples\":[],\"biometricUnlocks\":[],\"bluetoothDevices\":[],\"notes\":[],\"health\":100}"], ["player_type", "BreakEscape::DemoUser"], ["scenario_data", "{\"scenario_brief\":\"Hi! You are a cyber investigator tasked with uncovering evidence of corporate espionage. Anonymous tips suggest the CEO has been selling company secrets, but you need proof.\",\"startRoom\":\"reception\",\"startItemsInInventory\":[{\"type\":\"phone\",\"name\":\"Your Phone\",\"takeable\":true,\"phoneId\":\"player_phone\",\"npcIds\":[\"neye_eve\",\"gossip_girl\",\"helper_npc\"],\"observations\":\"Your personal phone with some interesting contacts\"},{\"type\":\"workstation\",\"name\":\"Crypto Analysis Station\",\"takeable\":true,\"observations\":\"A powerful workstation for cryptographic analysis\"},{\"type\":\"lockpick\",\"name\":\"Lock Pick Kit\",\"takeable\":true,\"observations\":\"A professional lock picking kit with various picks and tension wrenches\"}],\"rooms\":{\"reception\":{\"type\":\"room_reception\",\"connections\":{\"north\":\"office1\"},\"npcs\":[{\"id\":\"neye_eve\",\"displayName\":\"Neye Eve\",\"storyPath\":\"scenarios/ink/neye-eve.json\",\"avatar\":\"assets/npc/avatars/npc_adversary.png\",\"phoneId\":\"player_phone\",\"currentKnot\":\"start\",\"npcType\":\"phone\"},{\"id\":\"gossip_girl\",\"displayName\":\"Gossip Girl\",\"storyPath\":\"scenarios/ink/gossip-girl.json\",\"avatar\":\"assets/npc/avatars/npc_neutral.png\",\"phoneId\":\"player_phone\",\"currentKnot\":\"start\",\"npcType\":\"phone\",\"timedMessages\":[{\"delay\":5000,\"message\":\"Hey! 👋 Got any juicy gossip for me today?\",\"type\":\"text\"}]},{\"id\":\"helper_npc\",\"displayName\":\"Helpful Contact\",\"storyPath\":\"scenarios/ink/helper-npc.json\",\"avatar\":\"assets/npc/avatars/npc_helper.png\",\"phoneId\":\"player_phone\",\"currentKnot\":\"start\",\"npcType\":\"phone\",\"eventMappings\":[{\"eventPattern\":\"item_picked_up:lockpick\",\"targetKnot\":\"on_lockpick_pickup\",\"onceOnly\":true,\"cooldown\":0},{\"eventPattern\":\"minigame_completed\",\"targetKnot\":\"on_lockpick_success\",\"condition\":\"data.minigameName && data.minigameName.includes('Lockpick')\",\"cooldown\":10000},{\"eventPattern\":\"minigame_failed\",\"targetKnot\":\"on_lockpick_failed\",\"condition\":\"data.minigameName && data.minigameName.includes('Lockpick')\",\"cooldown\":15000},{\"eventPattern\":\"door_unlocked\",\"targetKnot\":\"on_door_unlocked\",\"cooldown\":8000},{\"eventPattern\":\"door_unlock_attempt\",\"targetKnot\":\"on_door_attempt\",\"cooldown\":12000},{\"eventPattern\":\"object_interacted\",\"targetKnot\":\"on_ceo_desk_interact\",\"condition\":\"data.objectType === 'desk_ceo'\",\"cooldown\":10000},{\"eventPattern\":\"item_picked_up:*\",\"targetKnot\":\"on_item_found\",\"cooldown\":20000},{\"eventPattern\":\"room_entered\",\"targetKnot\":\"on_room_entered\",\"cooldown\":45000,\"maxTriggers\":3},{\"eventPattern\":\"room_discovered\",\"targetKnot\":\"on_room_discovered\",\"cooldown\":15000,\"maxTriggers\":5},{\"eventPattern\":\"room_entered:ceo\",\"targetKnot\":\"on_ceo_office_entered\",\"onceOnly\":true}]}],\"objects\":[{\"type\":\"phone\",\"name\":\"Reception Phone\",\"takeable\":false,\"readable\":true,\"voice\":\"Hi, this is the IT Team. Security breach detected in server room. Changed access code to 4829.\",\"sender\":\"IT Team\",\"timestamp\":\"2:15 AM\",\"observations\":\"The reception phone's message light is blinking urgently\"},{\"type\":\"notes\",\"name\":\"Security Log\",\"takeable\":true,\"readable\":true,\"text\":\"Unusual after-hours access detected:\\n- CEO office: 11:30 PM\\n- Server room: 2:15 AM\\n- CEO office again: 3:45 AM\",\"observations\":\"A concerning security log from last night\"},{\"type\":\"pc\",\"name\":\"Reception Computer\",\"takeable\":false,\"lockType\":\"password\",\"passwordHint\":\"Optional hint text\",\"showHint\":true,\"showKeyboard\":true,\"maxAttempts\":3,\"locked\":true,\"requires\":\"secret123\",\"observations\":\"The reception's computer, currently locked\",\"postitNote\":\"Password: secret123\",\"showPostit\":true,\"contents\":[{\"type\":\"text_file\",\"name\":\"Private\",\"takeable\":false,\"readable\":true,\"text\":\"Closet keypad code: 7391 - Must move evidence to safe before audit\"}]},{\"type\":\"tablet\",\"name\":\"Tablet Device\",\"takeable\":true,\"locked\":true,\"lockType\":\"bluetooth\",\"requires\":\"bluetooth\",\"mac\":\"00:11:22:33:44:55\",\"observations\":\"A locked tablet device that requires Bluetooth pairing\"},{\"type\":\"bluetooth_scanner\",\"name\":\"Bluetooth Scanner\",\"takeable\":true,\"observations\":\"A device for detecting nearby Bluetooth signals\",\"canScanBluetooth\":true},{\"type\":\"key\",\"name\":\"Office Key\",\"takeable\":true,\"key_id\":\"office1_key\",\"keyPins\":[100,0,100,0],\"observations\":\"A key to access the office areas\"},{\"type\":\"pin-cracker\",\"name\":\"PIN Cracker\",\"takeable\":true,\"observations\":\"A sophisticated device that can analyze PIN entry patterns and provide feedback on attempts\"},{\"type\":\"safe\",\"name\":\"Reception Safe\",\"takeable\":false,\"locked\":true,\"lockType\":\"pin\",\"requires\":\"9573\",\"observations\":\"A small wall safe behind the reception desk. Looks like it needs a 4-digit code.\",\"contents\":[{\"type\":\"notes\",\"name\":\"IT Access Credentials\",\"takeable\":true,\"readable\":true,\"text\":\"Emergency IT Admin Credentials:\\nUsername: admin\\nPassword: ITsecure2024\\n\\nServer Room Backup Code: 4829\\nCEO Office Alarm Override: 1337\",\"observations\":\"Sensitive IT credentials that could be very useful\"}]}]},\"office1\":{\"type\":\"room_office\",\"locked\":true,\"lockType\":\"key\",\"requires\":\"office1_key\",\"keyPins\":[100,0,100,0],\"difficulty\":\"easy\",\"door_sign\":\"4A Hot Desks\",\"connections\":{\"north\":[\"office2\",\"office3\"],\"south\":\"reception\"},\"objects\":[{\"type\":\"pc\",\"name\":\"Office Computer\",\"takeable\":false,\"requires\":\"password\",\"hasFingerprint\":true,\"fingerprintOwner\":\"ceo\",\"fingerprintDifficulty\":\"medium\",\"observations\":\"A computer with a cybersecurity alert on screen. There might be fingerprints on the keyboard.\"},{\"type\":\"notes\",\"name\":\"IT Memo\",\"takeable\":true,\"readable\":true,\"text\":\"URGENT: Multiple unauthorized access attempts detected from CEO's office IP address\",\"observations\":\"A concerning IT department memo\"},{\"type\":\"fingerprint_kit\",\"name\":\"Fingerprint Kit\",\"takeable\":true,\"observations\":\"A kit used for collecting fingerprints from surfaces\"}]},\"office2\":{\"type\":\"room_office\",\"connections\":{\"north\":\"ceo\",\"south\":\"office1\"},\"objects\":[{\"type\":\"pc\",\"name\":\"Office Computer\",\"takeable\":false,\"lockType\":\"password\",\"requires\":\"office2024\",\"showKeyboard\":true,\"maxAttempts\":3,\"locked\":true,\"postitNote\":\"Password: office2024\",\"showPostit\":true,\"observations\":\"A standard office computer with a sticky note on the monitor\"},{\"type\":\"notes\",\"name\":\"Shredded Document\",\"takeable\":true,\"readable\":true,\"text\":\"Partially readable: '...offshore account...transfer complete...delete all traces...'\",\"observations\":\"A partially shredded document that someone failed to dispose of properly\"},{\"type\":\"key\",\"name\":\"CEO Office Key\",\"takeable\":true,\"key_id\":\"ceo_office_key\",\"keyPins\":[0,50,100,150],\"observations\":\"A spare key to the CEO's office, carelessly left behind\"}]},\"office3\":{\"type\":\"room_office\",\"connections\":{\"north\":\"server1\",\"south\":\"office1\"},\"objects\":[{\"type\":\"pc\",\"name\":\"IT Staff Computer\",\"takeable\":false,\"requires\":\"bluetooth\",\"lockType\":\"bluetooth\",\"mac\":\"00:11:22:33:44:55\",\"observations\":\"An IT staff computer showing network security logs\"},{\"type\":\"notes\",\"name\":\"Network Logs\",\"takeable\":true,\"readable\":true,\"text\":\"Large data transfers detected to unknown external IPs - All originating from CEO's office\",\"observations\":\"Suspicious network activity logs\"}]},\"ceo\":{\"type\":\"room_ceo\",\"connections\":{\"north\":\"closet\",\"south\":\"office2\"},\"locked\":true,\"lockType\":\"key\",\"requires\":\"ceo_office_key\",\"keyPins\":[0,50,100,150],\"difficulty\":\"easy\",\"objects\":[{\"type\":\"pc\",\"name\":\"CEO Computer\",\"takeable\":false,\"lockType\":\"password\",\"requires\":\"ceo2024\",\"showKeyboard\":true,\"maxAttempts\":3,\"locked\":true,\"postitNote\":\"Password: ceo2024\",\"showPostit\":true,\"observations\":\"The CEO's laptop, still warm - recently used. A sticky note is attached to the screen.\"},{\"type\":\"suitcase\",\"name\":\"CEO Briefcase\",\"takeable\":false,\"locked\":true,\"lockType\":\"key\",\"requires\":\"briefcase_key\",\"keyPins\":[50,25,0,75],\"difficulty\":\"medium\",\"observations\":\"An expensive leather briefcase with a sturdy lock\",\"contents\":[{\"type\":\"notes\",\"name\":\"Private Note\",\"takeable\":true,\"readable\":true,\"text\":\"Closet keypad code: 7391 - Must move evidence to safe before audit\",\"observations\":\"A hastily written note on expensive paper\"},{\"type\":\"key\",\"name\":\"Safe Key\",\"takeable\":true,\"key_id\":\"safe_key\",\"keyPins\":[68,10,48,30],\"observations\":\"A heavy-duty safe key hidden behind server equipment\"}]},{\"type\":\"phone\",\"name\":\"CEO Phone\",\"takeable\":false,\"readable\":true,\"text\":\"Recent calls: 'Offshore Bank', 'Unknown', 'Data Buyer'\",\"sender\":\"Call Log\",\"timestamp\":\"Last 24 hours\",\"observations\":\"The CEO's phone shows suspicious recent calls\"}]},\"closet\":{\"type\":\"room_closet\",\"connections\":{\"south\":\"ceo\"},\"locked\":true,\"lockType\":\"pin\",\"requires\":\"7391\",\"objects\":[{\"type\":\"safe\",\"name\":\"Hidden Safe\",\"takeable\":false,\"locked\":true,\"lockType\":\"key\",\"requires\":\"safe_key\",\"keyPins\":[68,10,48,30],\"difficulty\":\"hard\",\"observations\":\"A well-hidden wall safe behind a painting\",\"contents\":[{\"type\":\"notes\",\"name\":\"Incriminating Documents\",\"takeable\":true,\"readable\":true,\"text\":\"Contract for sale of proprietary technology\\nBank transfers from competing companies\\nDetails of upcoming corporate espionage operations\",\"observations\":\"A folder containing damning evidence of corporate espionage. Congratulations! You've recovered the incriminating documents. flag{ceo_exfil_flag}\"}]}]},\"server1\":{\"type\":\"room_servers\",\"connections\":{\"south\":\"office3\"},\"locked\":true,\"lockType\":\"pin\",\"requires\":\"4829\",\"objects\":[{\"type\":\"pc\",\"name\":\"Server Terminal\",\"takeable\":false,\"observations\":\"The main server terminal showing massive data exfiltration\"},{\"type\":\"key\",\"name\":\"Briefcase Key\",\"takeable\":true,\"key_id\":\"briefcase_key\",\"keyPins\":[50,25,0,75],\"observations\":\"A small key labeled 'Personal - Do Not Copy'\"}]}}}"], ["score", 0], ["started_at", "2025-11-20 18:00:26.210401"], ["status", "in_progress"], ["updated_at", "2025-11-20 18:00:26.208849"]]
TRANSACTION (0.1ms) RELEASE SAVEPOINT active_record_1
TRANSACTION (0.1ms) SAVEPOINT active_record_1
BreakEscape::Game Update (0.3ms) UPDATE "break_escape_games" SET "player_state" = ?, "updated_at" = ? WHERE "break_escape_games"."id" = ? [["player_state", "{\"currentRoom\":\"reception\",\"unlockedRooms\":[\"reception\"],\"unlockedObjects\":[],\"inventory\":[{\"type\":\"key\",\"name\":\"Test Key\"}],\"encounteredNPCs\":[],\"globalVariables\":{},\"biometricSamples\":[],\"biometricUnlocks\":[],\"bluetoothDevices\":[],\"notes\":[],\"health\":100}"], ["updated_at", "2025-11-20 18:00:26.212813"], ["id", 1]]
TRANSACTION (0.1ms) RELEASE SAVEPOINT active_record_1
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
------------------------------------------------
BreakEscape::GameTest: test_should_update_health
------------------------------------------------
BreakEscape::Mission Load (0.1ms) SELECT "break_escape_missions".* FROM "break_escape_missions" WHERE "break_escape_missions"."id" = ? LIMIT ? [["id", 418560898], ["LIMIT", 1]]
BreakEscape::DemoUser Load (0.1ms) SELECT "break_escape_demo_users".* FROM "break_escape_demo_users" WHERE "break_escape_demo_users"."id" = ? LIMIT ? [["id", 149617800], ["LIMIT", 1]]
TRANSACTION (0.1ms) SAVEPOINT active_record_1
BreakEscape::Game Create (0.4ms) INSERT INTO "break_escape_games" ("completed_at", "created_at", "mission_id", "player_id", "player_state", "player_type", "scenario_data", "score", "started_at", "status", "updated_at") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) RETURNING "id" [["completed_at", nil], ["created_at", "2025-11-20 18:00:26.215875"], ["mission_id", 418560898], ["player_id", 149617800], ["player_state", "{\"currentRoom\":\"reception\",\"unlockedRooms\":[\"reception\"],\"unlockedObjects\":[],\"inventory\":[],\"encounteredNPCs\":[],\"globalVariables\":{},\"biometricSamples\":[],\"biometricUnlocks\":[],\"bluetoothDevices\":[],\"notes\":[],\"health\":100}"], ["player_type", "BreakEscape::DemoUser"], ["scenario_data", "{\"scenario_brief\":\"Hi! You are a cyber investigator tasked with uncovering evidence of corporate espionage. Anonymous tips suggest the CEO has been selling company secrets, but you need proof.\",\"startRoom\":\"reception\",\"startItemsInInventory\":[{\"type\":\"phone\",\"name\":\"Your Phone\",\"takeable\":true,\"phoneId\":\"player_phone\",\"npcIds\":[\"neye_eve\",\"gossip_girl\",\"helper_npc\"],\"observations\":\"Your personal phone with some interesting contacts\"},{\"type\":\"workstation\",\"name\":\"Crypto Analysis Station\",\"takeable\":true,\"observations\":\"A powerful workstation for cryptographic analysis\"},{\"type\":\"lockpick\",\"name\":\"Lock Pick Kit\",\"takeable\":true,\"observations\":\"A professional lock picking kit with various picks and tension wrenches\"}],\"rooms\":{\"reception\":{\"type\":\"room_reception\",\"connections\":{\"north\":\"office1\"},\"npcs\":[{\"id\":\"neye_eve\",\"displayName\":\"Neye Eve\",\"storyPath\":\"scenarios/ink/neye-eve.json\",\"avatar\":\"assets/npc/avatars/npc_adversary.png\",\"phoneId\":\"player_phone\",\"currentKnot\":\"start\",\"npcType\":\"phone\"},{\"id\":\"gossip_girl\",\"displayName\":\"Gossip Girl\",\"storyPath\":\"scenarios/ink/gossip-girl.json\",\"avatar\":\"assets/npc/avatars/npc_neutral.png\",\"phoneId\":\"player_phone\",\"currentKnot\":\"start\",\"npcType\":\"phone\",\"timedMessages\":[{\"delay\":5000,\"message\":\"Hey! 👋 Got any juicy gossip for me today?\",\"type\":\"text\"}]},{\"id\":\"helper_npc\",\"displayName\":\"Helpful Contact\",\"storyPath\":\"scenarios/ink/helper-npc.json\",\"avatar\":\"assets/npc/avatars/npc_helper.png\",\"phoneId\":\"player_phone\",\"currentKnot\":\"start\",\"npcType\":\"phone\",\"eventMappings\":[{\"eventPattern\":\"item_picked_up:lockpick\",\"targetKnot\":\"on_lockpick_pickup\",\"onceOnly\":true,\"cooldown\":0},{\"eventPattern\":\"minigame_completed\",\"targetKnot\":\"on_lockpick_success\",\"condition\":\"data.minigameName && data.minigameName.includes('Lockpick')\",\"cooldown\":10000},{\"eventPattern\":\"minigame_failed\",\"targetKnot\":\"on_lockpick_failed\",\"condition\":\"data.minigameName && data.minigameName.includes('Lockpick')\",\"cooldown\":15000},{\"eventPattern\":\"door_unlocked\",\"targetKnot\":\"on_door_unlocked\",\"cooldown\":8000},{\"eventPattern\":\"door_unlock_attempt\",\"targetKnot\":\"on_door_attempt\",\"cooldown\":12000},{\"eventPattern\":\"object_interacted\",\"targetKnot\":\"on_ceo_desk_interact\",\"condition\":\"data.objectType === 'desk_ceo'\",\"cooldown\":10000},{\"eventPattern\":\"item_picked_up:*\",\"targetKnot\":\"on_item_found\",\"cooldown\":20000},{\"eventPattern\":\"room_entered\",\"targetKnot\":\"on_room_entered\",\"cooldown\":45000,\"maxTriggers\":3},{\"eventPattern\":\"room_discovered\",\"targetKnot\":\"on_room_discovered\",\"cooldown\":15000,\"maxTriggers\":5},{\"eventPattern\":\"room_entered:ceo\",\"targetKnot\":\"on_ceo_office_entered\",\"onceOnly\":true}]}],\"objects\":[{\"type\":\"phone\",\"name\":\"Reception Phone\",\"takeable\":false,\"readable\":true,\"voice\":\"Hi, this is the IT Team. Security breach detected in server room. Changed access code to 4829.\",\"sender\":\"IT Team\",\"timestamp\":\"2:15 AM\",\"observations\":\"The reception phone's message light is blinking urgently\"},{\"type\":\"notes\",\"name\":\"Security Log\",\"takeable\":true,\"readable\":true,\"text\":\"Unusual after-hours access detected:\\n- CEO office: 11:30 PM\\n- Server room: 2:15 AM\\n- CEO office again: 3:45 AM\",\"observations\":\"A concerning security log from last night\"},{\"type\":\"pc\",\"name\":\"Reception Computer\",\"takeable\":false,\"lockType\":\"password\",\"passwordHint\":\"Optional hint text\",\"showHint\":true,\"showKeyboard\":true,\"maxAttempts\":3,\"locked\":true,\"requires\":\"secret123\",\"observations\":\"The reception's computer, currently locked\",\"postitNote\":\"Password: secret123\",\"showPostit\":true,\"contents\":[{\"type\":\"text_file\",\"name\":\"Private\",\"takeable\":false,\"readable\":true,\"text\":\"Closet keypad code: 7391 - Must move evidence to safe before audit\"}]},{\"type\":\"tablet\",\"name\":\"Tablet Device\",\"takeable\":true,\"locked\":true,\"lockType\":\"bluetooth\",\"requires\":\"bluetooth\",\"mac\":\"00:11:22:33:44:55\",\"observations\":\"A locked tablet device that requires Bluetooth pairing\"},{\"type\":\"bluetooth_scanner\",\"name\":\"Bluetooth Scanner\",\"takeable\":true,\"observations\":\"A device for detecting nearby Bluetooth signals\",\"canScanBluetooth\":true},{\"type\":\"key\",\"name\":\"Office Key\",\"takeable\":true,\"key_id\":\"office1_key\",\"keyPins\":[100,0,100,0],\"observations\":\"A key to access the office areas\"},{\"type\":\"pin-cracker\",\"name\":\"PIN Cracker\",\"takeable\":true,\"observations\":\"A sophisticated device that can analyze PIN entry patterns and provide feedback on attempts\"},{\"type\":\"safe\",\"name\":\"Reception Safe\",\"takeable\":false,\"locked\":true,\"lockType\":\"pin\",\"requires\":\"9573\",\"observations\":\"A small wall safe behind the reception desk. Looks like it needs a 4-digit code.\",\"contents\":[{\"type\":\"notes\",\"name\":\"IT Access Credentials\",\"takeable\":true,\"readable\":true,\"text\":\"Emergency IT Admin Credentials:\\nUsername: admin\\nPassword: ITsecure2024\\n\\nServer Room Backup Code: 4829\\nCEO Office Alarm Override: 1337\",\"observations\":\"Sensitive IT credentials that could be very useful\"}]}]},\"office1\":{\"type\":\"room_office\",\"locked\":true,\"lockType\":\"key\",\"requires\":\"office1_key\",\"keyPins\":[100,0,100,0],\"difficulty\":\"easy\",\"door_sign\":\"4A Hot Desks\",\"connections\":{\"north\":[\"office2\",\"office3\"],\"south\":\"reception\"},\"objects\":[{\"type\":\"pc\",\"name\":\"Office Computer\",\"takeable\":false,\"requires\":\"password\",\"hasFingerprint\":true,\"fingerprintOwner\":\"ceo\",\"fingerprintDifficulty\":\"medium\",\"observations\":\"A computer with a cybersecurity alert on screen. There might be fingerprints on the keyboard.\"},{\"type\":\"notes\",\"name\":\"IT Memo\",\"takeable\":true,\"readable\":true,\"text\":\"URGENT: Multiple unauthorized access attempts detected from CEO's office IP address\",\"observations\":\"A concerning IT department memo\"},{\"type\":\"fingerprint_kit\",\"name\":\"Fingerprint Kit\",\"takeable\":true,\"observations\":\"A kit used for collecting fingerprints from surfaces\"}]},\"office2\":{\"type\":\"room_office\",\"connections\":{\"north\":\"ceo\",\"south\":\"office1\"},\"objects\":[{\"type\":\"pc\",\"name\":\"Office Computer\",\"takeable\":false,\"lockType\":\"password\",\"requires\":\"office2024\",\"showKeyboard\":true,\"maxAttempts\":3,\"locked\":true,\"postitNote\":\"Password: office2024\",\"showPostit\":true,\"observations\":\"A standard office computer with a sticky note on the monitor\"},{\"type\":\"notes\",\"name\":\"Shredded Document\",\"takeable\":true,\"readable\":true,\"text\":\"Partially readable: '...offshore account...transfer complete...delete all traces...'\",\"observations\":\"A partially shredded document that someone failed to dispose of properly\"},{\"type\":\"key\",\"name\":\"CEO Office Key\",\"takeable\":true,\"key_id\":\"ceo_office_key\",\"keyPins\":[0,50,100,150],\"observations\":\"A spare key to the CEO's office, carelessly left behind\"}]},\"office3\":{\"type\":\"room_office\",\"connections\":{\"north\":\"server1\",\"south\":\"office1\"},\"objects\":[{\"type\":\"pc\",\"name\":\"IT Staff Computer\",\"takeable\":false,\"requires\":\"bluetooth\",\"lockType\":\"bluetooth\",\"mac\":\"00:11:22:33:44:55\",\"observations\":\"An IT staff computer showing network security logs\"},{\"type\":\"notes\",\"name\":\"Network Logs\",\"takeable\":true,\"readable\":true,\"text\":\"Large data transfers detected to unknown external IPs - All originating from CEO's office\",\"observations\":\"Suspicious network activity logs\"}]},\"ceo\":{\"type\":\"room_ceo\",\"connections\":{\"north\":\"closet\",\"south\":\"office2\"},\"locked\":true,\"lockType\":\"key\",\"requires\":\"ceo_office_key\",\"keyPins\":[0,50,100,150],\"difficulty\":\"easy\",\"objects\":[{\"type\":\"pc\",\"name\":\"CEO Computer\",\"takeable\":false,\"lockType\":\"password\",\"requires\":\"ceo2024\",\"showKeyboard\":true,\"maxAttempts\":3,\"locked\":true,\"postitNote\":\"Password: ceo2024\",\"showPostit\":true,\"observations\":\"The CEO's laptop, still warm - recently used. A sticky note is attached to the screen.\"},{\"type\":\"suitcase\",\"name\":\"CEO Briefcase\",\"takeable\":false,\"locked\":true,\"lockType\":\"key\",\"requires\":\"briefcase_key\",\"keyPins\":[50,25,0,75],\"difficulty\":\"medium\",\"observations\":\"An expensive leather briefcase with a sturdy lock\",\"contents\":[{\"type\":\"notes\",\"name\":\"Private Note\",\"takeable\":true,\"readable\":true,\"text\":\"Closet keypad code: 7391 - Must move evidence to safe before audit\",\"observations\":\"A hastily written note on expensive paper\"},{\"type\":\"key\",\"name\":\"Safe Key\",\"takeable\":true,\"key_id\":\"safe_key\",\"keyPins\":[68,10,48,30],\"observations\":\"A heavy-duty safe key hidden behind server equipment\"}]},{\"type\":\"phone\",\"name\":\"CEO Phone\",\"takeable\":false,\"readable\":true,\"text\":\"Recent calls: 'Offshore Bank', 'Unknown', 'Data Buyer'\",\"sender\":\"Call Log\",\"timestamp\":\"Last 24 hours\",\"observations\":\"The CEO's phone shows suspicious recent calls\"}]},\"closet\":{\"type\":\"room_closet\",\"connections\":{\"south\":\"ceo\"},\"locked\":true,\"lockType\":\"pin\",\"requires\":\"7391\",\"objects\":[{\"type\":\"safe\",\"name\":\"Hidden Safe\",\"takeable\":false,\"locked\":true,\"lockType\":\"key\",\"requires\":\"safe_key\",\"keyPins\":[68,10,48,30],\"difficulty\":\"hard\",\"observations\":\"A well-hidden wall safe behind a painting\",\"contents\":[{\"type\":\"notes\",\"name\":\"Incriminating Documents\",\"takeable\":true,\"readable\":true,\"text\":\"Contract for sale of proprietary technology\\nBank transfers from competing companies\\nDetails of upcoming corporate espionage operations\",\"observations\":\"A folder containing damning evidence of corporate espionage. Congratulations! You've recovered the incriminating documents. flag{ceo_exfil_flag}\"}]}]},\"server1\":{\"type\":\"room_servers\",\"connections\":{\"south\":\"office3\"},\"locked\":true,\"lockType\":\"pin\",\"requires\":\"4829\",\"objects\":[{\"type\":\"pc\",\"name\":\"Server Terminal\",\"takeable\":false,\"observations\":\"The main server terminal showing massive data exfiltration\"},{\"type\":\"key\",\"name\":\"Briefcase Key\",\"takeable\":true,\"key_id\":\"briefcase_key\",\"keyPins\":[50,25,0,75],\"observations\":\"A small key labeled 'Personal - Do Not Copy'\"}]}}}"], ["score", 0], ["started_at", "2025-11-20 18:00:26.217706"], ["status", "in_progress"], ["updated_at", "2025-11-20 18:00:26.215875"]]
TRANSACTION (0.1ms) RELEASE SAVEPOINT active_record_1
TRANSACTION (0.1ms) SAVEPOINT active_record_1
BreakEscape::Game Update (0.3ms) UPDATE "break_escape_games" SET "player_state" = ?, "updated_at" = ? WHERE "break_escape_games"."id" = ? [["player_state", "{\"currentRoom\":\"reception\",\"unlockedRooms\":[\"reception\"],\"unlockedObjects\":[],\"inventory\":[],\"encounteredNPCs\":[],\"globalVariables\":{},\"biometricSamples\":[],\"biometricUnlocks\":[],\"bluetoothDevices\":[],\"notes\":[],\"health\":50}"], ["updated_at", "2025-11-20 18:00:26.219691"], ["id", 1]]
TRANSACTION (0.0ms) RELEASE SAVEPOINT active_record_1
TRANSACTION (0.0ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
-----------------------------------------------------------------
BreakEscape::GameTest: test_should_clamp_health_between_0_and_100
-----------------------------------------------------------------
BreakEscape::Mission Load (0.1ms) SELECT "break_escape_missions".* FROM "break_escape_missions" WHERE "break_escape_missions"."id" = ? LIMIT ? [["id", 418560898], ["LIMIT", 1]]
BreakEscape::DemoUser Load (0.1ms) SELECT "break_escape_demo_users".* FROM "break_escape_demo_users" WHERE "break_escape_demo_users"."id" = ? LIMIT ? [["id", 149617800], ["LIMIT", 1]]
TRANSACTION (0.1ms) SAVEPOINT active_record_1
BreakEscape::Game Create (0.6ms) INSERT INTO "break_escape_games" ("completed_at", "created_at", "mission_id", "player_id", "player_state", "player_type", "scenario_data", "score", "started_at", "status", "updated_at") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) RETURNING "id" [["completed_at", nil], ["created_at", "2025-11-20 18:00:26.222335"], ["mission_id", 418560898], ["player_id", 149617800], ["player_state", "{\"currentRoom\":\"reception\",\"unlockedRooms\":[\"reception\"],\"unlockedObjects\":[],\"inventory\":[],\"encounteredNPCs\":[],\"globalVariables\":{},\"biometricSamples\":[],\"biometricUnlocks\":[],\"bluetoothDevices\":[],\"notes\":[],\"health\":100}"], ["player_type", "BreakEscape::DemoUser"], ["scenario_data", "{\"scenario_brief\":\"Hi! You are a cyber investigator tasked with uncovering evidence of corporate espionage. Anonymous tips suggest the CEO has been selling company secrets, but you need proof.\",\"startRoom\":\"reception\",\"startItemsInInventory\":[{\"type\":\"phone\",\"name\":\"Your Phone\",\"takeable\":true,\"phoneId\":\"player_phone\",\"npcIds\":[\"neye_eve\",\"gossip_girl\",\"helper_npc\"],\"observations\":\"Your personal phone with some interesting contacts\"},{\"type\":\"workstation\",\"name\":\"Crypto Analysis Station\",\"takeable\":true,\"observations\":\"A powerful workstation for cryptographic analysis\"},{\"type\":\"lockpick\",\"name\":\"Lock Pick Kit\",\"takeable\":true,\"observations\":\"A professional lock picking kit with various picks and tension wrenches\"}],\"rooms\":{\"reception\":{\"type\":\"room_reception\",\"connections\":{\"north\":\"office1\"},\"npcs\":[{\"id\":\"neye_eve\",\"displayName\":\"Neye Eve\",\"storyPath\":\"scenarios/ink/neye-eve.json\",\"avatar\":\"assets/npc/avatars/npc_adversary.png\",\"phoneId\":\"player_phone\",\"currentKnot\":\"start\",\"npcType\":\"phone\"},{\"id\":\"gossip_girl\",\"displayName\":\"Gossip Girl\",\"storyPath\":\"scenarios/ink/gossip-girl.json\",\"avatar\":\"assets/npc/avatars/npc_neutral.png\",\"phoneId\":\"player_phone\",\"currentKnot\":\"start\",\"npcType\":\"phone\",\"timedMessages\":[{\"delay\":5000,\"message\":\"Hey! 👋 Got any juicy gossip for me today?\",\"type\":\"text\"}]},{\"id\":\"helper_npc\",\"displayName\":\"Helpful Contact\",\"storyPath\":\"scenarios/ink/helper-npc.json\",\"avatar\":\"assets/npc/avatars/npc_helper.png\",\"phoneId\":\"player_phone\",\"currentKnot\":\"start\",\"npcType\":\"phone\",\"eventMappings\":[{\"eventPattern\":\"item_picked_up:lockpick\",\"targetKnot\":\"on_lockpick_pickup\",\"onceOnly\":true,\"cooldown\":0},{\"eventPattern\":\"minigame_completed\",\"targetKnot\":\"on_lockpick_success\",\"condition\":\"data.minigameName && data.minigameName.includes('Lockpick')\",\"cooldown\":10000},{\"eventPattern\":\"minigame_failed\",\"targetKnot\":\"on_lockpick_failed\",\"condition\":\"data.minigameName && data.minigameName.includes('Lockpick')\",\"cooldown\":15000},{\"eventPattern\":\"door_unlocked\",\"targetKnot\":\"on_door_unlocked\",\"cooldown\":8000},{\"eventPattern\":\"door_unlock_attempt\",\"targetKnot\":\"on_door_attempt\",\"cooldown\":12000},{\"eventPattern\":\"object_interacted\",\"targetKnot\":\"on_ceo_desk_interact\",\"condition\":\"data.objectType === 'desk_ceo'\",\"cooldown\":10000},{\"eventPattern\":\"item_picked_up:*\",\"targetKnot\":\"on_item_found\",\"cooldown\":20000},{\"eventPattern\":\"room_entered\",\"targetKnot\":\"on_room_entered\",\"cooldown\":45000,\"maxTriggers\":3},{\"eventPattern\":\"room_discovered\",\"targetKnot\":\"on_room_discovered\",\"cooldown\":15000,\"maxTriggers\":5},{\"eventPattern\":\"room_entered:ceo\",\"targetKnot\":\"on_ceo_office_entered\",\"onceOnly\":true}]}],\"objects\":[{\"type\":\"phone\",\"name\":\"Reception Phone\",\"takeable\":false,\"readable\":true,\"voice\":\"Hi, this is the IT Team. Security breach detected in server room. Changed access code to 4829.\",\"sender\":\"IT Team\",\"timestamp\":\"2:15 AM\",\"observations\":\"The reception phone's message light is blinking urgently\"},{\"type\":\"notes\",\"name\":\"Security Log\",\"takeable\":true,\"readable\":true,\"text\":\"Unusual after-hours access detected:\\n- CEO office: 11:30 PM\\n- Server room: 2:15 AM\\n- CEO office again: 3:45 AM\",\"observations\":\"A concerning security log from last night\"},{\"type\":\"pc\",\"name\":\"Reception Computer\",\"takeable\":false,\"lockType\":\"password\",\"passwordHint\":\"Optional hint text\",\"showHint\":true,\"showKeyboard\":true,\"maxAttempts\":3,\"locked\":true,\"requires\":\"secret123\",\"observations\":\"The reception's computer, currently locked\",\"postitNote\":\"Password: secret123\",\"showPostit\":true,\"contents\":[{\"type\":\"text_file\",\"name\":\"Private\",\"takeable\":false,\"readable\":true,\"text\":\"Closet keypad code: 7391 - Must move evidence to safe before audit\"}]},{\"type\":\"tablet\",\"name\":\"Tablet Device\",\"takeable\":true,\"locked\":true,\"lockType\":\"bluetooth\",\"requires\":\"bluetooth\",\"mac\":\"00:11:22:33:44:55\",\"observations\":\"A locked tablet device that requires Bluetooth pairing\"},{\"type\":\"bluetooth_scanner\",\"name\":\"Bluetooth Scanner\",\"takeable\":true,\"observations\":\"A device for detecting nearby Bluetooth signals\",\"canScanBluetooth\":true},{\"type\":\"key\",\"name\":\"Office Key\",\"takeable\":true,\"key_id\":\"office1_key\",\"keyPins\":[100,0,100,0],\"observations\":\"A key to access the office areas\"},{\"type\":\"pin-cracker\",\"name\":\"PIN Cracker\",\"takeable\":true,\"observations\":\"A sophisticated device that can analyze PIN entry patterns and provide feedback on attempts\"},{\"type\":\"safe\",\"name\":\"Reception Safe\",\"takeable\":false,\"locked\":true,\"lockType\":\"pin\",\"requires\":\"9573\",\"observations\":\"A small wall safe behind the reception desk. Looks like it needs a 4-digit code.\",\"contents\":[{\"type\":\"notes\",\"name\":\"IT Access Credentials\",\"takeable\":true,\"readable\":true,\"text\":\"Emergency IT Admin Credentials:\\nUsername: admin\\nPassword: ITsecure2024\\n\\nServer Room Backup Code: 4829\\nCEO Office Alarm Override: 1337\",\"observations\":\"Sensitive IT credentials that could be very useful\"}]}]},\"office1\":{\"type\":\"room_office\",\"locked\":true,\"lockType\":\"key\",\"requires\":\"office1_key\",\"keyPins\":[100,0,100,0],\"difficulty\":\"easy\",\"door_sign\":\"4A Hot Desks\",\"connections\":{\"north\":[\"office2\",\"office3\"],\"south\":\"reception\"},\"objects\":[{\"type\":\"pc\",\"name\":\"Office Computer\",\"takeable\":false,\"requires\":\"password\",\"hasFingerprint\":true,\"fingerprintOwner\":\"ceo\",\"fingerprintDifficulty\":\"medium\",\"observations\":\"A computer with a cybersecurity alert on screen. There might be fingerprints on the keyboard.\"},{\"type\":\"notes\",\"name\":\"IT Memo\",\"takeable\":true,\"readable\":true,\"text\":\"URGENT: Multiple unauthorized access attempts detected from CEO's office IP address\",\"observations\":\"A concerning IT department memo\"},{\"type\":\"fingerprint_kit\",\"name\":\"Fingerprint Kit\",\"takeable\":true,\"observations\":\"A kit used for collecting fingerprints from surfaces\"}]},\"office2\":{\"type\":\"room_office\",\"connections\":{\"north\":\"ceo\",\"south\":\"office1\"},\"objects\":[{\"type\":\"pc\",\"name\":\"Office Computer\",\"takeable\":false,\"lockType\":\"password\",\"requires\":\"office2024\",\"showKeyboard\":true,\"maxAttempts\":3,\"locked\":true,\"postitNote\":\"Password: office2024\",\"showPostit\":true,\"observations\":\"A standard office computer with a sticky note on the monitor\"},{\"type\":\"notes\",\"name\":\"Shredded Document\",\"takeable\":true,\"readable\":true,\"text\":\"Partially readable: '...offshore account...transfer complete...delete all traces...'\",\"observations\":\"A partially shredded document that someone failed to dispose of properly\"},{\"type\":\"key\",\"name\":\"CEO Office Key\",\"takeable\":true,\"key_id\":\"ceo_office_key\",\"keyPins\":[0,50,100,150],\"observations\":\"A spare key to the CEO's office, carelessly left behind\"}]},\"office3\":{\"type\":\"room_office\",\"connections\":{\"north\":\"server1\",\"south\":\"office1\"},\"objects\":[{\"type\":\"pc\",\"name\":\"IT Staff Computer\",\"takeable\":false,\"requires\":\"bluetooth\",\"lockType\":\"bluetooth\",\"mac\":\"00:11:22:33:44:55\",\"observations\":\"An IT staff computer showing network security logs\"},{\"type\":\"notes\",\"name\":\"Network Logs\",\"takeable\":true,\"readable\":true,\"text\":\"Large data transfers detected to unknown external IPs - All originating from CEO's office\",\"observations\":\"Suspicious network activity logs\"}]},\"ceo\":{\"type\":\"room_ceo\",\"connections\":{\"north\":\"closet\",\"south\":\"office2\"},\"locked\":true,\"lockType\":\"key\",\"requires\":\"ceo_office_key\",\"keyPins\":[0,50,100,150],\"difficulty\":\"easy\",\"objects\":[{\"type\":\"pc\",\"name\":\"CEO Computer\",\"takeable\":false,\"lockType\":\"password\",\"requires\":\"ceo2024\",\"showKeyboard\":true,\"maxAttempts\":3,\"locked\":true,\"postitNote\":\"Password: ceo2024\",\"showPostit\":true,\"observations\":\"The CEO's laptop, still warm - recently used. A sticky note is attached to the screen.\"},{\"type\":\"suitcase\",\"name\":\"CEO Briefcase\",\"takeable\":false,\"locked\":true,\"lockType\":\"key\",\"requires\":\"briefcase_key\",\"keyPins\":[50,25,0,75],\"difficulty\":\"medium\",\"observations\":\"An expensive leather briefcase with a sturdy lock\",\"contents\":[{\"type\":\"notes\",\"name\":\"Private Note\",\"takeable\":true,\"readable\":true,\"text\":\"Closet keypad code: 7391 - Must move evidence to safe before audit\",\"observations\":\"A hastily written note on expensive paper\"},{\"type\":\"key\",\"name\":\"Safe Key\",\"takeable\":true,\"key_id\":\"safe_key\",\"keyPins\":[68,10,48,30],\"observations\":\"A heavy-duty safe key hidden behind server equipment\"}]},{\"type\":\"phone\",\"name\":\"CEO Phone\",\"takeable\":false,\"readable\":true,\"text\":\"Recent calls: 'Offshore Bank', 'Unknown', 'Data Buyer'\",\"sender\":\"Call Log\",\"timestamp\":\"Last 24 hours\",\"observations\":\"The CEO's phone shows suspicious recent calls\"}]},\"closet\":{\"type\":\"room_closet\",\"connections\":{\"south\":\"ceo\"},\"locked\":true,\"lockType\":\"pin\",\"requires\":\"7391\",\"objects\":[{\"type\":\"safe\",\"name\":\"Hidden Safe\",\"takeable\":false,\"locked\":true,\"lockType\":\"key\",\"requires\":\"safe_key\",\"keyPins\":[68,10,48,30],\"difficulty\":\"hard\",\"observations\":\"A well-hidden wall safe behind a painting\",\"contents\":[{\"type\":\"notes\",\"name\":\"Incriminating Documents\",\"takeable\":true,\"readable\":true,\"text\":\"Contract for sale of proprietary technology\\nBank transfers from competing companies\\nDetails of upcoming corporate espionage operations\",\"observations\":\"A folder containing damning evidence of corporate espionage. Congratulations! You've recovered the incriminating documents. flag{ceo_exfil_flag}\"}]}]},\"server1\":{\"type\":\"room_servers\",\"connections\":{\"south\":\"office3\"},\"locked\":true,\"lockType\":\"pin\",\"requires\":\"4829\",\"objects\":[{\"type\":\"pc\",\"name\":\"Server Terminal\",\"takeable\":false,\"observations\":\"The main server terminal showing massive data exfiltration\"},{\"type\":\"key\",\"name\":\"Briefcase Key\",\"takeable\":true,\"key_id\":\"briefcase_key\",\"keyPins\":[50,25,0,75],\"observations\":\"A small key labeled 'Personal - Do Not Copy'\"}]}}}"], ["score", 0], ["started_at", "2025-11-20 18:00:26.223912"], ["status", "in_progress"], ["updated_at", "2025-11-20 18:00:26.222335"]]
TRANSACTION (0.1ms) RELEASE SAVEPOINT active_record_1
TRANSACTION (0.1ms) SAVEPOINT active_record_1
BreakEscape::Game Update (0.3ms) UPDATE "break_escape_games" SET "player_state" = ?, "updated_at" = ? WHERE "break_escape_games"."id" = ? [["player_state", "{\"currentRoom\":\"reception\",\"unlockedRooms\":[\"reception\"],\"unlockedObjects\":[],\"inventory\":[],\"encounteredNPCs\":[],\"globalVariables\":{},\"biometricSamples\":[],\"biometricUnlocks\":[],\"bluetoothDevices\":[],\"notes\":[],\"health\":0}"], ["updated_at", "2025-11-20 18:00:26.227047"], ["id", 1]]
TRANSACTION (0.1ms) RELEASE SAVEPOINT active_record_1
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
(3.4ms) CREATE TABLE "schema_migrations" ("version" varchar NOT NULL PRIMARY KEY)
(0.2ms) CREATE TABLE "ar_internal_metadata" ("key" varchar NOT NULL PRIMARY KEY, "value" varchar, "created_at" datetime(6) NOT NULL, "updated_at" datetime(6) NOT NULL)
ActiveRecord::SchemaMigration Load (0.3ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
Generating image variants require the image_processing gem. Please add `gem "image_processing", "~> 1.2"` to your Gemfile or set `config.active_storage.variant_processor = :disabled`.
ActiveRecord::InternalMetadata Load (0.6ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = ? ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 [[nil, "environment"]]
ActiveRecord::InternalMetadata Create (5.2ms) INSERT INTO "ar_internal_metadata" ("key", "value", "created_at", "updated_at") VALUES ('environment', 'test', '2025-11-20 17:13:54.117520', '2025-11-20 17:13:54.117523') RETURNING "key"
ActiveRecord::SchemaMigration Load (0.2ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
Migrating to CreateBreakEscapeMissions (20251120155357)
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.6ms) CREATE TABLE "break_escape_missions" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "name" varchar NOT NULL, "display_name" varchar NOT NULL, "description" text, "published" boolean DEFAULT FALSE NOT NULL, "difficulty_level" integer DEFAULT 1 NOT NULL, "created_at" datetime(6) NOT NULL, "updated_at" datetime(6) NOT NULL)
(0.1ms) CREATE UNIQUE INDEX "index_break_escape_missions_on_name" ON "break_escape_missions" ("name")
(0.1ms) CREATE INDEX "index_break_escape_missions_on_published" ON "break_escape_missions" ("published")
ActiveRecord::SchemaMigration Create (0.1ms) INSERT INTO "schema_migrations" ("version") VALUES ('20251120155357') RETURNING "version"
TRANSACTION (0.1ms) COMMIT TRANSACTION
Migrating to CreateBreakEscapeGames (20251120155358)
Generating image variants require the image_processing gem. Please add `gem "image_processing", "~> 1.2"` to your Gemfile or set `config.active_storage.variant_processor = :disabled`.
ActiveRecord::SchemaMigration Load (0.4ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
ActiveRecord::InternalMetadata Load (0.2ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = ? ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 [[nil, "environment"]]
ActiveRecord::SchemaMigration Load (0.0ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
ActiveRecord::InternalMetadata Load (0.1ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = ? ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 [[nil, "environment"]]
ActiveRecord::SchemaMigration Load (0.1ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
ActiveRecord::InternalMetadata Load (0.1ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = ? ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 [[nil, "environment"]]
ActiveRecord::InternalMetadata Load (0.1ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = ? ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 [[nil, "environment"]]
ActiveRecord::SchemaMigration Load (0.0ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
Migrating to CreateBreakEscapeGames (20251120155358)
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.4ms) CREATE TABLE "break_escape_games" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "player_type" varchar NOT NULL, "player_id" integer NOT NULL, "mission_id" integer NOT NULL, "scenario_data" json NOT NULL, "player_state" json DEFAULT '"{\"currentRoom\":null,\"unlockedRooms\":[],\"unlockedObjects\":[],\"inventory\":[],\"encounteredNPCs\":[],\"globalVariables\":{},\"biometricSamples\":[],\"biometricUnlocks\":[],\"bluetoothDevices\":[],\"notes\":[],\"health\":100}"' NOT NULL, "status" varchar DEFAULT 'in_progress' NOT NULL, "started_at" datetime(6), "completed_at" datetime(6), "score" integer DEFAULT 0 NOT NULL, "created_at" datetime(6) NOT NULL, "updated_at" datetime(6) NOT NULL, CONSTRAINT "fk_rails_ce758a8dd4"
FOREIGN KEY ("mission_id")
REFERENCES "break_escape_missions" ("id")
)
(0.1ms) CREATE INDEX "index_break_escape_games_on_player" ON "break_escape_games" ("player_type", "player_id")
(0.1ms) CREATE INDEX "index_break_escape_games_on_mission_id" ON "break_escape_games" ("mission_id")
(0.1ms) CREATE UNIQUE INDEX "index_games_on_player_and_mission" ON "break_escape_games" ("player_type", "player_id", "mission_id")
(0.1ms) CREATE INDEX "index_break_escape_games_on_status" ON "break_escape_games" ("status")
ActiveRecord::SchemaMigration Create (0.1ms) INSERT INTO "schema_migrations" ("version") VALUES ('20251120155358') RETURNING "version"
TRANSACTION (5.3ms) COMMIT TRANSACTION
Migrating to CreateBreakEscapeDemoUsers (20251120160000)
TRANSACTION (0.0ms) BEGIN immediate TRANSACTION
(0.3ms) CREATE TABLE "break_escape_demo_users" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "handle" varchar NOT NULL, "role" varchar DEFAULT 'user' NOT NULL, "created_at" datetime(6) NOT NULL, "updated_at" datetime(6) NOT NULL)
(0.2ms) CREATE UNIQUE INDEX "index_break_escape_demo_users_on_handle" ON "break_escape_demo_users" ("handle")
ActiveRecord::SchemaMigration Create (0.1ms) INSERT INTO "schema_migrations" ("version") VALUES ('20251120160000') RETURNING "version"
TRANSACTION (0.1ms) COMMIT TRANSACTION
ActiveRecord::SchemaMigration Load (0.1ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
Generating image variants require the image_processing gem. Please add `gem "image_processing", "~> 1.2"` to your Gemfile or set `config.active_storage.variant_processor = :disabled`.
Generating image variants require the image_processing gem. Please add `gem "image_processing", "~> 1.2"` to your Gemfile or set `config.active_storage.variant_processor = :disabled`.
(1.2ms) DROP TABLE IF EXISTS "break_escape_demo_users"
(3.7ms) CREATE TABLE "break_escape_demo_users" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "created_at" datetime(6) NOT NULL, "handle" varchar NOT NULL, "role" varchar DEFAULT 'user' NOT NULL, "updated_at" datetime(6) NOT NULL)
(0.2ms) CREATE UNIQUE INDEX "index_break_escape_demo_users_on_handle" ON "break_escape_demo_users" ("handle")
(0.1ms) DROP TABLE IF EXISTS "break_escape_games"
(0.3ms) CREATE TABLE "break_escape_games" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "completed_at" datetime(6), "created_at" datetime(6) NOT NULL, "mission_id" integer NOT NULL, "player_id" integer NOT NULL, "player_state" json DEFAULT '"{\"currentRoom\":null,\"unlockedRooms\":[],\"unlockedObjects\":[],\"inventory\":[],\"encounteredNPCs\":[],\"globalVariables\":{},\"biometricSamples\":[],\"biometricUnlocks\":[],\"bluetoothDevices\":[],\"notes\":[],\"health\":100}"' NOT NULL, "player_type" varchar NOT NULL, "scenario_data" json NOT NULL, "score" integer DEFAULT 0 NOT NULL, "started_at" datetime(6), "status" varchar DEFAULT 'in_progress' NOT NULL, "updated_at" datetime(6) NOT NULL)
(0.2ms) CREATE INDEX "index_break_escape_games_on_mission_id" ON "break_escape_games" ("mission_id")
(0.3ms) CREATE UNIQUE INDEX "index_games_on_player_and_mission" ON "break_escape_games" ("player_type", "player_id", "mission_id")
(0.2ms) CREATE INDEX "index_break_escape_games_on_player" ON "break_escape_games" ("player_type", "player_id")
(0.2ms) CREATE INDEX "index_break_escape_games_on_status" ON "break_escape_games" ("status")
(0.1ms) DROP TABLE IF EXISTS "break_escape_missions"
(0.3ms) CREATE TABLE "break_escape_missions" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "created_at" datetime(6) NOT NULL, "description" text, "difficulty_level" integer DEFAULT 1 NOT NULL, "display_name" varchar NOT NULL, "name" varchar NOT NULL, "published" boolean DEFAULT FALSE NOT NULL, "updated_at" datetime(6) NOT NULL)
(0.3ms) CREATE UNIQUE INDEX "index_break_escape_missions_on_name" ON "break_escape_missions" ("name")
(0.2ms) CREATE INDEX "index_break_escape_missions_on_published" ON "break_escape_missions" ("published")
(0.1ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.2ms) CREATE TEMPORARY TABLE "abreak_escape_games" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "completed_at" datetime(6), "created_at" datetime(6) NOT NULL, "mission_id" integer NOT NULL, "player_id" integer NOT NULL, "player_state" json DEFAULT '"{\"currentRoom\":null,\"unlockedRooms\":[],\"unlockedObjects\":[],\"inventory\":[],\"encounteredNPCs\":[],\"globalVariables\":{},\"biometricSamples\":[],\"biometricUnlocks\":[],\"bluetoothDevices\":[],\"notes\":[],\"health\":100}"' NOT NULL, "player_type" varchar NOT NULL, "scenario_data" json NOT NULL, "score" integer DEFAULT 0 NOT NULL, "started_at" datetime(6), "status" varchar DEFAULT 'in_progress' NOT NULL, "updated_at" datetime(6) NOT NULL)
(0.1ms) CREATE INDEX "tindex_abreak_escape_games_on_status" ON "abreak_escape_games" ("status")
(0.1ms) CREATE INDEX "tindex_abreak_escape_games_on_player" ON "abreak_escape_games" ("player_type", "player_id")
(0.1ms) CREATE UNIQUE INDEX "tindex_games_on_player_and_mission" ON "abreak_escape_games" ("player_type", "player_id", "mission_id")
(0.1ms) CREATE INDEX "tindex_abreak_escape_games_on_mission_id" ON "abreak_escape_games" ("mission_id")
SQL (0.4ms) INSERT INTO "abreak_escape_games" ("id","completed_at","created_at","mission_id","player_id","player_state","player_type","scenario_data","score","started_at","status","updated_at")
SELECT "id","completed_at","created_at","mission_id","player_id","player_state","player_type","scenario_data","score","started_at","status","updated_at" FROM "break_escape_games"
(0.4ms) DROP TABLE "break_escape_games"
(0.2ms) CREATE TABLE "break_escape_games" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "completed_at" datetime(6), "created_at" datetime(6) NOT NULL, "mission_id" integer NOT NULL, "player_id" integer NOT NULL, "player_state" json DEFAULT '"{\"currentRoom\":null,\"unlockedRooms\":[],\"unlockedObjects\":[],\"inventory\":[],\"encounteredNPCs\":[],\"globalVariables\":{},\"biometricSamples\":[],\"biometricUnlocks\":[],\"bluetoothDevices\":[],\"notes\":[],\"health\":100}"' NOT NULL, "player_type" varchar NOT NULL, "scenario_data" json NOT NULL, "score" integer DEFAULT 0 NOT NULL, "started_at" datetime(6), "status" varchar DEFAULT 'in_progress' NOT NULL, "updated_at" datetime(6) NOT NULL, CONSTRAINT "fk_rails_ce758a8dd4"
FOREIGN KEY ("mission_id")
REFERENCES "break_escape_missions" ("id")
)
(0.1ms) CREATE INDEX "index_break_escape_games_on_mission_id" ON "break_escape_games" ("mission_id")
(0.1ms) CREATE UNIQUE INDEX "index_games_on_player_and_mission" ON "break_escape_games" ("player_type", "player_id", "mission_id")
(0.1ms) CREATE INDEX "index_break_escape_games_on_player" ON "break_escape_games" ("player_type", "player_id")
(0.1ms) CREATE INDEX "index_break_escape_games_on_status" ON "break_escape_games" ("status")
SQL (0.1ms) INSERT INTO "break_escape_games" ("id","completed_at","created_at","mission_id","player_id","player_state","player_type","scenario_data","score","started_at","status","updated_at")
SELECT "id","completed_at","created_at","mission_id","player_id","player_state","player_type","scenario_data","score","started_at","status","updated_at" FROM "abreak_escape_games"
(0.2ms) DROP TABLE "abreak_escape_games"
TRANSACTION (0.2ms) COMMIT TRANSACTION
(0.1ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
(0.2ms) CREATE TABLE "schema_migrations" ("version" varchar NOT NULL PRIMARY KEY)
ActiveRecord::SchemaMigration Load (0.2ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
(0.2ms) INSERT INTO "schema_migrations" (version) VALUES (20251120160000)
(0.1ms) INSERT INTO "schema_migrations" (version) VALUES
(20251120155358),
(20251120155357);
(0.3ms) CREATE TABLE "ar_internal_metadata" ("key" varchar NOT NULL PRIMARY KEY, "value" varchar, "created_at" datetime(6) NOT NULL, "updated_at" datetime(6) NOT NULL)
ActiveRecord::InternalMetadata Load (0.1ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = ? ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 [[nil, "environment"]]
ActiveRecord::InternalMetadata Create (0.3ms) INSERT INTO "ar_internal_metadata" ("key", "value", "created_at", "updated_at") VALUES ('environment', 'test', '2025-11-20 17:15:26.896212', '2025-11-20 17:15:26.896218') RETURNING "key"
ActiveRecord::InternalMetadata Load (0.1ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = ? ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 [[nil, "environment"]]
ActiveRecord::InternalMetadata Load (0.1ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = ? ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 [[nil, "schema_sha1"]]
ActiveRecord::InternalMetadata Create (0.3ms) INSERT INTO "ar_internal_metadata" ("key", "value", "created_at", "updated_at") VALUES ('schema_sha1', '33181f3d58f9bab484a9b348ce1e6b298e81ba9b', '2025-11-20 17:15:26.897909', '2025-11-20 17:15:26.897911') RETURNING "key"
ActiveRecord::SchemaMigration Load (0.6ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.5ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.4ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_games";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (149617800, '2025-11-20 17:15:27.433387', 'test_user', 'user', '2025-11-20 17:15:27.433387'), (618102942, '2025-11-20 17:15:27.433387', 'other_user', 'user', '2025-11-20 17:15:27.433387');
INSERT INTO "break_escape_games" ("id", "completed_at", "created_at", "mission_id", "player_id", "player_state", "player_type", "scenario_data", "score", "started_at", "status", "updated_at") VALUES (223060831, NULL, '2025-11-20 17:15:27.438207', 418560898, 149617800, '{"currentRoom":"reception","unlockedRooms":["reception"]}', 'BreakEscape::DemoUser', '{"startRoom":"reception","rooms":{}}', 0, NULL, 'in_progress', '2025-11-20 17:15:27.438207');
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (418560898, '2025-11-20 17:15:27.442020', 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, '2025-11-20 17:15:27.442020'), (636030761, '2025-11-20 17:15:27.442020', 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, '2025-11-20 17:15:27.442020')
(0.1ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (4.9ms) COMMIT TRANSACTION
(0.1ms) PRAGMA foreign_key_check
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
---------------------------------------------------------------
BreakEscape::MissionTest: test_should_validate_presence_of_name
---------------------------------------------------------------
BreakEscape::Mission Exists? (0.3ms) SELECT 1 AS one FROM "break_escape_missions" WHERE "break_escape_missions"."name" IS NULL LIMIT ? [["LIMIT", 1]]
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
------------------------------------------------------------------------------
BreakEscape::MissionTest: test_published_scope_returns_only_published_missions
------------------------------------------------------------------------------
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
-----------------------------------------------------------------
BreakEscape::MissionTest: test_scenario_path_returns_correct_path
-----------------------------------------------------------------
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
-----------------------------------------------------------------
BreakEscape::MissionTest: test_should_validate_uniqueness_of_name
-----------------------------------------------------------------
TRANSACTION (0.1ms) SAVEPOINT active_record_1
BreakEscape::Mission Exists? (0.4ms) SELECT 1 AS one FROM "break_escape_missions" WHERE "break_escape_missions"."name" = ? LIMIT ? [["name", "test"], ["LIMIT", 1]]
BreakEscape::Mission Create (0.4ms) INSERT INTO "break_escape_missions" ("created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (?, ?, ?, ?, ?, ?, ?) RETURNING "id" [["created_at", "2025-11-20 17:15:27.595654"], ["description", nil], ["difficulty_level", 1], ["display_name", "Test"], ["name", "test"], ["published", 0], ["updated_at", "2025-11-20 17:15:27.595654"]]
TRANSACTION (0.1ms) RELEASE SAVEPOINT active_record_1
BreakEscape::Mission Exists? (1.8ms) SELECT 1 AS one FROM "break_escape_missions" WHERE "break_escape_missions"."name" = ? LIMIT ? [["name", "test"], ["LIMIT", 1]]
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
---------------------------------------------
BreakEscapeTest: test_it_has_a_version_number
---------------------------------------------
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
----------------------------------------------------------
BreakEscape::MissionsControllerTest: test_should_get_index
----------------------------------------------------------
Started GET "/break_escape/missions" for 127.0.0.1 at 2025-11-20 17:15:27 +0000
Processing by BreakEscape::MissionsController#index as HTML
Completed 500 Internal Server Error in 7ms (ActiveRecord: 0.0ms (0 queries, 0 cached) | GC: 0.0ms)
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
-----------------------------------------------------------------------
BreakEscape::MissionsControllerTest: test_should_show_published_mission
-----------------------------------------------------------------------
BreakEscape::Mission Load (0.3ms) SELECT "break_escape_missions".* FROM "break_escape_missions" WHERE "break_escape_missions"."id" = ? LIMIT ? [["id", 418560898], ["LIMIT", 1]]
Started GET "/break_escape/missions/418560898" for 127.0.0.1 at 2025-11-20 17:15:28 +0000
Processing by BreakEscape::MissionsController#show as HTML
Parameters: {"id"=>"418560898"}
BreakEscape::Mission Load (0.2ms) SELECT "break_escape_missions".* FROM "break_escape_missions" WHERE "break_escape_missions"."id" = ? LIMIT ? [["id", 418560898], ["LIMIT", 1]]
Completed 500 Internal Server Error in 14ms (ActiveRecord: 0.1ms (1 query, 0 cached) | GC: 10.0ms)
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
------------------------------------------------
BreakEscape::GameTest: test_should_update_health
------------------------------------------------
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
---------------------------------------------------------------
BreakEscape::GameTest: test_should_belong_to_player_and_mission
---------------------------------------------------------------
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.0ms) BEGIN deferred TRANSACTION
--------------------------------------------------
BreakEscape::GameTest: test_should_track_inventory
--------------------------------------------------
TRANSACTION (0.0ms) ROLLBACK TRANSACTION
TRANSACTION (0.0ms) BEGIN deferred TRANSACTION
-----------------------------------------------------------------
BreakEscape::GameTest: test_should_clamp_health_between_0_and_100
-----------------------------------------------------------------
TRANSACTION (0.0ms) ROLLBACK TRANSACTION
TRANSACTION (0.0ms) BEGIN deferred TRANSACTION
----------------------------------------------
BreakEscape::GameTest: test_should_unlock_room
----------------------------------------------
TRANSACTION (0.0ms) ROLLBACK TRANSACTION
Generating image variants require the image_processing gem. Please add `gem "image_processing", "~> 1.2"` to your Gemfile or set `config.active_storage.variant_processor = :disabled`.
ActiveRecord::InternalMetadata Load (0.4ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = ? ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 [[nil, "schema_sha1"]]
ActiveRecord::SchemaMigration Load (0.2ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
Generating image variants require the image_processing gem. Please add `gem "image_processing", "~> 1.2"` to your Gemfile or set `config.active_storage.variant_processor = :disabled`.
ActiveRecord::InternalMetadata Load (0.6ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = ? ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 [[nil, "schema_sha1"]]
ActiveRecord::SchemaMigration Load (0.2ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
Generating image variants require the image_processing gem. Please add `gem "image_processing", "~> 1.2"` to your Gemfile or set `config.active_storage.variant_processor = :disabled`.
ActiveRecord::InternalMetadata Load (0.6ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = ? ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 [[nil, "schema_sha1"]]
ActiveRecord::SchemaMigration Load (0.2ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.4ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.1ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.3ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_games";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, NULL, 'test_user', 'user', NULL), (NULL, NULL, 'other_user', 'user', NULL);
INSERT INTO "break_escape_games" ("id", "completed_at", "created_at", "mission_id", "player_id", "player_state", "player_type", "scenario_data", "score", "started_at", "status", "updated_at") VALUES (NULL, NULL, NULL, 418560898, 149617800, '"{\"currentRoom\": \"reception\", \"unlockedRooms\": [\"reception\"], \"unlockedObjects\": [], \"inventory\": [], \"encounteredNPCs\": [], \"globalVariables\": {}, \"biometricSamples\": [], \"biometricUnlocks\": [], \"bluetoothDevices\": [], \"notes\": [], \"health\": 100}"', 'BreakEscape::DemoUser', '"{\"startRoom\": \"reception\", \"rooms\": {}}"', 0, NULL, 'in_progress', NULL);
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, NULL, 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, NULL), (NULL, NULL, 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, NULL)
(0.0ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (0.0ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.5ms) PRAGMA foreign_keys
(0.1ms) PRAGMA defer_foreign_keys
(0.1ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.3ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_games";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, NULL, 'test_user', 'user', NULL), (NULL, NULL, 'other_user', 'user', NULL);
INSERT INTO "break_escape_games" ("id", "completed_at", "created_at", "mission_id", "player_id", "player_state", "player_type", "scenario_data", "score", "started_at", "status", "updated_at") VALUES (NULL, NULL, NULL, 418560898, 149617800, '"{\"currentRoom\": \"reception\", \"unlockedRooms\": [\"reception\"], \"unlockedObjects\": [], \"inventory\": [], \"encounteredNPCs\": [], \"globalVariables\": {}, \"biometricSamples\": [], \"biometricUnlocks\": [], \"bluetoothDevices\": [], \"notes\": [], \"health\": 100}"', 'BreakEscape::DemoUser', '"{\"startRoom\": \"reception\", \"rooms\": {}}"', 0, NULL, 'in_progress', NULL);
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, NULL, 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, NULL), (NULL, NULL, 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, NULL)
(0.1ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.5ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.3ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_games";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, NULL, 'test_user', 'user', NULL), (NULL, NULL, 'other_user', 'user', NULL);
INSERT INTO "break_escape_games" ("id", "completed_at", "created_at", "mission_id", "player_id", "player_state", "player_type", "scenario_data", "score", "started_at", "status", "updated_at") VALUES (NULL, NULL, NULL, 418560898, 149617800, '"{\"currentRoom\": \"reception\", \"unlockedRooms\": [\"reception\"], \"unlockedObjects\": [], \"inventory\": [], \"encounteredNPCs\": [], \"globalVariables\": {}, \"biometricSamples\": [], \"biometricUnlocks\": [], \"bluetoothDevices\": [], \"notes\": [], \"health\": 100}"', 'BreakEscape::DemoUser', '"{\"startRoom\": \"reception\", \"rooms\": {}}"', 0, NULL, 'in_progress', NULL);
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, NULL, 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, NULL), (NULL, NULL, 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, NULL)
(0.0ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (0.0ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.3ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.2ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_games";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, NULL, 'test_user', 'user', NULL), (NULL, NULL, 'other_user', 'user', NULL);
INSERT INTO "break_escape_games" ("id", "completed_at", "created_at", "mission_id", "player_id", "player_state", "player_type", "scenario_data", "score", "started_at", "status", "updated_at") VALUES (NULL, NULL, NULL, 418560898, 149617800, '"{\"currentRoom\": \"reception\", \"unlockedRooms\": [\"reception\"], \"unlockedObjects\": [], \"inventory\": [], \"encounteredNPCs\": [], \"globalVariables\": {}, \"biometricSamples\": [], \"biometricUnlocks\": [], \"bluetoothDevices\": [], \"notes\": [], \"health\": 100}"', 'BreakEscape::DemoUser', '"{\"startRoom\": \"reception\", \"rooms\": {}}"', 0, NULL, 'in_progress', NULL);
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, NULL, 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, NULL), (NULL, NULL, 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, NULL)
(0.1ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (0.0ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.3ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.2ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_games";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, NULL, 'test_user', 'user', NULL), (NULL, NULL, 'other_user', 'user', NULL);
INSERT INTO "break_escape_games" ("id", "completed_at", "created_at", "mission_id", "player_id", "player_state", "player_type", "scenario_data", "score", "started_at", "status", "updated_at") VALUES (NULL, NULL, NULL, 418560898, 149617800, '"{\"currentRoom\": \"reception\", \"unlockedRooms\": [\"reception\"], \"unlockedObjects\": [], \"inventory\": [], \"encounteredNPCs\": [], \"globalVariables\": {}, \"biometricSamples\": [], \"biometricUnlocks\": [], \"bluetoothDevices\": [], \"notes\": [], \"health\": 100}"', 'BreakEscape::DemoUser', '"{\"startRoom\": \"reception\", \"rooms\": {}}"', 0, NULL, 'in_progress', NULL);
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, NULL, 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, NULL), (NULL, NULL, 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, NULL)
(0.0ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (0.0ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.3ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.3ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_games";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, NULL, 'test_user', 'user', NULL), (NULL, NULL, 'other_user', 'user', NULL);
INSERT INTO "break_escape_games" ("id", "completed_at", "created_at", "mission_id", "player_id", "player_state", "player_type", "scenario_data", "score", "started_at", "status", "updated_at") VALUES (NULL, NULL, NULL, 418560898, 149617800, '"{\"currentRoom\": \"reception\", \"unlockedRooms\": [\"reception\"], \"unlockedObjects\": [], \"inventory\": [], \"encounteredNPCs\": [], \"globalVariables\": {}, \"biometricSamples\": [], \"biometricUnlocks\": [], \"bluetoothDevices\": [], \"notes\": [], \"health\": 100}"', 'BreakEscape::DemoUser', '"{\"startRoom\": \"reception\", \"rooms\": {}}"', 0, NULL, 'in_progress', NULL);
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, NULL, 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, NULL), (NULL, NULL, 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, NULL)
(0.0ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (0.0ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.2ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.2ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_games";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, NULL, 'test_user', 'user', NULL), (NULL, NULL, 'other_user', 'user', NULL);
INSERT INTO "break_escape_games" ("id", "completed_at", "created_at", "mission_id", "player_id", "player_state", "player_type", "scenario_data", "score", "started_at", "status", "updated_at") VALUES (NULL, NULL, NULL, 418560898, 149617800, '"{\"currentRoom\": \"reception\", \"unlockedRooms\": [\"reception\"], \"unlockedObjects\": [], \"inventory\": [], \"encounteredNPCs\": [], \"globalVariables\": {}, \"biometricSamples\": [], \"biometricUnlocks\": [], \"bluetoothDevices\": [], \"notes\": [], \"health\": 100}"', 'BreakEscape::DemoUser', '"{\"startRoom\": \"reception\", \"rooms\": {}}"', 0, NULL, 'in_progress', NULL);
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, NULL, 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, NULL), (NULL, NULL, 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, NULL)
(0.0ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (0.0ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.2ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.2ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_games";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, NULL, 'test_user', 'user', NULL), (NULL, NULL, 'other_user', 'user', NULL);
INSERT INTO "break_escape_games" ("id", "completed_at", "created_at", "mission_id", "player_id", "player_state", "player_type", "scenario_data", "score", "started_at", "status", "updated_at") VALUES (NULL, NULL, NULL, 418560898, 149617800, '"{\"currentRoom\": \"reception\", \"unlockedRooms\": [\"reception\"], \"unlockedObjects\": [], \"inventory\": [], \"encounteredNPCs\": [], \"globalVariables\": {}, \"biometricSamples\": [], \"biometricUnlocks\": [], \"bluetoothDevices\": [], \"notes\": [], \"health\": 100}"', 'BreakEscape::DemoUser', '"{\"startRoom\": \"reception\", \"rooms\": {}}"', 0, NULL, 'in_progress', NULL);
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, NULL, 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, NULL), (NULL, NULL, 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, NULL)
(0.1ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (0.0ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.3ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.2ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_games";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, NULL, 'test_user', 'user', NULL), (NULL, NULL, 'other_user', 'user', NULL);
INSERT INTO "break_escape_games" ("id", "completed_at", "created_at", "mission_id", "player_id", "player_state", "player_type", "scenario_data", "score", "started_at", "status", "updated_at") VALUES (NULL, NULL, NULL, 418560898, 149617800, '"{\"currentRoom\": \"reception\", \"unlockedRooms\": [\"reception\"], \"unlockedObjects\": [], \"inventory\": [], \"encounteredNPCs\": [], \"globalVariables\": {}, \"biometricSamples\": [], \"biometricUnlocks\": [], \"bluetoothDevices\": [], \"notes\": [], \"health\": 100}"', 'BreakEscape::DemoUser', '"{\"startRoom\": \"reception\", \"rooms\": {}}"', 0, NULL, 'in_progress', NULL);
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, NULL, 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, NULL), (NULL, NULL, 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, NULL)
(0.0ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (0.0ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.2ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.2ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_games";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, NULL, 'test_user', 'user', NULL), (NULL, NULL, 'other_user', 'user', NULL);
INSERT INTO "break_escape_games" ("id", "completed_at", "created_at", "mission_id", "player_id", "player_state", "player_type", "scenario_data", "score", "started_at", "status", "updated_at") VALUES (NULL, NULL, NULL, 418560898, 149617800, '"{\"currentRoom\": \"reception\", \"unlockedRooms\": [\"reception\"], \"unlockedObjects\": [], \"inventory\": [], \"encounteredNPCs\": [], \"globalVariables\": {}, \"biometricSamples\": [], \"biometricUnlocks\": [], \"bluetoothDevices\": [], \"notes\": [], \"health\": 100}"', 'BreakEscape::DemoUser', '"{\"startRoom\": \"reception\", \"rooms\": {}}"', 0, NULL, 'in_progress', NULL);
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, NULL, 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, NULL), (NULL, NULL, 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, NULL)
(0.0ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (0.0ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.3ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.2ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_games";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, NULL, 'test_user', 'user', NULL), (NULL, NULL, 'other_user', 'user', NULL);
INSERT INTO "break_escape_games" ("id", "completed_at", "created_at", "mission_id", "player_id", "player_state", "player_type", "scenario_data", "score", "started_at", "status", "updated_at") VALUES (NULL, NULL, NULL, 418560898, 149617800, '"{\"currentRoom\": \"reception\", \"unlockedRooms\": [\"reception\"], \"unlockedObjects\": [], \"inventory\": [], \"encounteredNPCs\": [], \"globalVariables\": {}, \"biometricSamples\": [], \"biometricUnlocks\": [], \"bluetoothDevices\": [], \"notes\": [], \"health\": 100}"', 'BreakEscape::DemoUser', '"{\"startRoom\": \"reception\", \"rooms\": {}}"', 0, NULL, 'in_progress', NULL);
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, NULL, 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, NULL), (NULL, NULL, 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, NULL)
(0.1ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (0.0ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.3ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.2ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_games";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, NULL, 'test_user', 'user', NULL), (NULL, NULL, 'other_user', 'user', NULL);
INSERT INTO "break_escape_games" ("id", "completed_at", "created_at", "mission_id", "player_id", "player_state", "player_type", "scenario_data", "score", "started_at", "status", "updated_at") VALUES (NULL, NULL, NULL, 418560898, 149617800, '"{\"currentRoom\": \"reception\", \"unlockedRooms\": [\"reception\"], \"unlockedObjects\": [], \"inventory\": [], \"encounteredNPCs\": [], \"globalVariables\": {}, \"biometricSamples\": [], \"biometricUnlocks\": [], \"bluetoothDevices\": [], \"notes\": [], \"health\": 100}"', 'BreakEscape::DemoUser', '"{\"startRoom\": \"reception\", \"rooms\": {}}"', 0, NULL, 'in_progress', NULL);
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, NULL, 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, NULL), (NULL, NULL, 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, NULL)
(0.0ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (0.0ms) ROLLBACK TRANSACTION
Generating image variants require the image_processing gem. Please add `gem "image_processing", "~> 1.2"` to your Gemfile or set `config.active_storage.variant_processor = :disabled`.
ActiveRecord::InternalMetadata Load (0.6ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = ? ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 [[nil, "schema_sha1"]]
ActiveRecord::SchemaMigration Load (0.3ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.4ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.2ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_games";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, '2025-11-20 17:20:11', 'test_user', 'user', '2025-11-20 17:20:11'), (NULL, '2025-11-20 17:20:11', 'other_user', 'user', '2025-11-20 17:20:11');
INSERT INTO "break_escape_games" ("id", "completed_at", "created_at", "mission_id", "player_id", "player_state", "player_type", "scenario_data", "score", "started_at", "status", "updated_at") VALUES (NULL, NULL, '2025-11-20 17:20:11', 418560898, 149617800, '"{\"currentRoom\": \"reception\", \"unlockedRooms\": [\"reception\"], \"unlockedObjects\": [], \"inventory\": [], \"encounteredNPCs\": [], \"globalVariables\": {}, \"biometricSamples\": [], \"biometricUnlocks\": [], \"bluetoothDevices\": [], \"notes\": [], \"health\": 100}"', 'BreakEscape::DemoUser', '"{\"startRoom\": \"reception\", \"rooms\": {}}"', 0, '2025-11-20 17:20:11', 'in_progress', '2025-11-20 17:20:11');
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, '2025-11-20 17:20:11', 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, '2025-11-20 17:20:11'), (NULL, '2025-11-20 17:20:11', 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, '2025-11-20 17:20:11')
(0.0ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (5.2ms) COMMIT TRANSACTION
(0.1ms) PRAGMA foreign_key_check
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.4ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.1ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.2ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_games";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, '2025-11-20 17:20:11', 'test_user', 'user', '2025-11-20 17:20:11'), (NULL, '2025-11-20 17:20:11', 'other_user', 'user', '2025-11-20 17:20:11');
INSERT INTO "break_escape_games" ("id", "completed_at", "created_at", "mission_id", "player_id", "player_state", "player_type", "scenario_data", "score", "started_at", "status", "updated_at") VALUES (NULL, NULL, '2025-11-20 17:20:11', 418560898, 149617800, '"{\"currentRoom\": \"reception\", \"unlockedRooms\": [\"reception\"], \"unlockedObjects\": [], \"inventory\": [], \"encounteredNPCs\": [], \"globalVariables\": {}, \"biometricSamples\": [], \"biometricUnlocks\": [], \"bluetoothDevices\": [], \"notes\": [], \"health\": 100}"', 'BreakEscape::DemoUser', '"{\"startRoom\": \"reception\", \"rooms\": {}}"', 0, '2025-11-20 17:20:11', 'in_progress', '2025-11-20 17:20:11');
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, '2025-11-20 17:20:11', 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, '2025-11-20 17:20:11'), (NULL, '2025-11-20 17:20:11', 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, '2025-11-20 17:20:11')
(0.0ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (0.2ms) COMMIT TRANSACTION
(0.1ms) PRAGMA foreign_key_check
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.3ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.2ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_games";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, '2025-11-20 17:20:11', 'test_user', 'user', '2025-11-20 17:20:11'), (NULL, '2025-11-20 17:20:11', 'other_user', 'user', '2025-11-20 17:20:11');
INSERT INTO "break_escape_games" ("id", "completed_at", "created_at", "mission_id", "player_id", "player_state", "player_type", "scenario_data", "score", "started_at", "status", "updated_at") VALUES (NULL, NULL, '2025-11-20 17:20:11', 418560898, 149617800, '"{\"currentRoom\": \"reception\", \"unlockedRooms\": [\"reception\"], \"unlockedObjects\": [], \"inventory\": [], \"encounteredNPCs\": [], \"globalVariables\": {}, \"biometricSamples\": [], \"biometricUnlocks\": [], \"bluetoothDevices\": [], \"notes\": [], \"health\": 100}"', 'BreakEscape::DemoUser', '"{\"startRoom\": \"reception\", \"rooms\": {}}"', 0, '2025-11-20 17:20:11', 'in_progress', '2025-11-20 17:20:11');
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, '2025-11-20 17:20:11', 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, '2025-11-20 17:20:11'), (NULL, '2025-11-20 17:20:11', 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, '2025-11-20 17:20:11')
(0.0ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (0.2ms) COMMIT TRANSACTION
(0.1ms) PRAGMA foreign_key_check
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.4ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.2ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_games";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, '2025-11-20 17:20:11', 'test_user', 'user', '2025-11-20 17:20:11'), (NULL, '2025-11-20 17:20:11', 'other_user', 'user', '2025-11-20 17:20:11');
INSERT INTO "break_escape_games" ("id", "completed_at", "created_at", "mission_id", "player_id", "player_state", "player_type", "scenario_data", "score", "started_at", "status", "updated_at") VALUES (NULL, NULL, '2025-11-20 17:20:11', 418560898, 149617800, '"{\"currentRoom\": \"reception\", \"unlockedRooms\": [\"reception\"], \"unlockedObjects\": [], \"inventory\": [], \"encounteredNPCs\": [], \"globalVariables\": {}, \"biometricSamples\": [], \"biometricUnlocks\": [], \"bluetoothDevices\": [], \"notes\": [], \"health\": 100}"', 'BreakEscape::DemoUser', '"{\"startRoom\": \"reception\", \"rooms\": {}}"', 0, '2025-11-20 17:20:11', 'in_progress', '2025-11-20 17:20:11');
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, '2025-11-20 17:20:11', 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, '2025-11-20 17:20:11'), (NULL, '2025-11-20 17:20:11', 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, '2025-11-20 17:20:11')
(0.0ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (0.2ms) COMMIT TRANSACTION
(0.1ms) PRAGMA foreign_key_check
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.5ms) PRAGMA foreign_keys
(0.1ms) PRAGMA defer_foreign_keys
(0.1ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.2ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_games";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, '2025-11-20 17:20:11', 'test_user', 'user', '2025-11-20 17:20:11'), (NULL, '2025-11-20 17:20:11', 'other_user', 'user', '2025-11-20 17:20:11');
INSERT INTO "break_escape_games" ("id", "completed_at", "created_at", "mission_id", "player_id", "player_state", "player_type", "scenario_data", "score", "started_at", "status", "updated_at") VALUES (NULL, NULL, '2025-11-20 17:20:11', 418560898, 149617800, '"{\"currentRoom\": \"reception\", \"unlockedRooms\": [\"reception\"], \"unlockedObjects\": [], \"inventory\": [], \"encounteredNPCs\": [], \"globalVariables\": {}, \"biometricSamples\": [], \"biometricUnlocks\": [], \"bluetoothDevices\": [], \"notes\": [], \"health\": 100}"', 'BreakEscape::DemoUser', '"{\"startRoom\": \"reception\", \"rooms\": {}}"', 0, '2025-11-20 17:20:11', 'in_progress', '2025-11-20 17:20:11');
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, '2025-11-20 17:20:11', 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, '2025-11-20 17:20:11'), (NULL, '2025-11-20 17:20:11', 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, '2025-11-20 17:20:11')
(0.0ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (0.2ms) COMMIT TRANSACTION
(0.1ms) PRAGMA foreign_key_check
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.4ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.2ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_games";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, '2025-11-20 17:20:11', 'test_user', 'user', '2025-11-20 17:20:11'), (NULL, '2025-11-20 17:20:11', 'other_user', 'user', '2025-11-20 17:20:11');
INSERT INTO "break_escape_games" ("id", "completed_at", "created_at", "mission_id", "player_id", "player_state", "player_type", "scenario_data", "score", "started_at", "status", "updated_at") VALUES (NULL, NULL, '2025-11-20 17:20:11', 418560898, 149617800, '"{\"currentRoom\": \"reception\", \"unlockedRooms\": [\"reception\"], \"unlockedObjects\": [], \"inventory\": [], \"encounteredNPCs\": [], \"globalVariables\": {}, \"biometricSamples\": [], \"biometricUnlocks\": [], \"bluetoothDevices\": [], \"notes\": [], \"health\": 100}"', 'BreakEscape::DemoUser', '"{\"startRoom\": \"reception\", \"rooms\": {}}"', 0, '2025-11-20 17:20:11', 'in_progress', '2025-11-20 17:20:11');
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, '2025-11-20 17:20:11', 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, '2025-11-20 17:20:11'), (NULL, '2025-11-20 17:20:11', 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, '2025-11-20 17:20:11')
(0.1ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (0.2ms) COMMIT TRANSACTION
(0.1ms) PRAGMA foreign_key_check
TRANSACTION (0.2ms) BEGIN immediate TRANSACTION
(0.5ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.2ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_games";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, '2025-11-20 17:20:11', 'test_user', 'user', '2025-11-20 17:20:11'), (NULL, '2025-11-20 17:20:11', 'other_user', 'user', '2025-11-20 17:20:11');
INSERT INTO "break_escape_games" ("id", "completed_at", "created_at", "mission_id", "player_id", "player_state", "player_type", "scenario_data", "score", "started_at", "status", "updated_at") VALUES (NULL, NULL, '2025-11-20 17:20:11', 418560898, 149617800, '"{\"currentRoom\": \"reception\", \"unlockedRooms\": [\"reception\"], \"unlockedObjects\": [], \"inventory\": [], \"encounteredNPCs\": [], \"globalVariables\": {}, \"biometricSamples\": [], \"biometricUnlocks\": [], \"bluetoothDevices\": [], \"notes\": [], \"health\": 100}"', 'BreakEscape::DemoUser', '"{\"startRoom\": \"reception\", \"rooms\": {}}"', 0, '2025-11-20 17:20:11', 'in_progress', '2025-11-20 17:20:11');
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, '2025-11-20 17:20:11', 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, '2025-11-20 17:20:11'), (NULL, '2025-11-20 17:20:11', 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, '2025-11-20 17:20:11')
(0.1ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (0.2ms) COMMIT TRANSACTION
(0.1ms) PRAGMA foreign_key_check
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.3ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.2ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_games";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, '2025-11-20 17:20:11', 'test_user', 'user', '2025-11-20 17:20:11'), (NULL, '2025-11-20 17:20:11', 'other_user', 'user', '2025-11-20 17:20:11');
INSERT INTO "break_escape_games" ("id", "completed_at", "created_at", "mission_id", "player_id", "player_state", "player_type", "scenario_data", "score", "started_at", "status", "updated_at") VALUES (NULL, NULL, '2025-11-20 17:20:11', 418560898, 149617800, '"{\"currentRoom\": \"reception\", \"unlockedRooms\": [\"reception\"], \"unlockedObjects\": [], \"inventory\": [], \"encounteredNPCs\": [], \"globalVariables\": {}, \"biometricSamples\": [], \"biometricUnlocks\": [], \"bluetoothDevices\": [], \"notes\": [], \"health\": 100}"', 'BreakEscape::DemoUser', '"{\"startRoom\": \"reception\", \"rooms\": {}}"', 0, '2025-11-20 17:20:11', 'in_progress', '2025-11-20 17:20:11');
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, '2025-11-20 17:20:11', 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, '2025-11-20 17:20:11'), (NULL, '2025-11-20 17:20:11', 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, '2025-11-20 17:20:11')
(0.0ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (0.2ms) COMMIT TRANSACTION
(0.1ms) PRAGMA foreign_key_check
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.3ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.2ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_games";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, '2025-11-20 17:20:11', 'test_user', 'user', '2025-11-20 17:20:11'), (NULL, '2025-11-20 17:20:11', 'other_user', 'user', '2025-11-20 17:20:11');
INSERT INTO "break_escape_games" ("id", "completed_at", "created_at", "mission_id", "player_id", "player_state", "player_type", "scenario_data", "score", "started_at", "status", "updated_at") VALUES (NULL, NULL, '2025-11-20 17:20:11', 418560898, 149617800, '"{\"currentRoom\": \"reception\", \"unlockedRooms\": [\"reception\"], \"unlockedObjects\": [], \"inventory\": [], \"encounteredNPCs\": [], \"globalVariables\": {}, \"biometricSamples\": [], \"biometricUnlocks\": [], \"bluetoothDevices\": [], \"notes\": [], \"health\": 100}"', 'BreakEscape::DemoUser', '"{\"startRoom\": \"reception\", \"rooms\": {}}"', 0, '2025-11-20 17:20:11', 'in_progress', '2025-11-20 17:20:11');
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, '2025-11-20 17:20:11', 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, '2025-11-20 17:20:11'), (NULL, '2025-11-20 17:20:11', 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, '2025-11-20 17:20:11')
(0.0ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (0.2ms) COMMIT TRANSACTION
(0.1ms) PRAGMA foreign_key_check
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.3ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.4ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_games";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, '2025-11-20 17:20:11', 'test_user', 'user', '2025-11-20 17:20:11'), (NULL, '2025-11-20 17:20:11', 'other_user', 'user', '2025-11-20 17:20:11');
INSERT INTO "break_escape_games" ("id", "completed_at", "created_at", "mission_id", "player_id", "player_state", "player_type", "scenario_data", "score", "started_at", "status", "updated_at") VALUES (NULL, NULL, '2025-11-20 17:20:11', 418560898, 149617800, '"{\"currentRoom\": \"reception\", \"unlockedRooms\": [\"reception\"], \"unlockedObjects\": [], \"inventory\": [], \"encounteredNPCs\": [], \"globalVariables\": {}, \"biometricSamples\": [], \"biometricUnlocks\": [], \"bluetoothDevices\": [], \"notes\": [], \"health\": 100}"', 'BreakEscape::DemoUser', '"{\"startRoom\": \"reception\", \"rooms\": {}}"', 0, '2025-11-20 17:20:11', 'in_progress', '2025-11-20 17:20:11');
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, '2025-11-20 17:20:11', 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, '2025-11-20 17:20:11'), (NULL, '2025-11-20 17:20:11', 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, '2025-11-20 17:20:11')
(0.1ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (0.2ms) COMMIT TRANSACTION
(0.1ms) PRAGMA foreign_key_check
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.3ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.1ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_games";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, '2025-11-20 17:20:11', 'test_user', 'user', '2025-11-20 17:20:11'), (NULL, '2025-11-20 17:20:11', 'other_user', 'user', '2025-11-20 17:20:11');
INSERT INTO "break_escape_games" ("id", "completed_at", "created_at", "mission_id", "player_id", "player_state", "player_type", "scenario_data", "score", "started_at", "status", "updated_at") VALUES (NULL, NULL, '2025-11-20 17:20:11', 418560898, 149617800, '"{\"currentRoom\": \"reception\", \"unlockedRooms\": [\"reception\"], \"unlockedObjects\": [], \"inventory\": [], \"encounteredNPCs\": [], \"globalVariables\": {}, \"biometricSamples\": [], \"biometricUnlocks\": [], \"bluetoothDevices\": [], \"notes\": [], \"health\": 100}"', 'BreakEscape::DemoUser', '"{\"startRoom\": \"reception\", \"rooms\": {}}"', 0, '2025-11-20 17:20:11', 'in_progress', '2025-11-20 17:20:11');
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, '2025-11-20 17:20:11', 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, '2025-11-20 17:20:11'), (NULL, '2025-11-20 17:20:11', 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, '2025-11-20 17:20:11')
(0.0ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (0.2ms) COMMIT TRANSACTION
(0.1ms) PRAGMA foreign_key_check
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.4ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.2ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_games";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, '2025-11-20 17:20:11', 'test_user', 'user', '2025-11-20 17:20:11'), (NULL, '2025-11-20 17:20:11', 'other_user', 'user', '2025-11-20 17:20:11');
INSERT INTO "break_escape_games" ("id", "completed_at", "created_at", "mission_id", "player_id", "player_state", "player_type", "scenario_data", "score", "started_at", "status", "updated_at") VALUES (NULL, NULL, '2025-11-20 17:20:11', 418560898, 149617800, '"{\"currentRoom\": \"reception\", \"unlockedRooms\": [\"reception\"], \"unlockedObjects\": [], \"inventory\": [], \"encounteredNPCs\": [], \"globalVariables\": {}, \"biometricSamples\": [], \"biometricUnlocks\": [], \"bluetoothDevices\": [], \"notes\": [], \"health\": 100}"', 'BreakEscape::DemoUser', '"{\"startRoom\": \"reception\", \"rooms\": {}}"', 0, '2025-11-20 17:20:11', 'in_progress', '2025-11-20 17:20:11');
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, '2025-11-20 17:20:11', 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, '2025-11-20 17:20:11'), (NULL, '2025-11-20 17:20:11', 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, '2025-11-20 17:20:11')
(0.0ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (0.2ms) COMMIT TRANSACTION
(0.1ms) PRAGMA foreign_key_check
Generating image variants require the image_processing gem. Please add `gem "image_processing", "~> 1.2"` to your Gemfile or set `config.active_storage.variant_processor = :disabled`.
ActiveRecord::InternalMetadata Load (0.5ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = ? ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 [[nil, "schema_sha1"]]
ActiveRecord::SchemaMigration Load (0.3ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.5ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.1ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.2ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, '2025-11-20 17:21:12', 'test_user', 'user', '2025-11-20 17:21:12'), (NULL, '2025-11-20 17:21:12', 'other_user', 'user', '2025-11-20 17:21:12');
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, '2025-11-20 17:21:12', 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, '2025-11-20 17:21:12'), (NULL, '2025-11-20 17:21:12', 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, '2025-11-20 17:21:12')
(0.0ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (5.0ms) COMMIT TRANSACTION
(0.1ms) PRAGMA foreign_key_check
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.4ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.2ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, '2025-11-20 17:21:13', 'test_user', 'user', '2025-11-20 17:21:13'), (NULL, '2025-11-20 17:21:13', 'other_user', 'user', '2025-11-20 17:21:13');
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, '2025-11-20 17:21:13', 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, '2025-11-20 17:21:13'), (NULL, '2025-11-20 17:21:13', 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, '2025-11-20 17:21:13')
(0.1ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (0.1ms) COMMIT TRANSACTION
(0.1ms) PRAGMA foreign_key_check
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.4ms) PRAGMA foreign_keys
(0.1ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.2ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, '2025-11-20 17:21:13', 'test_user', 'user', '2025-11-20 17:21:13'), (NULL, '2025-11-20 17:21:13', 'other_user', 'user', '2025-11-20 17:21:13');
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, '2025-11-20 17:21:13', 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, '2025-11-20 17:21:13'), (NULL, '2025-11-20 17:21:13', 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, '2025-11-20 17:21:13')
(0.0ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (0.2ms) COMMIT TRANSACTION
(0.1ms) PRAGMA foreign_key_check
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.2ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.2ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, '2025-11-20 17:21:13', 'test_user', 'user', '2025-11-20 17:21:13'), (NULL, '2025-11-20 17:21:13', 'other_user', 'user', '2025-11-20 17:21:13');
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, '2025-11-20 17:21:13', 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, '2025-11-20 17:21:13'), (NULL, '2025-11-20 17:21:13', 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, '2025-11-20 17:21:13')
(0.0ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (0.1ms) COMMIT TRANSACTION
(0.1ms) PRAGMA foreign_key_check
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.3ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.3ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, '2025-11-20 17:21:13', 'test_user', 'user', '2025-11-20 17:21:13'), (NULL, '2025-11-20 17:21:13', 'other_user', 'user', '2025-11-20 17:21:13');
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, '2025-11-20 17:21:13', 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, '2025-11-20 17:21:13'), (NULL, '2025-11-20 17:21:13', 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, '2025-11-20 17:21:13')
(0.0ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (0.1ms) COMMIT TRANSACTION
(0.1ms) PRAGMA foreign_key_check
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.2ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.2ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, '2025-11-20 17:21:13', 'test_user', 'user', '2025-11-20 17:21:13'), (NULL, '2025-11-20 17:21:13', 'other_user', 'user', '2025-11-20 17:21:13');
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, '2025-11-20 17:21:13', 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, '2025-11-20 17:21:13'), (NULL, '2025-11-20 17:21:13', 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, '2025-11-20 17:21:13')
(0.1ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (0.1ms) COMMIT TRANSACTION
(0.1ms) PRAGMA foreign_key_check
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.2ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.3ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, '2025-11-20 17:21:13', 'test_user', 'user', '2025-11-20 17:21:13'), (NULL, '2025-11-20 17:21:13', 'other_user', 'user', '2025-11-20 17:21:13');
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, '2025-11-20 17:21:13', 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, '2025-11-20 17:21:13'), (NULL, '2025-11-20 17:21:13', 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, '2025-11-20 17:21:13')
(0.0ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (0.1ms) COMMIT TRANSACTION
(0.1ms) PRAGMA foreign_key_check
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.2ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.1ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, '2025-11-20 17:21:13', 'test_user', 'user', '2025-11-20 17:21:13'), (NULL, '2025-11-20 17:21:13', 'other_user', 'user', '2025-11-20 17:21:13');
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, '2025-11-20 17:21:13', 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, '2025-11-20 17:21:13'), (NULL, '2025-11-20 17:21:13', 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, '2025-11-20 17:21:13')
(0.0ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (0.1ms) COMMIT TRANSACTION
(0.1ms) PRAGMA foreign_key_check
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.2ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.1ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.1ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, '2025-11-20 17:21:13', 'test_user', 'user', '2025-11-20 17:21:13'), (NULL, '2025-11-20 17:21:13', 'other_user', 'user', '2025-11-20 17:21:13');
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, '2025-11-20 17:21:13', 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, '2025-11-20 17:21:13'), (NULL, '2025-11-20 17:21:13', 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, '2025-11-20 17:21:13')
(0.0ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (0.1ms) COMMIT TRANSACTION
(0.1ms) PRAGMA foreign_key_check
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.2ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.1ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, '2025-11-20 17:21:13', 'test_user', 'user', '2025-11-20 17:21:13'), (NULL, '2025-11-20 17:21:13', 'other_user', 'user', '2025-11-20 17:21:13');
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, '2025-11-20 17:21:13', 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, '2025-11-20 17:21:13'), (NULL, '2025-11-20 17:21:13', 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, '2025-11-20 17:21:13')
(0.0ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (0.2ms) COMMIT TRANSACTION
(0.1ms) PRAGMA foreign_key_check
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.2ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.3ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, '2025-11-20 17:21:13', 'test_user', 'user', '2025-11-20 17:21:13'), (NULL, '2025-11-20 17:21:13', 'other_user', 'user', '2025-11-20 17:21:13');
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, '2025-11-20 17:21:13', 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, '2025-11-20 17:21:13'), (NULL, '2025-11-20 17:21:13', 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, '2025-11-20 17:21:13')
(0.0ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (0.1ms) COMMIT TRANSACTION
(0.1ms) PRAGMA foreign_key_check
TRANSACTION (0.0ms) BEGIN immediate TRANSACTION
(0.2ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.1ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, '2025-11-20 17:21:13', 'test_user', 'user', '2025-11-20 17:21:13'), (NULL, '2025-11-20 17:21:13', 'other_user', 'user', '2025-11-20 17:21:13');
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, '2025-11-20 17:21:13', 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, '2025-11-20 17:21:13'), (NULL, '2025-11-20 17:21:13', 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, '2025-11-20 17:21:13')
(0.0ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (0.1ms) COMMIT TRANSACTION
(0.1ms) PRAGMA foreign_key_check
Generating image variants require the image_processing gem. Please add `gem "image_processing", "~> 1.2"` to your Gemfile or set `config.active_storage.variant_processor = :disabled`.
ActiveRecord::InternalMetadata Load (0.6ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = ? ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 [[nil, "schema_sha1"]]
ActiveRecord::SchemaMigration Load (0.2ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.3ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.2ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, '2025-11-20 17:22:17', 'test_user', 'user', '2025-11-20 17:22:17'), (NULL, '2025-11-20 17:22:17', 'other_user', 'user', '2025-11-20 17:22:17');
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, '2025-11-20 17:22:17', 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, '2025-11-20 17:22:17'), (NULL, '2025-11-20 17:22:17', 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, '2025-11-20 17:22:17')
(0.0ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (5.1ms) COMMIT TRANSACTION
(0.1ms) PRAGMA foreign_key_check
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.3ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.2ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, '2025-11-20 17:22:17', 'test_user', 'user', '2025-11-20 17:22:17'), (NULL, '2025-11-20 17:22:17', 'other_user', 'user', '2025-11-20 17:22:17');
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, '2025-11-20 17:22:17', 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, '2025-11-20 17:22:17'), (NULL, '2025-11-20 17:22:17', 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, '2025-11-20 17:22:17')
(0.0ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (0.1ms) COMMIT TRANSACTION
(0.1ms) PRAGMA foreign_key_check
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.3ms) PRAGMA foreign_keys
(0.1ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.1ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, '2025-11-20 17:22:17', 'test_user', 'user', '2025-11-20 17:22:17'), (NULL, '2025-11-20 17:22:17', 'other_user', 'user', '2025-11-20 17:22:17');
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, '2025-11-20 17:22:17', 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, '2025-11-20 17:22:17'), (NULL, '2025-11-20 17:22:17', 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, '2025-11-20 17:22:17')
(0.0ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (0.1ms) COMMIT TRANSACTION
(0.1ms) PRAGMA foreign_key_check
TRANSACTION (0.0ms) BEGIN immediate TRANSACTION
(0.2ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.2ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, '2025-11-20 17:22:17', 'test_user', 'user', '2025-11-20 17:22:17'), (NULL, '2025-11-20 17:22:17', 'other_user', 'user', '2025-11-20 17:22:17');
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, '2025-11-20 17:22:17', 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, '2025-11-20 17:22:17'), (NULL, '2025-11-20 17:22:17', 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, '2025-11-20 17:22:17')
(0.0ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (0.1ms) COMMIT TRANSACTION
(0.1ms) PRAGMA foreign_key_check
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.4ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.2ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, '2025-11-20 17:22:17', 'test_user', 'user', '2025-11-20 17:22:17'), (NULL, '2025-11-20 17:22:17', 'other_user', 'user', '2025-11-20 17:22:17');
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, '2025-11-20 17:22:17', 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, '2025-11-20 17:22:17'), (NULL, '2025-11-20 17:22:17', 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, '2025-11-20 17:22:17')
(0.0ms) PRAGMA defer_foreign_keys = 0
(0.1ms) PRAGMA foreign_keys = 1
TRANSACTION (0.1ms) COMMIT TRANSACTION
(0.1ms) PRAGMA foreign_key_check
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.4ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.1ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.2ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, '2025-11-20 17:22:18', 'test_user', 'user', '2025-11-20 17:22:18'), (NULL, '2025-11-20 17:22:18', 'other_user', 'user', '2025-11-20 17:22:18');
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, '2025-11-20 17:22:18', 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, '2025-11-20 17:22:18'), (NULL, '2025-11-20 17:22:18', 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, '2025-11-20 17:22:18')
(0.0ms) PRAGMA defer_foreign_keys = 0
(0.1ms) PRAGMA foreign_keys = 1
TRANSACTION (0.2ms) COMMIT TRANSACTION
(0.1ms) PRAGMA foreign_key_check
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.3ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.2ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, '2025-11-20 17:22:18', 'test_user', 'user', '2025-11-20 17:22:18'), (NULL, '2025-11-20 17:22:18', 'other_user', 'user', '2025-11-20 17:22:18');
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, '2025-11-20 17:22:18', 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, '2025-11-20 17:22:18'), (NULL, '2025-11-20 17:22:18', 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, '2025-11-20 17:22:18')
(0.0ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (0.1ms) COMMIT TRANSACTION
(0.1ms) PRAGMA foreign_key_check
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.2ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.4ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, '2025-11-20 17:22:18', 'test_user', 'user', '2025-11-20 17:22:18'), (NULL, '2025-11-20 17:22:18', 'other_user', 'user', '2025-11-20 17:22:18');
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, '2025-11-20 17:22:18', 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, '2025-11-20 17:22:18'), (NULL, '2025-11-20 17:22:18', 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, '2025-11-20 17:22:18')
(0.0ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (0.1ms) COMMIT TRANSACTION
(0.1ms) PRAGMA foreign_key_check
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.2ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.1ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, '2025-11-20 17:22:18', 'test_user', 'user', '2025-11-20 17:22:18'), (NULL, '2025-11-20 17:22:18', 'other_user', 'user', '2025-11-20 17:22:18');
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, '2025-11-20 17:22:18', 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, '2025-11-20 17:22:18'), (NULL, '2025-11-20 17:22:18', 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, '2025-11-20 17:22:18')
(0.0ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (0.1ms) COMMIT TRANSACTION
(0.1ms) PRAGMA foreign_key_check
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.3ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.1ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, '2025-11-20 17:22:18', 'test_user', 'user', '2025-11-20 17:22:18'), (NULL, '2025-11-20 17:22:18', 'other_user', 'user', '2025-11-20 17:22:18');
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, '2025-11-20 17:22:18', 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, '2025-11-20 17:22:18'), (NULL, '2025-11-20 17:22:18', 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, '2025-11-20 17:22:18')
(0.1ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (0.1ms) COMMIT TRANSACTION
(0.1ms) PRAGMA foreign_key_check
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.2ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.1ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, '2025-11-20 17:22:18', 'test_user', 'user', '2025-11-20 17:22:18'), (NULL, '2025-11-20 17:22:18', 'other_user', 'user', '2025-11-20 17:22:18');
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, '2025-11-20 17:22:18', 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, '2025-11-20 17:22:18'), (NULL, '2025-11-20 17:22:18', 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, '2025-11-20 17:22:18')
(0.0ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (0.1ms) COMMIT TRANSACTION
(0.1ms) PRAGMA foreign_key_check
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.3ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.1ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, '2025-11-20 17:22:18', 'test_user', 'user', '2025-11-20 17:22:18'), (NULL, '2025-11-20 17:22:18', 'other_user', 'user', '2025-11-20 17:22:18');
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, '2025-11-20 17:22:18', 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, '2025-11-20 17:22:18'), (NULL, '2025-11-20 17:22:18', 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, '2025-11-20 17:22:18')
(0.0ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (0.1ms) COMMIT TRANSACTION
(0.1ms) PRAGMA foreign_key_check
Generating image variants require the image_processing gem. Please add `gem "image_processing", "~> 1.2"` to your Gemfile or set `config.active_storage.variant_processor = :disabled`.
ActiveRecord::SchemaMigration Load (0.5ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
ActiveRecord::InternalMetadata Load (0.2ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = ? ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 [[nil, "environment"]]
ActiveRecord::SchemaMigration Load (0.1ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
ActiveRecord::InternalMetadata Load (0.1ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = ? ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 [[nil, "environment"]]
ActiveRecord::SchemaMigration Load (0.1ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
ActiveRecord::InternalMetadata Load (0.1ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = ? ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 [[nil, "environment"]]
(4.9ms) DROP TABLE IF EXISTS "break_escape_demo_users"
(0.2ms) CREATE TABLE "break_escape_demo_users" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "created_at" datetime(6) NOT NULL, "handle" varchar NOT NULL, "role" varchar DEFAULT 'user' NOT NULL, "updated_at" datetime(6) NOT NULL)
(0.2ms) CREATE UNIQUE INDEX "index_break_escape_demo_users_on_handle" ON "break_escape_demo_users" ("handle")
(0.4ms) DROP TABLE IF EXISTS "break_escape_games"
(0.2ms) CREATE TABLE "break_escape_games" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "completed_at" datetime(6), "created_at" datetime(6) NOT NULL, "mission_id" integer NOT NULL, "player_id" integer NOT NULL, "player_state" json DEFAULT '"{\"currentRoom\":null,\"unlockedRooms\":[],\"unlockedObjects\":[],\"inventory\":[],\"encounteredNPCs\":[],\"globalVariables\":{},\"biometricSamples\":[],\"biometricUnlocks\":[],\"bluetoothDevices\":[],\"notes\":[],\"health\":100}"' NOT NULL, "player_type" varchar NOT NULL, "scenario_data" json NOT NULL, "score" integer DEFAULT 0 NOT NULL, "started_at" datetime(6), "status" varchar DEFAULT 'in_progress' NOT NULL, "updated_at" datetime(6) NOT NULL)
(0.1ms) CREATE INDEX "index_break_escape_games_on_mission_id" ON "break_escape_games" ("mission_id")
(0.1ms) CREATE UNIQUE INDEX "index_games_on_player_and_mission" ON "break_escape_games" ("player_type", "player_id", "mission_id")
(0.1ms) CREATE INDEX "index_break_escape_games_on_player" ON "break_escape_games" ("player_type", "player_id")
(0.1ms) CREATE INDEX "index_break_escape_games_on_status" ON "break_escape_games" ("status")
(0.2ms) DROP TABLE IF EXISTS "break_escape_missions"
(0.2ms) CREATE TABLE "break_escape_missions" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "created_at" datetime(6) NOT NULL, "description" text, "difficulty_level" integer DEFAULT 1 NOT NULL, "display_name" varchar NOT NULL, "name" varchar NOT NULL, "published" boolean DEFAULT FALSE NOT NULL, "updated_at" datetime(6) NOT NULL)
(0.1ms) CREATE UNIQUE INDEX "index_break_escape_missions_on_name" ON "break_escape_missions" ("name")
(0.1ms) CREATE INDEX "index_break_escape_missions_on_published" ON "break_escape_missions" ("published")
(0.1ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
TRANSACTION (0.0ms) BEGIN immediate TRANSACTION
(0.2ms) CREATE TEMPORARY TABLE "abreak_escape_games" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "completed_at" datetime(6), "created_at" datetime(6) NOT NULL, "mission_id" integer NOT NULL, "player_id" integer NOT NULL, "player_state" json DEFAULT '"{\"currentRoom\":null,\"unlockedRooms\":[],\"unlockedObjects\":[],\"inventory\":[],\"encounteredNPCs\":[],\"globalVariables\":{},\"biometricSamples\":[],\"biometricUnlocks\":[],\"bluetoothDevices\":[],\"notes\":[],\"health\":100}"' NOT NULL, "player_type" varchar NOT NULL, "scenario_data" json NOT NULL, "score" integer DEFAULT 0 NOT NULL, "started_at" datetime(6), "status" varchar DEFAULT 'in_progress' NOT NULL, "updated_at" datetime(6) NOT NULL)
(0.1ms) CREATE INDEX "tindex_abreak_escape_games_on_status" ON "abreak_escape_games" ("status")
(0.1ms) CREATE INDEX "tindex_abreak_escape_games_on_player" ON "abreak_escape_games" ("player_type", "player_id")
(0.1ms) CREATE UNIQUE INDEX "tindex_games_on_player_and_mission" ON "abreak_escape_games" ("player_type", "player_id", "mission_id")
(0.1ms) CREATE INDEX "tindex_abreak_escape_games_on_mission_id" ON "abreak_escape_games" ("mission_id")
SQL (0.1ms) INSERT INTO "abreak_escape_games" ("id","completed_at","created_at","mission_id","player_id","player_state","player_type","scenario_data","score","started_at","status","updated_at")
SELECT "id","completed_at","created_at","mission_id","player_id","player_state","player_type","scenario_data","score","started_at","status","updated_at" FROM "break_escape_games"
(0.2ms) DROP TABLE "break_escape_games"
(0.1ms) CREATE TABLE "break_escape_games" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "completed_at" datetime(6), "created_at" datetime(6) NOT NULL, "mission_id" integer NOT NULL, "player_id" integer NOT NULL, "player_state" json DEFAULT '"{\"currentRoom\":null,\"unlockedRooms\":[],\"unlockedObjects\":[],\"inventory\":[],\"encounteredNPCs\":[],\"globalVariables\":{},\"biometricSamples\":[],\"biometricUnlocks\":[],\"bluetoothDevices\":[],\"notes\":[],\"health\":100}"' NOT NULL, "player_type" varchar NOT NULL, "scenario_data" json NOT NULL, "score" integer DEFAULT 0 NOT NULL, "started_at" datetime(6), "status" varchar DEFAULT 'in_progress' NOT NULL, "updated_at" datetime(6) NOT NULL, CONSTRAINT "fk_rails_ce758a8dd4"
FOREIGN KEY ("mission_id")
REFERENCES "break_escape_missions" ("id")
)
(0.1ms) CREATE INDEX "index_break_escape_games_on_mission_id" ON "break_escape_games" ("mission_id")
(0.1ms) CREATE UNIQUE INDEX "index_games_on_player_and_mission" ON "break_escape_games" ("player_type", "player_id", "mission_id")
(0.1ms) CREATE INDEX "index_break_escape_games_on_player" ON "break_escape_games" ("player_type", "player_id")
(0.1ms) CREATE INDEX "index_break_escape_games_on_status" ON "break_escape_games" ("status")
SQL (0.1ms) INSERT INTO "break_escape_games" ("id","completed_at","created_at","mission_id","player_id","player_state","player_type","scenario_data","score","started_at","status","updated_at")
SELECT "id","completed_at","created_at","mission_id","player_id","player_state","player_type","scenario_data","score","started_at","status","updated_at" FROM "abreak_escape_games"
(0.1ms) DROP TABLE "abreak_escape_games"
TRANSACTION (0.2ms) COMMIT TRANSACTION
(0.0ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
ActiveRecord::SchemaMigration Load (0.1ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
ActiveRecord::InternalMetadata Load (0.1ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = ? ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 [[nil, "environment"]]
ActiveRecord::InternalMetadata Load (0.1ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = ? ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 [[nil, "environment"]]
ActiveRecord::InternalMetadata Load (0.1ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = ? ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 [[nil, "schema_sha1"]]
ActiveRecord::SchemaMigration Load (0.0ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
Generating image variants require the image_processing gem. Please add `gem "image_processing", "~> 1.2"` to your Gemfile or set `config.active_storage.variant_processor = :disabled`.
Generating image variants require the image_processing gem. Please add `gem "image_processing", "~> 1.2"` to your Gemfile or set `config.active_storage.variant_processor = :disabled`.
(1.1ms) DROP TABLE IF EXISTS "break_escape_demo_users"
(3.7ms) CREATE TABLE "break_escape_demo_users" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "created_at" datetime(6) NOT NULL, "handle" varchar NOT NULL, "role" varchar DEFAULT 'user' NOT NULL, "updated_at" datetime(6) NOT NULL)
(0.2ms) CREATE UNIQUE INDEX "index_break_escape_demo_users_on_handle" ON "break_escape_demo_users" ("handle")
(0.1ms) DROP TABLE IF EXISTS "break_escape_games"
(0.2ms) CREATE TABLE "break_escape_games" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "completed_at" datetime(6), "created_at" datetime(6) NOT NULL, "mission_id" integer NOT NULL, "player_id" integer NOT NULL, "player_state" json DEFAULT '"{\"currentRoom\":null,\"unlockedRooms\":[],\"unlockedObjects\":[],\"inventory\":[],\"encounteredNPCs\":[],\"globalVariables\":{},\"biometricSamples\":[],\"biometricUnlocks\":[],\"bluetoothDevices\":[],\"notes\":[],\"health\":100}"' NOT NULL, "player_type" varchar NOT NULL, "scenario_data" json NOT NULL, "score" integer DEFAULT 0 NOT NULL, "started_at" datetime(6), "status" varchar DEFAULT 'in_progress' NOT NULL, "updated_at" datetime(6) NOT NULL)
(0.1ms) CREATE INDEX "index_break_escape_games_on_mission_id" ON "break_escape_games" ("mission_id")
(0.1ms) CREATE UNIQUE INDEX "index_games_on_player_and_mission" ON "break_escape_games" ("player_type", "player_id", "mission_id")
(0.1ms) CREATE INDEX "index_break_escape_games_on_player" ON "break_escape_games" ("player_type", "player_id")
(0.2ms) CREATE INDEX "index_break_escape_games_on_status" ON "break_escape_games" ("status")
(0.1ms) DROP TABLE IF EXISTS "break_escape_missions"
(0.2ms) CREATE TABLE "break_escape_missions" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "created_at" datetime(6) NOT NULL, "description" text, "difficulty_level" integer DEFAULT 1 NOT NULL, "display_name" varchar NOT NULL, "name" varchar NOT NULL, "published" boolean DEFAULT FALSE NOT NULL, "updated_at" datetime(6) NOT NULL)
(0.2ms) CREATE UNIQUE INDEX "index_break_escape_missions_on_name" ON "break_escape_missions" ("name")
(0.2ms) CREATE INDEX "index_break_escape_missions_on_published" ON "break_escape_missions" ("published")
(0.0ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
TRANSACTION (0.0ms) BEGIN immediate TRANSACTION
(0.2ms) CREATE TEMPORARY TABLE "abreak_escape_games" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "completed_at" datetime(6), "created_at" datetime(6) NOT NULL, "mission_id" integer NOT NULL, "player_id" integer NOT NULL, "player_state" json DEFAULT '"{\"currentRoom\":null,\"unlockedRooms\":[],\"unlockedObjects\":[],\"inventory\":[],\"encounteredNPCs\":[],\"globalVariables\":{},\"biometricSamples\":[],\"biometricUnlocks\":[],\"bluetoothDevices\":[],\"notes\":[],\"health\":100}"' NOT NULL, "player_type" varchar NOT NULL, "scenario_data" json NOT NULL, "score" integer DEFAULT 0 NOT NULL, "started_at" datetime(6), "status" varchar DEFAULT 'in_progress' NOT NULL, "updated_at" datetime(6) NOT NULL)
(0.1ms) CREATE INDEX "tindex_abreak_escape_games_on_status" ON "abreak_escape_games" ("status")
(0.1ms) CREATE INDEX "tindex_abreak_escape_games_on_player" ON "abreak_escape_games" ("player_type", "player_id")
(0.2ms) CREATE UNIQUE INDEX "tindex_games_on_player_and_mission" ON "abreak_escape_games" ("player_type", "player_id", "mission_id")
(0.1ms) CREATE INDEX "tindex_abreak_escape_games_on_mission_id" ON "abreak_escape_games" ("mission_id")
SQL (0.2ms) INSERT INTO "abreak_escape_games" ("id","completed_at","created_at","mission_id","player_id","player_state","player_type","scenario_data","score","started_at","status","updated_at")
SELECT "id","completed_at","created_at","mission_id","player_id","player_state","player_type","scenario_data","score","started_at","status","updated_at" FROM "break_escape_games"
(0.4ms) DROP TABLE "break_escape_games"
(0.2ms) CREATE TABLE "break_escape_games" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "completed_at" datetime(6), "created_at" datetime(6) NOT NULL, "mission_id" integer NOT NULL, "player_id" integer NOT NULL, "player_state" json DEFAULT '"{\"currentRoom\":null,\"unlockedRooms\":[],\"unlockedObjects\":[],\"inventory\":[],\"encounteredNPCs\":[],\"globalVariables\":{},\"biometricSamples\":[],\"biometricUnlocks\":[],\"bluetoothDevices\":[],\"notes\":[],\"health\":100}"' NOT NULL, "player_type" varchar NOT NULL, "scenario_data" json NOT NULL, "score" integer DEFAULT 0 NOT NULL, "started_at" datetime(6), "status" varchar DEFAULT 'in_progress' NOT NULL, "updated_at" datetime(6) NOT NULL, CONSTRAINT "fk_rails_ce758a8dd4"
FOREIGN KEY ("mission_id")
REFERENCES "break_escape_missions" ("id")
)
(0.1ms) CREATE INDEX "index_break_escape_games_on_mission_id" ON "break_escape_games" ("mission_id")
(0.1ms) CREATE UNIQUE INDEX "index_games_on_player_and_mission" ON "break_escape_games" ("player_type", "player_id", "mission_id")
(0.1ms) CREATE INDEX "index_break_escape_games_on_player" ON "break_escape_games" ("player_type", "player_id")
(0.1ms) CREATE INDEX "index_break_escape_games_on_status" ON "break_escape_games" ("status")
SQL (0.7ms) INSERT INTO "break_escape_games" ("id","completed_at","created_at","mission_id","player_id","player_state","player_type","scenario_data","score","started_at","status","updated_at")
SELECT "id","completed_at","created_at","mission_id","player_id","player_state","player_type","scenario_data","score","started_at","status","updated_at" FROM "abreak_escape_games"
(0.2ms) DROP TABLE "abreak_escape_games"
TRANSACTION (0.1ms) COMMIT TRANSACTION
(0.0ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
(0.2ms) CREATE TABLE "schema_migrations" ("version" varchar NOT NULL PRIMARY KEY)
ActiveRecord::SchemaMigration Load (0.2ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
(0.2ms) INSERT INTO "schema_migrations" (version) VALUES (20251120160000)
(0.3ms) INSERT INTO "schema_migrations" (version) VALUES
(20251120155358),
(20251120155357);
(0.3ms) CREATE TABLE "ar_internal_metadata" ("key" varchar NOT NULL PRIMARY KEY, "value" varchar, "created_at" datetime(6) NOT NULL, "updated_at" datetime(6) NOT NULL)
ActiveRecord::InternalMetadata Load (0.1ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = ? ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 [[nil, "environment"]]
ActiveRecord::InternalMetadata Create (0.2ms) INSERT INTO "ar_internal_metadata" ("key", "value", "created_at", "updated_at") VALUES ('environment', 'test', '2025-11-20 17:23:21.162347', '2025-11-20 17:23:21.162351') RETURNING "key"
ActiveRecord::InternalMetadata Load (0.1ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = ? ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 [[nil, "environment"]]
ActiveRecord::InternalMetadata Load (0.1ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = ? ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 [[nil, "schema_sha1"]]
ActiveRecord::InternalMetadata Create (0.1ms) INSERT INTO "ar_internal_metadata" ("key", "value", "created_at", "updated_at") VALUES ('schema_sha1', '33181f3d58f9bab484a9b348ce1e6b298e81ba9b', '2025-11-20 17:23:21.163822', '2025-11-20 17:23:21.163824') RETURNING "key"
ActiveRecord::SchemaMigration Load (0.6ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.4ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.3ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, '2025-11-20 17:23:21', 'test_user', 'user', '2025-11-20 17:23:21'), (NULL, '2025-11-20 17:23:21', 'other_user', 'user', '2025-11-20 17:23:21');
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, '2025-11-20 17:23:21', 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, '2025-11-20 17:23:21'), (NULL, '2025-11-20 17:23:21', 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, '2025-11-20 17:23:21')
(0.1ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (3.5ms) COMMIT TRANSACTION
(0.1ms) PRAGMA foreign_key_check
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
----------------------------------------------------------
BreakEscape::MissionsControllerTest: test_should_get_index
----------------------------------------------------------
Started GET "/break_escape/missions" for 127.0.0.1 at 2025-11-20 17:23:22 +0000
Processing by BreakEscape::MissionsController#index as HTML
Completed 500 Internal Server Error in 43ms (ActiveRecord: 0.0ms (0 queries, 0 cached) | GC: 0.0ms)
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
-----------------------------------------------------------------------
BreakEscape::MissionsControllerTest: test_should_show_published_mission
-----------------------------------------------------------------------
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
------------------------------------------------
BreakEscape::GameTest: test_should_update_health
------------------------------------------------
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
Generating image variants require the image_processing gem. Please add `gem "image_processing", "~> 1.2"` to your Gemfile or set `config.active_storage.variant_processor = :disabled`.
ActiveRecord::InternalMetadata Load (0.5ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = ? ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 [[nil, "schema_sha1"]]
ActiveRecord::SchemaMigration Load (0.3ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.3ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.1ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, '2025-11-20 17:24:03', 'test_user', 'user', '2025-11-20 17:24:03'), (NULL, '2025-11-20 17:24:03', 'other_user', 'user', '2025-11-20 17:24:03');
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, '2025-11-20 17:24:03', 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, '2025-11-20 17:24:03'), (NULL, '2025-11-20 17:24:03', 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, '2025-11-20 17:24:03')
(0.0ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (5.3ms) COMMIT TRANSACTION
(0.2ms) PRAGMA foreign_key_check
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
---------------------------------------------------------------
BreakEscape::MissionTest: test_should_validate_presence_of_name
---------------------------------------------------------------
BreakEscape::Mission Exists? (0.2ms) SELECT 1 AS one FROM "break_escape_missions" WHERE "break_escape_missions"."name" IS NULL LIMIT ? [["LIMIT", 1]]
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
-----------------------------------------------------------------
BreakEscape::MissionTest: test_should_validate_uniqueness_of_name
-----------------------------------------------------------------
TRANSACTION (0.1ms) SAVEPOINT active_record_1
BreakEscape::Mission Exists? (0.3ms) SELECT 1 AS one FROM "break_escape_missions" WHERE "break_escape_missions"."name" = ? LIMIT ? [["name", "test"], ["LIMIT", 1]]
BreakEscape::Mission Create (0.2ms) INSERT INTO "break_escape_missions" ("created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (?, ?, ?, ?, ?, ?, ?) RETURNING "id" [["created_at", "2025-11-20 17:24:03.653615"], ["description", nil], ["difficulty_level", 1], ["display_name", "Test"], ["name", "test"], ["published", 0], ["updated_at", "2025-11-20 17:24:03.653615"]]
TRANSACTION (0.1ms) RELEASE SAVEPOINT active_record_1
BreakEscape::Mission Exists? (0.1ms) SELECT 1 AS one FROM "break_escape_missions" WHERE "break_escape_missions"."name" = ? LIMIT ? [["name", "test"], ["LIMIT", 1]]
TRANSACTION (0.0ms) ROLLBACK TRANSACTION
TRANSACTION (0.0ms) BEGIN deferred TRANSACTION
------------------------------------------------------------------------------
BreakEscape::MissionTest: test_published_scope_returns_only_published_missions
------------------------------------------------------------------------------
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
-----------------------------------------------------------------
BreakEscape::MissionTest: test_scenario_path_returns_correct_path
-----------------------------------------------------------------
TRANSACTION (0.0ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
----------------------------------------------------------
BreakEscape::MissionsControllerTest: test_should_get_index
----------------------------------------------------------
Started GET "/break_escape/missions" for 127.0.0.1 at 2025-11-20 17:24:04 +0000
Processing by BreakEscape::MissionsController#index as HTML
BreakEscape::DemoUser Load (0.1ms) SELECT "break_escape_demo_users".* FROM "break_escape_demo_users" ORDER BY "break_escape_demo_users"."id" ASC LIMIT ? [["LIMIT", 1]]
Rendering layout /home/user/BreakEscape/app/views/layouts/break_escape/application.html.erb
Rendering /home/user/BreakEscape/app/views/break_escape/missions/index.html.erb within layouts/break_escape/application
BreakEscape::Mission Load (0.4ms) SELECT "break_escape_missions".* FROM "break_escape_missions" WHERE "break_escape_missions"."published" = ? [["published", 1]]
Rendered /home/user/BreakEscape/app/views/break_escape/missions/index.html.erb within layouts/break_escape/application (Duration: 2.9ms | GC: 0.0ms)
Rendered layout /home/user/BreakEscape/app/views/layouts/break_escape/application.html.erb (Duration: 3.8ms | GC: 0.0ms)
Completed 200 OK in 62ms (Views: 19.1ms | ActiveRecord: 0.9ms (2 queries, 0 cached) | GC: 0.0ms)
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
-----------------------------------------------------------------------
BreakEscape::MissionsControllerTest: test_should_show_published_mission
-----------------------------------------------------------------------
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
---------------------------------------------
BreakEscapeTest: test_it_has_a_version_number
---------------------------------------------
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
--------------------------------------------------
BreakEscape::GameTest: test_should_track_inventory
--------------------------------------------------
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
----------------------------------------------
BreakEscape::GameTest: test_should_unlock_room
----------------------------------------------
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
------------------------------------------------
BreakEscape::GameTest: test_should_update_health
------------------------------------------------
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
---------------------------------------------------------------
BreakEscape::GameTest: test_should_belong_to_player_and_mission
---------------------------------------------------------------
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
-----------------------------------------------------------------
BreakEscape::GameTest: test_should_clamp_health_between_0_and_100
-----------------------------------------------------------------
TRANSACTION (0.0ms) ROLLBACK TRANSACTION
Generating image variants require the image_processing gem. Please add `gem "image_processing", "~> 1.2"` to your Gemfile or set `config.active_storage.variant_processor = :disabled`.
ActiveRecord::InternalMetadata Load (0.5ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = ? ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 [[nil, "schema_sha1"]]
ActiveRecord::SchemaMigration Load (0.2ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.5ms) PRAGMA foreign_keys
(0.1ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.1ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (NULL, '2025-11-20 17:24:29', 'test_user', 'user', '2025-11-20 17:24:29'), (NULL, '2025-11-20 17:24:29', 'other_user', 'user', '2025-11-20 17:24:29');
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (NULL, '2025-11-20 17:24:29', 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, '2025-11-20 17:24:29'), (NULL, '2025-11-20 17:24:29', 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, '2025-11-20 17:24:29')
(0.1ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (4.6ms) COMMIT TRANSACTION
(0.1ms) PRAGMA foreign_key_check
TRANSACTION (0.0ms) BEGIN deferred TRANSACTION
---------------------------------------------------------------
BreakEscape::MissionTest: test_should_validate_presence_of_name
---------------------------------------------------------------
BreakEscape::Mission Exists? (0.2ms) SELECT 1 AS one FROM "break_escape_missions" WHERE "break_escape_missions"."name" IS NULL LIMIT ? [["LIMIT", 1]]
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
-----------------------------------------------------------------
BreakEscape::MissionTest: test_should_validate_uniqueness_of_name
-----------------------------------------------------------------
TRANSACTION (0.1ms) SAVEPOINT active_record_1
BreakEscape::Mission Exists? (0.3ms) SELECT 1 AS one FROM "break_escape_missions" WHERE "break_escape_missions"."name" = ? LIMIT ? [["name", "test"], ["LIMIT", 1]]
BreakEscape::Mission Create (0.3ms) INSERT INTO "break_escape_missions" ("created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (?, ?, ?, ?, ?, ?, ?) RETURNING "id" [["created_at", "2025-11-20 17:24:30.005081"], ["description", nil], ["difficulty_level", 1], ["display_name", "Test"], ["name", "test"], ["published", 0], ["updated_at", "2025-11-20 17:24:30.005081"]]
TRANSACTION (0.1ms) RELEASE SAVEPOINT active_record_1
BreakEscape::Mission Exists? (0.1ms) SELECT 1 AS one FROM "break_escape_missions" WHERE "break_escape_missions"."name" = ? LIMIT ? [["name", "test"], ["LIMIT", 1]]
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
-----------------------------------------------------------------
BreakEscape::MissionTest: test_scenario_path_returns_correct_path
-----------------------------------------------------------------
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
------------------------------------------------------------------------------
BreakEscape::MissionTest: test_published_scope_returns_only_published_missions
------------------------------------------------------------------------------
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
---------------------------------------------
BreakEscapeTest: test_it_has_a_version_number
---------------------------------------------
TRANSACTION (0.0ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
-----------------------------------------------------------------------
BreakEscape::MissionsControllerTest: test_should_show_published_mission
-----------------------------------------------------------------------
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.4ms) BEGIN deferred TRANSACTION
----------------------------------------------------------
BreakEscape::MissionsControllerTest: test_should_get_index
----------------------------------------------------------
Started GET "/break_escape/missions" for 127.0.0.1 at 2025-11-20 17:24:30 +0000
Processing by BreakEscape::MissionsController#index as HTML
BreakEscape::DemoUser Load (0.2ms) SELECT "break_escape_demo_users".* FROM "break_escape_demo_users" ORDER BY "break_escape_demo_users"."id" ASC LIMIT ? [["LIMIT", 1]]
Rendering layout /home/user/BreakEscape/app/views/layouts/break_escape/application.html.erb
Rendering /home/user/BreakEscape/app/views/break_escape/missions/index.html.erb within layouts/break_escape/application
BreakEscape::Mission Load (0.2ms) SELECT "break_escape_missions".* FROM "break_escape_missions" WHERE "break_escape_missions"."published" = ? [["published", 1]]
Rendered /home/user/BreakEscape/app/views/break_escape/missions/index.html.erb within layouts/break_escape/application (Duration: 2.2ms | GC: 0.0ms)
Rendered layout /home/user/BreakEscape/app/views/layouts/break_escape/application.html.erb (Duration: 3.2ms | GC: 0.0ms)
Completed 200 OK in 57ms (Views: 17.5ms | ActiveRecord: 0.7ms (2 queries, 0 cached) | GC: 0.0ms)
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
----------------------------------------------
BreakEscape::GameTest: test_should_unlock_room
----------------------------------------------
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.0ms) BEGIN deferred TRANSACTION
------------------------------------------------
BreakEscape::GameTest: test_should_update_health
------------------------------------------------
TRANSACTION (0.0ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
--------------------------------------------------
BreakEscape::GameTest: test_should_track_inventory
--------------------------------------------------
TRANSACTION (0.0ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
-----------------------------------------------------------------
BreakEscape::GameTest: test_should_clamp_health_between_0_and_100
-----------------------------------------------------------------
TRANSACTION (0.0ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
---------------------------------------------------------------
BreakEscape::GameTest: test_should_belong_to_player_and_mission
---------------------------------------------------------------
TRANSACTION (0.0ms) ROLLBACK TRANSACTION
Generating image variants require the image_processing gem. Please add `gem "image_processing", "~> 1.2"` to your Gemfile or set `config.active_storage.variant_processor = :disabled`.
ActiveRecord::InternalMetadata Load (0.6ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = ? ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 [[nil, "schema_sha1"]]
ActiveRecord::SchemaMigration Load (0.3ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.4ms) PRAGMA foreign_keys
(0.0ms) PRAGMA defer_foreign_keys
(0.0ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.2ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (149617800, '2025-11-20 17:25:07', 'test_user', 'user', '2025-11-20 17:25:07'), (618102942, '2025-11-20 17:25:07', 'other_user', 'user', '2025-11-20 17:25:07');
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (418560898, '2025-11-20 17:25:07', 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, '2025-11-20 17:25:07'), (636030761, '2025-11-20 17:25:07', 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, '2025-11-20 17:25:07')
(0.0ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (54.5ms) COMMIT TRANSACTION
(0.1ms) PRAGMA foreign_key_check
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
-----------------------------------------------------------------
BreakEscape::MissionTest: test_scenario_path_returns_correct_path
-----------------------------------------------------------------
BreakEscape::Mission Load (0.3ms) SELECT "break_escape_missions".* FROM "break_escape_missions" WHERE "break_escape_missions"."id" = ? LIMIT ? [["id", 418560898], ["LIMIT", 1]]
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
------------------------------------------------------------------------------
BreakEscape::MissionTest: test_published_scope_returns_only_published_missions
------------------------------------------------------------------------------
BreakEscape::Mission Load (0.2ms) SELECT "break_escape_missions".* FROM "break_escape_missions" WHERE "break_escape_missions"."id" = ? LIMIT ? [["id", 418560898], ["LIMIT", 1]]
BreakEscape::Mission Exists? (0.1ms) SELECT 1 AS one FROM "break_escape_missions" WHERE "break_escape_missions"."published" = ? AND "break_escape_missions"."id" = ? LIMIT ? [["published", 1], ["id", 418560898], ["LIMIT", 1]]
BreakEscape::Mission Load (0.1ms) SELECT "break_escape_missions".* FROM "break_escape_missions" WHERE "break_escape_missions"."id" = ? LIMIT ? [["id", 636030761], ["LIMIT", 1]]
BreakEscape::Mission Exists? (0.1ms) SELECT 1 AS one FROM "break_escape_missions" WHERE "break_escape_missions"."published" = ? AND "break_escape_missions"."id" = ? LIMIT ? [["published", 1], ["id", 636030761], ["LIMIT", 1]]
TRANSACTION (0.0ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
---------------------------------------------------------------
BreakEscape::MissionTest: test_should_validate_presence_of_name
---------------------------------------------------------------
BreakEscape::Mission Exists? (0.1ms) SELECT 1 AS one FROM "break_escape_missions" WHERE "break_escape_missions"."name" IS NULL LIMIT ? [["LIMIT", 1]]
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
-----------------------------------------------------------------
BreakEscape::MissionTest: test_should_validate_uniqueness_of_name
-----------------------------------------------------------------
TRANSACTION (0.0ms) SAVEPOINT active_record_1
BreakEscape::Mission Exists? (0.3ms) SELECT 1 AS one FROM "break_escape_missions" WHERE "break_escape_missions"."name" = ? LIMIT ? [["name", "test"], ["LIMIT", 1]]
BreakEscape::Mission Create (0.2ms) INSERT INTO "break_escape_missions" ("created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (?, ?, ?, ?, ?, ?, ?) RETURNING "id" [["created_at", "2025-11-20 17:25:07.298681"], ["description", nil], ["difficulty_level", 1], ["display_name", "Test"], ["name", "test"], ["published", 0], ["updated_at", "2025-11-20 17:25:07.298681"]]
TRANSACTION (0.0ms) RELEASE SAVEPOINT active_record_1
BreakEscape::Mission Exists? (0.1ms) SELECT 1 AS one FROM "break_escape_missions" WHERE "break_escape_missions"."name" = ? LIMIT ? [["name", "test"], ["LIMIT", 1]]
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
----------------------------------------------------------
BreakEscape::MissionsControllerTest: test_should_get_index
----------------------------------------------------------
Started GET "/break_escape/missions" for 127.0.0.1 at 2025-11-20 17:25:07 +0000
Processing by BreakEscape::MissionsController#index as HTML
BreakEscape::DemoUser Load (0.2ms) SELECT "break_escape_demo_users".* FROM "break_escape_demo_users" ORDER BY "break_escape_demo_users"."id" ASC LIMIT ? [["LIMIT", 1]]
Rendering layout /home/user/BreakEscape/app/views/layouts/break_escape/application.html.erb
Rendering /home/user/BreakEscape/app/views/break_escape/missions/index.html.erb within layouts/break_escape/application
BreakEscape::Mission Load (0.3ms) SELECT "break_escape_missions".* FROM "break_escape_missions" WHERE "break_escape_missions"."published" = ? [["published", 1]]
Rendered /home/user/BreakEscape/app/views/break_escape/missions/index.html.erb within layouts/break_escape/application (Duration: 2.4ms | GC: 0.0ms)
Rendered layout /home/user/BreakEscape/app/views/layouts/break_escape/application.html.erb (Duration: 3.3ms | GC: 0.0ms)
Completed 200 OK in 56ms (Views: 17.6ms | ActiveRecord: 0.5ms (2 queries, 0 cached) | GC: 0.0ms)
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
-----------------------------------------------------------------------
BreakEscape::MissionsControllerTest: test_should_show_published_mission
-----------------------------------------------------------------------
BreakEscape::Mission Load (0.1ms) SELECT "break_escape_missions".* FROM "break_escape_missions" WHERE "break_escape_missions"."id" = ? LIMIT ? [["id", 418560898], ["LIMIT", 1]]
Started GET "/break_escape/missions/418560898" for 127.0.0.1 at 2025-11-20 17:25:07 +0000
Processing by BreakEscape::MissionsController#show as HTML
Parameters: {"id"=>"418560898"}
BreakEscape::Mission Load (0.1ms) SELECT "break_escape_missions".* FROM "break_escape_missions" WHERE "break_escape_missions"."id" = ? LIMIT ? [["id", 418560898], ["LIMIT", 1]]
BreakEscape::DemoUser Load (0.1ms) SELECT "break_escape_demo_users".* FROM "break_escape_demo_users" ORDER BY "break_escape_demo_users"."id" ASC LIMIT ? [["LIMIT", 1]]
BreakEscape::Game Load (0.2ms) SELECT "break_escape_games".* FROM "break_escape_games" WHERE "break_escape_games"."player_type" = ? AND "break_escape_games"."player_id" = ? AND "break_escape_games"."mission_id" = ? LIMIT ? [["player_type", "BreakEscape::DemoUser"], ["player_id", 149617800], ["mission_id", 418560898], ["LIMIT", 1]]
TRANSACTION (0.1ms) SAVEPOINT active_record_1
TRANSACTION (0.1ms) ROLLBACK TO SAVEPOINT active_record_1
Completed 500 Internal Server Error in 56ms (ActiveRecord: 1.0ms (3 queries, 0 cached) | GC: 0.0ms)
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
-----------------------------------------------------------------
BreakEscape::GameTest: test_should_clamp_health_between_0_and_100
-----------------------------------------------------------------
BreakEscape::Mission Load (0.2ms) SELECT "break_escape_missions".* FROM "break_escape_missions" WHERE "break_escape_missions"."id" = ? LIMIT ? [["id", 418560898], ["LIMIT", 1]]
BreakEscape::DemoUser Load (0.1ms) SELECT "break_escape_demo_users".* FROM "break_escape_demo_users" WHERE "break_escape_demo_users"."id" = ? LIMIT ? [["id", 149617800], ["LIMIT", 1]]
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.0ms) BEGIN deferred TRANSACTION
------------------------------------------------
BreakEscape::GameTest: test_should_update_health
------------------------------------------------
BreakEscape::Mission Load (0.1ms) SELECT "break_escape_missions".* FROM "break_escape_missions" WHERE "break_escape_missions"."id" = ? LIMIT ? [["id", 418560898], ["LIMIT", 1]]
BreakEscape::DemoUser Load (0.1ms) SELECT "break_escape_demo_users".* FROM "break_escape_demo_users" WHERE "break_escape_demo_users"."id" = ? LIMIT ? [["id", 149617800], ["LIMIT", 1]]
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
---------------------------------------------------------------
BreakEscape::GameTest: test_should_belong_to_player_and_mission
---------------------------------------------------------------
BreakEscape::Mission Load (0.1ms) SELECT "break_escape_missions".* FROM "break_escape_missions" WHERE "break_escape_missions"."id" = ? LIMIT ? [["id", 418560898], ["LIMIT", 1]]
BreakEscape::DemoUser Load (0.1ms) SELECT "break_escape_demo_users".* FROM "break_escape_demo_users" WHERE "break_escape_demo_users"."id" = ? LIMIT ? [["id", 149617800], ["LIMIT", 1]]
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
--------------------------------------------------
BreakEscape::GameTest: test_should_track_inventory
--------------------------------------------------
BreakEscape::Mission Load (0.2ms) SELECT "break_escape_missions".* FROM "break_escape_missions" WHERE "break_escape_missions"."id" = ? LIMIT ? [["id", 418560898], ["LIMIT", 1]]
BreakEscape::DemoUser Load (0.1ms) SELECT "break_escape_demo_users".* FROM "break_escape_demo_users" WHERE "break_escape_demo_users"."id" = ? LIMIT ? [["id", 149617800], ["LIMIT", 1]]
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
----------------------------------------------
BreakEscape::GameTest: test_should_unlock_room
----------------------------------------------
BreakEscape::Mission Load (0.1ms) SELECT "break_escape_missions".* FROM "break_escape_missions" WHERE "break_escape_missions"."id" = ? LIMIT ? [["id", 418560898], ["LIMIT", 1]]
BreakEscape::DemoUser Load (0.1ms) SELECT "break_escape_demo_users".* FROM "break_escape_demo_users" WHERE "break_escape_demo_users"."id" = ? LIMIT ? [["id", 149617800], ["LIMIT", 1]]
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
---------------------------------------------
BreakEscapeTest: test_it_has_a_version_number
---------------------------------------------
TRANSACTION (0.0ms) ROLLBACK TRANSACTION
Generating image variants require the image_processing gem. Please add `gem "image_processing", "~> 1.2"` to your Gemfile or set `config.active_storage.variant_processor = :disabled`.
ActiveRecord::InternalMetadata Load (0.5ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = ? ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 [[nil, "schema_sha1"]]
ActiveRecord::SchemaMigration Load (0.2ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.7ms) PRAGMA foreign_keys
(0.1ms) PRAGMA defer_foreign_keys
(0.1ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.2ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (149617800, '2025-11-20 17:59:19', 'test_user', 'user', '2025-11-20 17:59:19'), (618102942, '2025-11-20 17:59:19', 'other_user', 'user', '2025-11-20 17:59:19');
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (418560898, '2025-11-20 17:59:19', 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, '2025-11-20 17:59:19'), (636030761, '2025-11-20 17:59:19', 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, '2025-11-20 17:59:19')
(0.0ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (5.5ms) COMMIT TRANSACTION
(0.1ms) PRAGMA foreign_key_check
TRANSACTION (0.0ms) BEGIN deferred TRANSACTION
------------------------------------------------
BreakEscape::GameTest: test_should_update_health
------------------------------------------------
BreakEscape::Mission Load (0.2ms) SELECT "break_escape_missions".* FROM "break_escape_missions" WHERE "break_escape_missions"."id" = ? LIMIT ? [["id", 418560898], ["LIMIT", 1]]
BreakEscape::DemoUser Load (0.1ms) SELECT "break_escape_demo_users".* FROM "break_escape_demo_users" WHERE "break_escape_demo_users"."id" = ? LIMIT ? [["id", 149617800], ["LIMIT", 1]]
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
---------------------------------------------------------------
BreakEscape::GameTest: test_should_belong_to_player_and_mission
---------------------------------------------------------------
BreakEscape::Mission Load (0.2ms) SELECT "break_escape_missions".* FROM "break_escape_missions" WHERE "break_escape_missions"."id" = ? LIMIT ? [["id", 418560898], ["LIMIT", 1]]
BreakEscape::DemoUser Load (0.1ms) SELECT "break_escape_demo_users".* FROM "break_escape_demo_users" WHERE "break_escape_demo_users"."id" = ? LIMIT ? [["id", 149617800], ["LIMIT", 1]]
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
-----------------------------------------------------------------
BreakEscape::GameTest: test_should_clamp_health_between_0_and_100
-----------------------------------------------------------------
BreakEscape::Mission Load (0.1ms) SELECT "break_escape_missions".* FROM "break_escape_missions" WHERE "break_escape_missions"."id" = ? LIMIT ? [["id", 418560898], ["LIMIT", 1]]
BreakEscape::DemoUser Load (0.1ms) SELECT "break_escape_demo_users".* FROM "break_escape_demo_users" WHERE "break_escape_demo_users"."id" = ? LIMIT ? [["id", 149617800], ["LIMIT", 1]]
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
----------------------------------------------
BreakEscape::GameTest: test_should_unlock_room
----------------------------------------------
BreakEscape::Mission Load (0.1ms) SELECT "break_escape_missions".* FROM "break_escape_missions" WHERE "break_escape_missions"."id" = ? LIMIT ? [["id", 418560898], ["LIMIT", 1]]
BreakEscape::DemoUser Load (0.1ms) SELECT "break_escape_demo_users".* FROM "break_escape_demo_users" WHERE "break_escape_demo_users"."id" = ? LIMIT ? [["id", 149617800], ["LIMIT", 1]]
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
--------------------------------------------------
BreakEscape::GameTest: test_should_track_inventory
--------------------------------------------------
BreakEscape::Mission Load (0.1ms) SELECT "break_escape_missions".* FROM "break_escape_missions" WHERE "break_escape_missions"."id" = ? LIMIT ? [["id", 418560898], ["LIMIT", 1]]
BreakEscape::DemoUser Load (0.1ms) SELECT "break_escape_demo_users".* FROM "break_escape_demo_users" WHERE "break_escape_demo_users"."id" = ? LIMIT ? [["id", 149617800], ["LIMIT", 1]]
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
-----------------------------------------------------------------------
BreakEscape::MissionsControllerTest: test_should_show_published_mission
-----------------------------------------------------------------------
BreakEscape::Mission Load (0.2ms) SELECT "break_escape_missions".* FROM "break_escape_missions" WHERE "break_escape_missions"."id" = ? LIMIT ? [["id", 418560898], ["LIMIT", 1]]
Started GET "/break_escape/missions/418560898" for 127.0.0.1 at 2025-11-20 17:59:19 +0000
Processing by BreakEscape::MissionsController#show as HTML
Parameters: {"id"=>"418560898"}
BreakEscape::Mission Load (0.3ms) SELECT "break_escape_missions".* FROM "break_escape_missions" WHERE "break_escape_missions"."id" = ? LIMIT ? [["id", 418560898], ["LIMIT", 1]]
BreakEscape::DemoUser Load (0.2ms) SELECT "break_escape_demo_users".* FROM "break_escape_demo_users" ORDER BY "break_escape_demo_users"."id" ASC LIMIT ? [["LIMIT", 1]]
BreakEscape::Game Load (0.2ms) SELECT "break_escape_games".* FROM "break_escape_games" WHERE "break_escape_games"."player_type" = ? AND "break_escape_games"."player_id" = ? AND "break_escape_games"."mission_id" = ? LIMIT ? [["player_type", "BreakEscape::DemoUser"], ["player_id", 149617800], ["mission_id", 418560898], ["LIMIT", 1]]
Completed 500 Internal Server Error in 15ms (ActiveRecord: 0.5ms (3 queries, 0 cached) | GC: 0.0ms)
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
----------------------------------------------------------
BreakEscape::MissionsControllerTest: test_should_get_index
----------------------------------------------------------
Started GET "/break_escape/missions" for 127.0.0.1 at 2025-11-20 17:59:20 +0000
Processing by BreakEscape::MissionsController#index as HTML
BreakEscape::DemoUser Load (0.1ms) SELECT "break_escape_demo_users".* FROM "break_escape_demo_users" ORDER BY "break_escape_demo_users"."id" ASC LIMIT ? [["LIMIT", 1]]
Rendering layout /home/user/BreakEscape/app/views/layouts/break_escape/application.html.erb
Rendering /home/user/BreakEscape/app/views/break_escape/missions/index.html.erb within layouts/break_escape/application
BreakEscape::Mission Load (0.2ms) SELECT "break_escape_missions".* FROM "break_escape_missions" WHERE "break_escape_missions"."published" = ? [["published", 1]]
Rendered /home/user/BreakEscape/app/views/break_escape/missions/index.html.erb within layouts/break_escape/application (Duration: 2.2ms | GC: 0.0ms)
Rendered layout /home/user/BreakEscape/app/views/layouts/break_escape/application.html.erb (Duration: 3.1ms | GC: 0.0ms)
Completed 200 OK in 53ms (Views: 19.4ms | ActiveRecord: 0.3ms (2 queries, 0 cached) | GC: 0.0ms)
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
-----------------------------------------------------------------
BreakEscape::MissionTest: test_should_validate_uniqueness_of_name
-----------------------------------------------------------------
TRANSACTION (0.1ms) SAVEPOINT active_record_1
BreakEscape::Mission Exists? (0.4ms) SELECT 1 AS one FROM "break_escape_missions" WHERE "break_escape_missions"."name" = ? LIMIT ? [["name", "test"], ["LIMIT", 1]]
BreakEscape::Mission Create (0.3ms) INSERT INTO "break_escape_missions" ("created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (?, ?, ?, ?, ?, ?, ?) RETURNING "id" [["created_at", "2025-11-20 17:59:20.159340"], ["description", nil], ["difficulty_level", 1], ["display_name", "Test"], ["name", "test"], ["published", 0], ["updated_at", "2025-11-20 17:59:20.159340"]]
TRANSACTION (0.1ms) RELEASE SAVEPOINT active_record_1
BreakEscape::Mission Exists? (0.1ms) SELECT 1 AS one FROM "break_escape_missions" WHERE "break_escape_missions"."name" = ? LIMIT ? [["name", "test"], ["LIMIT", 1]]
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
------------------------------------------------------------------------------
BreakEscape::MissionTest: test_published_scope_returns_only_published_missions
------------------------------------------------------------------------------
BreakEscape::Mission Load (0.2ms) SELECT "break_escape_missions".* FROM "break_escape_missions" WHERE "break_escape_missions"."id" = ? LIMIT ? [["id", 418560898], ["LIMIT", 1]]
BreakEscape::Mission Exists? (0.1ms) SELECT 1 AS one FROM "break_escape_missions" WHERE "break_escape_missions"."published" = ? AND "break_escape_missions"."id" = ? LIMIT ? [["published", 1], ["id", 418560898], ["LIMIT", 1]]
BreakEscape::Mission Load (0.1ms) SELECT "break_escape_missions".* FROM "break_escape_missions" WHERE "break_escape_missions"."id" = ? LIMIT ? [["id", 636030761], ["LIMIT", 1]]
BreakEscape::Mission Exists? (0.1ms) SELECT 1 AS one FROM "break_escape_missions" WHERE "break_escape_missions"."published" = ? AND "break_escape_missions"."id" = ? LIMIT ? [["published", 1], ["id", 636030761], ["LIMIT", 1]]
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
-----------------------------------------------------------------
BreakEscape::MissionTest: test_scenario_path_returns_correct_path
-----------------------------------------------------------------
BreakEscape::Mission Load (0.1ms) SELECT "break_escape_missions".* FROM "break_escape_missions" WHERE "break_escape_missions"."id" = ? LIMIT ? [["id", 418560898], ["LIMIT", 1]]
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
---------------------------------------------------------------
BreakEscape::MissionTest: test_should_validate_presence_of_name
---------------------------------------------------------------
BreakEscape::Mission Exists? (0.2ms) SELECT 1 AS one FROM "break_escape_missions" WHERE "break_escape_missions"."name" IS NULL LIMIT ? [["LIMIT", 1]]
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
---------------------------------------------
BreakEscapeTest: test_it_has_a_version_number
---------------------------------------------
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
Generating image variants require the image_processing gem. Please add `gem "image_processing", "~> 1.2"` to your Gemfile or set `config.active_storage.variant_processor = :disabled`.
ActiveRecord::InternalMetadata Load (0.6ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = ? ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 [[nil, "schema_sha1"]]
ActiveRecord::SchemaMigration Load (0.2ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
TRANSACTION (0.1ms) BEGIN immediate TRANSACTION
(0.5ms) PRAGMA foreign_keys
(0.1ms) PRAGMA defer_foreign_keys
(0.1ms) PRAGMA defer_foreign_keys = ON
(0.0ms) PRAGMA foreign_keys = OFF
Fixtures Load (0.2ms) DELETE FROM "break_escape_demo_users";
DELETE FROM "break_escape_missions";
INSERT INTO "break_escape_demo_users" ("id", "created_at", "handle", "role", "updated_at") VALUES (149617800, '2025-11-20 18:00:25', 'test_user', 'user', '2025-11-20 18:00:25'), (618102942, '2025-11-20 18:00:25', 'other_user', 'user', '2025-11-20 18:00:25');
INSERT INTO "break_escape_missions" ("id", "created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (418560898, '2025-11-20 18:00:25', 'Test scenario', 3, 'CEO Exfiltration', 'ceo_exfil', TRUE, '2025-11-20 18:00:25'), (636030761, '2025-11-20 18:00:25', 'Not visible', 1, 'Unpublished Test', 'test_unpublished', FALSE, '2025-11-20 18:00:25')
(0.0ms) PRAGMA defer_foreign_keys = 0
(0.0ms) PRAGMA foreign_keys = 1
TRANSACTION (7.3ms) COMMIT TRANSACTION
(0.1ms) PRAGMA foreign_key_check
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
---------------------------------------------
BreakEscapeTest: test_it_has_a_version_number
---------------------------------------------
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
----------------------------------------------------------
BreakEscape::MissionsControllerTest: test_should_get_index
----------------------------------------------------------
Started GET "/break_escape/missions" for 127.0.0.1 at 2025-11-20 18:00:25 +0000
Processing by BreakEscape::MissionsController#index as HTML
BreakEscape::DemoUser Load (0.3ms) SELECT "break_escape_demo_users".* FROM "break_escape_demo_users" ORDER BY "break_escape_demo_users"."id" ASC LIMIT ? [["LIMIT", 1]]
Rendering layout /home/user/BreakEscape/app/views/layouts/break_escape/application.html.erb
Rendering /home/user/BreakEscape/app/views/break_escape/missions/index.html.erb within layouts/break_escape/application
BreakEscape::Mission Load (0.2ms) SELECT "break_escape_missions".* FROM "break_escape_missions" WHERE "break_escape_missions"."published" = ? [["published", 1]]
Rendered /home/user/BreakEscape/app/views/break_escape/missions/index.html.erb within layouts/break_escape/application (Duration: 5.0ms | GC: 0.0ms)
Rendered layout /home/user/BreakEscape/app/views/layouts/break_escape/application.html.erb (Duration: 5.9ms | GC: 0.0ms)
Completed 200 OK in 129ms (Views: 33.4ms | ActiveRecord: 0.4ms (2 queries, 0 cached) | GC: 20.0ms)
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.0ms) BEGIN deferred TRANSACTION
-----------------------------------------------------------------------
BreakEscape::MissionsControllerTest: test_should_show_published_mission
-----------------------------------------------------------------------
BreakEscape::Mission Load (0.1ms) SELECT "break_escape_missions".* FROM "break_escape_missions" WHERE "break_escape_missions"."id" = ? LIMIT ? [["id", 418560898], ["LIMIT", 1]]
Started GET "/break_escape/missions/418560898" for 127.0.0.1 at 2025-11-20 18:00:26 +0000
Processing by BreakEscape::MissionsController#show as HTML
Parameters: {"id"=>"418560898"}
BreakEscape::Mission Load (0.1ms) SELECT "break_escape_missions".* FROM "break_escape_missions" WHERE "break_escape_missions"."id" = ? LIMIT ? [["id", 418560898], ["LIMIT", 1]]
BreakEscape::DemoUser Load (0.1ms) SELECT "break_escape_demo_users".* FROM "break_escape_demo_users" ORDER BY "break_escape_demo_users"."id" ASC LIMIT ? [["LIMIT", 1]]
BreakEscape::Game Load (0.2ms) SELECT "break_escape_games".* FROM "break_escape_games" WHERE "break_escape_games"."player_type" = ? AND "break_escape_games"."player_id" = ? AND "break_escape_games"."mission_id" = ? LIMIT ? [["player_type", "BreakEscape::DemoUser"], ["player_id", 149617800], ["mission_id", 418560898], ["LIMIT", 1]]
TRANSACTION (0.0ms) SAVEPOINT active_record_1
BreakEscape::Game Create (0.3ms) INSERT INTO "break_escape_games" ("completed_at", "created_at", "mission_id", "player_id", "player_state", "player_type", "scenario_data", "score", "started_at", "status", "updated_at") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) RETURNING "id" [["completed_at", nil], ["created_at", "2025-11-20 18:00:26.131316"], ["mission_id", 418560898], ["player_id", 149617800], ["player_state", "\"{\\\"currentRoom\\\":null,\\\"unlockedRooms\\\":[],\\\"unlockedObjects\\\":[],\\\"inventory\\\":[],\\\"encounteredNPCs\\\":[],\\\"globalVariables\\\":{},\\\"biometricSamples\\\":[],\\\"biometricUnlocks\\\":[],\\\"bluetoothDevices\\\":[],\\\"notes\\\":[],\\\"health\\\":100}\""], ["player_type", "BreakEscape::DemoUser"], ["scenario_data", "{\"scenario_brief\":\"Hi! You are a cyber investigator tasked with uncovering evidence of corporate espionage. Anonymous tips suggest the CEO has been selling company secrets, but you need proof.\",\"startRoom\":\"reception\",\"startItemsInInventory\":[{\"type\":\"phone\",\"name\":\"Your Phone\",\"takeable\":true,\"phoneId\":\"player_phone\",\"npcIds\":[\"neye_eve\",\"gossip_girl\",\"helper_npc\"],\"observations\":\"Your personal phone with some interesting contacts\"},{\"type\":\"workstation\",\"name\":\"Crypto Analysis Station\",\"takeable\":true,\"observations\":\"A powerful workstation for cryptographic analysis\"},{\"type\":\"lockpick\",\"name\":\"Lock Pick Kit\",\"takeable\":true,\"observations\":\"A professional lock picking kit with various picks and tension wrenches\"}],\"rooms\":{\"reception\":{\"type\":\"room_reception\",\"connections\":{\"north\":\"office1\"},\"npcs\":[{\"id\":\"neye_eve\",\"displayName\":\"Neye Eve\",\"storyPath\":\"scenarios/ink/neye-eve.json\",\"avatar\":\"assets/npc/avatars/npc_adversary.png\",\"phoneId\":\"player_phone\",\"currentKnot\":\"start\",\"npcType\":\"phone\"},{\"id\":\"gossip_girl\",\"displayName\":\"Gossip Girl\",\"storyPath\":\"scenarios/ink/gossip-girl.json\",\"avatar\":\"assets/npc/avatars/npc_neutral.png\",\"phoneId\":\"player_phone\",\"currentKnot\":\"start\",\"npcType\":\"phone\",\"timedMessages\":[{\"delay\":5000,\"message\":\"Hey! 👋 Got any juicy gossip for me today?\",\"type\":\"text\"}]},{\"id\":\"helper_npc\",\"displayName\":\"Helpful Contact\",\"storyPath\":\"scenarios/ink/helper-npc.json\",\"avatar\":\"assets/npc/avatars/npc_helper.png\",\"phoneId\":\"player_phone\",\"currentKnot\":\"start\",\"npcType\":\"phone\",\"eventMappings\":[{\"eventPattern\":\"item_picked_up:lockpick\",\"targetKnot\":\"on_lockpick_pickup\",\"onceOnly\":true,\"cooldown\":0},{\"eventPattern\":\"minigame_completed\",\"targetKnot\":\"on_lockpick_success\",\"condition\":\"data.minigameName && data.minigameName.includes('Lockpick')\",\"cooldown\":10000},{\"eventPattern\":\"minigame_failed\",\"targetKnot\":\"on_lockpick_failed\",\"condition\":\"data.minigameName && data.minigameName.includes('Lockpick')\",\"cooldown\":15000},{\"eventPattern\":\"door_unlocked\",\"targetKnot\":\"on_door_unlocked\",\"cooldown\":8000},{\"eventPattern\":\"door_unlock_attempt\",\"targetKnot\":\"on_door_attempt\",\"cooldown\":12000},{\"eventPattern\":\"object_interacted\",\"targetKnot\":\"on_ceo_desk_interact\",\"condition\":\"data.objectType === 'desk_ceo'\",\"cooldown\":10000},{\"eventPattern\":\"item_picked_up:*\",\"targetKnot\":\"on_item_found\",\"cooldown\":20000},{\"eventPattern\":\"room_entered\",\"targetKnot\":\"on_room_entered\",\"cooldown\":45000,\"maxTriggers\":3},{\"eventPattern\":\"room_discovered\",\"targetKnot\":\"on_room_discovered\",\"cooldown\":15000,\"maxTriggers\":5},{\"eventPattern\":\"room_entered:ceo\",\"targetKnot\":\"on_ceo_office_entered\",\"onceOnly\":true}]}],\"objects\":[{\"type\":\"phone\",\"name\":\"Reception Phone\",\"takeable\":false,\"readable\":true,\"voice\":\"Hi, this is the IT Team. Security breach detected in server room. Changed access code to 4829.\",\"sender\":\"IT Team\",\"timestamp\":\"2:15 AM\",\"observations\":\"The reception phone's message light is blinking urgently\"},{\"type\":\"notes\",\"name\":\"Security Log\",\"takeable\":true,\"readable\":true,\"text\":\"Unusual after-hours access detected:\\n- CEO office: 11:30 PM\\n- Server room: 2:15 AM\\n- CEO office again: 3:45 AM\",\"observations\":\"A concerning security log from last night\"},{\"type\":\"pc\",\"name\":\"Reception Computer\",\"takeable\":false,\"lockType\":\"password\",\"passwordHint\":\"Optional hint text\",\"showHint\":true,\"showKeyboard\":true,\"maxAttempts\":3,\"locked\":true,\"requires\":\"secret123\",\"observations\":\"The reception's computer, currently locked\",\"postitNote\":\"Password: secret123\",\"showPostit\":true,\"contents\":[{\"type\":\"text_file\",\"name\":\"Private\",\"takeable\":false,\"readable\":true,\"text\":\"Closet keypad code: 7391 - Must move evidence to safe before audit\"}]},{\"type\":\"tablet\",\"name\":\"Tablet Device\",\"takeable\":true,\"locked\":true,\"lockType\":\"bluetooth\",\"requires\":\"bluetooth\",\"mac\":\"00:11:22:33:44:55\",\"observations\":\"A locked tablet device that requires Bluetooth pairing\"},{\"type\":\"bluetooth_scanner\",\"name\":\"Bluetooth Scanner\",\"takeable\":true,\"observations\":\"A device for detecting nearby Bluetooth signals\",\"canScanBluetooth\":true},{\"type\":\"key\",\"name\":\"Office Key\",\"takeable\":true,\"key_id\":\"office1_key\",\"keyPins\":[100,0,100,0],\"observations\":\"A key to access the office areas\"},{\"type\":\"pin-cracker\",\"name\":\"PIN Cracker\",\"takeable\":true,\"observations\":\"A sophisticated device that can analyze PIN entry patterns and provide feedback on attempts\"},{\"type\":\"safe\",\"name\":\"Reception Safe\",\"takeable\":false,\"locked\":true,\"lockType\":\"pin\",\"requires\":\"9573\",\"observations\":\"A small wall safe behind the reception desk. Looks like it needs a 4-digit code.\",\"contents\":[{\"type\":\"notes\",\"name\":\"IT Access Credentials\",\"takeable\":true,\"readable\":true,\"text\":\"Emergency IT Admin Credentials:\\nUsername: admin\\nPassword: ITsecure2024\\n\\nServer Room Backup Code: 4829\\nCEO Office Alarm Override: 1337\",\"observations\":\"Sensitive IT credentials that could be very useful\"}]}]},\"office1\":{\"type\":\"room_office\",\"locked\":true,\"lockType\":\"key\",\"requires\":\"office1_key\",\"keyPins\":[100,0,100,0],\"difficulty\":\"easy\",\"door_sign\":\"4A Hot Desks\",\"connections\":{\"north\":[\"office2\",\"office3\"],\"south\":\"reception\"},\"objects\":[{\"type\":\"pc\",\"name\":\"Office Computer\",\"takeable\":false,\"requires\":\"password\",\"hasFingerprint\":true,\"fingerprintOwner\":\"ceo\",\"fingerprintDifficulty\":\"medium\",\"observations\":\"A computer with a cybersecurity alert on screen. There might be fingerprints on the keyboard.\"},{\"type\":\"notes\",\"name\":\"IT Memo\",\"takeable\":true,\"readable\":true,\"text\":\"URGENT: Multiple unauthorized access attempts detected from CEO's office IP address\",\"observations\":\"A concerning IT department memo\"},{\"type\":\"fingerprint_kit\",\"name\":\"Fingerprint Kit\",\"takeable\":true,\"observations\":\"A kit used for collecting fingerprints from surfaces\"}]},\"office2\":{\"type\":\"room_office\",\"connections\":{\"north\":\"ceo\",\"south\":\"office1\"},\"objects\":[{\"type\":\"pc\",\"name\":\"Office Computer\",\"takeable\":false,\"lockType\":\"password\",\"requires\":\"office2024\",\"showKeyboard\":true,\"maxAttempts\":3,\"locked\":true,\"postitNote\":\"Password: office2024\",\"showPostit\":true,\"observations\":\"A standard office computer with a sticky note on the monitor\"},{\"type\":\"notes\",\"name\":\"Shredded Document\",\"takeable\":true,\"readable\":true,\"text\":\"Partially readable: '...offshore account...transfer complete...delete all traces...'\",\"observations\":\"A partially shredded document that someone failed to dispose of properly\"},{\"type\":\"key\",\"name\":\"CEO Office Key\",\"takeable\":true,\"key_id\":\"ceo_office_key\",\"keyPins\":[0,50,100,150],\"observations\":\"A spare key to the CEO's office, carelessly left behind\"}]},\"office3\":{\"type\":\"room_office\",\"connections\":{\"north\":\"server1\",\"south\":\"office1\"},\"objects\":[{\"type\":\"pc\",\"name\":\"IT Staff Computer\",\"takeable\":false,\"requires\":\"bluetooth\",\"lockType\":\"bluetooth\",\"mac\":\"00:11:22:33:44:55\",\"observations\":\"An IT staff computer showing network security logs\"},{\"type\":\"notes\",\"name\":\"Network Logs\",\"takeable\":true,\"readable\":true,\"text\":\"Large data transfers detected to unknown external IPs - All originating from CEO's office\",\"observations\":\"Suspicious network activity logs\"}]},\"ceo\":{\"type\":\"room_ceo\",\"connections\":{\"north\":\"closet\",\"south\":\"office2\"},\"locked\":true,\"lockType\":\"key\",\"requires\":\"ceo_office_key\",\"keyPins\":[0,50,100,150],\"difficulty\":\"easy\",\"objects\":[{\"type\":\"pc\",\"name\":\"CEO Computer\",\"takeable\":false,\"lockType\":\"password\",\"requires\":\"ceo2024\",\"showKeyboard\":true,\"maxAttempts\":3,\"locked\":true,\"postitNote\":\"Password: ceo2024\",\"showPostit\":true,\"observations\":\"The CEO's laptop, still warm - recently used. A sticky note is attached to the screen.\"},{\"type\":\"suitcase\",\"name\":\"CEO Briefcase\",\"takeable\":false,\"locked\":true,\"lockType\":\"key\",\"requires\":\"briefcase_key\",\"keyPins\":[50,25,0,75],\"difficulty\":\"medium\",\"observations\":\"An expensive leather briefcase with a sturdy lock\",\"contents\":[{\"type\":\"notes\",\"name\":\"Private Note\",\"takeable\":true,\"readable\":true,\"text\":\"Closet keypad code: 7391 - Must move evidence to safe before audit\",\"observations\":\"A hastily written note on expensive paper\"},{\"type\":\"key\",\"name\":\"Safe Key\",\"takeable\":true,\"key_id\":\"safe_key\",\"keyPins\":[68,10,48,30],\"observations\":\"A heavy-duty safe key hidden behind server equipment\"}]},{\"type\":\"phone\",\"name\":\"CEO Phone\",\"takeable\":false,\"readable\":true,\"text\":\"Recent calls: 'Offshore Bank', 'Unknown', 'Data Buyer'\",\"sender\":\"Call Log\",\"timestamp\":\"Last 24 hours\",\"observations\":\"The CEO's phone shows suspicious recent calls\"}]},\"closet\":{\"type\":\"room_closet\",\"connections\":{\"south\":\"ceo\"},\"locked\":true,\"lockType\":\"pin\",\"requires\":\"7391\",\"objects\":[{\"type\":\"safe\",\"name\":\"Hidden Safe\",\"takeable\":false,\"locked\":true,\"lockType\":\"key\",\"requires\":\"safe_key\",\"keyPins\":[68,10,48,30],\"difficulty\":\"hard\",\"observations\":\"A well-hidden wall safe behind a painting\",\"contents\":[{\"type\":\"notes\",\"name\":\"Incriminating Documents\",\"takeable\":true,\"readable\":true,\"text\":\"Contract for sale of proprietary technology\\nBank transfers from competing companies\\nDetails of upcoming corporate espionage operations\",\"observations\":\"A folder containing damning evidence of corporate espionage. Congratulations! You've recovered the incriminating documents. flag{ceo_exfil_flag}\"}]}]},\"server1\":{\"type\":\"room_servers\",\"connections\":{\"south\":\"office3\"},\"locked\":true,\"lockType\":\"pin\",\"requires\":\"4829\",\"objects\":[{\"type\":\"pc\",\"name\":\"Server Terminal\",\"takeable\":false,\"observations\":\"The main server terminal showing massive data exfiltration\"},{\"type\":\"key\",\"name\":\"Briefcase Key\",\"takeable\":true,\"key_id\":\"briefcase_key\",\"keyPins\":[50,25,0,75],\"observations\":\"A small key labeled 'Personal - Do Not Copy'\"}]}}}"], ["score", 0], ["started_at", "2025-11-20 18:00:26.136014"], ["status", "in_progress"], ["updated_at", "2025-11-20 18:00:26.131316"]]
TRANSACTION (0.1ms) RELEASE SAVEPOINT active_record_1
Redirected to http://www.example.com/break_escape/games/1
Completed 302 Found in 71ms (ActiveRecord: 1.2ms (4 queries, 0 cached) | GC: 10.0ms)
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
---------------------------------------------------------------
BreakEscape::MissionTest: test_should_validate_presence_of_name
---------------------------------------------------------------
BreakEscape::Mission Exists? (0.2ms) SELECT 1 AS one FROM "break_escape_missions" WHERE "break_escape_missions"."name" IS NULL LIMIT ? [["LIMIT", 1]]
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
------------------------------------------------------------------------------
BreakEscape::MissionTest: test_published_scope_returns_only_published_missions
------------------------------------------------------------------------------
BreakEscape::Mission Load (0.1ms) SELECT "break_escape_missions".* FROM "break_escape_missions" WHERE "break_escape_missions"."id" = ? LIMIT ? [["id", 418560898], ["LIMIT", 1]]
BreakEscape::Mission Exists? (0.1ms) SELECT 1 AS one FROM "break_escape_missions" WHERE "break_escape_missions"."published" = ? AND "break_escape_missions"."id" = ? LIMIT ? [["published", 1], ["id", 418560898], ["LIMIT", 1]]
BreakEscape::Mission Load (0.1ms) SELECT "break_escape_missions".* FROM "break_escape_missions" WHERE "break_escape_missions"."id" = ? LIMIT ? [["id", 636030761], ["LIMIT", 1]]
BreakEscape::Mission Exists? (0.1ms) SELECT 1 AS one FROM "break_escape_missions" WHERE "break_escape_missions"."published" = ? AND "break_escape_missions"."id" = ? LIMIT ? [["published", 1], ["id", 636030761], ["LIMIT", 1]]
TRANSACTION (0.0ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
-----------------------------------------------------------------
BreakEscape::MissionTest: test_should_validate_uniqueness_of_name
-----------------------------------------------------------------
TRANSACTION (0.1ms) SAVEPOINT active_record_1
BreakEscape::Mission Exists? (0.3ms) SELECT 1 AS one FROM "break_escape_missions" WHERE "break_escape_missions"."name" = ? LIMIT ? [["name", "test"], ["LIMIT", 1]]
BreakEscape::Mission Create (1.5ms) INSERT INTO "break_escape_missions" ("created_at", "description", "difficulty_level", "display_name", "name", "published", "updated_at") VALUES (?, ?, ?, ?, ?, ?, ?) RETURNING "id" [["created_at", "2025-11-20 18:00:26.168627"], ["description", nil], ["difficulty_level", 1], ["display_name", "Test"], ["name", "test"], ["published", 0], ["updated_at", "2025-11-20 18:00:26.168627"]]
TRANSACTION (0.1ms) RELEASE SAVEPOINT active_record_1
BreakEscape::Mission Exists? (0.1ms) SELECT 1 AS one FROM "break_escape_missions" WHERE "break_escape_missions"."name" = ? LIMIT ? [["name", "test"], ["LIMIT", 1]]
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
-----------------------------------------------------------------
BreakEscape::MissionTest: test_scenario_path_returns_correct_path
-----------------------------------------------------------------
BreakEscape::Mission Load (0.1ms) SELECT "break_escape_missions".* FROM "break_escape_missions" WHERE "break_escape_missions"."id" = ? LIMIT ? [["id", 418560898], ["LIMIT", 1]]
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
----------------------------------------------
BreakEscape::GameTest: test_should_unlock_room
----------------------------------------------
BreakEscape::Mission Load (0.1ms) SELECT "break_escape_missions".* FROM "break_escape_missions" WHERE "break_escape_missions"."id" = ? LIMIT ? [["id", 418560898], ["LIMIT", 1]]
BreakEscape::DemoUser Load (1.6ms) SELECT "break_escape_demo_users".* FROM "break_escape_demo_users" WHERE "break_escape_demo_users"."id" = ? LIMIT ? [["id", 149617800], ["LIMIT", 1]]
TRANSACTION (0.1ms) SAVEPOINT active_record_1
BreakEscape::Game Create (1.8ms) INSERT INTO "break_escape_games" ("completed_at", "created_at", "mission_id", "player_id", "player_state", "player_type", "scenario_data", "score", "started_at", "status", "updated_at") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) RETURNING "id" [["completed_at", nil], ["created_at", "2025-11-20 18:00:26.185151"], ["mission_id", 418560898], ["player_id", 149617800], ["player_state", "{\"currentRoom\":\"reception\",\"unlockedRooms\":[\"reception\"],\"unlockedObjects\":[],\"inventory\":[],\"encounteredNPCs\":[],\"globalVariables\":{},\"biometricSamples\":[],\"biometricUnlocks\":[],\"bluetoothDevices\":[],\"notes\":[],\"health\":100}"], ["player_type", "BreakEscape::DemoUser"], ["scenario_data", "{\"scenario_brief\":\"Hi! You are a cyber investigator tasked with uncovering evidence of corporate espionage. Anonymous tips suggest the CEO has been selling company secrets, but you need proof.\",\"startRoom\":\"reception\",\"startItemsInInventory\":[{\"type\":\"phone\",\"name\":\"Your Phone\",\"takeable\":true,\"phoneId\":\"player_phone\",\"npcIds\":[\"neye_eve\",\"gossip_girl\",\"helper_npc\"],\"observations\":\"Your personal phone with some interesting contacts\"},{\"type\":\"workstation\",\"name\":\"Crypto Analysis Station\",\"takeable\":true,\"observations\":\"A powerful workstation for cryptographic analysis\"},{\"type\":\"lockpick\",\"name\":\"Lock Pick Kit\",\"takeable\":true,\"observations\":\"A professional lock picking kit with various picks and tension wrenches\"}],\"rooms\":{\"reception\":{\"type\":\"room_reception\",\"connections\":{\"north\":\"office1\"},\"npcs\":[{\"id\":\"neye_eve\",\"displayName\":\"Neye Eve\",\"storyPath\":\"scenarios/ink/neye-eve.json\",\"avatar\":\"assets/npc/avatars/npc_adversary.png\",\"phoneId\":\"player_phone\",\"currentKnot\":\"start\",\"npcType\":\"phone\"},{\"id\":\"gossip_girl\",\"displayName\":\"Gossip Girl\",\"storyPath\":\"scenarios/ink/gossip-girl.json\",\"avatar\":\"assets/npc/avatars/npc_neutral.png\",\"phoneId\":\"player_phone\",\"currentKnot\":\"start\",\"npcType\":\"phone\",\"timedMessages\":[{\"delay\":5000,\"message\":\"Hey! 👋 Got any juicy gossip for me today?\",\"type\":\"text\"}]},{\"id\":\"helper_npc\",\"displayName\":\"Helpful Contact\",\"storyPath\":\"scenarios/ink/helper-npc.json\",\"avatar\":\"assets/npc/avatars/npc_helper.png\",\"phoneId\":\"player_phone\",\"currentKnot\":\"start\",\"npcType\":\"phone\",\"eventMappings\":[{\"eventPattern\":\"item_picked_up:lockpick\",\"targetKnot\":\"on_lockpick_pickup\",\"onceOnly\":true,\"cooldown\":0},{\"eventPattern\":\"minigame_completed\",\"targetKnot\":\"on_lockpick_success\",\"condition\":\"data.minigameName && data.minigameName.includes('Lockpick')\",\"cooldown\":10000},{\"eventPattern\":\"minigame_failed\",\"targetKnot\":\"on_lockpick_failed\",\"condition\":\"data.minigameName && data.minigameName.includes('Lockpick')\",\"cooldown\":15000},{\"eventPattern\":\"door_unlocked\",\"targetKnot\":\"on_door_unlocked\",\"cooldown\":8000},{\"eventPattern\":\"door_unlock_attempt\",\"targetKnot\":\"on_door_attempt\",\"cooldown\":12000},{\"eventPattern\":\"object_interacted\",\"targetKnot\":\"on_ceo_desk_interact\",\"condition\":\"data.objectType === 'desk_ceo'\",\"cooldown\":10000},{\"eventPattern\":\"item_picked_up:*\",\"targetKnot\":\"on_item_found\",\"cooldown\":20000},{\"eventPattern\":\"room_entered\",\"targetKnot\":\"on_room_entered\",\"cooldown\":45000,\"maxTriggers\":3},{\"eventPattern\":\"room_discovered\",\"targetKnot\":\"on_room_discovered\",\"cooldown\":15000,\"maxTriggers\":5},{\"eventPattern\":\"room_entered:ceo\",\"targetKnot\":\"on_ceo_office_entered\",\"onceOnly\":true}]}],\"objects\":[{\"type\":\"phone\",\"name\":\"Reception Phone\",\"takeable\":false,\"readable\":true,\"voice\":\"Hi, this is the IT Team. Security breach detected in server room. Changed access code to 4829.\",\"sender\":\"IT Team\",\"timestamp\":\"2:15 AM\",\"observations\":\"The reception phone's message light is blinking urgently\"},{\"type\":\"notes\",\"name\":\"Security Log\",\"takeable\":true,\"readable\":true,\"text\":\"Unusual after-hours access detected:\\n- CEO office: 11:30 PM\\n- Server room: 2:15 AM\\n- CEO office again: 3:45 AM\",\"observations\":\"A concerning security log from last night\"},{\"type\":\"pc\",\"name\":\"Reception Computer\",\"takeable\":false,\"lockType\":\"password\",\"passwordHint\":\"Optional hint text\",\"showHint\":true,\"showKeyboard\":true,\"maxAttempts\":3,\"locked\":true,\"requires\":\"secret123\",\"observations\":\"The reception's computer, currently locked\",\"postitNote\":\"Password: secret123\",\"showPostit\":true,\"contents\":[{\"type\":\"text_file\",\"name\":\"Private\",\"takeable\":false,\"readable\":true,\"text\":\"Closet keypad code: 7391 - Must move evidence to safe before audit\"}]},{\"type\":\"tablet\",\"name\":\"Tablet Device\",\"takeable\":true,\"locked\":true,\"lockType\":\"bluetooth\",\"requires\":\"bluetooth\",\"mac\":\"00:11:22:33:44:55\",\"observations\":\"A locked tablet device that requires Bluetooth pairing\"},{\"type\":\"bluetooth_scanner\",\"name\":\"Bluetooth Scanner\",\"takeable\":true,\"observations\":\"A device for detecting nearby Bluetooth signals\",\"canScanBluetooth\":true},{\"type\":\"key\",\"name\":\"Office Key\",\"takeable\":true,\"key_id\":\"office1_key\",\"keyPins\":[100,0,100,0],\"observations\":\"A key to access the office areas\"},{\"type\":\"pin-cracker\",\"name\":\"PIN Cracker\",\"takeable\":true,\"observations\":\"A sophisticated device that can analyze PIN entry patterns and provide feedback on attempts\"},{\"type\":\"safe\",\"name\":\"Reception Safe\",\"takeable\":false,\"locked\":true,\"lockType\":\"pin\",\"requires\":\"9573\",\"observations\":\"A small wall safe behind the reception desk. Looks like it needs a 4-digit code.\",\"contents\":[{\"type\":\"notes\",\"name\":\"IT Access Credentials\",\"takeable\":true,\"readable\":true,\"text\":\"Emergency IT Admin Credentials:\\nUsername: admin\\nPassword: ITsecure2024\\n\\nServer Room Backup Code: 4829\\nCEO Office Alarm Override: 1337\",\"observations\":\"Sensitive IT credentials that could be very useful\"}]}]},\"office1\":{\"type\":\"room_office\",\"locked\":true,\"lockType\":\"key\",\"requires\":\"office1_key\",\"keyPins\":[100,0,100,0],\"difficulty\":\"easy\",\"door_sign\":\"4A Hot Desks\",\"connections\":{\"north\":[\"office2\",\"office3\"],\"south\":\"reception\"},\"objects\":[{\"type\":\"pc\",\"name\":\"Office Computer\",\"takeable\":false,\"requires\":\"password\",\"hasFingerprint\":true,\"fingerprintOwner\":\"ceo\",\"fingerprintDifficulty\":\"medium\",\"observations\":\"A computer with a cybersecurity alert on screen. There might be fingerprints on the keyboard.\"},{\"type\":\"notes\",\"name\":\"IT Memo\",\"takeable\":true,\"readable\":true,\"text\":\"URGENT: Multiple unauthorized access attempts detected from CEO's office IP address\",\"observations\":\"A concerning IT department memo\"},{\"type\":\"fingerprint_kit\",\"name\":\"Fingerprint Kit\",\"takeable\":true,\"observations\":\"A kit used for collecting fingerprints from surfaces\"}]},\"office2\":{\"type\":\"room_office\",\"connections\":{\"north\":\"ceo\",\"south\":\"office1\"},\"objects\":[{\"type\":\"pc\",\"name\":\"Office Computer\",\"takeable\":false,\"lockType\":\"password\",\"requires\":\"office2024\",\"showKeyboard\":true,\"maxAttempts\":3,\"locked\":true,\"postitNote\":\"Password: office2024\",\"showPostit\":true,\"observations\":\"A standard office computer with a sticky note on the monitor\"},{\"type\":\"notes\",\"name\":\"Shredded Document\",\"takeable\":true,\"readable\":true,\"text\":\"Partially readable: '...offshore account...transfer complete...delete all traces...'\",\"observations\":\"A partially shredded document that someone failed to dispose of properly\"},{\"type\":\"key\",\"name\":\"CEO Office Key\",\"takeable\":true,\"key_id\":\"ceo_office_key\",\"keyPins\":[0,50,100,150],\"observations\":\"A spare key to the CEO's office, carelessly left behind\"}]},\"office3\":{\"type\":\"room_office\",\"connections\":{\"north\":\"server1\",\"south\":\"office1\"},\"objects\":[{\"type\":\"pc\",\"name\":\"IT Staff Computer\",\"takeable\":false,\"requires\":\"bluetooth\",\"lockType\":\"bluetooth\",\"mac\":\"00:11:22:33:44:55\",\"observations\":\"An IT staff computer showing network security logs\"},{\"type\":\"notes\",\"name\":\"Network Logs\",\"takeable\":true,\"readable\":true,\"text\":\"Large data transfers detected to unknown external IPs - All originating from CEO's office\",\"observations\":\"Suspicious network activity logs\"}]},\"ceo\":{\"type\":\"room_ceo\",\"connections\":{\"north\":\"closet\",\"south\":\"office2\"},\"locked\":true,\"lockType\":\"key\",\"requires\":\"ceo_office_key\",\"keyPins\":[0,50,100,150],\"difficulty\":\"easy\",\"objects\":[{\"type\":\"pc\",\"name\":\"CEO Computer\",\"takeable\":false,\"lockType\":\"password\",\"requires\":\"ceo2024\",\"showKeyboard\":true,\"maxAttempts\":3,\"locked\":true,\"postitNote\":\"Password: ceo2024\",\"showPostit\":true,\"observations\":\"The CEO's laptop, still warm - recently used. A sticky note is attached to the screen.\"},{\"type\":\"suitcase\",\"name\":\"CEO Briefcase\",\"takeable\":false,\"locked\":true,\"lockType\":\"key\",\"requires\":\"briefcase_key\",\"keyPins\":[50,25,0,75],\"difficulty\":\"medium\",\"observations\":\"An expensive leather briefcase with a sturdy lock\",\"contents\":[{\"type\":\"notes\",\"name\":\"Private Note\",\"takeable\":true,\"readable\":true,\"text\":\"Closet keypad code: 7391 - Must move evidence to safe before audit\",\"observations\":\"A hastily written note on expensive paper\"},{\"type\":\"key\",\"name\":\"Safe Key\",\"takeable\":true,\"key_id\":\"safe_key\",\"keyPins\":[68,10,48,30],\"observations\":\"A heavy-duty safe key hidden behind server equipment\"}]},{\"type\":\"phone\",\"name\":\"CEO Phone\",\"takeable\":false,\"readable\":true,\"text\":\"Recent calls: 'Offshore Bank', 'Unknown', 'Data Buyer'\",\"sender\":\"Call Log\",\"timestamp\":\"Last 24 hours\",\"observations\":\"The CEO's phone shows suspicious recent calls\"}]},\"closet\":{\"type\":\"room_closet\",\"connections\":{\"south\":\"ceo\"},\"locked\":true,\"lockType\":\"pin\",\"requires\":\"7391\",\"objects\":[{\"type\":\"safe\",\"name\":\"Hidden Safe\",\"takeable\":false,\"locked\":true,\"lockType\":\"key\",\"requires\":\"safe_key\",\"keyPins\":[68,10,48,30],\"difficulty\":\"hard\",\"observations\":\"A well-hidden wall safe behind a painting\",\"contents\":[{\"type\":\"notes\",\"name\":\"Incriminating Documents\",\"takeable\":true,\"readable\":true,\"text\":\"Contract for sale of proprietary technology\\nBank transfers from competing companies\\nDetails of upcoming corporate espionage operations\",\"observations\":\"A folder containing damning evidence of corporate espionage. Congratulations! You've recovered the incriminating documents. flag{ceo_exfil_flag}\"}]}]},\"server1\":{\"type\":\"room_servers\",\"connections\":{\"south\":\"office3\"},\"locked\":true,\"lockType\":\"pin\",\"requires\":\"4829\",\"objects\":[{\"type\":\"pc\",\"name\":\"Server Terminal\",\"takeable\":false,\"observations\":\"The main server terminal showing massive data exfiltration\"},{\"type\":\"key\",\"name\":\"Briefcase Key\",\"takeable\":true,\"key_id\":\"briefcase_key\",\"keyPins\":[50,25,0,75],\"observations\":\"A small key labeled 'Personal - Do Not Copy'\"}]}}}"], ["score", 0], ["started_at", "2025-11-20 18:00:26.190791"], ["status", "in_progress"], ["updated_at", "2025-11-20 18:00:26.185151"]]
TRANSACTION (0.1ms) RELEASE SAVEPOINT active_record_1
TRANSACTION (0.1ms) SAVEPOINT active_record_1
BreakEscape::Game Update (1.6ms) UPDATE "break_escape_games" SET "player_state" = ?, "updated_at" = ? WHERE "break_escape_games"."id" = ? [["player_state", "{\"currentRoom\":\"reception\",\"unlockedRooms\":[\"reception\",\"office\"],\"unlockedObjects\":[],\"inventory\":[],\"encounteredNPCs\":[],\"globalVariables\":{},\"biometricSamples\":[],\"biometricUnlocks\":[],\"bluetoothDevices\":[],\"notes\":[],\"health\":100}"], ["updated_at", "2025-11-20 18:00:26.198136"], ["id", 1]]
TRANSACTION (0.0ms) RELEASE SAVEPOINT active_record_1
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
---------------------------------------------------------------
BreakEscape::GameTest: test_should_belong_to_player_and_mission
---------------------------------------------------------------
BreakEscape::Mission Load (0.1ms) SELECT "break_escape_missions".* FROM "break_escape_missions" WHERE "break_escape_missions"."id" = ? LIMIT ? [["id", 418560898], ["LIMIT", 1]]
BreakEscape::DemoUser Load (0.1ms) SELECT "break_escape_demo_users".* FROM "break_escape_demo_users" WHERE "break_escape_demo_users"."id" = ? LIMIT ? [["id", 149617800], ["LIMIT", 1]]
TRANSACTION (0.1ms) SAVEPOINT active_record_1
BreakEscape::Game Create (0.6ms) INSERT INTO "break_escape_games" ("completed_at", "created_at", "mission_id", "player_id", "player_state", "player_type", "scenario_data", "score", "started_at", "status", "updated_at") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) RETURNING "id" [["completed_at", nil], ["created_at", "2025-11-20 18:00:26.202787"], ["mission_id", 418560898], ["player_id", 149617800], ["player_state", "{\"currentRoom\":\"reception\",\"unlockedRooms\":[\"reception\"],\"unlockedObjects\":[],\"inventory\":[],\"encounteredNPCs\":[],\"globalVariables\":{},\"biometricSamples\":[],\"biometricUnlocks\":[],\"bluetoothDevices\":[],\"notes\":[],\"health\":100}"], ["player_type", "BreakEscape::DemoUser"], ["scenario_data", "{\"scenario_brief\":\"Hi! You are a cyber investigator tasked with uncovering evidence of corporate espionage. Anonymous tips suggest the CEO has been selling company secrets, but you need proof.\",\"startRoom\":\"reception\",\"startItemsInInventory\":[{\"type\":\"phone\",\"name\":\"Your Phone\",\"takeable\":true,\"phoneId\":\"player_phone\",\"npcIds\":[\"neye_eve\",\"gossip_girl\",\"helper_npc\"],\"observations\":\"Your personal phone with some interesting contacts\"},{\"type\":\"workstation\",\"name\":\"Crypto Analysis Station\",\"takeable\":true,\"observations\":\"A powerful workstation for cryptographic analysis\"},{\"type\":\"lockpick\",\"name\":\"Lock Pick Kit\",\"takeable\":true,\"observations\":\"A professional lock picking kit with various picks and tension wrenches\"}],\"rooms\":{\"reception\":{\"type\":\"room_reception\",\"connections\":{\"north\":\"office1\"},\"npcs\":[{\"id\":\"neye_eve\",\"displayName\":\"Neye Eve\",\"storyPath\":\"scenarios/ink/neye-eve.json\",\"avatar\":\"assets/npc/avatars/npc_adversary.png\",\"phoneId\":\"player_phone\",\"currentKnot\":\"start\",\"npcType\":\"phone\"},{\"id\":\"gossip_girl\",\"displayName\":\"Gossip Girl\",\"storyPath\":\"scenarios/ink/gossip-girl.json\",\"avatar\":\"assets/npc/avatars/npc_neutral.png\",\"phoneId\":\"player_phone\",\"currentKnot\":\"start\",\"npcType\":\"phone\",\"timedMessages\":[{\"delay\":5000,\"message\":\"Hey! 👋 Got any juicy gossip for me today?\",\"type\":\"text\"}]},{\"id\":\"helper_npc\",\"displayName\":\"Helpful Contact\",\"storyPath\":\"scenarios/ink/helper-npc.json\",\"avatar\":\"assets/npc/avatars/npc_helper.png\",\"phoneId\":\"player_phone\",\"currentKnot\":\"start\",\"npcType\":\"phone\",\"eventMappings\":[{\"eventPattern\":\"item_picked_up:lockpick\",\"targetKnot\":\"on_lockpick_pickup\",\"onceOnly\":true,\"cooldown\":0},{\"eventPattern\":\"minigame_completed\",\"targetKnot\":\"on_lockpick_success\",\"condition\":\"data.minigameName && data.minigameName.includes('Lockpick')\",\"cooldown\":10000},{\"eventPattern\":\"minigame_failed\",\"targetKnot\":\"on_lockpick_failed\",\"condition\":\"data.minigameName && data.minigameName.includes('Lockpick')\",\"cooldown\":15000},{\"eventPattern\":\"door_unlocked\",\"targetKnot\":\"on_door_unlocked\",\"cooldown\":8000},{\"eventPattern\":\"door_unlock_attempt\",\"targetKnot\":\"on_door_attempt\",\"cooldown\":12000},{\"eventPattern\":\"object_interacted\",\"targetKnot\":\"on_ceo_desk_interact\",\"condition\":\"data.objectType === 'desk_ceo'\",\"cooldown\":10000},{\"eventPattern\":\"item_picked_up:*\",\"targetKnot\":\"on_item_found\",\"cooldown\":20000},{\"eventPattern\":\"room_entered\",\"targetKnot\":\"on_room_entered\",\"cooldown\":45000,\"maxTriggers\":3},{\"eventPattern\":\"room_discovered\",\"targetKnot\":\"on_room_discovered\",\"cooldown\":15000,\"maxTriggers\":5},{\"eventPattern\":\"room_entered:ceo\",\"targetKnot\":\"on_ceo_office_entered\",\"onceOnly\":true}]}],\"objects\":[{\"type\":\"phone\",\"name\":\"Reception Phone\",\"takeable\":false,\"readable\":true,\"voice\":\"Hi, this is the IT Team. Security breach detected in server room. Changed access code to 4829.\",\"sender\":\"IT Team\",\"timestamp\":\"2:15 AM\",\"observations\":\"The reception phone's message light is blinking urgently\"},{\"type\":\"notes\",\"name\":\"Security Log\",\"takeable\":true,\"readable\":true,\"text\":\"Unusual after-hours access detected:\\n- CEO office: 11:30 PM\\n- Server room: 2:15 AM\\n- CEO office again: 3:45 AM\",\"observations\":\"A concerning security log from last night\"},{\"type\":\"pc\",\"name\":\"Reception Computer\",\"takeable\":false,\"lockType\":\"password\",\"passwordHint\":\"Optional hint text\",\"showHint\":true,\"showKeyboard\":true,\"maxAttempts\":3,\"locked\":true,\"requires\":\"secret123\",\"observations\":\"The reception's computer, currently locked\",\"postitNote\":\"Password: secret123\",\"showPostit\":true,\"contents\":[{\"type\":\"text_file\",\"name\":\"Private\",\"takeable\":false,\"readable\":true,\"text\":\"Closet keypad code: 7391 - Must move evidence to safe before audit\"}]},{\"type\":\"tablet\",\"name\":\"Tablet Device\",\"takeable\":true,\"locked\":true,\"lockType\":\"bluetooth\",\"requires\":\"bluetooth\",\"mac\":\"00:11:22:33:44:55\",\"observations\":\"A locked tablet device that requires Bluetooth pairing\"},{\"type\":\"bluetooth_scanner\",\"name\":\"Bluetooth Scanner\",\"takeable\":true,\"observations\":\"A device for detecting nearby Bluetooth signals\",\"canScanBluetooth\":true},{\"type\":\"key\",\"name\":\"Office Key\",\"takeable\":true,\"key_id\":\"office1_key\",\"keyPins\":[100,0,100,0],\"observations\":\"A key to access the office areas\"},{\"type\":\"pin-cracker\",\"name\":\"PIN Cracker\",\"takeable\":true,\"observations\":\"A sophisticated device that can analyze PIN entry patterns and provide feedback on attempts\"},{\"type\":\"safe\",\"name\":\"Reception Safe\",\"takeable\":false,\"locked\":true,\"lockType\":\"pin\",\"requires\":\"9573\",\"observations\":\"A small wall safe behind the reception desk. Looks like it needs a 4-digit code.\",\"contents\":[{\"type\":\"notes\",\"name\":\"IT Access Credentials\",\"takeable\":true,\"readable\":true,\"text\":\"Emergency IT Admin Credentials:\\nUsername: admin\\nPassword: ITsecure2024\\n\\nServer Room Backup Code: 4829\\nCEO Office Alarm Override: 1337\",\"observations\":\"Sensitive IT credentials that could be very useful\"}]}]},\"office1\":{\"type\":\"room_office\",\"locked\":true,\"lockType\":\"key\",\"requires\":\"office1_key\",\"keyPins\":[100,0,100,0],\"difficulty\":\"easy\",\"door_sign\":\"4A Hot Desks\",\"connections\":{\"north\":[\"office2\",\"office3\"],\"south\":\"reception\"},\"objects\":[{\"type\":\"pc\",\"name\":\"Office Computer\",\"takeable\":false,\"requires\":\"password\",\"hasFingerprint\":true,\"fingerprintOwner\":\"ceo\",\"fingerprintDifficulty\":\"medium\",\"observations\":\"A computer with a cybersecurity alert on screen. There might be fingerprints on the keyboard.\"},{\"type\":\"notes\",\"name\":\"IT Memo\",\"takeable\":true,\"readable\":true,\"text\":\"URGENT: Multiple unauthorized access attempts detected from CEO's office IP address\",\"observations\":\"A concerning IT department memo\"},{\"type\":\"fingerprint_kit\",\"name\":\"Fingerprint Kit\",\"takeable\":true,\"observations\":\"A kit used for collecting fingerprints from surfaces\"}]},\"office2\":{\"type\":\"room_office\",\"connections\":{\"north\":\"ceo\",\"south\":\"office1\"},\"objects\":[{\"type\":\"pc\",\"name\":\"Office Computer\",\"takeable\":false,\"lockType\":\"password\",\"requires\":\"office2024\",\"showKeyboard\":true,\"maxAttempts\":3,\"locked\":true,\"postitNote\":\"Password: office2024\",\"showPostit\":true,\"observations\":\"A standard office computer with a sticky note on the monitor\"},{\"type\":\"notes\",\"name\":\"Shredded Document\",\"takeable\":true,\"readable\":true,\"text\":\"Partially readable: '...offshore account...transfer complete...delete all traces...'\",\"observations\":\"A partially shredded document that someone failed to dispose of properly\"},{\"type\":\"key\",\"name\":\"CEO Office Key\",\"takeable\":true,\"key_id\":\"ceo_office_key\",\"keyPins\":[0,50,100,150],\"observations\":\"A spare key to the CEO's office, carelessly left behind\"}]},\"office3\":{\"type\":\"room_office\",\"connections\":{\"north\":\"server1\",\"south\":\"office1\"},\"objects\":[{\"type\":\"pc\",\"name\":\"IT Staff Computer\",\"takeable\":false,\"requires\":\"bluetooth\",\"lockType\":\"bluetooth\",\"mac\":\"00:11:22:33:44:55\",\"observations\":\"An IT staff computer showing network security logs\"},{\"type\":\"notes\",\"name\":\"Network Logs\",\"takeable\":true,\"readable\":true,\"text\":\"Large data transfers detected to unknown external IPs - All originating from CEO's office\",\"observations\":\"Suspicious network activity logs\"}]},\"ceo\":{\"type\":\"room_ceo\",\"connections\":{\"north\":\"closet\",\"south\":\"office2\"},\"locked\":true,\"lockType\":\"key\",\"requires\":\"ceo_office_key\",\"keyPins\":[0,50,100,150],\"difficulty\":\"easy\",\"objects\":[{\"type\":\"pc\",\"name\":\"CEO Computer\",\"takeable\":false,\"lockType\":\"password\",\"requires\":\"ceo2024\",\"showKeyboard\":true,\"maxAttempts\":3,\"locked\":true,\"postitNote\":\"Password: ceo2024\",\"showPostit\":true,\"observations\":\"The CEO's laptop, still warm - recently used. A sticky note is attached to the screen.\"},{\"type\":\"suitcase\",\"name\":\"CEO Briefcase\",\"takeable\":false,\"locked\":true,\"lockType\":\"key\",\"requires\":\"briefcase_key\",\"keyPins\":[50,25,0,75],\"difficulty\":\"medium\",\"observations\":\"An expensive leather briefcase with a sturdy lock\",\"contents\":[{\"type\":\"notes\",\"name\":\"Private Note\",\"takeable\":true,\"readable\":true,\"text\":\"Closet keypad code: 7391 - Must move evidence to safe before audit\",\"observations\":\"A hastily written note on expensive paper\"},{\"type\":\"key\",\"name\":\"Safe Key\",\"takeable\":true,\"key_id\":\"safe_key\",\"keyPins\":[68,10,48,30],\"observations\":\"A heavy-duty safe key hidden behind server equipment\"}]},{\"type\":\"phone\",\"name\":\"CEO Phone\",\"takeable\":false,\"readable\":true,\"text\":\"Recent calls: 'Offshore Bank', 'Unknown', 'Data Buyer'\",\"sender\":\"Call Log\",\"timestamp\":\"Last 24 hours\",\"observations\":\"The CEO's phone shows suspicious recent calls\"}]},\"closet\":{\"type\":\"room_closet\",\"connections\":{\"south\":\"ceo\"},\"locked\":true,\"lockType\":\"pin\",\"requires\":\"7391\",\"objects\":[{\"type\":\"safe\",\"name\":\"Hidden Safe\",\"takeable\":false,\"locked\":true,\"lockType\":\"key\",\"requires\":\"safe_key\",\"keyPins\":[68,10,48,30],\"difficulty\":\"hard\",\"observations\":\"A well-hidden wall safe behind a painting\",\"contents\":[{\"type\":\"notes\",\"name\":\"Incriminating Documents\",\"takeable\":true,\"readable\":true,\"text\":\"Contract for sale of proprietary technology\\nBank transfers from competing companies\\nDetails of upcoming corporate espionage operations\",\"observations\":\"A folder containing damning evidence of corporate espionage. Congratulations! You've recovered the incriminating documents. flag{ceo_exfil_flag}\"}]}]},\"server1\":{\"type\":\"room_servers\",\"connections\":{\"south\":\"office3\"},\"locked\":true,\"lockType\":\"pin\",\"requires\":\"4829\",\"objects\":[{\"type\":\"pc\",\"name\":\"Server Terminal\",\"takeable\":false,\"observations\":\"The main server terminal showing massive data exfiltration\"},{\"type\":\"key\",\"name\":\"Briefcase Key\",\"takeable\":true,\"key_id\":\"briefcase_key\",\"keyPins\":[50,25,0,75],\"observations\":\"A small key labeled 'Personal - Do Not Copy'\"}]}}}"], ["score", 0], ["started_at", "2025-11-20 18:00:26.204368"], ["status", "in_progress"], ["updated_at", "2025-11-20 18:00:26.202787"]]
TRANSACTION (0.1ms) RELEASE SAVEPOINT active_record_1
TRANSACTION (0.0ms) ROLLBACK TRANSACTION
TRANSACTION (0.0ms) BEGIN deferred TRANSACTION
--------------------------------------------------
BreakEscape::GameTest: test_should_track_inventory
--------------------------------------------------
BreakEscape::Mission Load (0.1ms) SELECT "break_escape_missions".* FROM "break_escape_missions" WHERE "break_escape_missions"."id" = ? LIMIT ? [["id", 418560898], ["LIMIT", 1]]
BreakEscape::DemoUser Load (0.1ms) SELECT "break_escape_demo_users".* FROM "break_escape_demo_users" WHERE "break_escape_demo_users"."id" = ? LIMIT ? [["id", 149617800], ["LIMIT", 1]]
TRANSACTION (0.1ms) SAVEPOINT active_record_1
BreakEscape::Game Create (0.6ms) INSERT INTO "break_escape_games" ("completed_at", "created_at", "mission_id", "player_id", "player_state", "player_type", "scenario_data", "score", "started_at", "status", "updated_at") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) RETURNING "id" [["completed_at", nil], ["created_at", "2025-11-20 18:00:26.208849"], ["mission_id", 418560898], ["player_id", 149617800], ["player_state", "{\"currentRoom\":\"reception\",\"unlockedRooms\":[\"reception\"],\"unlockedObjects\":[],\"inventory\":[],\"encounteredNPCs\":[],\"globalVariables\":{},\"biometricSamples\":[],\"biometricUnlocks\":[],\"bluetoothDevices\":[],\"notes\":[],\"health\":100}"], ["player_type", "BreakEscape::DemoUser"], ["scenario_data", "{\"scenario_brief\":\"Hi! You are a cyber investigator tasked with uncovering evidence of corporate espionage. Anonymous tips suggest the CEO has been selling company secrets, but you need proof.\",\"startRoom\":\"reception\",\"startItemsInInventory\":[{\"type\":\"phone\",\"name\":\"Your Phone\",\"takeable\":true,\"phoneId\":\"player_phone\",\"npcIds\":[\"neye_eve\",\"gossip_girl\",\"helper_npc\"],\"observations\":\"Your personal phone with some interesting contacts\"},{\"type\":\"workstation\",\"name\":\"Crypto Analysis Station\",\"takeable\":true,\"observations\":\"A powerful workstation for cryptographic analysis\"},{\"type\":\"lockpick\",\"name\":\"Lock Pick Kit\",\"takeable\":true,\"observations\":\"A professional lock picking kit with various picks and tension wrenches\"}],\"rooms\":{\"reception\":{\"type\":\"room_reception\",\"connections\":{\"north\":\"office1\"},\"npcs\":[{\"id\":\"neye_eve\",\"displayName\":\"Neye Eve\",\"storyPath\":\"scenarios/ink/neye-eve.json\",\"avatar\":\"assets/npc/avatars/npc_adversary.png\",\"phoneId\":\"player_phone\",\"currentKnot\":\"start\",\"npcType\":\"phone\"},{\"id\":\"gossip_girl\",\"displayName\":\"Gossip Girl\",\"storyPath\":\"scenarios/ink/gossip-girl.json\",\"avatar\":\"assets/npc/avatars/npc_neutral.png\",\"phoneId\":\"player_phone\",\"currentKnot\":\"start\",\"npcType\":\"phone\",\"timedMessages\":[{\"delay\":5000,\"message\":\"Hey! 👋 Got any juicy gossip for me today?\",\"type\":\"text\"}]},{\"id\":\"helper_npc\",\"displayName\":\"Helpful Contact\",\"storyPath\":\"scenarios/ink/helper-npc.json\",\"avatar\":\"assets/npc/avatars/npc_helper.png\",\"phoneId\":\"player_phone\",\"currentKnot\":\"start\",\"npcType\":\"phone\",\"eventMappings\":[{\"eventPattern\":\"item_picked_up:lockpick\",\"targetKnot\":\"on_lockpick_pickup\",\"onceOnly\":true,\"cooldown\":0},{\"eventPattern\":\"minigame_completed\",\"targetKnot\":\"on_lockpick_success\",\"condition\":\"data.minigameName && data.minigameName.includes('Lockpick')\",\"cooldown\":10000},{\"eventPattern\":\"minigame_failed\",\"targetKnot\":\"on_lockpick_failed\",\"condition\":\"data.minigameName && data.minigameName.includes('Lockpick')\",\"cooldown\":15000},{\"eventPattern\":\"door_unlocked\",\"targetKnot\":\"on_door_unlocked\",\"cooldown\":8000},{\"eventPattern\":\"door_unlock_attempt\",\"targetKnot\":\"on_door_attempt\",\"cooldown\":12000},{\"eventPattern\":\"object_interacted\",\"targetKnot\":\"on_ceo_desk_interact\",\"condition\":\"data.objectType === 'desk_ceo'\",\"cooldown\":10000},{\"eventPattern\":\"item_picked_up:*\",\"targetKnot\":\"on_item_found\",\"cooldown\":20000},{\"eventPattern\":\"room_entered\",\"targetKnot\":\"on_room_entered\",\"cooldown\":45000,\"maxTriggers\":3},{\"eventPattern\":\"room_discovered\",\"targetKnot\":\"on_room_discovered\",\"cooldown\":15000,\"maxTriggers\":5},{\"eventPattern\":\"room_entered:ceo\",\"targetKnot\":\"on_ceo_office_entered\",\"onceOnly\":true}]}],\"objects\":[{\"type\":\"phone\",\"name\":\"Reception Phone\",\"takeable\":false,\"readable\":true,\"voice\":\"Hi, this is the IT Team. Security breach detected in server room. Changed access code to 4829.\",\"sender\":\"IT Team\",\"timestamp\":\"2:15 AM\",\"observations\":\"The reception phone's message light is blinking urgently\"},{\"type\":\"notes\",\"name\":\"Security Log\",\"takeable\":true,\"readable\":true,\"text\":\"Unusual after-hours access detected:\\n- CEO office: 11:30 PM\\n- Server room: 2:15 AM\\n- CEO office again: 3:45 AM\",\"observations\":\"A concerning security log from last night\"},{\"type\":\"pc\",\"name\":\"Reception Computer\",\"takeable\":false,\"lockType\":\"password\",\"passwordHint\":\"Optional hint text\",\"showHint\":true,\"showKeyboard\":true,\"maxAttempts\":3,\"locked\":true,\"requires\":\"secret123\",\"observations\":\"The reception's computer, currently locked\",\"postitNote\":\"Password: secret123\",\"showPostit\":true,\"contents\":[{\"type\":\"text_file\",\"name\":\"Private\",\"takeable\":false,\"readable\":true,\"text\":\"Closet keypad code: 7391 - Must move evidence to safe before audit\"}]},{\"type\":\"tablet\",\"name\":\"Tablet Device\",\"takeable\":true,\"locked\":true,\"lockType\":\"bluetooth\",\"requires\":\"bluetooth\",\"mac\":\"00:11:22:33:44:55\",\"observations\":\"A locked tablet device that requires Bluetooth pairing\"},{\"type\":\"bluetooth_scanner\",\"name\":\"Bluetooth Scanner\",\"takeable\":true,\"observations\":\"A device for detecting nearby Bluetooth signals\",\"canScanBluetooth\":true},{\"type\":\"key\",\"name\":\"Office Key\",\"takeable\":true,\"key_id\":\"office1_key\",\"keyPins\":[100,0,100,0],\"observations\":\"A key to access the office areas\"},{\"type\":\"pin-cracker\",\"name\":\"PIN Cracker\",\"takeable\":true,\"observations\":\"A sophisticated device that can analyze PIN entry patterns and provide feedback on attempts\"},{\"type\":\"safe\",\"name\":\"Reception Safe\",\"takeable\":false,\"locked\":true,\"lockType\":\"pin\",\"requires\":\"9573\",\"observations\":\"A small wall safe behind the reception desk. Looks like it needs a 4-digit code.\",\"contents\":[{\"type\":\"notes\",\"name\":\"IT Access Credentials\",\"takeable\":true,\"readable\":true,\"text\":\"Emergency IT Admin Credentials:\\nUsername: admin\\nPassword: ITsecure2024\\n\\nServer Room Backup Code: 4829\\nCEO Office Alarm Override: 1337\",\"observations\":\"Sensitive IT credentials that could be very useful\"}]}]},\"office1\":{\"type\":\"room_office\",\"locked\":true,\"lockType\":\"key\",\"requires\":\"office1_key\",\"keyPins\":[100,0,100,0],\"difficulty\":\"easy\",\"door_sign\":\"4A Hot Desks\",\"connections\":{\"north\":[\"office2\",\"office3\"],\"south\":\"reception\"},\"objects\":[{\"type\":\"pc\",\"name\":\"Office Computer\",\"takeable\":false,\"requires\":\"password\",\"hasFingerprint\":true,\"fingerprintOwner\":\"ceo\",\"fingerprintDifficulty\":\"medium\",\"observations\":\"A computer with a cybersecurity alert on screen. There might be fingerprints on the keyboard.\"},{\"type\":\"notes\",\"name\":\"IT Memo\",\"takeable\":true,\"readable\":true,\"text\":\"URGENT: Multiple unauthorized access attempts detected from CEO's office IP address\",\"observations\":\"A concerning IT department memo\"},{\"type\":\"fingerprint_kit\",\"name\":\"Fingerprint Kit\",\"takeable\":true,\"observations\":\"A kit used for collecting fingerprints from surfaces\"}]},\"office2\":{\"type\":\"room_office\",\"connections\":{\"north\":\"ceo\",\"south\":\"office1\"},\"objects\":[{\"type\":\"pc\",\"name\":\"Office Computer\",\"takeable\":false,\"lockType\":\"password\",\"requires\":\"office2024\",\"showKeyboard\":true,\"maxAttempts\":3,\"locked\":true,\"postitNote\":\"Password: office2024\",\"showPostit\":true,\"observations\":\"A standard office computer with a sticky note on the monitor\"},{\"type\":\"notes\",\"name\":\"Shredded Document\",\"takeable\":true,\"readable\":true,\"text\":\"Partially readable: '...offshore account...transfer complete...delete all traces...'\",\"observations\":\"A partially shredded document that someone failed to dispose of properly\"},{\"type\":\"key\",\"name\":\"CEO Office Key\",\"takeable\":true,\"key_id\":\"ceo_office_key\",\"keyPins\":[0,50,100,150],\"observations\":\"A spare key to the CEO's office, carelessly left behind\"}]},\"office3\":{\"type\":\"room_office\",\"connections\":{\"north\":\"server1\",\"south\":\"office1\"},\"objects\":[{\"type\":\"pc\",\"name\":\"IT Staff Computer\",\"takeable\":false,\"requires\":\"bluetooth\",\"lockType\":\"bluetooth\",\"mac\":\"00:11:22:33:44:55\",\"observations\":\"An IT staff computer showing network security logs\"},{\"type\":\"notes\",\"name\":\"Network Logs\",\"takeable\":true,\"readable\":true,\"text\":\"Large data transfers detected to unknown external IPs - All originating from CEO's office\",\"observations\":\"Suspicious network activity logs\"}]},\"ceo\":{\"type\":\"room_ceo\",\"connections\":{\"north\":\"closet\",\"south\":\"office2\"},\"locked\":true,\"lockType\":\"key\",\"requires\":\"ceo_office_key\",\"keyPins\":[0,50,100,150],\"difficulty\":\"easy\",\"objects\":[{\"type\":\"pc\",\"name\":\"CEO Computer\",\"takeable\":false,\"lockType\":\"password\",\"requires\":\"ceo2024\",\"showKeyboard\":true,\"maxAttempts\":3,\"locked\":true,\"postitNote\":\"Password: ceo2024\",\"showPostit\":true,\"observations\":\"The CEO's laptop, still warm - recently used. A sticky note is attached to the screen.\"},{\"type\":\"suitcase\",\"name\":\"CEO Briefcase\",\"takeable\":false,\"locked\":true,\"lockType\":\"key\",\"requires\":\"briefcase_key\",\"keyPins\":[50,25,0,75],\"difficulty\":\"medium\",\"observations\":\"An expensive leather briefcase with a sturdy lock\",\"contents\":[{\"type\":\"notes\",\"name\":\"Private Note\",\"takeable\":true,\"readable\":true,\"text\":\"Closet keypad code: 7391 - Must move evidence to safe before audit\",\"observations\":\"A hastily written note on expensive paper\"},{\"type\":\"key\",\"name\":\"Safe Key\",\"takeable\":true,\"key_id\":\"safe_key\",\"keyPins\":[68,10,48,30],\"observations\":\"A heavy-duty safe key hidden behind server equipment\"}]},{\"type\":\"phone\",\"name\":\"CEO Phone\",\"takeable\":false,\"readable\":true,\"text\":\"Recent calls: 'Offshore Bank', 'Unknown', 'Data Buyer'\",\"sender\":\"Call Log\",\"timestamp\":\"Last 24 hours\",\"observations\":\"The CEO's phone shows suspicious recent calls\"}]},\"closet\":{\"type\":\"room_closet\",\"connections\":{\"south\":\"ceo\"},\"locked\":true,\"lockType\":\"pin\",\"requires\":\"7391\",\"objects\":[{\"type\":\"safe\",\"name\":\"Hidden Safe\",\"takeable\":false,\"locked\":true,\"lockType\":\"key\",\"requires\":\"safe_key\",\"keyPins\":[68,10,48,30],\"difficulty\":\"hard\",\"observations\":\"A well-hidden wall safe behind a painting\",\"contents\":[{\"type\":\"notes\",\"name\":\"Incriminating Documents\",\"takeable\":true,\"readable\":true,\"text\":\"Contract for sale of proprietary technology\\nBank transfers from competing companies\\nDetails of upcoming corporate espionage operations\",\"observations\":\"A folder containing damning evidence of corporate espionage. Congratulations! You've recovered the incriminating documents. flag{ceo_exfil_flag}\"}]}]},\"server1\":{\"type\":\"room_servers\",\"connections\":{\"south\":\"office3\"},\"locked\":true,\"lockType\":\"pin\",\"requires\":\"4829\",\"objects\":[{\"type\":\"pc\",\"name\":\"Server Terminal\",\"takeable\":false,\"observations\":\"The main server terminal showing massive data exfiltration\"},{\"type\":\"key\",\"name\":\"Briefcase Key\",\"takeable\":true,\"key_id\":\"briefcase_key\",\"keyPins\":[50,25,0,75],\"observations\":\"A small key labeled 'Personal - Do Not Copy'\"}]}}}"], ["score", 0], ["started_at", "2025-11-20 18:00:26.210401"], ["status", "in_progress"], ["updated_at", "2025-11-20 18:00:26.208849"]]
TRANSACTION (0.1ms) RELEASE SAVEPOINT active_record_1
TRANSACTION (0.1ms) SAVEPOINT active_record_1
BreakEscape::Game Update (0.3ms) UPDATE "break_escape_games" SET "player_state" = ?, "updated_at" = ? WHERE "break_escape_games"."id" = ? [["player_state", "{\"currentRoom\":\"reception\",\"unlockedRooms\":[\"reception\"],\"unlockedObjects\":[],\"inventory\":[{\"type\":\"key\",\"name\":\"Test Key\"}],\"encounteredNPCs\":[],\"globalVariables\":{},\"biometricSamples\":[],\"biometricUnlocks\":[],\"bluetoothDevices\":[],\"notes\":[],\"health\":100}"], ["updated_at", "2025-11-20 18:00:26.212813"], ["id", 1]]
TRANSACTION (0.1ms) RELEASE SAVEPOINT active_record_1
TRANSACTION (0.1ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
------------------------------------------------
BreakEscape::GameTest: test_should_update_health
------------------------------------------------
BreakEscape::Mission Load (0.1ms) SELECT "break_escape_missions".* FROM "break_escape_missions" WHERE "break_escape_missions"."id" = ? LIMIT ? [["id", 418560898], ["LIMIT", 1]]
BreakEscape::DemoUser Load (0.1ms) SELECT "break_escape_demo_users".* FROM "break_escape_demo_users" WHERE "break_escape_demo_users"."id" = ? LIMIT ? [["id", 149617800], ["LIMIT", 1]]
TRANSACTION (0.1ms) SAVEPOINT active_record_1
BreakEscape::Game Create (0.4ms) INSERT INTO "break_escape_games" ("completed_at", "created_at", "mission_id", "player_id", "player_state", "player_type", "scenario_data", "score", "started_at", "status", "updated_at") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) RETURNING "id" [["completed_at", nil], ["created_at", "2025-11-20 18:00:26.215875"], ["mission_id", 418560898], ["player_id", 149617800], ["player_state", "{\"currentRoom\":\"reception\",\"unlockedRooms\":[\"reception\"],\"unlockedObjects\":[],\"inventory\":[],\"encounteredNPCs\":[],\"globalVariables\":{},\"biometricSamples\":[],\"biometricUnlocks\":[],\"bluetoothDevices\":[],\"notes\":[],\"health\":100}"], ["player_type", "BreakEscape::DemoUser"], ["scenario_data", "{\"scenario_brief\":\"Hi! You are a cyber investigator tasked with uncovering evidence of corporate espionage. Anonymous tips suggest the CEO has been selling company secrets, but you need proof.\",\"startRoom\":\"reception\",\"startItemsInInventory\":[{\"type\":\"phone\",\"name\":\"Your Phone\",\"takeable\":true,\"phoneId\":\"player_phone\",\"npcIds\":[\"neye_eve\",\"gossip_girl\",\"helper_npc\"],\"observations\":\"Your personal phone with some interesting contacts\"},{\"type\":\"workstation\",\"name\":\"Crypto Analysis Station\",\"takeable\":true,\"observations\":\"A powerful workstation for cryptographic analysis\"},{\"type\":\"lockpick\",\"name\":\"Lock Pick Kit\",\"takeable\":true,\"observations\":\"A professional lock picking kit with various picks and tension wrenches\"}],\"rooms\":{\"reception\":{\"type\":\"room_reception\",\"connections\":{\"north\":\"office1\"},\"npcs\":[{\"id\":\"neye_eve\",\"displayName\":\"Neye Eve\",\"storyPath\":\"scenarios/ink/neye-eve.json\",\"avatar\":\"assets/npc/avatars/npc_adversary.png\",\"phoneId\":\"player_phone\",\"currentKnot\":\"start\",\"npcType\":\"phone\"},{\"id\":\"gossip_girl\",\"displayName\":\"Gossip Girl\",\"storyPath\":\"scenarios/ink/gossip-girl.json\",\"avatar\":\"assets/npc/avatars/npc_neutral.png\",\"phoneId\":\"player_phone\",\"currentKnot\":\"start\",\"npcType\":\"phone\",\"timedMessages\":[{\"delay\":5000,\"message\":\"Hey! 👋 Got any juicy gossip for me today?\",\"type\":\"text\"}]},{\"id\":\"helper_npc\",\"displayName\":\"Helpful Contact\",\"storyPath\":\"scenarios/ink/helper-npc.json\",\"avatar\":\"assets/npc/avatars/npc_helper.png\",\"phoneId\":\"player_phone\",\"currentKnot\":\"start\",\"npcType\":\"phone\",\"eventMappings\":[{\"eventPattern\":\"item_picked_up:lockpick\",\"targetKnot\":\"on_lockpick_pickup\",\"onceOnly\":true,\"cooldown\":0},{\"eventPattern\":\"minigame_completed\",\"targetKnot\":\"on_lockpick_success\",\"condition\":\"data.minigameName && data.minigameName.includes('Lockpick')\",\"cooldown\":10000},{\"eventPattern\":\"minigame_failed\",\"targetKnot\":\"on_lockpick_failed\",\"condition\":\"data.minigameName && data.minigameName.includes('Lockpick')\",\"cooldown\":15000},{\"eventPattern\":\"door_unlocked\",\"targetKnot\":\"on_door_unlocked\",\"cooldown\":8000},{\"eventPattern\":\"door_unlock_attempt\",\"targetKnot\":\"on_door_attempt\",\"cooldown\":12000},{\"eventPattern\":\"object_interacted\",\"targetKnot\":\"on_ceo_desk_interact\",\"condition\":\"data.objectType === 'desk_ceo'\",\"cooldown\":10000},{\"eventPattern\":\"item_picked_up:*\",\"targetKnot\":\"on_item_found\",\"cooldown\":20000},{\"eventPattern\":\"room_entered\",\"targetKnot\":\"on_room_entered\",\"cooldown\":45000,\"maxTriggers\":3},{\"eventPattern\":\"room_discovered\",\"targetKnot\":\"on_room_discovered\",\"cooldown\":15000,\"maxTriggers\":5},{\"eventPattern\":\"room_entered:ceo\",\"targetKnot\":\"on_ceo_office_entered\",\"onceOnly\":true}]}],\"objects\":[{\"type\":\"phone\",\"name\":\"Reception Phone\",\"takeable\":false,\"readable\":true,\"voice\":\"Hi, this is the IT Team. Security breach detected in server room. Changed access code to 4829.\",\"sender\":\"IT Team\",\"timestamp\":\"2:15 AM\",\"observations\":\"The reception phone's message light is blinking urgently\"},{\"type\":\"notes\",\"name\":\"Security Log\",\"takeable\":true,\"readable\":true,\"text\":\"Unusual after-hours access detected:\\n- CEO office: 11:30 PM\\n- Server room: 2:15 AM\\n- CEO office again: 3:45 AM\",\"observations\":\"A concerning security log from last night\"},{\"type\":\"pc\",\"name\":\"Reception Computer\",\"takeable\":false,\"lockType\":\"password\",\"passwordHint\":\"Optional hint text\",\"showHint\":true,\"showKeyboard\":true,\"maxAttempts\":3,\"locked\":true,\"requires\":\"secret123\",\"observations\":\"The reception's computer, currently locked\",\"postitNote\":\"Password: secret123\",\"showPostit\":true,\"contents\":[{\"type\":\"text_file\",\"name\":\"Private\",\"takeable\":false,\"readable\":true,\"text\":\"Closet keypad code: 7391 - Must move evidence to safe before audit\"}]},{\"type\":\"tablet\",\"name\":\"Tablet Device\",\"takeable\":true,\"locked\":true,\"lockType\":\"bluetooth\",\"requires\":\"bluetooth\",\"mac\":\"00:11:22:33:44:55\",\"observations\":\"A locked tablet device that requires Bluetooth pairing\"},{\"type\":\"bluetooth_scanner\",\"name\":\"Bluetooth Scanner\",\"takeable\":true,\"observations\":\"A device for detecting nearby Bluetooth signals\",\"canScanBluetooth\":true},{\"type\":\"key\",\"name\":\"Office Key\",\"takeable\":true,\"key_id\":\"office1_key\",\"keyPins\":[100,0,100,0],\"observations\":\"A key to access the office areas\"},{\"type\":\"pin-cracker\",\"name\":\"PIN Cracker\",\"takeable\":true,\"observations\":\"A sophisticated device that can analyze PIN entry patterns and provide feedback on attempts\"},{\"type\":\"safe\",\"name\":\"Reception Safe\",\"takeable\":false,\"locked\":true,\"lockType\":\"pin\",\"requires\":\"9573\",\"observations\":\"A small wall safe behind the reception desk. Looks like it needs a 4-digit code.\",\"contents\":[{\"type\":\"notes\",\"name\":\"IT Access Credentials\",\"takeable\":true,\"readable\":true,\"text\":\"Emergency IT Admin Credentials:\\nUsername: admin\\nPassword: ITsecure2024\\n\\nServer Room Backup Code: 4829\\nCEO Office Alarm Override: 1337\",\"observations\":\"Sensitive IT credentials that could be very useful\"}]}]},\"office1\":{\"type\":\"room_office\",\"locked\":true,\"lockType\":\"key\",\"requires\":\"office1_key\",\"keyPins\":[100,0,100,0],\"difficulty\":\"easy\",\"door_sign\":\"4A Hot Desks\",\"connections\":{\"north\":[\"office2\",\"office3\"],\"south\":\"reception\"},\"objects\":[{\"type\":\"pc\",\"name\":\"Office Computer\",\"takeable\":false,\"requires\":\"password\",\"hasFingerprint\":true,\"fingerprintOwner\":\"ceo\",\"fingerprintDifficulty\":\"medium\",\"observations\":\"A computer with a cybersecurity alert on screen. There might be fingerprints on the keyboard.\"},{\"type\":\"notes\",\"name\":\"IT Memo\",\"takeable\":true,\"readable\":true,\"text\":\"URGENT: Multiple unauthorized access attempts detected from CEO's office IP address\",\"observations\":\"A concerning IT department memo\"},{\"type\":\"fingerprint_kit\",\"name\":\"Fingerprint Kit\",\"takeable\":true,\"observations\":\"A kit used for collecting fingerprints from surfaces\"}]},\"office2\":{\"type\":\"room_office\",\"connections\":{\"north\":\"ceo\",\"south\":\"office1\"},\"objects\":[{\"type\":\"pc\",\"name\":\"Office Computer\",\"takeable\":false,\"lockType\":\"password\",\"requires\":\"office2024\",\"showKeyboard\":true,\"maxAttempts\":3,\"locked\":true,\"postitNote\":\"Password: office2024\",\"showPostit\":true,\"observations\":\"A standard office computer with a sticky note on the monitor\"},{\"type\":\"notes\",\"name\":\"Shredded Document\",\"takeable\":true,\"readable\":true,\"text\":\"Partially readable: '...offshore account...transfer complete...delete all traces...'\",\"observations\":\"A partially shredded document that someone failed to dispose of properly\"},{\"type\":\"key\",\"name\":\"CEO Office Key\",\"takeable\":true,\"key_id\":\"ceo_office_key\",\"keyPins\":[0,50,100,150],\"observations\":\"A spare key to the CEO's office, carelessly left behind\"}]},\"office3\":{\"type\":\"room_office\",\"connections\":{\"north\":\"server1\",\"south\":\"office1\"},\"objects\":[{\"type\":\"pc\",\"name\":\"IT Staff Computer\",\"takeable\":false,\"requires\":\"bluetooth\",\"lockType\":\"bluetooth\",\"mac\":\"00:11:22:33:44:55\",\"observations\":\"An IT staff computer showing network security logs\"},{\"type\":\"notes\",\"name\":\"Network Logs\",\"takeable\":true,\"readable\":true,\"text\":\"Large data transfers detected to unknown external IPs - All originating from CEO's office\",\"observations\":\"Suspicious network activity logs\"}]},\"ceo\":{\"type\":\"room_ceo\",\"connections\":{\"north\":\"closet\",\"south\":\"office2\"},\"locked\":true,\"lockType\":\"key\",\"requires\":\"ceo_office_key\",\"keyPins\":[0,50,100,150],\"difficulty\":\"easy\",\"objects\":[{\"type\":\"pc\",\"name\":\"CEO Computer\",\"takeable\":false,\"lockType\":\"password\",\"requires\":\"ceo2024\",\"showKeyboard\":true,\"maxAttempts\":3,\"locked\":true,\"postitNote\":\"Password: ceo2024\",\"showPostit\":true,\"observations\":\"The CEO's laptop, still warm - recently used. A sticky note is attached to the screen.\"},{\"type\":\"suitcase\",\"name\":\"CEO Briefcase\",\"takeable\":false,\"locked\":true,\"lockType\":\"key\",\"requires\":\"briefcase_key\",\"keyPins\":[50,25,0,75],\"difficulty\":\"medium\",\"observations\":\"An expensive leather briefcase with a sturdy lock\",\"contents\":[{\"type\":\"notes\",\"name\":\"Private Note\",\"takeable\":true,\"readable\":true,\"text\":\"Closet keypad code: 7391 - Must move evidence to safe before audit\",\"observations\":\"A hastily written note on expensive paper\"},{\"type\":\"key\",\"name\":\"Safe Key\",\"takeable\":true,\"key_id\":\"safe_key\",\"keyPins\":[68,10,48,30],\"observations\":\"A heavy-duty safe key hidden behind server equipment\"}]},{\"type\":\"phone\",\"name\":\"CEO Phone\",\"takeable\":false,\"readable\":true,\"text\":\"Recent calls: 'Offshore Bank', 'Unknown', 'Data Buyer'\",\"sender\":\"Call Log\",\"timestamp\":\"Last 24 hours\",\"observations\":\"The CEO's phone shows suspicious recent calls\"}]},\"closet\":{\"type\":\"room_closet\",\"connections\":{\"south\":\"ceo\"},\"locked\":true,\"lockType\":\"pin\",\"requires\":\"7391\",\"objects\":[{\"type\":\"safe\",\"name\":\"Hidden Safe\",\"takeable\":false,\"locked\":true,\"lockType\":\"key\",\"requires\":\"safe_key\",\"keyPins\":[68,10,48,30],\"difficulty\":\"hard\",\"observations\":\"A well-hidden wall safe behind a painting\",\"contents\":[{\"type\":\"notes\",\"name\":\"Incriminating Documents\",\"takeable\":true,\"readable\":true,\"text\":\"Contract for sale of proprietary technology\\nBank transfers from competing companies\\nDetails of upcoming corporate espionage operations\",\"observations\":\"A folder containing damning evidence of corporate espionage. Congratulations! You've recovered the incriminating documents. flag{ceo_exfil_flag}\"}]}]},\"server1\":{\"type\":\"room_servers\",\"connections\":{\"south\":\"office3\"},\"locked\":true,\"lockType\":\"pin\",\"requires\":\"4829\",\"objects\":[{\"type\":\"pc\",\"name\":\"Server Terminal\",\"takeable\":false,\"observations\":\"The main server terminal showing massive data exfiltration\"},{\"type\":\"key\",\"name\":\"Briefcase Key\",\"takeable\":true,\"key_id\":\"briefcase_key\",\"keyPins\":[50,25,0,75],\"observations\":\"A small key labeled 'Personal - Do Not Copy'\"}]}}}"], ["score", 0], ["started_at", "2025-11-20 18:00:26.217706"], ["status", "in_progress"], ["updated_at", "2025-11-20 18:00:26.215875"]]
TRANSACTION (0.1ms) RELEASE SAVEPOINT active_record_1
TRANSACTION (0.1ms) SAVEPOINT active_record_1
BreakEscape::Game Update (0.3ms) UPDATE "break_escape_games" SET "player_state" = ?, "updated_at" = ? WHERE "break_escape_games"."id" = ? [["player_state", "{\"currentRoom\":\"reception\",\"unlockedRooms\":[\"reception\"],\"unlockedObjects\":[],\"inventory\":[],\"encounteredNPCs\":[],\"globalVariables\":{},\"biometricSamples\":[],\"biometricUnlocks\":[],\"bluetoothDevices\":[],\"notes\":[],\"health\":50}"], ["updated_at", "2025-11-20 18:00:26.219691"], ["id", 1]]
TRANSACTION (0.0ms) RELEASE SAVEPOINT active_record_1
TRANSACTION (0.0ms) ROLLBACK TRANSACTION
TRANSACTION (0.1ms) BEGIN deferred TRANSACTION
-----------------------------------------------------------------
BreakEscape::GameTest: test_should_clamp_health_between_0_and_100
-----------------------------------------------------------------
BreakEscape::Mission Load (0.1ms) SELECT "break_escape_missions".* FROM "break_escape_missions" WHERE "break_escape_missions"."id" = ? LIMIT ? [["id", 418560898], ["LIMIT", 1]]
BreakEscape::DemoUser Load (0.1ms) SELECT "break_escape_demo_users".* FROM "break_escape_demo_users" WHERE "break_escape_demo_users"."id" = ? LIMIT ? [["id", 149617800], ["LIMIT", 1]]
TRANSACTION (0.1ms) SAVEPOINT active_record_1
BreakEscape::Game Create (0.6ms) INSERT INTO "break_escape_games" ("completed_at", "created_at", "mission_id", "player_id", "player_state", "player_type", "scenario_data", "score", "started_at", "status", "updated_at") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) RETURNING "id" [["completed_at", nil], ["created_at", "2025-11-20 18:00:26.222335"], ["mission_id", 418560898], ["player_id", 149617800], ["player_state", "{\"currentRoom\":\"reception\",\"unlockedRooms\":[\"reception\"],\"unlockedObjects\":[],\"inventory\":[],\"encounteredNPCs\":[],\"globalVariables\":{},\"biometricSamples\":[],\"biometricUnlocks\":[],\"bluetoothDevices\":[],\"notes\":[],\"health\":100}"], ["player_type", "BreakEscape::DemoUser"], ["scenario_data", "{\"scenario_brief\":\"Hi! You are a cyber investigator tasked with uncovering evidence of corporate espionage. Anonymous tips suggest the CEO has been selling company secrets, but you need proof.\",\"startRoom\":\"reception\",\"startItemsInInventory\":[{\"type\":\"phone\",\"name\":\"Your Phone\",\"takeable\":true,\"phoneId\":\"player_phone\",\"npcIds\":[\"neye_eve\",\"gossip_girl\",\"helper_npc\"],\"observations\":\"Your personal phone with some interesting contacts\"},{\"type\":\"workstation\",\"name\":\"Crypto Analysis Station\",\"takeable\":true,\"observations\":\"A powerful workstation for cryptographic analysis\"},{\"type\":\"lockpick\",\"name\":\"Lock Pick Kit\",\"takeable\":true,\"observations\":\"A professional lock picking kit with various picks and tension wrenches\"}],\"rooms\":{\"reception\":{\"type\":\"room_reception\",\"connections\":{\"north\":\"office1\"},\"npcs\":[{\"id\":\"neye_eve\",\"displayName\":\"Neye Eve\",\"storyPath\":\"scenarios/ink/neye-eve.json\",\"avatar\":\"assets/npc/avatars/npc_adversary.png\",\"phoneId\":\"player_phone\",\"currentKnot\":\"start\",\"npcType\":\"phone\"},{\"id\":\"gossip_girl\",\"displayName\":\"Gossip Girl\",\"storyPath\":\"scenarios/ink/gossip-girl.json\",\"avatar\":\"assets/npc/avatars/npc_neutral.png\",\"phoneId\":\"player_phone\",\"currentKnot\":\"start\",\"npcType\":\"phone\",\"timedMessages\":[{\"delay\":5000,\"message\":\"Hey! 👋 Got any juicy gossip for me today?\",\"type\":\"text\"}]},{\"id\":\"helper_npc\",\"displayName\":\"Helpful Contact\",\"storyPath\":\"scenarios/ink/helper-npc.json\",\"avatar\":\"assets/npc/avatars/npc_helper.png\",\"phoneId\":\"player_phone\",\"currentKnot\":\"start\",\"npcType\":\"phone\",\"eventMappings\":[{\"eventPattern\":\"item_picked_up:lockpick\",\"targetKnot\":\"on_lockpick_pickup\",\"onceOnly\":true,\"cooldown\":0},{\"eventPattern\":\"minigame_completed\",\"targetKnot\":\"on_lockpick_success\",\"condition\":\"data.minigameName && data.minigameName.includes('Lockpick')\",\"cooldown\":10000},{\"eventPattern\":\"minigame_failed\",\"targetKnot\":\"on_lockpick_failed\",\"condition\":\"data.minigameName && data.minigameName.includes('Lockpick')\",\"cooldown\":15000},{\"eventPattern\":\"door_unlocked\",\"targetKnot\":\"on_door_unlocked\",\"cooldown\":8000},{\"eventPattern\":\"door_unlock_attempt\",\"targetKnot\":\"on_door_attempt\",\"cooldown\":12000},{\"eventPattern\":\"object_interacted\",\"targetKnot\":\"on_ceo_desk_interact\",\"condition\":\"data.objectType === 'desk_ceo'\",\"cooldown\":10000},{\"eventPattern\":\"item_picked_up:*\",\"targetKnot\":\"on_item_found\",\"cooldown\":20000},{\"eventPattern\":\"room_entered\",\"targetKnot\":\"on_room_entered\",\"cooldown\":45000,\"maxTriggers\":3},{\"eventPattern\":\"room_discovered\",\"targetKnot\":\"on_room_discovered\",\"cooldown\":15000,\"maxTriggers\":5},{\"eventPattern\":\"room_entered:ceo\",\"targetKnot\":\"on_ceo_office_entered\",\"onceOnly\":true}]}],\"objects\":[{\"type\":\"phone\",\"name\":\"Reception Phone\",\"takeable\":false,\"readable\":true,\"voice\":\"Hi, this is the IT Team. Security breach detected in server room. Changed access code to 4829.\",\"sender\":\"IT Team\",\"timestamp\":\"2:15 AM\",\"observations\":\"The reception phone's message light is blinking urgently\"},{\"type\":\"notes\",\"name\":\"Security Log\",\"takeable\":true,\"readable\":true,\"text\":\"Unusual after-hours access detected:\\n- CEO office: 11:30 PM\\n- Server room: 2:15 AM\\n- CEO office again: 3:45 AM\",\"observations\":\"A concerning security log from last night\"},{\"type\":\"pc\",\"name\":\"Reception Computer\",\"takeable\":false,\"lockType\":\"password\",\"passwordHint\":\"Optional hint text\",\"showHint\":true,\"showKeyboard\":true,\"maxAttempts\":3,\"locked\":true,\"requires\":\"secret123\",\"observations\":\"The reception's computer, currently locked\",\"postitNote\":\"Password: secret123\",\"showPostit\":true,\"contents\":[{\"type\":\"text_file\",\"name\":\"Private\",\"takeable\":false,\"readable\":true,\"text\":\"Closet keypad code: 7391 - Must move evidence to safe before audit\"}]},{\"type\":\"tablet\",\"name\":\"Tablet Device\",\"takeable\":true,\"locked\":true,\"lockType\":\"bluetooth\",\"requires\":\"bluetooth\",\"mac\":\"00:11:22:33:44:55\",\"observations\":\"A locked tablet device that requires Bluetooth pairing\"},{\"type\":\"bluetooth_scanner\",\"name\":\"Bluetooth Scanner\",\"takeable\":true,\"observations\":\"A device for detecting nearby Bluetooth signals\",\"canScanBluetooth\":true},{\"type\":\"key\",\"name\":\"Office Key\",\"takeable\":true,\"key_id\":\"office1_key\",\"keyPins\":[100,0,100,0],\"observations\":\"A key to access the office areas\"},{\"type\":\"pin-cracker\",\"name\":\"PIN Cracker\",\"takeable\":true,\"observations\":\"A sophisticated device that can analyze PIN entry patterns and provide feedback on attempts\"},{\"type\":\"safe\",\"name\":\"Reception Safe\",\"takeable\":false,\"locked\":true,\"lockType\":\"pin\",\"requires\":\"9573\",\"observations\":\"A small wall safe behind the reception desk. Looks like it needs a 4-digit code.\",\"contents\":[{\"type\":\"notes\",\"name\":\"IT Access Credentials\",\"takeable\":true,\"readable\":true,\"text\":\"Emergency IT Admin Credentials:\\nUsername: admin\\nPassword: ITsecure2024\\n\\nServer Room Backup Code: 4829\\nCEO Office Alarm Override: 1337\",\"observations\":\"Sensitive IT credentials that could be very useful\"}]}]},\"office1\":{\"type\":\"room_office\",\"locked\":true,\"lockType\":\"key\",\"requires\":\"office1_key\",\"keyPins\":[100,0,100,0],\"difficulty\":\"easy\",\"door_sign\":\"4A Hot Desks\",\"connections\":{\"north\":[\"office2\",\"office3\"],\"south\":\"reception\"},\"objects\":[{\"type\":\"pc\",\"name\":\"Office Computer\",\"takeable\":false,\"requires\":\"password\",\"hasFingerprint\":true,\"fingerprintOwner\":\"ceo\",\"fingerprintDifficulty\":\"medium\",\"observations\":\"A computer with a cybersecurity alert on screen. There might be fingerprints on the keyboard.\"},{\"type\":\"notes\",\"name\":\"IT Memo\",\"takeable\":true,\"readable\":true,\"text\":\"URGENT: Multiple unauthorized access attempts detected from CEO's office IP address\",\"observations\":\"A concerning IT department memo\"},{\"type\":\"fingerprint_kit\",\"name\":\"Fingerprint Kit\",\"takeable\":true,\"observations\":\"A kit used for collecting fingerprints from surfaces\"}]},\"office2\":{\"type\":\"room_office\",\"connections\":{\"north\":\"ceo\",\"south\":\"office1\"},\"objects\":[{\"type\":\"pc\",\"name\":\"Office Computer\",\"takeable\":false,\"lockType\":\"password\",\"requires\":\"office2024\",\"showKeyboard\":true,\"maxAttempts\":3,\"locked\":true,\"postitNote\":\"Password: office2024\",\"showPostit\":true,\"observations\":\"A standard office computer with a sticky note on the monitor\"},{\"type\":\"notes\",\"name\":\"Shredded Document\",\"takeable\":true,\"readable\":true,\"text\":\"Partially readable: '...offshore account...transfer complete...delete all traces...'\",\"observations\":\"A partially shredded document that someone failed to dispose of properly\"},{\"type\":\"key\",\"name\":\"CEO Office Key\",\"takeable\":true,\"key_id\":\"ceo_office_key\",\"keyPins\":[0,50,100,150],\"observations\":\"A spare key to the CEO's office, carelessly left behind\"}]},\"office3\":{\"type\":\"room_office\",\"connections\":{\"north\":\"server1\",\"south\":\"office1\"},\"objects\":[{\"type\":\"pc\",\"name\":\"IT Staff Computer\",\"takeable\":false,\"requires\":\"bluetooth\",\"lockType\":\"bluetooth\",\"mac\":\"00:11:22:33:44:55\",\"observations\":\"An IT staff computer showing network security logs\"},{\"type\":\"notes\",\"name\":\"Network Logs\",\"takeable\":true,\"readable\":true,\"text\":\"Large data transfers detected to unknown external IPs - All originating from CEO's office\",\"observations\":\"Suspicious network activity logs\"}]},\"ceo\":{\"type\":\"room_ceo\",\"connections\":{\"north\":\"closet\",\"south\":\"office2\"},\"locked\":true,\"lockType\":\"key\",\"requires\":\"ceo_office_key\",\"keyPins\":[0,50,100,150],\"difficulty\":\"easy\",\"objects\":[{\"type\":\"pc\",\"name\":\"CEO Computer\",\"takeable\":false,\"lockType\":\"password\",\"requires\":\"ceo2024\",\"showKeyboard\":true,\"maxAttempts\":3,\"locked\":true,\"postitNote\":\"Password: ceo2024\",\"showPostit\":true,\"observations\":\"The CEO's laptop, still warm - recently used. A sticky note is attached to the screen.\"},{\"type\":\"suitcase\",\"name\":\"CEO Briefcase\",\"takeable\":false,\"locked\":true,\"lockType\":\"key\",\"requires\":\"briefcase_key\",\"keyPins\":[50,25,0,75],\"difficulty\":\"medium\",\"observations\":\"An expensive leather briefcase with a sturdy lock\",\"contents\":[{\"type\":\"notes\",\"name\":\"Private Note\",\"takeable\":true,\"readable\":true,\"text\":\"Closet keypad code: 7391 - Must move evidence to safe before audit\",\"observations\":\"A hastily written note on expensive paper\"},{\"type\":\"key\",\"name\":\"Safe Key\",\"takeable\":true,\"key_id\":\"safe_key\",\"keyPins\":[68,10,48,30],\"observations\":\"A heavy-duty safe key hidden behind server equipment\"}]},{\"type\":\"phone\",\"name\":\"CEO Phone\",\"takeable\":false,\"readable\":true,\"text\":\"Recent calls: 'Offshore Bank', 'Unknown', 'Data Buyer'\",\"sender\":\"Call Log\",\"timestamp\":\"Last 24 hours\",\"observations\":\"The CEO's phone shows suspicious recent calls\"}]},\"closet\":{\"type\":\"room_closet\",\"connections\":{\"south\":\"ceo\"},\"locked\":true,\"lockType\":\"pin\",\"requires\":\"7391\",\"objects\":[{\"type\":\"safe\",\"name\":\"Hidden Safe\",\"takeable\":false,\"locked\":true,\"lockType\":\"key\",\"requires\":\"safe_key\",\"keyPins\":[68,10,48,30],\"difficulty\":\"hard\",\"observations\":\"A well-hidden wall safe behind a painting\",\"contents\":[{\"type\":\"notes\",\"name\":\"Incriminating Documents\",\"takeable\":true,\"readable\":true,\"text\":\"Contract for sale of proprietary technology\\nBank transfers from competing companies\\nDetails of upcoming corporate espionage operations\",\"observations\":\"A folder containing damning evidence of corporate espionage. Congratulations! You've recovered the incriminating documents. flag{ceo_exfil_flag}\"}]}]},\"server1\":{\"type\":\"room_servers\",\"connections\":{\"south\":\"office3\"},\"locked\":true,\"lockType\":\"pin\",\"requires\":\"4829\",\"objects\":[{\"type\":\"pc\",\"name\":\"Server Terminal\",\"takeable\":false,\"observations\":\"The main server terminal showing massive data exfiltration\"},{\"type\":\"key\",\"name\":\"Briefcase Key\",\"takeable\":true,\"key_id\":\"briefcase_key\",\"keyPins\":[50,25,0,75],\"observations\":\"A small key labeled 'Personal - Do Not Copy'\"}]}}}"], ["score", 0], ["started_at", "2025-11-20 18:00:26.223912"], ["status", "in_progress"], ["updated_at", "2025-11-20 18:00:26.222335"]]
TRANSACTION (0.1ms) RELEASE SAVEPOINT active_record_1
TRANSACTION (0.1ms) SAVEPOINT active_record_1
BreakEscape::Game Update (0.3ms) UPDATE "break_escape_games" SET "player_state" = ?, "updated_at" = ? WHERE "break_escape_games"."id" = ? [["player_state", "{\"currentRoom\":\"reception\",\"unlockedRooms\":[\"reception\"],\"unlockedObjects\":[],\"inventory\":[],\"encounteredNPCs\":[],\"globalVariables\":{},\"biometricSamples\":[],\"biometricUnlocks\":[],\"bluetoothDevices\":[],\"notes\":[],\"health\":0}"], ["updated_at", "2025-11-20 18:00:26.227047"], ["id", 1]]
TRANSACTION (0.1ms) RELEASE SAVEPOINT active_record_1
TRANSACTION (0.1ms) ROLLBACK TRANSACTION