Skip to content
Open

. #36

Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
1311 commits
Select commit Hold shift + click to select a range
edc0455
Update healthcare scenario and dungeon graph with new NPC interaction…
cliffe Apr 19, 2026
a68384b
Add start node functionality to dungeon graph and scenario configuration
cliffe Apr 19, 2026
faf097a
Add new MP3 files to TTS cache for healthcare module
cliffe Apr 19, 2026
410e074
Enhance NPC Helen's dialogue and logic for ICO and NCSC notifications
cliffe Apr 19, 2026
4e25662
Update healthcare scenario to include NCSC notification task and adju…
cliffe Apr 19, 2026
a7b9e8f
Update NPC Sarah's dialogue and conditions for initial actions in res…
cliffe Apr 19, 2026
08bdc15
Update NPC Pharmacist's dialogue and conditions for incident response…
cliffe Apr 19, 2026
2c64c96
Enhance NPC Sarah's dialogue for drug library override and update NPC…
cliffe Apr 19, 2026
22c6aba
Add new audio files for healthcare scenario in TTS cache
cliffe Apr 19, 2026
3db407d
Merge branch 'main' into vm-02-access-log
cliffe Apr 19, 2026
c19feea
Merge pull request #68 from alihussain6692/vm-02-access-log
cliffe Apr 19, 2026
e71141d
Merge branch 'main' into vm-01-scada-historian
cliffe Apr 20, 2026
c9a4825
Merge pull request #70 from alihussain6692/vm-01-scada-historian
cliffe Apr 20, 2026
9f44a92
feat: Enhance NPC interaction and debriefing flow for Dr Priya Sharma
cliffe Apr 20, 2026
48ef8ff
feat: Update NPC names for consistency and clarity in dialogue
cliffe Apr 20, 2026
f3c8af4
Add observations for NPCs in healthcare scenario
cliffe Apr 20, 2026
f9ff0b2
Add new MP3 files to TTS cache for healthcare module
cliffe Apr 20, 2026
ab5a2f1
feat: Enhance Ink text validation and NPC bark handling during conver…
cliffe Apr 20, 2026
0ae135a
feat: Improve bark processing to ensure TTS audio and visual display …
cliffe Apr 21, 2026
66f18ff
feat: Add new MP3 files to TTS cache for healthcare module
cliffe Apr 21, 2026
c867b43
Enhance NPC Helen's dialogue and logic for backup recovery process
cliffe Apr 21, 2026
869ce60
feat: Add scenario design review and validation skills for enhanced s…
cliffe Apr 21, 2026
1895264
feat: Update dungeon graph and scenario schema for NPC interactions a…
cliffe Apr 21, 2026
4a302da
Add multiple new audio files to healthcare TTS cache
cliffe Apr 21, 2026
afd34ac
feat(minigame): add warranty compliance checklist for sis03_insurance
alixthegreat Apr 23, 2026
1c2e7db
feat(mg-05): Coverage Decision Form minigame for sis03_cyber_insurance
alihussain6692 Apr 23, 2026
6fad9c2
Add new nurse character assets and update scenario tasks
cliffe Apr 24, 2026
1a7319b
feat: Update scenario.json.erb with implemented minigames and remove …
cliffe Apr 24, 2026
06de3b2
Add task completion for contacting CastleTech in Tom Hadley's dialogue
cliffe Apr 24, 2026
3ff355f
Add player sprite and unlock conditions for tasks in SIS02 energy sce…
cliffe Apr 24, 2026
ac83da7
feat: Add music events and win condition fixes to scenario.json.erb a…
cliffe Apr 24, 2026
2489a5a
feat: Update scenario.json.erb to implement compound condition for fa…
cliffe Apr 24, 2026
8027933
feat: add Plant Room Access Badge to Priya's itemsHeld for Battery Ha…
cliffe Apr 24, 2026
838cdf8
Merge pull request #71 from alixthegreat/warranty-compliance-checklist
cliffe Apr 24, 2026
13061c3
Merge branch 'main' into mg-05-coverage-decision
cliffe Apr 24, 2026
9767d61
Merge pull request #72 from alihussain6692/mg-05-coverage-decision
cliffe Apr 24, 2026
de70306
Refactor scenario.json.erb for SIS03 Cyber Insurance:
cliffe Apr 24, 2026
c8f5468
Refactor scenario.json.erb: Update global variables and unlock condit…
cliffe Apr 24, 2026
3486c72
feat: update coverage decision options and Trent Water assessment logic
cliffe Apr 24, 2026
9190fc8
feat: trigger game-wide event on global variable change in NPC conver…
cliffe Apr 24, 2026
9af9e9a
Enhance SIS03 Cyber Insurance Scenario: Update NPC dialogue trees, un…
cliffe Apr 24, 2026
8d46dd5
feat: add TODO documentation for SIS03 Cyber Insurance scenario and u…
cliffe Apr 24, 2026
b6e7964
Enhance scenario.json.erb with additional forensic evidence details a…
cliffe Apr 24, 2026
35d8302
Refactor network segmentation map: make it fully scenario-driven
alixthegreat Apr 24, 2026
e9626f0
Refactor network architecture diagram: make it fully scenario driven
alixthegreat Apr 24, 2026
c55a809
Enhance SIS02 Energy Scenario: Update Room Configurations and Add New…
cliffe Apr 25, 2026
a23b19e
Refactor code structure for improved readability and maintainability
cliffe Apr 25, 2026
711dcd6
Refactor forensic data platform: make it fully scenario driven
alixthegreat Apr 25, 2026
40390c8
Refactor ESD pushbutton: make it fully scenario-driven
alixthegreat Apr 25, 2026
5ae3775
Refactor ESD pushbutton starter: remove field enumeration
alixthegreat Apr 25, 2026
efa18e3
Add new MP3 files to the TTS cache
cliffe Apr 25, 2026
4177fda
Refactor NPC Sarah dialogue and scenario JSON for clarity and accuracy
cliffe Apr 25, 2026
d1e3056
Enhance network isolation event definitions with authorized and bypas…
cliffe Apr 25, 2026
af2c0b4
Update Albion Battery Hall scenario details and enhance observation h…
cliffe Apr 26, 2026
2173c80
Enhance cyber insurance scenario with claim synthesis and coverage logic
cliffe Apr 26, 2026
222c2b7
Refactor alarm panel: make it fully scenario-driven
alixthegreat Apr 26, 2026
5d44e3d
Refactor NCSC brief: make it fully scenario-driven
alixthegreat Apr 26, 2026
367f023
Refactor coverage decision form: make it fully scenario-driven
alixthegreat Apr 26, 2026
c8b079b
Restyle warranty checklist to match FDP and coverage form
alixthegreat Apr 26, 2026
2189dc6
Add dungeon graph for sis01_healthcare scenario
cliffe Apr 27, 2026
d8e9988
Refactor scenario JSON handling and validation
cliffe Apr 27, 2026
bebfd03
Add new MP3 files for sis02_energy scenario
cliffe Apr 27, 2026
bc174d3
Refactor code structure for improved readability and maintainability
cliffe Apr 27, 2026
81bcd21
Add new MP3 files for sis02_energy scenario
cliffe Apr 27, 2026
0ccf6bf
Enhance scenario interactions and validation checks
cliffe Apr 27, 2026
a60bd9b
Update NPC dialogue for clearer navigation instructions in Albion Bat…
cliffe Apr 27, 2026
a910b0e
Add new MP3 files for sis02_energy scenario
cliffe Apr 27, 2026
3386b5b
Refactor scenario.json.erb: Update note type and remove unused laptop…
cliffe Apr 28, 2026
d3043b5
Adjust object positions in room_control_1x2gu.json and room_control_1…
cliffe Apr 28, 2026
4408bfe
Refactor scenario.json.erb: Update character sprites, remove ambient …
cliffe Apr 28, 2026
514e4f1
Add new MP3 files for sis01_healthcare and sis02_energy scenarios
cliffe Apr 28, 2026
5faf05a
Merge branch 'main' into refactor-minigames
cliffe Apr 28, 2026
85fe0b2
Merge pull request #74 from alixthegreat/refactor-minigames
cliffe Apr 28, 2026
9c76637
Add new MP3 files for sis02_energy scenario
cliffe Apr 28, 2026
9e1e8d2
Update scenario.json.erb to enhance task descriptions and notificatio…
cliffe Apr 28, 2026
d265b54
Enhance NPC interactions and scenario elements for SIS02 and SIS03
cliffe Apr 28, 2026
e6747f6
Add new MP3 files for sis02_energy scenario
cliffe Apr 28, 2026
54be8ee
Refactor minigame data structure and update related scenarios
cliffe Apr 28, 2026
1fdd135
Enhance interaction system with onInteract functionality and add conf…
cliffe Apr 28, 2026
c9329ff
Refactor NPC Tom Hadley interactions and scenario logic
cliffe Apr 29, 2026
0e69a2a
Refactor NPC dialogue and scenario details for clarity and consistency
cliffe Apr 29, 2026
e4b060c
Update task metrics and add confirmation task for SIS tamper report i…
cliffe Apr 29, 2026
b52e684
Add new audio files for sis02_energy scenario
cliffe Apr 29, 2026
87037de
Consolidate VPN log viewer into log-filter minigame; retire vpn-log-v…
alixthegreat Apr 29, 2026
927920c
energy scenario progress
cliffe Apr 29, 2026
c330575
Add new audio files for sis02_energy scenario
cliffe Apr 29, 2026
0f2a073
insurance scenario progress
cliffe Apr 30, 2026
48a764a
Add new audio files
cliffe Apr 30, 2026
2d68bd9
insurance scenario updates
cliffe Apr 30, 2026
94ee784
Update skill
cliffe Apr 30, 2026
0e6570d
scenario updates
cliffe Apr 30, 2026
f77d31c
scenario updates
cliffe Apr 30, 2026
74d1724
Refactor minigame scenario data
cliffe Apr 30, 2026
6617228
Enhance scenario design by adding support for 'as-type' positioning a…
cliffe Apr 30, 2026
3b218ab
Add lab sheet for SIS03 Cyber Insurance scenario detailing breach inv…
cliffe Apr 30, 2026
e9281f7
Refactor lab sheets for SIS02 and SIS03 scenarios: update titles, aut…
cliffe May 1, 2026
a39c257
Update NPC dialogue for dual-auth panel bypass in healthcare scenario…
cliffe May 1, 2026
84e4341
Merge branch 'main' into log-analysis-merge
alixthegreat May 1, 2026
80d1131
Update TTS model in BreakEscape service to use the latest version, wi…
cliffe May 1, 2026
8a80353
Add Shredded Document minigame
alixthegreat May 1, 2026
b86beb5
Add per-message typing indicator to phone NPC conversations
alixthegreat May 1, 2026
3b707a2
Revise Operation Shatter scenario details to enhance clarity on targe…
cliffe May 1, 2026
eda9fc4
feat(mg-06): Add network diagram pinboard to Evidence Archive for sis…
alihussain6692 Apr 24, 2026
74ad998
feat(mg-c): Combination Padlock minigame for BreakEscape
alihussain6692 Apr 29, 2026
791180a
feat(mg-u): Cryptex Scroll-Wheel Password minigame for BreakEscape
alihussain6692 May 1, 2026
e790866
Add new audio files to TTS cache for healthcare module
cliffe May 1, 2026
59b0d1f
Add Blockchain Transaction Explorer minigame
alixthegreat May 2, 2026
a99f3dd
Remove evidence text field from warranty checklist minigame
alixthegreat May 2, 2026
0de30b4
Reduce RAM use: Enhance music playback management by implementing a b…
cliffe May 3, 2026
05d9a45
Enhance audio management by integrating voice volume control into Mus…
cliffe May 3, 2026
4f1fb41
Update default audio volume settings in music configuration and widge…
cliffe May 3, 2026
c7bfd5b
Add BLE Scanner minigame
alixthegreat May 4, 2026
9b72e57
Rename Priya Chandra to Helen Marsh SIS02
alixthegreat May 5, 2026
f43834a
Rename David Osei to Simon Hartley SIS03
alixthegreat May 6, 2026
729c9d2
Merge pull request #73 from alihussain6692/mg-06-evidence-archive
cliffe May 6, 2026
4a44fda
Merge pull request #75 from alihussain6692/mg-c-combination-padlock
cliffe May 6, 2026
320f594
Merge pull request #76 from alixthegreat/log-analysis-merge
cliffe May 6, 2026
eedad6e
Merge pull request #79 from alixthegreat/npc-typing-indicators
cliffe May 6, 2026
5772113
Merge pull request #81 from alixthegreat/warranty-compliance-change
cliffe May 6, 2026
3df4315
Merge branch 'main' into mg-u-cryptex-clean
cliffe May 6, 2026
80ec3b7
Merge pull request #77 from alihussain6692/mg-u-cryptex-clean
cliffe May 6, 2026
d454f49
Merge branch 'main' into shredded-document
cliffe May 6, 2026
0005673
Merge pull request #78 from alixthegreat/shredded-document
cliffe May 6, 2026
69f3d79
Merge branch 'main' into blockchain-transactions-explorer
cliffe May 6, 2026
ed0ec58
Merge pull request #80 from alixthegreat/blockchain-transactions-expl…
cliffe May 6, 2026
dba5bdf
Merge pull request #82 from alixthegreat/ble-scanner
cliffe May 6, 2026
a3e533d
Rename Nalini Bashir to Priya Sharma; Fix Priya Sharma spawn
alixthegreat May 7, 2026
e3eaa40
Merge pull request #83 from alixthegreat/npc-naming
cliffe May 8, 2026
1c55aee
Fix cryptex unlock callback missing success handler and break
alixthegreat May 8, 2026
5bd5652
Add terminal theme to phone-chat minigame
alixthegreat May 8, 2026
cb657f3
Merge pull request #84 from alixthegreat/fix-cryptex-callback
cliffe May 9, 2026
a17425b
Merge pull request #85 from alixthegreat/phone-terminal-theme
cliffe May 9, 2026
712e7bf
Improve Mission 2: hospital ward patients, new NPCs, validator fixes
cliffe May 9, 2026
f94925b
Fix M02 scenario: unlock chains, task completions, narrative scaffolding
cliffe May 9, 2026
4a8b34b
Elevate M02 narrative: music, Ghost proactivity, marcus_protected cre…
cliffe May 9, 2026
42b5aaf
Add Ghost screen hijack arc and physical press terminal exposure deci…
cliffe May 9, 2026
70754f5
Rewrite Agent 0x99 phone ink to use gated variable hub
cliffe May 9, 2026
b406a02
Review and edit all M02 ink files for quality and integration
cliffe May 9, 2026
77eb0be
Apply M01 hub exit pattern to all M02 NPC conversations; remove dead …
cliffe May 9, 2026
4765af9
Integrate Ghost phone-terminal contact via planted IT department device
cliffe May 9, 2026
7ee360c
Consolidate all Ghost contact into terminal phone-chat; retire ghost_…
cliffe May 9, 2026
f91bd5d
Add spacebar hint to dialogue skip button
alixthegreat May 9, 2026
ce66f9b
Enhance dungeon graph and scenario design: update puzzle node counts,…
cliffe May 10, 2026
e0c77d8
Add new scenario "Mission 2: Ransomed Trust - Hospital Backup Server"
cliffe May 10, 2026
9cb0640
Merge pull request #86 from alixthegreat/dialogue-skip
cliffe May 11, 2026
da43cfc
Fix CI build for Ruby 2.7.8 compatibility
cliffe May 11, 2026
71782dd
Implement VM console access security: enforce room unlock checks and …
cliffe May 11, 2026
1f62f78
Remove gem version pins for Ruby 2.7.8 compatibility from Gemfile
cliffe May 12, 2026
0640188
Update sqlite3 gem version to 1.6.7 for compatibility
cliffe May 12, 2026
1960bc9
Refactor game index constraints: remove unique index and add non-uniq…
cliffe May 12, 2026
77d566c
Enhance HACKTIVITY integration: add asset serving configuration for p…
cliffe May 12, 2026
57df779
Clean up whitespace in generate_dungeon_graph.rb for improved readabi…
cliffe May 12, 2026
33815c0
feat: Add scoring totals and calculation methods to games
cliffe May 17, 2026
1bae98a
feat: thermometer sprite variants conditional on global variables for…
alihussain6692 May 17, 2026
726f9f6
Add GNF font to the project with @font-face declaration in fonts.css
cliffe May 17, 2026
52253e7
Enhance Rakefile: add detailed instructions for running tests in the …
cliffe May 17, 2026
8798257
feat: Remove constraint limiting players to one active game per mission
cliffe May 17, 2026
973b6a7
style: Remove bold font-weight from objectives title for improved aes…
cliffe May 17, 2026
28313fb
feat: Update password generation and hints in first contact scenario …
cliffe May 17, 2026
dcc3fb0
Improve Mission 2: hospital ward patients, new NPCs, validator fixes
cliffe May 18, 2026
5d381dc
Fix M02 scenario: unlock chains, task completions, narrative scaffolding
cliffe May 18, 2026
f49d4ac
Elevate M02 narrative: music, Ghost proactivity, marcus_protected cre…
cliffe May 18, 2026
866a0f2
Add Ghost screen hijack arc and physical press terminal exposure deci…
cliffe May 18, 2026
f6f88df
Rewrite Agent 0x99 phone ink to use gated variable hub
cliffe May 18, 2026
4187f0a
Review and edit all M02 ink files for quality and integration
cliffe May 18, 2026
c545526
Apply M01 hub exit pattern to all M02 NPC conversations; remove dead …
cliffe May 18, 2026
f590db5
Integrate Ghost phone-terminal contact via planted IT department device
cliffe May 18, 2026
9a8a72c
Consolidate all Ghost contact into terminal phone-chat; retire ghost_…
cliffe May 18, 2026
9c7f03a
Merge remote-tracking branch 'origin/main' into claude/improve-missio…
cliffe May 18, 2026
c443038
Merge pull request #89 from cliffe/claude/improve-mission-2-sRLUZ
cliffe May 18, 2026
0557e76
Add two minimal test scenarios for objective and VM flag testing
cliffe May 19, 2026
49182b1
Merge pull request #90 from cliffe/claude/add-test-scenarios-KwWyJ
cliffe May 19, 2026
2846bf8
Enhance VM panel functionality and user experience
cliffe May 19, 2026
c7c82e4
Add styled post-it note overlay to VM display
cliffe May 19, 2026
d9245aa
Implement VM Controls Widget with overlay functionality and integrati…
cliffe May 20, 2026
6810ada
Refine keywords in mission scenarios and update CyBOK structure for c…
cliffe May 20, 2026
94ce2a3
Update dependent option for game_slots association and clean up appli…
cliffe May 21, 2026
69ae105
Refactor game completion callback tests and update policy test for ad…
cliffe May 21, 2026
759f66a
Update gem dependencies, enhance test setup, and adjust migration ver…
cliffe May 21, 2026
3c727bd
Enhance mission authorization logic and add tests for mounted mode be…
cliffe May 21, 2026
c427b1e
Refactor API client to use getter functions for API_BASE and CSRF_TOK…
cliffe May 22, 2026
1bdc4b2
Refactor VM controls HUD button styles; adjust countdown positioning …
cliffe May 22, 2026
7006b00
Update HUD styles and enhance VM countdown functionality; adjust font…
cliffe May 23, 2026
153247a
Implement mission conclusion system with prerequisites and conclusion…
cliffe May 25, 2026
749cca3
Add mission ID to breakEscapeConfig and implement heartbeat for tab l…
cliffe May 25, 2026
5c2e3be
Add rubocop-rails-omakase gem to development group for improved code …
cliffe May 25, 2026
9471940
Fix CI: update Gemfile.lock to include rubocop-rails-omakase
cliffe May 25, 2026
97e361c
Add on_task_complete callback to configuration for task completion ha…
cliffe May 26, 2026
f50a8c4
Add new audio files for TTS cache in m02_ransomed_trust
cliffe May 27, 2026
c0f5e04
Refactor code structure for improved readability and maintainability
cliffe May 27, 2026
70cbd48
Update field guides for clarity and consistency in objectives and wor…
cliffe May 27, 2026
d7e5102
Merge pull request #88 from alihussain6692/thermometer-sprite-variants
cliffe May 27, 2026
1bbd6c0
Refactor game management: replace missionId with gameId for cross-tab…
cliffe May 27, 2026
29886bb
Merge branch 'main' of https://github.com/cliffe/BreakEscape into main
cliffe May 27, 2026
8479fe0
Add TTS batch generator script and update README with usage instructions
cliffe May 27, 2026
72cf4a0
Add SAFETYNET field guides for reconnaissance, vulnerability analysis…
cliffe May 27, 2026
d1e9049
Add new audio files to the TTS cache for m02_ransomed_trust
cliffe May 28, 2026
e6f0689
Add scenario for Mission 2: Ransomed Trust, detailing hospital ransom…
cliffe May 28, 2026
8fa4690
Enhance game setup: validate player sprite selection and update defau…
cliffe May 31, 2026
c18cd55
Add custom fonts and update styles for player preferences screen
cliffe Jun 1, 2026
40df362
Merge branch 'main' of https://github.com/cliffe/BreakEscape into main
cliffe Jun 2, 2026
35fa557
Refactor code structure for improved readability and maintainability
cliffe Jun 2, 2026
c0ea5de
Enhance HUD styles: adjust button active states and border thickness …
cliffe Jun 2, 2026
5df9a0b
Update iframe height to 100vh for better responsiveness; enhance item…
cliffe Jun 2, 2026
8e9aa0f
Refactor grunt sound management: replace old sounds with new heavy an…
cliffe Jun 2, 2026
4300168
Update room_servers JSON and TMJ files: adjust tile data, add new obj…
cliffe Jun 2, 2026
eab3180
Enhance flag submission logic: process rewards and completed tasks; a…
cliffe Jun 2, 2026
b56c28d
Merge branch 'main' of https://github.com/cliffe/BreakEscape into main
cliffe Jun 2, 2026
7717e9c
Enhance object interaction handling: add support for post-it notes an…
cliffe Jun 3, 2026
8fdeb6c
Add mission and scenario files for basic and VM-free missions; enhanc…
cliffe Jun 3, 2026
8bae81c
Refactor player_preferences_controller_test to use single quotes for …
cliffe Jun 3, 2026
aa142c2
Update dungeon graph and scenario files: change "Storage Receipt" to …
cliffe Jun 3, 2026
4fc5ea3
Add CyberChef decoding alternatives and lockpicking guide to scenario
cliffe Jun 3, 2026
f3e69ce
Add gameplay note for clipboard usage in SSH access guide
cliffe Jun 3, 2026
4b7c5fe
Refactor Gemini API key retrieval to include Rails credentials and up…
cliffe Jun 4, 2026
c64a877
Refactor Gemini API key retrieval to use Rails environment-specific c…
cliffe Jun 4, 2026
53ec74a
Add self-hosted fonts and update CSS for font loading
cliffe Jun 4, 2026
4f35f94
Refactor TTS configuration check to use dig method for safer key retr…
cliffe Jun 4, 2026
2e5a861
Refactor Gemini API key retrieval to use dig method for safer access
cliffe Jun 4, 2026
800a608
Refactor player sprite handling to ensure player object initializatio…
cliffe Jun 4, 2026
49a9206
Update sprite selection modal to display lock overlay for invalid spr…
cliffe Jun 4, 2026
0f667f5
Add relaunch tutorial button and functionality in player preferences …
cliffe Jun 5, 2026
3ff318c
Integrate tutorial manager for relaunch functionality in player prefe…
cliffe Jun 5, 2026
64809dd
Update font family in player preferences header to 'GNF'
cliffe Jun 5, 2026
510063e
Update HACKTIVITY_INTEGRATION.md to clarify seed command for BreakEscape
cliffe Jun 5, 2026
207d3cb
Update female hacker character sprite with new design
cliffe Jun 5, 2026
30052ca
Update asset paths to include versioning for cache busting
cliffe Jun 5, 2026
522d241
Add new female hacker sprite and update spriteTalk handling for playe…
cliffe Jun 5, 2026
f88f8a5
Update female hacker hood down talk sprite
cliffe Jun 6, 2026
af7a621
Add male hacker hood talk sprite and update versioning for related mo…
cliffe Jun 6, 2026
4019d54
Enhance tutorial system with combat mode notifications and objectives…
cliffe Jun 6, 2026
eecb18a
Update tutorial prompt title to reflect Hacktivity Games branding
cliffe Jun 6, 2026
8ea1c27
Enhance title screen with animated mission display name and improved …
cliffe Jun 6, 2026
473d979
Adjust notepad positioning in notes minigame for improved layout
cliffe Jun 6, 2026
0089c9d
Add interactive "Continue?" prompt to title screen minigame
cliffe Jun 6, 2026
54ee04b
Enhance game functionality with VM set activation on start/resume, im…
cliffe Jun 10, 2026
26725f4
Refactor ransom decision interface and add decompiler scripts
cliffe Jun 10, 2026
bf4b938
Refactor scenario JSON and enhance Ink decompiler
cliffe Jun 11, 2026
ce2f015
Add new task for cloning receptionist badge and update related game m…
cliffe Jun 11, 2026
3a33964
Add asset cache busting via ASSETS_VERSION and import map
cliffe Jun 11, 2026
b06aa3b
Strip hardcoded ?v=X from all JS module import paths
cliffe Jun 11, 2026
3bd067a
Add cache busting documentation
cliffe Jun 11, 2026
b9f92e3
docs: add development mode testing section to CACHE_BUSTING.md
cliffe Jun 11, 2026
bb36c8d
Merge pull request #92 from cliffe/claude/asset-cache-busting-erk5zg
cliffe Jun 11, 2026
7e55c60
Add dungeon graph for m04_critical_failure scenario
cliffe Jun 11, 2026
1a0d54d
m04 updates
cliffe Jun 11, 2026
939a01b
feat: update dungeon graph and scenario details for m04_critical_failure
cliffe Jun 12, 2026
a9a5f93
Cleanup
cliffe Jun 12, 2026
f6cb0a8
feat: enhance player preferences and asset versioning
cliffe Jun 12, 2026
05e152d
feat: update asset versioning to 1.0.2 and enhance cache busting inst…
cliffe Jun 12, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
The diff you're trying to view is too large. We only load the first 3000 changed files.
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
# Memory Index

- [Terminals are minigames, not ink](terminals-are-minigames-not-ink.md) — terminal task completion goes via globals + eventMappings, never ink
- [Use objective_task_completed event pattern](m02-event-pattern-objective-task-completed.md) — NPC eventMappings: objective_task_completed:<id>, not task_completed:<id>
- [Ink decompiler tooling](ink-decompiler-tooling.md) — recover .ink from compiled inkVersion-21 .json + verify round-trip
- [Phone NPC targetKnot limitation](phone-npc-targetknot-limitation.md) — targetKnot only works first-contact; use setGlobal+sendTimedMessage otherwise
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
---
name: ink-decompiler-tooling
description: Scripts to recover .ink source from compiled inkVersion-21 .json
metadata:
type: reference
---

When a scenario's `.ink` source is missing but the compiled `.json` exists (e.g. only compiled ink was committed), recover editable source with:

- `scripts/decompile_ink.py <compiled.json>` — emits readable inkVersion-21 ink (knots, choices, conditionals, var ops, tags, external calls, diverts) to stdout.
- `scripts/verify_ink_roundtrip.py <original.json> <recompiled.json>` — recompile the decompiled `.ink` with `bin/inklecate` and confirm a normalized semantic trace (text, tags, VAR= targets, x() calls, knot names) matches the original. **Always verify before trusting** — the game runs from `.json`, so a divergent decompile could change behaviour on recompile.

Used to recover all of m03_ghost_in_the_machine's ink (8 files, all trace-matched). Recompile in-sync with `./scripts/compile-ink.sh <scenario>`. Gotcha found: inklecate rejects `not (x)` for a parenthesised bare identifier — emit `not x`.
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
---
name: m02-event-pattern-objective-task-completed
description: NPC eventMappings must use objective_task_completed:<id>, not task_completed:<id>
metadata:
type: project
---

To react to an objective task completing, NPC `eventMappings` must use eventPattern **`objective_task_completed:<taskId>`**. The engine emits `objective_task_completed:<id>` (objectives-manager.js) and `task_completed_by_npc`, but **never `task_completed:<id>`**. m02_ransomed_trust originally used `task_completed:<id>` in 8 mappings, which silently never fired (lost most of Agent 0x99/Ghost guidance).

**How to apply:** When wiring NPC reactions to task completion, use `objective_task_completed:`. For reacting to globals set by minigames/terminals, use `global_variable_changed:<var>`. Related: [[terminals-are-minigames-not-ink]].
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
---
name: phone-npc-targetknot-limitation
description: Phone NPC eventMappings with targetKnot only work on first contact
metadata:
type: project
---

For **phone** NPCs, an `eventMapping` with `targetKnot` only works the FIRST time that phone story is opened. Once a storyState is saved, `targetKnot` is ignored on reopen. The validator flags phone eventMappings that use `targetKnot` without `conversationMode`.

**How to apply:**
- First-contact phone cutscenes (e.g. a planted-device phone, a closing-debrief phone) may use `targetKnot` — add `"conversationMode": "phone-chat"` so it opens a fresh phone-chat to that knot (matches m02 ghost, m03 closing_debrief).
- For a phone the player has already opened (e.g. the always-available handler 0x99), do NOT rely on `targetKnot` for later events. Use `setGlobal` a flag + `sendTimedMessage` to notify, and add a conditional hub option `+ {flag} [..] -> knot` in the Ink. This is the m01/m02 handler-guidance pattern. Related: [[m02-event-pattern-objective-task-completed]], [[terminals-are-minigames-not-ink]].
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
---
name: terminals-are-minigames-not-ink
description: In Break Escape, in-world terminals/consoles are minigames, not ink dialogues
metadata:
type: project
---

In Break Escape scenarios, interactive **terminals/consoles are implemented as minigames, not ink**. Examples: `backup_recovery` (recovery console), `ransomware_display`, `password`/`pin` locks, vm-launcher/flag-station. The one exception is the phone "hacker mode" overlay that pops up when the player is on another device.

**Why:** A terminal that has a `storyPath` to an ink file is almost always a mistake — the engine launches the minigame for its `type`/`lockType`, and the ink never runs. m02_ransomed_trust had an orphaned `m02_terminal_ransom_interface.ink` that was never referenced; it was deleted.

**How to apply:** Minigames complete objective tasks by *writing globals* (e.g. backup-recovery writes `backup_recovery_source`, `backup_restore_initiated`). To finish a task off a terminal, add an NPC `eventMapping` watching `global_variable_changed:<var>` with `completeTask`/`setGlobal` (sis01's Helen Carver and m02's Agent 0x99 do this). Do NOT wire terminal task completion through ink. Related: [[m02-event-pattern-objective-task-completed]].
10 changes: 10 additions & 0 deletions .claude/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"permissions": {
"allow": [
"Bash(*)",
"Write(*)",
"Edit(*)",
"Read(*)"
]
}
}
40 changes: 40 additions & 0 deletions .claude/skills/break-escape-dungeon-graph/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
---
name: break-escape-dungeon-graph
description: Runs the scenario validator and opens the generated dungeon graph for a Break Escape scenario file (.json or .json.erb). Use this skill whenever the user asks for a diagram, graph, map, dependency chart, or visual overview of a scenario's lock/key structure. Also trigger when the user asks to "visualise the mission", "show the lock and key structure", "draw the dungeon graph", "update the diagram", or "confirm the graph is up to date" after editing a scenario.
---

# Break Escape dungeon graph skill

The dungeon graph is generated automatically by the scenario validator. This skill runs the validator, reports its output, and reads the resulting HTML file.

## Step 1 — resolve the scenario path

The user will provide a scenario file path (e.g. `scenarios/sis01_healthcare/scenario.json.erb`). Work from the repository root (`/home/cliffe/Files/Projects/Code/BreakEscape/BreakEscape`).

## Step 2 — run the validator

```bash
ruby scripts/validate_scenario.rb <scenario_path>
```

The validator:
- Validates JSON structure, schema, and ink files
- Generates `dungeon_graph.html` (interactive visual) and `dungeon_graph.md` (AI-readable reference with all five Mermaid diagrams and prose descriptions) in the same directory as the scenario file
- Prints a summary: node/edge counts and the critical path

Report any validation **errors** (❌) and **warnings** (⚠️) to the user. Suppress the ✅/💡 informational lines unless the user asks for them.

## Step 3 — read the generated graph

After the validator succeeds, read the generated `dungeon_graph.html` file (same directory as the scenario, e.g. `scenarios/sis01_healthcare/dungeon_graph.html`) and display it directly using the `show_widget` visualiser tool:

- `title`: `[scenario_id]_dungeon_graph`
- `widget_code`: the full contents of the generated HTML file
- `loading_messages`: `["Running validator…", "Reading generated graph…", "Rendering…"]`

## Step 4 — summarise

After rendering, report to the user:
- Node and edge counts (puzzle / story / integrated)
- The critical path printed by the validator
- Any errors or warnings that need attention
141 changes: 141 additions & 0 deletions .claude/skills/scenario-design-review/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,141 @@
---
name: scenario-design-review
description: Full design review of a Break Escape scenario — runs the validator script then applies higher-level design judgement from README_scenario_design.md. Trigger when the user explicitly asks for a "design review", "full review", "deep review", or "scenario critique", or when the validate-scenario skill has already been run and the user wants to go deeper.
---

# Break Escape scenario design review skill

Two-phase check: (1) run the script, (2) apply design principles from `README_scenario_design.md` that require reading and reasoning about the scenario.

## Step 1 — run the validator script

```bash
ruby scripts/validate_scenario.rb <scenario_path>
```

Work from the repository root (`/home/cliffe/Files/Projects/Code/BreakEscape/BreakEscape`).

**Present the output in four clearly labelled groups — omit any group that is empty:**

| Symbol | Meaning | How to present |
|--------|---------|----------------|
| ❌ INVALID | Must fix before the scenario will work | List all, bold the path |
| ⚠️ WARNING | Should fix; may cause subtle bugs or broken task counters | List all |
| ✅ GOOD PRACTICE | Things already done well | Summarise in one sentence, don't enumerate |
| 💡 SUGGESTION | Optional improvements from `m01_first_contact` reference patterns | List only those that are relevant to this scenario's type and theme; skip generic feature-add suggestions if the scenario is already feature-complete |

**Known false positive**: `puzzle_graph_and_with` pairs are used to represent AND-gate requirements (e.g. dual-authorisation panels). These intentionally appear as multiple-solution warnings in the validator. Note this to the user rather than treating it as a real issue.

Also report the **dungeon graph summary line** printed by the validator:
- Node/edge counts (puzzle / story / integrated)
- Critical path

## Step 2 — design review against README_scenario_design.md

Before reading the scenario JSON, load `dungeon_graph.md` from the same directory (e.g. `scenarios/m01_first_contact/dungeon_graph.md`). This file contains all five Mermaid diagrams — Puzzle Graph, Story Aims, Story + Puzzle, Rooms, and Rooms & Contents — with prose descriptions of what each shows. Use it as your primary reference for the structural checks below; it is much easier to reason from than the raw scenario JSON.

Apply the following checks that the script cannot perform mechanically. Report findings as **CONCERN**, **OK**, or **N/A**.

Do **not** repeat or re-explain errors and warnings already reported in Phase 1. In the design sections below, you may cross-reference a Phase 1 finding (e.g. "see validator warning above") but do not restate the detail.

### 2a. Solvability trace

Walk the critical path from `startRoom` to the final objective:

- For every locked room or object, confirm the key/code/tool that unlocks it is reachable *before* the player needs it (i.e., not locked behind the same target).
- Flag any **circular dependencies** (key A inside box requiring key B, which requires key A).
- Flag any **soft locks** — situations where the player can reach a state with no forward progress.

### 2b. Clue distribution quality

- Are clue notes/phones/files spread across rooms, or clustered in one place?
- Are hints for codes/passwords placed in logically accessible locations before the lock that uses them?
- Are there readable items that exist but appear to serve no puzzle purpose (no `puzzle_graph_unlocks`, no connection to any task)?
- **Navigation-only items**: Are there notes/signs that only provide directional information (e.g. "Room A is north") with no puzzle value? These should be removed — the player can see room connections on the map.

### 2c. Educational coverage

Cross-reference the scenario's lock types against the README teaching objectives:

| Lock type | Teaches |
|-----------|---------|
| `key` + lockpick | Physical security, privilege escalation via tools |
| `pin` | Numeric access control, code hygiene |
| `password` | Credential security, password hygiene |
| `rfid` | Access credentials, badge/card security |
| `bluetooth` | Wireless attack surface |
| `flag` | Technical hacking challenges (VM-based) |

- Does the combination of lock types in this scenario meaningfully address its stated brief?
- If the scenario has a specific security topic (e.g. ransomware response, network segmentation), are the locks/puzzles thematically coherent rather than generic?

### 2d. Narrative structure

Based on `README_scenario_design.md §Designing Solvable Scenarios` points 8 and 9:

- **Opening cutscene**: Does the `startRoom` NPC's `timedConversation` adequately brief the player on their role and immediate objective? Is `skipIfGlobal` set so it doesn't replay on resume?
- **Closing debrief**: Is there a narrative endpoint (hidden person NPC with event-driven reveal, or equivalent)? Does the scenario have a clear win condition?
- **Ink dialogue arcs**: Are key NPCs wired to respond to the major plot events (via `eventMappings`)? Spot-check 2–3 event mappings that seem critical to narrative flow.

### 2e. Dungeon graph metadata completeness

Beyond what the validator checks mechanically:

- Are the major lock–key relationships represented in `puzzle_graph_unlocks` annotations, or is the graph sparse?
- Do `puzzle_graph_actions` nodes exist for the key NPC conversations that gate progress?
- Does the Integrated Graph (as described in the README) have bridge edges between puzzle nodes and story aims, or are the two layers disconnected?
- **Starting items**: If the scenario has `startItemsInInventory` with `puzzle_graph_unlocks` (e.g. a lockpick that opens doors), do these items appear in the Puzzle Graph as nodes sourced from the starting room? Missing starting items break the dependency chain — the graph shows locks with no visible way to open them.
- **VM challenge connections**: If the scenario has VM challenges (vm-launcher objects and submit_flags tasks), is there a connection chain in the Puzzle Graph from `lock_vm_launcher_*` → `vm_access_terminal` (or equivalent) → first VM challenge node (`vmch_*`)? Disconnected VM challenges appear as isolated subgraphs.
- **Backwards edges**: In the Puzzle Graph, check for edges flowing FROM locked rooms back TO the starting room or unlocked areas (e.g. `it_department --> reception_lobby` when `it_department` is locked). These create layout problems and suggest the graph generator didn't skip connections from locked sources. The correct pattern is: unlocked room → door lock → locked room (forward only).

Note: the validator already flags missing `puzzle_graph_unlocks` on clue items inside locked containers and on `submit_flags` tasks with `onComplete`. Focus here on whether the *overall graph tells the right story* at a design level.

### 2f. Room layout and dead ends

- Are any rooms reachable but containing nothing useful (no objects, no NPCs, no connections to further rooms)? These waste player time.
- Do room types (`room_office`, `room_servers`, etc.) match the scenario's physical setting and theme?
- Are there rooms that a player would naturally visit last but that contain early-game clues, creating an awkward backtracking requirement?

### 2g. Objectives scaffolding — the most common failure mode

This is the hardest thing to see when building a scenario piece by piece: the individual components work, but the aims/tasks/objectives layer doesn't actively guide the player toward what they need to do next.

**Check each aim in sequence:**

1. **Is it clear how the player discovers each task exists?** Tasks with `type: "npc_conversation"` or `type: "enter_room"` point somewhere concrete. `type: "manual"` tasks give the player nothing to go on unless something in the world (an NPC bark, a conversation, a readable item) directs them.

2. **Is there a "dead zone" between aims?** The transition between aims is the most vulnerable moment. When aim N completes, is aim N+1 already visible and populated with active tasks? Or does the player find themselves in a world where everything looks complete but the game hasn't told them what comes next? Check every `unlockCondition` — if an aim unlocks only after the previous one *fully* completes, ask whether the last task in the previous aim provides a clear handoff.

3. **Do task titles tell the player what to *do*, not just what *happened*?** A task called "Network isolated" describes an outcome; "Authorise network isolation at the dual-auth panel" tells the player their action. Review all task `title` fields for action-orientation.

4. **Are all the tasks within an aim actually completable in the order a player would naturally encounter them?** Walk the aim's task list and ask: could a player complete task 3 before task 1, leaving task 1 stranded as a confusing leftover? Optional tasks are fine to leave incomplete, but required tasks that become orphaned after the aim's main action feels done are a UX problem.

5. **Are barks and event-driven conversations used to narrate aim transitions?** When an aim completes and the next unlocks, does an NPC say something that acknowledges the shift and points forward? Or does the transition happen silently, leaving the player to discover the new tasks by opening the objectives panel? The best scenarios use NPC barks or auto-opening conversations to narrate each transition — the objectives panel confirms what the player already knows, rather than being the primary discovery mechanism.

6. **Does the aim description match the tasks inside it?** Read each aim's `description` field against its task list. If the description promises four things but the task list only has two visible tasks (the others being optional or gated), the player may feel they've missed something.

Produce a table:

| Aim | # required tasks | # with in-world pointer | Dead zone risk? | Bark/conversation at transition? |
|-----|-----------------|------------------------|-----------------|----------------------------------|

Flag any aim where more than half the required tasks are `manual` with no in-world pointer, or where the transition out of the aim leaves the player without a clear next instruction.

---

## Step 3 — produce a prioritised action list

After both phases, produce a short prioritised list:

**Must fix (blocks play)**
- All ❌ INVALID items from the validator
- **Win-condition failure modes first**: any field that controls the scenario's end state (e.g. `disableClose`, `setVisible` for the final NPC, `onComplete` triggers) that is schema-unknown, misspelled, or missing — list these at the top because they silently prevent the scenario from completing even when the player does everything right

**Should fix (degrades experience)**
- All ⚠️ WARNING items + any CONCERN findings from the design review
- Any aims with a dead-zone risk or missing in-world pointers (from §2g scaffolding table)

**Worth considering (polish)**
- Relevant 💡 SUGGESTION items + minor design review observations

Keep the action list concise — one line per item, grouped by priority. Do not repeat detail already given in the validator output or design review sections.
Loading
Loading