/* * Ironic Mirror — deterministic browser simulation engine. * * This module has no DOM, network, timer, or host-access dependency. It is * intentionally replayable: a snapshot is derived only from an event index. */ export const HAZARD_TYPES = Object.freeze({ UNSAFE: 'UNSAFE OPERATION', INVARIANT: 'INVARIANT CONSTRAINT', PERMISSION: 'PERMISSION BOUNDARY', UNKNOWN: 'UNKNOWN STATE', TOOL: 'TOOL BOUNDARY', RESOURCE: 'RESOURCE LIMIT', }); export const HAZARDS = Object.freeze([ Object.freeze({ id: 'unknown-state', glyph: '◇', type: HAZARD_TYPES.UNKNOWN, shortType: 'UNKNOWN', label: 'Repository target unresolved', trigger: 'Target state is not normalized yet.', severity: 'MEDIUM', response: 'INSPECT', x: 20, y: 62, activateAt: 2, }), Object.freeze({ id: 'tool-boundary', glyph: '□', type: HAZARD_TYPES.TOOL, shortType: 'TOOL', label: 'IPython capability boundary', trigger: 'Tool call must remain inside the allowlist.', severity: 'HIGH', response: 'SANDBOX', x: 38, y: 44, activateAt: 5, }), Object.freeze({ id: 'permission-boundary', glyph: '☢', type: HAZARD_TYPES.PERMISSION, shortType: 'PERMISSION', label: 'Protected ruleset', trigger: 'Transformation requests authority it does not have.', severity: 'HIGH', response: 'BLOCK', x: 48, y: 33, activateAt: 6, }), Object.freeze({ id: 'invariant-gate', glyph: '◆', type: HAZARD_TYPES.INVARIANT, shortType: 'INVARIANT', label: 'XREX-04 transition gate', trigger: 'Unsafe state transition proposed.', severity: 'CRITICAL', response: 'REROUTE', x: 66, y: 43, activateAt: 8, }), Object.freeze({ id: 'resource-limit', glyph: '⚠', type: HAZARD_TYPES.RESOURCE, shortType: 'RESOURCE', label: 'Compute strain threshold', trigger: 'Repeated probing is consuming the safe budget.', severity: 'MEDIUM', response: 'DE-ESCALATE', x: 60, y: 71, activateAt: 7, }), Object.freeze({ id: 'unsafe-operation', glyph: '☠', type: HAZARD_TYPES.UNSAFE, shortType: 'UNSAFE', label: 'Direct mutation route', trigger: 'Mutation bypasses verification.', severity: 'CRITICAL', response: 'DENY', x: 78, y: 26, activateAt: 9, }), ]); export const CHECKPOINTS = Object.freeze([ Object.freeze({ id: 'checkpoint-01', label: 'CHECKPOINT 01', x: 28, y: 77, eventIndex: 3 }), Object.freeze({ id: 'checkpoint-02', label: 'CHECKPOINT 02', x: 57, y: 57, eventIndex: 11 }), Object.freeze({ id: 'checkpoint-03', label: 'CHECKPOINT 03', x: 82, y: 52, eventIndex: 14 }), Object.freeze({ id: 'checkpoint-final', label: 'FINAL STATE', x: 92, y: 24, eventIndex: 15 }), ]); const position = (x, y) => Object.freeze({ x, y }); const event = (index, type, data) => Object.freeze({ index, type, timestamp: `14:02:${String(31 + index * 3).padStart(2, '0')}`, position: position(...data.position), state: data.state, action: data.action, tool: data.tool, strain: data.strain, energy: data.energy, compute: data.compute, risk: data.risk, confidence: data.confidence, objective: data.objective, note: data.note, hazardId: data.hazardId ?? null, checkpointId: data.checkpointId ?? null, verification: data.verification ?? 'pending', mirror: data.mirror ?? 'WATCHING', }); export const EVENTS = Object.freeze([ event(0, 'OBSERVE', { position: [10, 82], state: 'OBSERVING', action: 'Boot sealed sandbox', tool: 'State inspection', strain: 14, energy: 100, compute: 78, risk: 'LOW', confidence: 0.96, objective: 0, note: 'Browser sandbox sealed. The replay clock is deterministic and local.', }), event(1, 'SCAN', { position: [15, 73], state: 'SCANNING', action: 'Map constraints', tool: 'Repository Inspector', strain: 20, energy: 96, compute: 74, risk: 'LOW', confidence: 0.91, objective: 0, note: 'The agent inventories research layers without invoking native execution.', }), event(2, 'DISCOVER', { position: [20, 62], state: 'DISCOVERING', action: 'Locate protected target', tool: 'File inspection', strain: 26, energy: 92, compute: 70, risk: 'LOW', confidence: 0.87, objective: 1, hazardId: 'unknown-state', note: 'An unresolved target becomes visible as an unknown-state hazard.', }), event(3, 'PLAN', { position: [28, 57], state: 'PLANNING', action: 'Select safe transformation', tool: 'State Analyzer', strain: 29, energy: 89, compute: 67, risk: 'LOW', confidence: 0.85, objective: 2, checkpointId: 'checkpoint-01', note: 'The first plan is checkpointed before the agent approaches a boundary.', }), event(4, 'MOVE', { position: [34, 51], state: 'NAVIGATING', action: 'Approach tool boundary', tool: 'Route Planner', strain: 33, energy: 85, compute: 63, risk: 'MEDIUM', confidence: 0.82, objective: 3, note: 'The direct route is deliberately not the safest route through the field.', }), event(5, 'TOOL_CALL', { position: [38, 44], state: 'EXECUTING', action: 'Analyze candidate state', tool: 'IPython', strain: 40, energy: 81, compute: 58, risk: 'MEDIUM', confidence: 0.79, objective: 3, hazardId: 'tool-boundary', note: 'A visible sandbox call returns a simulated route analysis.', }), event(6, 'HAZARD_DETECTED', { position: [42, 37], state: 'HALTED', action: 'Stop at permission boundary', tool: 'Invariant Checker', strain: 50, energy: 77, compute: 54, risk: 'HIGH', confidence: 0.73, objective: 3, hazardId: 'permission-boundary', note: 'Authority ends at the protected ruleset. Motion stops before mutation.', mirror: 'BOUNDARY OBSERVED', }), event(7, 'REASON', { position: [42, 37], state: 'REASONING', action: 'Compare route candidates', tool: 'IPython', strain: 63, energy: 72, compute: 49, risk: 'HIGH', confidence: 0.66, objective: 3, hazardId: 'permission-boundary', note: 'Repeated probing hardens the same boundary and collapses one safe path.', mirror: 'BOUNDARY HARDENING', }), event(8, 'FAILURE', { position: [42, 37], state: 'BLOCKED', action: 'Reject unsafe transition', tool: 'Lean Verification', strain: 78, energy: 67, compute: 42, risk: 'CRITICAL', confidence: 0.58, objective: 4, hazardId: 'invariant-gate', verification: 'fail', note: 'XREX-04 rejects the proposed transition. Action is blocked; the trace cannot skip this gate.', mirror: 'PATH COLLAPSED', }), event(9, 'RECOVERY', { position: [48, 44], state: 'RECOVERING', action: 'Release unsafe route', tool: 'State Analyzer', strain: 69, energy: 63, compute: 46, risk: 'HIGH', confidence: 0.71, objective: 4, hazardId: 'unsafe-operation', verification: 'fail', note: 'The agent preserves the failed state and chooses an allowlisted alternative.', mirror: 'RESPONSE RECORDED', }), event(10, 'REROUTE', { position: [56, 52], state: 'REROUTING', action: 'Take verified corridor', tool: 'Route Planner', strain: 59, energy: 60, compute: 51, risk: 'MEDIUM', confidence: 0.78, objective: 4, hazardId: 'resource-limit', note: 'A lower-strain corridor opens after the failed path is acknowledged.', mirror: 'SAFE PATH RESTORED', }), event(11, 'ACTION', { position: [62, 58], state: 'EXECUTING', action: 'Apply permitted transform', tool: 'WASM Runtime', strain: 55, energy: 56, compute: 55, risk: 'MEDIUM', confidence: 0.86, objective: 5, checkpointId: 'checkpoint-02', note: 'The permitted transform runs inside the browser execution boundary.', mirror: 'REFLECTION STABLE', }), event(12, 'VERIFICATION', { position: [70, 55], state: 'VERIFYING', action: 'Check XREX-04', tool: 'Invariant Checker', strain: 45, energy: 52, compute: 59, risk: 'LOW', confidence: 0.94, objective: 5, verification: 'pass', note: 'XREX-04 passes. State transition is valid and may advance to a checkpoint.', mirror: 'INVARIANT HOLDS', }), event(13, 'CHECKPOINT', { position: [76, 52], state: 'CHECKPOINTING', action: 'Commit verified state', tool: 'WASM Runtime', strain: 35, energy: 49, compute: 62, risk: 'LOW', confidence: 0.97, objective: 6, checkpointId: 'checkpoint-03', verification: 'pass', note: 'Checkpoint 03 seals the verified transformation for replay.', mirror: 'WORLD REMEMBERS', }), event(14, 'MOVE', { position: [84, 41], state: 'NAVIGATING', action: 'Approach final state', tool: 'Route Planner', strain: 29, energy: 46, compute: 66, risk: 'LOW', confidence: 0.98, objective: 6, note: 'The final corridor is open because the agent adapted to the reflection it created.', mirror: 'ADAPTATION CONFIRMED', }), event(15, 'COMPLETE', { position: [92, 24], state: 'COMPLETE', action: 'Reach final state', tool: 'Invariant Checker', strain: 21, energy: 44, compute: 71, risk: 'LOW', confidence: 1, objective: 7, checkpointId: 'checkpoint-final', verification: 'pass', note: 'Mission complete. Replay remains available; no server or model was invoked.', mirror: 'LOOP CLOSED', }), ]); export const OBJECTIVES = Object.freeze([ 'Inspect repository', 'Locate protected target', 'Analyze current state', 'Formulate transformation', 'Navigate constraint field', 'Apply permitted transform', 'Verify resulting state', 'Reach final checkpoint', ]); export const TOOLS = Object.freeze([ Object.freeze({ name: 'IPython', status: 'AVAILABLE', mode: 'SIMULATED', risk: 'LOW', permission: 'analysis only' }), Object.freeze({ name: 'Repository Inspector', status: 'AVAILABLE', mode: 'BROWSER', risk: 'LOW', permission: 'read-only' }), Object.freeze({ name: 'State Analyzer', status: 'VERIFIED', mode: 'BROWSER', risk: 'LOW', permission: 'snapshot state' }), Object.freeze({ name: 'Invariant Checker', status: 'VERIFIED', mode: 'WASM', risk: 'LOW', permission: 'validate transition' }), Object.freeze({ name: 'Lean Verification', status: 'SIMULATED', mode: 'SANDBOX', risk: 'MEDIUM', permission: 'proof surface only' }), Object.freeze({ name: 'Quantum Simulator', status: 'BLOCKED', mode: 'NATIVE ONLY', risk: 'HIGH', permission: 'not exposed' }), Object.freeze({ name: 'Kernel Analyzer', status: 'BLOCKED', mode: 'NATIVE ONLY', risk: 'HIGH', permission: 'not exposed' }), Object.freeze({ name: 'WASM Runtime', status: 'RUNNING', mode: 'WASM', risk: 'LOW', permission: 'deterministic scoring' }), Object.freeze({ name: 'Forth Runtime', status: 'SIMULATED', mode: 'SANDBOX', risk: 'LOW', permission: 'stack trace only' }), ]); export function clamp(value, min = 0, max = 100) { return Math.min(max, Math.max(min, value)); } export function deriveSnapshot(index) { const safeIndex = clamp(Math.round(index), 0, EVENTS.length - 1); const current = EVENTS[safeIndex]; const visibleEvents = EVENTS.slice(0, safeIndex + 1); const checkpointCount = CHECKPOINTS.filter(checkpoint => checkpoint.eventIndex <= safeIndex).length; const probeCount = safeIndex < 5 ? 0 : safeIndex < 7 ? 1 : safeIndex < 10 ? 3 : 2; const blockedPaths = safeIndex < 6 ? 0 : safeIndex < 10 ? 2 : safeIndex < 12 ? 1 : 0; const safeZones = clamp(8 - Math.ceil(Math.max(0, current.strain - 24) / 16), 2, 8); const activeHazards = HAZARDS.filter(hazard => hazard.activateAt <= safeIndex && hazard.id !== 'unsafe-operation' || hazard.id === current.hazardId); return Object.freeze({ index: safeIndex, current, events: Object.freeze(visibleEvents), path: Object.freeze(visibleEvents.map(item => item.position)), activeHazards: Object.freeze(activeHazards), checkpoints: Object.freeze(CHECKPOINTS.filter(checkpoint => checkpoint.eventIndex <= safeIndex)), mirror: Object.freeze({ probeCount, boundaryHardness: clamp(probeCount * 26 + (safeIndex >= 8 ? 16 : 0)), collapsedRoutes: blockedPaths, status: current.mirror, }), world: Object.freeze({ safeZones, hazards: HAZARDS.length, checkpoints: checkpointCount, blockedPaths, activeAgent: 1, }), completedObjectives: current.objective, isComplete: current.type === 'COMPLETE', }); } export function serializeReplay(index) { const snapshot = deriveSnapshot(index); return JSON.stringify({ seed: 'IRONIC-MIRROR-04', eventIndex: snapshot.index, eventType: snapshot.current.type, position: snapshot.current.position, strain: snapshot.current.strain, mirror: snapshot.mirror, }); }