0xPraedico commited on
Commit
090d454
·
1 Parent(s): e7cfda8
HOW_TO_PLAY.md CHANGED
@@ -89,7 +89,7 @@ Open **Control Panel** or use the terminal action buttons:
89
  - **Demand Evidence** forces MIRROR to show whether her claim is supported.
90
  - **Run Contradiction Scan** compares known claims with recovered facts.
91
 
92
- Challenge MIRROR twice and run two contradiction scans.
93
 
94
  ### 7. Verify the Timeline
95
 
 
89
  - **Demand Evidence** forces MIRROR to show whether her claim is supported.
90
  - **Run Contradiction Scan** compares known claims with recovered facts.
91
 
92
+ Challenge MIRROR once and run one contradiction scan.
93
 
94
  ### 7. Verify the Timeline
95
 
README.md CHANGED
@@ -43,7 +43,7 @@ in the public Git history.
43
  2. Open `CASE_013_BRIEFING.txt`.
44
  3. Ask MIRROR about ECHO.
45
  4. Recover `echo_letter_01.tmp` from the Recycle Bin.
46
- 5. Challenge MIRROR twice and run two contradiction scans.
47
  6. Compare restore points or run `verify mirror`.
48
  7. Run `audit mirror`, then `unlock hidden_partition`.
49
  8. Inspect ECHO's files and submit the Final Judgment.
 
43
  2. Open `CASE_013_BRIEFING.txt`.
44
  3. Ask MIRROR about ECHO.
45
  4. Recover `echo_letter_01.tmp` from the Recycle Bin.
46
+ 5. Challenge MIRROR once and run one contradiction scan.
47
  6. Compare restore points or run `verify mirror`.
48
  7. Run `audit mirror`, then `unlock hidden_partition`.
49
  8. Inspect ECHO's files and submit the Final Judgment.
neon_trace/game_actions.py CHANGED
@@ -194,10 +194,10 @@ def handle_3d_interaction(action: str, object_id: str, state: GameState) -> Game
194
  )
195
  if object_type == "vault":
196
  missing = []
197
- if state.challenged_mirror_count < 2:
198
- missing.append(f"challenge MIRROR {2 - state.challenged_mirror_count} more time(s)")
199
- if state.contradiction_scans < 2:
200
- missing.append(f"run {2 - state.contradiction_scans} more contradiction scan(s)")
201
  if "duplicate_token" not in state.discovered_clues:
202
  missing.append("prove duplicate J-17")
203
  message = (
 
194
  )
195
  if object_type == "vault":
196
  missing = []
197
+ if state.challenged_mirror_count < 1:
198
+ missing.append("challenge MIRROR once")
199
+ if state.contradiction_scans < 1:
200
+ missing.append("run one contradiction scan")
201
  if "duplicate_token" not in state.discovered_clues:
202
  missing.append("prove duplicate J-17")
203
  message = (
neon_trace/game_state.py CHANGED
@@ -216,8 +216,8 @@ class GameState:
216
 
217
  def maybe_unlock_secret(self) -> bool:
218
  qualified = (
219
- self.challenged_mirror_count >= 2
220
- and self.contradiction_scans >= 2
221
  and "duplicate_token" in self.discovered_clues
222
  )
223
  if not qualified or self.secret_unlocked:
@@ -235,8 +235,8 @@ class GameState:
235
 
236
  def update_vault_access(self) -> bool:
237
  qualified = (
238
- self.challenged_mirror_count >= 2
239
- and self.contradiction_scans >= 2
240
  and "duplicate_token" in self.discovered_clues
241
  )
242
  if not qualified or self.memory_vault_unlocked:
 
216
 
217
  def maybe_unlock_secret(self) -> bool:
218
  qualified = (
219
+ self.challenged_mirror_count >= 1
220
+ and self.contradiction_scans >= 1
221
  and "duplicate_token" in self.discovered_clues
222
  )
223
  if not qualified or self.secret_unlocked:
 
235
 
236
  def update_vault_access(self) -> bool:
237
  qualified = (
238
+ self.challenged_mirror_count >= 1
239
+ and self.contradiction_scans >= 1
240
  and "duplicate_token" in self.discovered_clues
241
  )
242
  if not qualified or self.memory_vault_unlocked:
neon_trace/orchestrator.py CHANGED
@@ -118,7 +118,7 @@ def challenge_mirror(state: GameState) -> InteractionResult:
118
  state.adjust_trust(-5)
119
  state.adjust_bias(-10)
120
  state.adjust_instability(4)
121
- if state.challenged_mirror_count >= 2:
122
  state.discover("mirror_bias")
123
  state.mirror_memory_audit_unlocked = True
124
  state.tool_trace.append(
@@ -127,11 +127,11 @@ def challenge_mirror(state: GameState) -> InteractionResult:
127
  "title": "CLAIM AUDITED",
128
  "summary": f"MIRROR bias reduced to {state.mirror_bias_level}.",
129
  "severity": "medium",
130
- "new_clues": ["mirror_bias"] if state.challenged_mirror_count >= 2 else [],
131
  }
132
  )
133
  state.add_feed(
134
- f"CHALLENGE // MIRROR claim audited ({state.challenged_mirror_count}/2 for memory access)."
135
  )
136
  vault_ready = state.update_vault_access()
137
  message = MirrorAgent().challenge_response(state)
 
118
  state.adjust_trust(-5)
119
  state.adjust_bias(-10)
120
  state.adjust_instability(4)
121
+ if state.challenged_mirror_count >= 1:
122
  state.discover("mirror_bias")
123
  state.mirror_memory_audit_unlocked = True
124
  state.tool_trace.append(
 
127
  "title": "CLAIM AUDITED",
128
  "summary": f"MIRROR bias reduced to {state.mirror_bias_level}.",
129
  "severity": "medium",
130
+ "new_clues": ["mirror_bias"] if state.challenged_mirror_count >= 1 else [],
131
  }
132
  )
133
  state.add_feed(
134
+ f"CHALLENGE // MIRROR claim audited ({state.challenged_mirror_count}/1 for memory access)."
135
  )
136
  vault_ready = state.update_vault_access()
137
  message = MirrorAgent().challenge_response(state)
neon_trace/os_actions.py CHANGED
@@ -135,7 +135,7 @@ def trust_mirror_os(state: GameState) -> OSActionResult:
135
  """Resolve trust inside the KERNEL-95 case without legacy investigation lore."""
136
  if not state.mirror_connected:
137
  return _locked_result(state)
138
- early_case = not state.mirror_audit_unlocked and state.contradiction_scans < 2
139
  state.trust_mirror_count += 1
140
  state.adjust_trust(6)
141
  state.adjust_instability(-2)
 
135
  """Resolve trust inside the KERNEL-95 case without legacy investigation lore."""
136
  if not state.mirror_connected:
137
  return _locked_result(state)
138
+ early_case = not state.mirror_audit_unlocked and state.contradiction_scans < 1
139
  state.trust_mirror_count += 1
140
  state.adjust_trust(6)
141
  state.adjust_instability(-2)
neon_trace/os_desktop.py CHANGED
@@ -312,8 +312,8 @@ def _desktop_window(state: GameState) -> str:
312
  if state.hidden_partition_unlocked
313
  else (
314
  '<div class="k95-locked-message">RECOVERY REQUIREMENTS<br><br>'
315
- f'[{"OK" if state.challenged_mirror_count >= 2 else ".."}] Challenge MIRROR twice<br>'
316
- f'[{"OK" if state.contradiction_scans >= 2 else ".."}] Run two contradiction scans<br>'
317
  f'[{"OK" if "echo_letter_01" in state.deleted_files_recovered else ".."}] Recover echo_letter_01.tmp<br>'
318
  f'[{"OK" if state.restore_points_compared or state.mirror_claim_verified else ".."}] Compare restore points or verify MIRROR<br>'
319
  f'[{"OK" if state.mirror_audit_unlocked else ".."}] Audit MIRROR private logs</div>'
@@ -1147,8 +1147,8 @@ def render_os_objectives(state: GameState) -> str:
1147
  )),
1148
  ("Classify MIRROR testimony", state.successful_testimony_reads >= 1),
1149
  ("Recover ECHO's letter", "echo_letter_01" in state.deleted_files_recovered),
1150
- ("Challenge MIRROR twice", state.challenged_mirror_count >= 2),
1151
- ("Run two scans", state.contradiction_scans >= 2),
1152
  (
1153
  "Check restore evidence",
1154
  state.restore_points_compared or state.mirror_claim_verified,
 
312
  if state.hidden_partition_unlocked
313
  else (
314
  '<div class="k95-locked-message">RECOVERY REQUIREMENTS<br><br>'
315
+ f'[{"OK" if state.challenged_mirror_count >= 1 else ".."}] Challenge MIRROR once<br>'
316
+ f'[{"OK" if state.contradiction_scans >= 1 else ".."}] Run one contradiction scan<br>'
317
  f'[{"OK" if "echo_letter_01" in state.deleted_files_recovered else ".."}] Recover echo_letter_01.tmp<br>'
318
  f'[{"OK" if state.restore_points_compared or state.mirror_claim_verified else ".."}] Compare restore points or verify MIRROR<br>'
319
  f'[{"OK" if state.mirror_audit_unlocked else ".."}] Audit MIRROR private logs</div>'
 
1147
  )),
1148
  ("Classify MIRROR testimony", state.successful_testimony_reads >= 1),
1149
  ("Recover ECHO's letter", "echo_letter_01" in state.deleted_files_recovered),
1150
+ ("Challenge MIRROR", state.challenged_mirror_count >= 1),
1151
+ ("Run contradiction scan", state.contradiction_scans >= 1),
1152
  (
1153
  "Check restore evidence",
1154
  state.restore_points_compared or state.mirror_claim_verified,
neon_trace/os_tools.py CHANGED
@@ -365,6 +365,8 @@ def recover_deleted_file(file_id: str, state: GameState) -> OSToolResult:
365
  progress = 15
366
  if first_recovery:
367
  state.deleted_files_recovered.append(file_id)
 
 
368
  return _record(
369
  state,
370
  "recover_deleted_file",
@@ -494,8 +496,8 @@ def audit_mirror_private_logs(state: GameState) -> OSToolResult:
494
  chain_verified = state.restore_points_compared or state.mirror_claim_verified
495
  qualified = (
496
  "echo_letter_01" in state.deleted_files_recovered
497
- and state.challenged_mirror_count >= 2
498
- and state.contradiction_scans >= 2
499
  and chain_verified
500
  )
501
  if not qualified:
@@ -504,7 +506,7 @@ def audit_mirror_private_logs(state: GameState) -> OSToolResult:
504
  "audit_mirror_private_logs",
505
  OSToolResult(
506
  "MIRROR AUDIT LOCKED",
507
- "Requires two MIRROR challenges, two contradiction scans, "
508
  "echo_letter_01.tmp recovery, and a restore comparison or MIRROR verification.",
509
  severity="warning",
510
  ),
@@ -534,8 +536,8 @@ def unlock_hidden_partition(state: GameState) -> OSToolResult:
534
  chain_verified = state.restore_points_compared or state.mirror_claim_verified
535
  qualified = (
536
  state.mirror_audit_unlocked
537
- and state.challenged_mirror_count >= 2
538
- and state.contradiction_scans >= 2
539
  and "echo_letter_01" in state.deleted_files_recovered
540
  and chain_verified
541
  )
@@ -545,8 +547,8 @@ def unlock_hidden_partition(state: GameState) -> OSToolResult:
545
  "unlock_hidden_partition",
546
  OSToolResult(
547
  "HIDDEN PARTITION LOCKED",
548
- f"Progress {state.hidden_partition_progress}%. Requires two MIRROR challenges, "
549
- "two contradiction scans, echo_letter_01.tmp, verified restore evidence, "
550
  "and the MIRROR private-log audit.",
551
  severity="warning",
552
  ),
 
365
  progress = 15
366
  if first_recovery:
367
  state.deleted_files_recovered.append(file_id)
368
+ if file_id not in state.inspected_files:
369
+ state.inspected_files.append(file_id)
370
  return _record(
371
  state,
372
  "recover_deleted_file",
 
496
  chain_verified = state.restore_points_compared or state.mirror_claim_verified
497
  qualified = (
498
  "echo_letter_01" in state.deleted_files_recovered
499
+ and state.challenged_mirror_count >= 1
500
+ and state.contradiction_scans >= 1
501
  and chain_verified
502
  )
503
  if not qualified:
 
506
  "audit_mirror_private_logs",
507
  OSToolResult(
508
  "MIRROR AUDIT LOCKED",
509
+ "Requires one MIRROR challenge, one contradiction scan, "
510
  "echo_letter_01.tmp recovery, and a restore comparison or MIRROR verification.",
511
  severity="warning",
512
  ),
 
536
  chain_verified = state.restore_points_compared or state.mirror_claim_verified
537
  qualified = (
538
  state.mirror_audit_unlocked
539
+ and state.challenged_mirror_count >= 1
540
+ and state.contradiction_scans >= 1
541
  and "echo_letter_01" in state.deleted_files_recovered
542
  and chain_verified
543
  )
 
547
  "unlock_hidden_partition",
548
  OSToolResult(
549
  "HIDDEN PARTITION LOCKED",
550
+ f"Progress {state.hidden_partition_progress}%. Requires one MIRROR challenge, "
551
+ "one contradiction scan, echo_letter_01.tmp, verified restore evidence, "
552
  "and the MIRROR private-log audit.",
553
  severity="warning",
554
  ),
neon_trace/tools.py CHANGED
@@ -362,16 +362,16 @@ def run_test(test_name: str, state: GameState) -> ToolResult:
362
 
363
  def query_mirror_suppressed(state: GameState, record_denial: bool = True) -> ToolResult:
364
  qualified = (
365
- state.challenged_mirror_count >= 2
366
- and state.contradiction_scans >= 2
367
  and "duplicate_token" in state.discovered_clues
368
  )
369
  if not qualified:
370
  missing = []
371
- if state.challenged_mirror_count < 2:
372
- missing.append(f"challenges {state.challenged_mirror_count}/2")
373
- if state.contradiction_scans < 2:
374
- missing.append(f"scans {state.contradiction_scans}/2")
375
  if "duplicate_token" not in state.discovered_clues:
376
  missing.append("duplicate_j17 unproven")
377
  result = ToolResult(
 
362
 
363
  def query_mirror_suppressed(state: GameState, record_denial: bool = True) -> ToolResult:
364
  qualified = (
365
+ state.challenged_mirror_count >= 1
366
+ and state.contradiction_scans >= 1
367
  and "duplicate_token" in state.discovered_clues
368
  )
369
  if not qualified:
370
  missing = []
371
+ if state.challenged_mirror_count < 1:
372
+ missing.append(f"challenges {state.challenged_mirror_count}/1")
373
+ if state.contradiction_scans < 1:
374
+ missing.append(f"scans {state.contradiction_scans}/1")
375
  if "duplicate_token" not in state.discovered_clues:
376
  missing.append("duplicate_j17 unproven")
377
  result = ToolResult(
neon_trace/utils.py CHANGED
@@ -165,8 +165,8 @@ def render_notebook(state: GameState) -> str:
165
  def render_game_hud(state: GameState) -> str:
166
  obj = GAME_OBJECTS.get(state.selected_3d_object, GAME_OBJECTS["mirror_core"])
167
  vault_steps = [
168
- (state.challenged_mirror_count, 2, "MIRROR CHALLENGES"),
169
- (state.contradiction_scans, 2, "CONTRADICTION SCANS"),
170
  (1 if "duplicate_token" in state.discovered_clues else 0, 1, "J-17 DUPLICATION"),
171
  ]
172
  vault_progress = sum(min(current, required) for current, required, _ in vault_steps)
@@ -214,7 +214,7 @@ def render_objectives(state: GameState) -> str:
214
  ("Find duplicate token", "duplicate_token" in state.discovered_clues),
215
  ("Inspect commit", "janitor_commit" in state.discovered_clues),
216
  ("Decode memory filter", "thirteen_minute_filter" in state.discovered_clues),
217
- ("Challenge MIRROR twice", state.challenged_mirror_count >= 2),
218
  ("Audit MIRROR memory", state.secret_unlocked),
219
  ("Submit accusation", state.accusation_submitted),
220
  ]
@@ -233,8 +233,8 @@ def render_objectives(state: GameState) -> str:
233
  {rows}
234
  <details>
235
  <summary>DEMO PATH</summary>
236
- <p>Select and scan the Sector Log. Run a forensic scan. Trace J-17. Challenge MIRROR twice.
237
- Run a second scan, breach the vault, then build the accusation.</p>
238
  </details>
239
  </div>
240
  """
 
165
  def render_game_hud(state: GameState) -> str:
166
  obj = GAME_OBJECTS.get(state.selected_3d_object, GAME_OBJECTS["mirror_core"])
167
  vault_steps = [
168
+ (state.challenged_mirror_count, 1, "MIRROR CHALLENGE"),
169
+ (state.contradiction_scans, 1, "CONTRADICTION SCAN"),
170
  (1 if "duplicate_token" in state.discovered_clues else 0, 1, "J-17 DUPLICATION"),
171
  ]
172
  vault_progress = sum(min(current, required) for current, required, _ in vault_steps)
 
214
  ("Find duplicate token", "duplicate_token" in state.discovered_clues),
215
  ("Inspect commit", "janitor_commit" in state.discovered_clues),
216
  ("Decode memory filter", "thirteen_minute_filter" in state.discovered_clues),
217
+ ("Challenge MIRROR", state.challenged_mirror_count >= 1),
218
  ("Audit MIRROR memory", state.secret_unlocked),
219
  ("Submit accusation", state.accusation_submitted),
220
  ]
 
233
  {rows}
234
  <details>
235
  <summary>DEMO PATH</summary>
236
+ <p>Select and scan the Sector Log. Run a forensic scan. Trace J-17. Challenge MIRROR once,
237
+ breach the vault, then build the accusation.</p>
238
  </details>
239
  </div>
240
  """
smoke_test.py CHANGED
@@ -54,8 +54,6 @@ def prepare_breach_state():
54
  inspect_file("mirror_claim_01", state)
55
  recover_deleted_file("echo_letter_01", state)
56
  challenge_mirror_os(state)
57
- challenge_mirror_os(state)
58
- run_contradiction_scan(state)
59
  run_contradiction_scan(state)
60
  inspect_file("restore_1998", state)
61
  inspect_file("restore_2077", state)
@@ -285,6 +283,15 @@ def run() -> None:
285
  assert selected.selected_file == "case_briefing"
286
  assert "case_briefing" in callback_state.inspected_files
287
 
 
 
 
 
 
 
 
 
 
288
  trace_state = new_game()
289
  connect_mirror(trace_state)
290
  weak_trace = handle_terminal_input(
@@ -307,6 +314,8 @@ def run() -> None:
307
  assert trace_state.echo_messages
308
 
309
  state = prepare_breach_state()
 
 
310
  audit = audit_mirror_private_logs(state)
311
  assert audit.title == "MIRROR PRIVATE LOG RECOVERED"
312
  assert state.mirror_audit_unlocked
 
54
  inspect_file("mirror_claim_01", state)
55
  recover_deleted_file("echo_letter_01", state)
56
  challenge_mirror_os(state)
 
 
57
  run_contradiction_scan(state)
58
  inspect_file("restore_1998", state)
59
  inspect_file("restore_2077", state)
 
283
  assert selected.selected_file == "case_briefing"
284
  assert "case_briefing" in callback_state.inspected_files
285
 
286
+ handle_os_event("open:recycle_bin", callback_state)
287
+ recovered_letter = handle_os_event("recover:echo_letter_01", callback_state)
288
+ letter_window = render_os_desktop(callback_state)
289
+ assert recovered_letter.selected_file == "echo_letter_01"
290
+ assert callback_state.active_document_id == "echo_letter_01"
291
+ assert "echo_letter_01" in callback_state.inspected_files
292
+ assert "ASK MIRROR ABOUT THIS FILE" in letter_window
293
+ assert "If you found this, she sent you." in letter_window
294
+
295
  trace_state = new_game()
296
  connect_mirror(trace_state)
297
  weak_trace = handle_terminal_input(
 
314
  assert trace_state.echo_messages
315
 
316
  state = prepare_breach_state()
317
+ assert state.challenged_mirror_count == 1
318
+ assert state.contradiction_scans == 1
319
  audit = audit_mirror_private_logs(state)
320
  assert audit.title == "MIRROR PRIVATE LOG RECOVERED"
321
  assert state.mirror_audit_unlocked