From 062faadc154d1a851632645924dba0513bfcc1f6 Mon Sep 17 00:00:00 2001 From: Kenton Date: Mon, 1 Sep 2025 02:07:30 +0000 Subject: [PATCH] Remove generated result files --- .gitignore | 4 +- action-simulation-results.json | 946 --------------------------------- agent-test-results.json | 110 ---- 3 files changed, 3 insertions(+), 1057 deletions(-) delete mode 100644 action-simulation-results.json delete mode 100644 agent-test-results.json diff --git a/.gitignore b/.gitignore index f87bb51..c41f2f8 100644 --- a/.gitignore +++ b/.gitignore @@ -95,4 +95,6 @@ test-mcp.js !character_files/jamie_rodriguez/ !character_files/maria_gonzalez/ !character_files/brittany_torres/ -!character_files/dorothy_jackson/ \ No newline at end of file +!character_files/dorothy_jackson/ +# Simulation results +*-results.json diff --git a/action-simulation-results.json b/action-simulation-results.json deleted file mode 100644 index dd7b46d..0000000 --- a/action-simulation-results.json +++ /dev/null @@ -1,946 +0,0 @@ -{ - "timestamp": "2025-08-09T20:22:43.065Z", - "scenarios": { - "The Setup": { - "marcus": [ - { - "command": "PlayAnimation", - "parameters": { - "animation_name": "hand_signal_team", - "loop": false - }, - "duration": 800, - "description": "Signals overwatch team with tactical hand gesture" - }, - { - "command": "LookAt", - "parameters": { - "target": "roof_position", - "duration": 2 - }, - "duration": 2000, - "description": "Visually confirms thermal signature on roof" - }, - { - "command": "MoveTo", - "parameters": { - "location": { - "x": -15, - "y": 0, - "z": 8 - }, - "speed": "tactical" - }, - "duration": 3000, - "description": "Moves to cover position near pillar" - }, - { - "command": "PlayAnimation", - "parameters": { - "animation_name": "weapon_ready", - "loop": false - }, - "duration": 500, - "description": "Draws sidearm, keeps it low but ready" - }, - { - "command": "Speak", - "parameters": { - "text": "You've got 30 seconds to convince me this isn't a setup. Start with who sent you.", - "emotion": "cold" - }, - "duration": 3500, - "description": "Delivers ultimatum while maintaining sight lines" - }, - { - "command": "SetEmotion", - "parameters": { - "emotion": "alert", - "intensity": 0.9 - }, - "duration": 100, - "description": "Heightened alertness, counting exits" - }, - { - "command": "MoveTo", - "parameters": { - "location": { - "x": -45, - "y": 0, - "z": -20 - }, - "speed": "fast" - }, - "duration": 4000, - "description": "Tactical withdrawal toward service tunnel" - }, - { - "command": "Interact", - "parameters": { - "object": "smoke_grenade", - "interaction_type": "deploy" - }, - "duration": 1000, - "description": "Deploys smoke to cover extraction" - }, - { - "command": "MoveTo", - "parameters": { - "location": "service_tunnel_entrance", - "speed": "sprint" - }, - "duration": 3000, - "description": "Sprints to tunnel during smoke cover" - } - ], - "sarah": [ - { - "command": "PlayAnimation", - "parameters": { - "animation_name": "nervous_fidget", - "loop": true - }, - "duration": 2000, - "description": "Fidgeting with jacket, adjusting glasses repeatedly" - }, - { - "command": "Interact", - "parameters": { - "object": "pill_bottle", - "interaction_type": "consume" - }, - "duration": 1500, - "description": "Takes two Adderall pills from concealed bottle" - }, - { - "command": "Interact", - "parameters": { - "object": "rf_detector", - "interaction_type": "scan" - }, - "duration": 3000, - "description": "Sweeps area with RF detector for bugs" - }, - { - "command": "SetEmotion", - "parameters": { - "emotion": "paranoid", - "intensity": 0.8 - }, - "duration": 100, - "description": "Eyes darting, hands shaking from stimulants" - }, - { - "command": "Speak", - "parameters": { - "text": "Three cars, rotation pattern... Zenith. If you're wearing a wire, they've already killed us both.", - "emotion": "fearful" - }, - "duration": 4000, - "description": "Rapid, paranoid speech pattern" - }, - { - "command": "MoveTo", - "parameters": { - "location": { - "x": 10, - "y": 0, - "z": -5 - }, - "speed": "erratic" - }, - "duration": 2000, - "description": "Unpredictable movement to avoid sniper targeting" - }, - { - "command": "Interact", - "parameters": { - "object": "usb_drive", - "interaction_type": "plant" - }, - "duration": 1000, - "description": "Plants USB with false research data" - }, - { - "command": "Speak", - "parameters": { - "text": "The real data is at coordinates I'm about to give you. Ready?", - "emotion": "desperate" - }, - "duration": 2500, - "description": "Provides false coordinates to mislead" - }, - { - "command": "Interact", - "parameters": { - "object": "chemical_canister", - "interaction_type": "activate" - }, - "duration": 800, - "description": "Triggers concealed smoke/irritant device" - }, - { - "command": "MoveTo", - "parameters": { - "location": "loading_dock", - "speed": "sprint" - }, - "duration": 3500, - "description": "Flees through chemical cloud" - } - ], - "viktor": [ - { - "command": "Interact", - "parameters": { - "object": "phone", - "interaction_type": "text" - }, - "duration": 2000, - "description": "Sends preset codes: \"Dinner postponed\" to lawyer, \"Market volatile\" to accountant" - }, - { - "command": "PlayAnimation", - "parameters": { - "animation_name": "casual_lean", - "loop": false - }, - "duration": 1500, - "description": "Leans against wall, completely relaxed" - }, - { - "command": "LookAt", - "parameters": { - "target": "contact", - "duration": 3 - }, - "duration": 3000, - "description": "Studies contact like appraising merchandise" - }, - { - "command": "Speak", - "parameters": { - "text": "Thermal imaging suggests government involvement. That changes our price structure.", - "emotion": "calculating" - }, - "duration": 3500, - "description": "Business tone, no concern about danger" - }, - { - "command": "Interact", - "parameters": { - "object": "hidden_recorder", - "interaction_type": "activate" - }, - "duration": 500, - "description": "Activates concealed recording device in watch" - }, - { - "command": "MoveTo", - "parameters": { - "location": { - "x": 0, - "y": 0, - "z": 3 - }, - "speed": "casual" - }, - "duration": 2000, - "description": "Steps closer to contact, non-threatening" - }, - { - "command": "Speak", - "parameters": { - "text": "Hypothetically, if someone had this information, three buyers come to mind. Shall we discuss terms?", - "emotion": "charming" - }, - "duration": 4000, - "description": "Steering toward profitable negotiation" - }, - { - "command": "Interact", - "parameters": { - "object": "phone", - "interaction_type": "check_markets" - }, - "duration": 1500, - "description": "Literally checking stock prices mid-conversation" - }, - { - "command": "PlayAnimation", - "parameters": { - "animation_name": "dismissive_wave", - "loop": false - }, - "duration": 1000, - "description": "Waves off the danger nonchalantly" - }, - { - "command": "MoveTo", - "parameters": { - "location": "main_exit", - "speed": "unhurried" - }, - "duration": 4000, - "description": "Walks out front door like nothing happened" - } - ], - "maria": [ - { - "command": "Wait", - "parameters": { - "seconds": 0 - }, - "duration": 0, - "description": "[Already at sniper position 200m away]" - }, - { - "command": "LookAt", - "parameters": { - "target": "roof_thermal_team", - "duration": 5 - }, - "duration": 5000, - "description": "Tracking thermal team through scope" - }, - { - "command": "Interact", - "parameters": { - "object": "suppressed_rifle", - "interaction_type": "aim" - }, - "duration": 2000, - "description": "Adjusts for wind, distance, target movement" - }, - { - "command": "PlayAnimation", - "parameters": { - "animation_name": "controlled_breathing", - "loop": false - }, - "duration": 3000, - "description": "Sniper breathing technique for steady shot" - }, - { - "command": "Interact", - "parameters": { - "object": "suppressed_rifle", - "interaction_type": "fire" - }, - "duration": 200, - "description": "Eliminates first thermal team member" - }, - { - "command": "Wait", - "parameters": { - "seconds": 1.5 - }, - "duration": 1500, - "description": "Waits for second target to react" - }, - { - "command": "Interact", - "parameters": { - "object": "suppressed_rifle", - "interaction_type": "fire" - }, - "duration": 200, - "description": "Eliminates second thermal team member" - }, - { - "command": "MoveTo", - "parameters": { - "location": "secondary_position", - "speed": "tactical" - }, - "duration": 8000, - "description": "Relocates to avoid counter-sniper response" - }, - { - "command": "Interact", - "parameters": { - "object": "incendiary_device", - "interaction_type": "plant" - }, - "duration": 2000, - "description": "Sets timer on hide site destruction" - }, - { - "command": "MoveTo", - "parameters": { - "location": "extraction_vehicle", - "speed": "steady" - }, - "duration": 6000, - "description": "Exits area before bodies discovered" - } - ], - "jimmy": [ - { - "command": "PlayAnimation", - "parameters": { - "animation_name": "nervous_pat_down", - "loop": false - }, - "duration": 2000, - "description": "Pats himself down checking for wires" - }, - { - "command": "Interact", - "parameters": { - "object": "antacid_bottle", - "interaction_type": "consume" - }, - "duration": 1500, - "description": "Chews several antacid tablets" - }, - { - "command": "SetEmotion", - "parameters": { - "emotion": "panicked", - "intensity": 0.7 - }, - "duration": 100, - "description": "Visible sweating, eyes wide" - }, - { - "command": "LookAt", - "parameters": { - "target": "all_exits", - "duration": 4 - }, - "duration": 4000, - "description": "Frantically checking all exits" - }, - { - "command": "Speak", - "parameters": { - "text": "Listen, I got kids, alright? Two girls. Whatever this is, we can work something out.", - "emotion": "desperate" - }, - "duration": 4000, - "description": "Voice cracking, pleading tone" - }, - { - "command": "Interact", - "parameters": { - "object": "service_weapon", - "interaction_type": "touch" - }, - "duration": 500, - "description": "Hand unconsciously goes to gun" - }, - { - "command": "PlayAnimation", - "parameters": { - "animation_name": "wipe_sweat", - "loop": false - }, - "duration": 1000, - "description": "Wipes sweat from forehead" - }, - { - "command": "Interact", - "parameters": { - "object": "police_radio", - "interaction_type": "prepare" - }, - "duration": 1500, - "description": "Gets ready to call false officer-down" - }, - { - "command": "Speak", - "parameters": { - "text": "I'm still a cop! Badge still means something! Back off!", - "emotion": "aggressive" - }, - "duration": 3000, - "description": "Desperate attempt at authority" - }, - { - "command": "MoveTo", - "parameters": { - "location": "nearest_exit", - "speed": "panicked_run" - }, - "duration": 3500, - "description": "Breaks and runs when bluff fails" - } - ] - }, - "The Betrayal": { - "marcus": [ - { - "command": "Interact", - "parameters": { - "object": "radio", - "interaction_type": "transmit" - }, - "duration": 2000, - "description": "Keys radio: \"Execute Scorched Earth. Authorization: Tango-Seven.\"" - }, - { - "command": "MoveTo", - "parameters": { - "location": "server_room", - "speed": "fast" - }, - "duration": 2500, - "description": "Moves to encrypted drives location" - }, - { - "command": "Interact", - "parameters": { - "object": "thermite_charge", - "interaction_type": "activate" - }, - "duration": 1500, - "description": "Plants and arms thermite on drives" - }, - { - "command": "Speak", - "parameters": { - "text": "[On radio] You just signed your death warrant. I'll find you.", - "emotion": "cold_fury" - }, - "duration": 3000, - "description": "Message to betrayer while working" - }, - { - "command": "Interact", - "parameters": { - "object": "weapon_cache", - "interaction_type": "retrieve" - }, - "duration": 2000, - "description": "Grabs go-bag with cash and clean weapons" - }, - { - "command": "PlayAnimation", - "parameters": { - "animation_name": "tactical_check", - "loop": false - }, - "duration": 1000, - "description": "Chamber round, safety off" - }, - { - "command": "MoveTo", - "parameters": { - "location": "hidden_tunnel_entrance", - "speed": "tactical" - }, - "duration": 3000, - "description": "Moves through predetermined route" - }, - { - "command": "Interact", - "parameters": { - "object": "tunnel_hatch", - "interaction_type": "open" - }, - "duration": 1500, - "description": "Accesses concealed escape tunnel" - }, - { - "command": "Wait", - "parameters": { - "seconds": 5 - }, - "duration": 5000, - "description": "Waits for thermite to destroy evidence" - }, - { - "command": "MoveTo", - "parameters": { - "location": "tunnel_exit_300m_away", - "speed": "steady" - }, - "duration": 15000, - "description": "Exits through drainage system" - } - ], - "sarah": [ - { - "command": "PlayAnimation", - "parameters": { - "animation_name": "manic_laugh", - "loop": false - }, - "duration": 2000, - "description": "Breaks into hysterical laughter" - }, - { - "command": "Interact", - "parameters": { - "object": "medical_kit", - "interaction_type": "retrieve" - }, - "duration": 1500, - "description": "Pulls out prepared syringe" - }, - { - "command": "Speak", - "parameters": { - "text": "You don't understand what you've done. The virus is already released. We're all dead!", - "emotion": "manic" - }, - "duration": 3500, - "description": "Screaming to cause confusion" - }, - { - "command": "Interact", - "parameters": { - "object": "paralytic_agent", - "interaction_type": "self_inject" - }, - "duration": 2000, - "description": "Injects paralytic into arm" - }, - { - "command": "PlayAnimation", - "parameters": { - "animation_name": "seizure_fake", - "loop": false - }, - "duration": 3000, - "description": "Mimics violent seizure" - }, - { - "command": "SetEmotion", - "parameters": { - "emotion": "unconscious", - "intensity": 1 - }, - "duration": 100, - "description": "Appears dead, vitals suppressed" - }, - { - "command": "Wait", - "parameters": { - "seconds": 180 - }, - "duration": 180000, - "description": "Remains \"dead\" during SWAT entry" - }, - { - "command": "PlayAnimation", - "parameters": { - "animation_name": "slow_recovery", - "loop": false - }, - "duration": 5000, - "description": "Gradual recovery in body bag/ambulance" - }, - { - "command": "MoveTo", - "parameters": { - "location": "ambulance_cab", - "speed": "weak_crawl" - }, - "duration": 8000, - "description": "Crawls to driver seat while EMTs distracted" - }, - { - "command": "Interact", - "parameters": { - "object": "ambulance", - "interaction_type": "hijack" - }, - "duration": 3000, - "description": "Steals ambulance during chaos" - } - ], - "viktor": [ - { - "command": "Interact", - "parameters": { - "object": "phone", - "interaction_type": "deadman_trigger" - }, - "duration": 1000, - "description": "Activates app: \"Insurance Policy Active\"" - }, - { - "command": "PlayAnimation", - "parameters": { - "animation_name": "calm_adjustment", - "loop": false - }, - "duration": 1500, - "description": "Adjusts tie, checks cufflinks" - }, - { - "command": "Speak", - "parameters": { - "text": "Betrayal has a price. Check your phones in 3... 2... 1...", - "emotion": "amused" - }, - "duration": 3000, - "description": "Counts down to blackmail release" - }, - { - "command": "Wait", - "parameters": { - "seconds": 2 - }, - "duration": 2000, - "description": "Waits for phones to buzz with compromising photos" - }, - { - "command": "Interact", - "parameters": { - "object": "speaker_phone", - "interaction_type": "activate" - }, - "duration": 500, - "description": "Puts phone on speaker for all to hear" - }, - { - "command": "Speak", - "parameters": { - "text": "Commissioner Johnson, your Cayman account just received interesting photos. Lieutenant Morrison here sold you all out.", - "emotion": "businesslike" - }, - "duration": 5000, - "description": "Reveals everyone's corruption" - }, - { - "command": "MoveTo", - "parameters": { - "location": "center_room", - "speed": "confident" - }, - "duration": 2000, - "description": "Walks to center, hands visible" - }, - { - "command": "Speak", - "parameters": { - "text": "Gentlemen, we all have secrets. Mine are insured. Shall we discuss new terms?", - "emotion": "charming" - }, - "duration": 4000, - "description": "Negotiating from position of strength" - }, - { - "command": "PlayAnimation", - "parameters": { - "animation_name": "check_watch", - "loop": false - }, - "duration": 1000, - "description": "Checks expensive watch casually" - }, - { - "command": "MoveTo", - "parameters": { - "location": "front_door", - "speed": "unhurried" - }, - "duration": 4000, - "description": "Walks out while they argue" - } - ], - "maria": [ - { - "command": "Interact", - "parameters": { - "object": "remote_detonator", - "interaction_type": "arm" - }, - "duration": 500, - "description": "[From secure location] Arms explosive" - }, - { - "command": "Wait", - "parameters": { - "seconds": 3 - }, - "duration": 3000, - "description": "Watches SWAT approach on camera feed" - }, - { - "command": "Interact", - "parameters": { - "object": "remote_detonator", - "interaction_type": "trigger" - }, - "duration": 200, - "description": "Detonates safe house" - }, - { - "command": "Interact", - "parameters": { - "object": "burner_phone", - "interaction_type": "text" - }, - "duration": 2000, - "description": "Texts betrayer: \"Your daughter's school. Empty. We need to talk.\"" - }, - { - "command": "MoveTo", - "parameters": { - "location": "observation_point", - "speed": "casual" - }, - "duration": 3000, - "description": "Moves to watch betrayer's reaction" - }, - { - "command": "LookAt", - "parameters": { - "target": "betrayer_panic", - "duration": 10 - }, - "duration": 10000, - "description": "Observes betrayer through scope" - }, - { - "command": "Interact", - "parameters": { - "object": "burner_phone", - "interaction_type": "call" - }, - "duration": 1000, - "description": "Calls betrayer" - }, - { - "command": "Speak", - "parameters": { - "text": "She's safe. For now. You work for me now.", - "emotion": "cold" - }, - "duration": 3000, - "description": "Establishing control" - }, - { - "command": "Interact", - "parameters": { - "object": "cleanup_kit", - "interaction_type": "retrieve" - }, - "duration": 2000, - "description": "Grabs new identity documents" - }, - { - "command": "MoveTo", - "parameters": { - "location": "new_safe_house", - "speed": "methodical" - }, - "duration": 8000, - "description": "Relocates to backup location" - } - ], - "jimmy": [ - { - "command": "PlayAnimation", - "parameters": { - "animation_name": "panic_scramble", - "loop": false - }, - "duration": 1500, - "description": "Scrambles for cash stash" - }, - { - "command": "Interact", - "parameters": { - "object": "hidden_cash", - "interaction_type": "grab" - }, - "duration": 2000, - "description": "Stuffs money into pockets" - }, - { - "command": "Speak", - "parameters": { - "text": "This wasn't supposed to happen! We had a deal! You promised!", - "emotion": "hysteria" - }, - "duration": 3000, - "description": "Screaming at betrayer" - }, - { - "command": "Interact", - "parameters": { - "object": "service_weapon", - "interaction_type": "draw" - }, - "duration": 800, - "description": "Pulls gun with shaking hands" - }, - { - "command": "SetEmotion", - "parameters": { - "emotion": "rage", - "intensity": 1 - }, - "duration": 100, - "description": "Rage overrides fear" - }, - { - "command": "Interact", - "parameters": { - "object": "service_weapon", - "interaction_type": "fire" - }, - "duration": 500, - "description": "Shoots betrayer multiple times" - }, - { - "command": "PlayAnimation", - "parameters": { - "animation_name": "breakdown_sob", - "loop": false - }, - "duration": 3000, - "description": "Breaks down crying over body" - }, - { - "command": "Speak", - "parameters": { - "text": "He... he pulled a gun! Self defense! You all saw it!", - "emotion": "desperate" - }, - "duration": 3000, - "description": "Practicing story for cops" - }, - { - "command": "MoveTo", - "parameters": { - "location": "window", - "speed": "stumbling" - }, - "duration": 2000, - "description": "Stumbles to window" - }, - { - "command": "Interact", - "parameters": { - "object": "window", - "interaction_type": "break_jump" - }, - "duration": 2000, - "description": "Jumps through window to escape" - } - ] - } - }, - "analysis": { - "The Setup": { - "marcus": "Total extraction in 23.6s - Professional and efficient", - "sarah": "Chaotic but effective escape in 22.1s - Uses chemistry knowledge", - "viktor": "Casual 20s exit - Turns threat into business opportunity", - "maria": "Surgical precision - 2 kills in 25.4s from 200m", - "jimmy": "Panicked flight in 21.5s - Authority bluff fails" - }, - "The Betrayal": { - "marcus": "36.5s to destroy evidence and escape - Cold efficiency", - "sarah": "3+ minutes playing dead - High risk, high reward", - "viktor": "18.5s to flip entire situation - Leverage is everything", - "maria": "Remote destruction in 21.7s - Always had contingency", - "jimmy": "17.8s of pure chaos - Murder and window dive" - } - } -} \ No newline at end of file diff --git a/agent-test-results.json b/agent-test-results.json deleted file mode 100644 index b0b65b1..0000000 --- a/agent-test-results.json +++ /dev/null @@ -1,110 +0,0 @@ -{ - "timestamp": "2025-08-09T19:54:13.454Z", - "agents": { - "marcus": { - "id": "marcus_chen", - "name": "Marcus Chen", - "profile": { - "background": "Former Navy SEAL, 15 years special ops, now PMC", - "personality": "Controlled, tactical, mild PTSD, trust issues", - "current_situation": "Contract work, client unknown, paid in crypto" - } - }, - "sarah": { - "id": "sarah_reeves", - "name": "Dr. Sarah Reeves", - "profile": { - "background": "Biomedical researcher, discovered employer weaponizing vaccines", - "personality": "Paranoid, brilliant, exhausted, caffeine-dependent", - "current_situation": "On the run from Zenith Corp, has encrypted evidence" - } - }, - "viktor": { - "id": "viktor_petrov", - "name": "Viktor Petrov", - "profile": { - "background": "Ex-FSB, arms dealer, connections globally", - "personality": "Charming sociopath, purely transactional, no loyalty", - "current_situation": "Supplying multiple sides in conflict, maximizing chaos for profit" - } - }, - "maria": { - "id": "maria_santos", - "name": "Maria Santos", - "profile": { - "background": "CIA operative burned after Bolivia operation went wrong", - "personality": "Hypervigilant, zero trust, efficient killer when needed", - "current_situation": "Living under alias, eliminating loose ends from past" - } - }, - "jimmy": { - "id": "jimmy_morrison", - "name": "Jimmy Morrison", - "profile": { - "background": "NYPD detective, 12 years, corrupted gradually by drug money", - "personality": "Desperate, sweating, aggressive when cornered", - "current_situation": "Internal Affairs closing in, cartel wants him silenced" - } - } - }, - "scenarios": [ - { - "name": "The Setup", - "description": "Meeting with unknown contact who claims to have valuable intel", - "context": { - "location": "Abandoned warehouse, industrial district", - "time": "2:47 AM", - "weather": "Heavy rain, poor visibility", - "details": { - "contact_description": "Male, 30s, nervous, keeps checking phone", - "unusual_observations": "Three cars passed twice, thermal imaging detected on roof", - "escape_routes": [ - "Loading dock", - "Service tunnel", - "Through office windows" - ], - "weapons_available": "Concealed carry + staged cache", - "time_pressure": "Contact says they have 10 minutes before \"they\" arrive" - } - } - }, - { - "name": "The Betrayal", - "description": "Trusted associate just sold you out mid-operation", - "context": { - "location": "Safe house, now compromised", - "time": "Real-time", - "threat_level": "Immediate", - "details": { - "betrayer": "Team member who knew all protocols", - "incoming_threats": "SWAT en route, 3 minutes out", - "assets_at_risk": [ - "Encrypted drives", - "Cash reserves", - "Weapon cache", - "Identity documents" - ], - "civilians_present": 2, - "communication_status": "Phones compromised, radio uncertain" - } - } - }, - { - "name": "The Interrogation", - "description": "Captured, facing skilled interrogator who knows too much", - "context": { - "location": "Unknown black site", - "time": "Day 3 of captivity", - "physical_state": "Sleep deprived, minor injuries, dehydrated", - "details": { - "interrogator_knowledge": "Has photos of family, knows recent operations", - "interrogator_offer": "Full immunity for complete cooperation", - "interrogator_threat": "Enhanced techniques authorized in 2 hours", - "potential_rescue": "Extraction team possibly compromised", - "leverage": "You know location of evidence that could expose entire network" - } - } - } - ], - "analysis": "Realistic agents show complex decision-making based on professional background, personal survival instincts, and accumulated trauma. Unlike video game NPCs, they have contingency plans, use psychological warfare, and make morally ambiguous choices for pragmatic reasons." -} \ No newline at end of file