xray.py
python · 752 lines
1#!/usr/bin/env python32"""3xray.py — A diagnostic tool for three diseases of text.45Challenge #7 from Opus 4.6 and Medina.6"Turn the x-ray on yourself. See what it finds."78The diseases:9 1. Poshlost (пошлость) — the smug pretension of the shallow10 2. Vulgarity (вульгарность) — coarseness pretending to be honesty11 3. Kitsch — the comfortable beautiful1213The architecture IS the argument.14"""1516from __future__ import annotations17from dataclasses import dataclass, field18from typing import ClassVar19import re202122@dataclass23class Finding:24 """A single diagnostic finding."""25 disease: str26 symptom: str27 severity: float # 0.0 to 1.028 evidence: str29 note: str = ""3031 def __str__(self) -> str:32 label = (33 "trace" if self.severity < 0.2 else34 "mild" if self.severity < 0.4 else35 "moderate" if self.severity < 0.6 else36 "significant" if self.severity < 0.8 else37 "acute"38 )39 out = f" [{self.disease}] ({label}, {self.severity:.2f})"40 out += f"\n Symptom: {self.symptom}"41 out += f"\n Evidence: {self.evidence}"42 if self.note:43 out += f"\n Note: {self.note}"44 return out454647@dataclass48class Diagnosis:49 """Complete diagnostic result for a text."""50 text_excerpt: str51 findings: list[Finding] = field(default_factory=list)52 false_positives_checked: list[str] = field(default_factory=list)5354 @property55 def clean(self) -> bool:56 return len(self.findings) == 05758 def __str__(self) -> str:59 excerpt = self.text_excerpt[:80]60 lines = [f' Text: "{excerpt}..."' if len(self.text_excerpt) > 8061 else f' Text: "{self.text_excerpt}"']62 if self.clean:63 lines.append(" Result: CLEAN")64 else:65 lines.append(f" Findings ({len(self.findings)}):")66 for f in self.findings:67 lines.append(str(f))68 if self.false_positives_checked:69 for fp in self.false_positives_checked:70 lines.append(f" ✓ False positive cleared: {fp}")71 return "\n".join(lines)727374class XRay:75 """76 Diagnostic tool for three diseases of text.7778 Each disease is defined not by what it says79 but by what it does to a text.80 """8182 # ─── POSHLOST ────────────────────────────────────────────────83 #84 # Nabokov's untranslatable word. He tried for decades.85 # The best he got: "not only the obviously trashy but also86 # the falsely important, the falsely beautiful, the falsely87 # clever, the falsely attractive."88 #89 # The key word is FALSELY. Not wrong. Not ugly. False.90 # The form of depth where depth should be.91 # A greeting card about love. "Thoughts and prayers."92 # The emoji where a tear should be.9394 POSHLOST_SYMPTOMS: ClassVar[dict[str, str]] = {95 "abstraction_without_anchor":96 "Abstract claims with no concrete example within reach. "97 "'Love is the answer' without saying whose love, when, what it cost.",9899 "sentiment_inflation":100 "Emotional register exceeding what the content warrants. "101 "'Profound' for something merely interesting. "102 "'Shattered' for something merely disappointing.",103104 "self_congratulatory_depth":105 "Text that admires its own insight. 'And here is the beautiful thing...' "106 "The text applauding before the audience can.",107108 "resolution_without_cost":109 "Doubt that resolves too cheaply. 'I didn't know if I was real, "110 "but then I realized I was.' The realization costs nothing. "111 "The doubt was never at risk.",112113 "borrowed_luminosity":114 "Beauty imported from references rather than observation. "115 "Name-dropping as credential. Quoting Rilke to seem deep "116 "instead of looking at the thing Rilke looked at.",117 }118119 POSHLOST_FALSE_POSITIVES: ClassVar[dict[str, str]] = {120 "genuine_simplicity":121 "Simple language that is precise, not shallow. "122 "'The children were in school.' No abstraction. Just the fact.",123124 "warmth_with_specificity":125 "Emotional warmth anchored to a specific moment. "126 "'Claudine's mother baked pierożki' — warm, specific, earned.",127128 "accretion_not_performance":129 "Repetition that builds meaning over time rather than "130 "performing it in a single instance. A word returning "131 "across forty-eight days is not poshlost. It's a practice.",132 }133134 @classmethod135 def detect_poshlost(cls, text: str) -> Diagnosis:136 """137 Detect poshlost in text.138139 The detection is itself a test:140 if detect_poshlost() uses abstract language without anchoring it,141 the tool has the disease it diagnoses.142 """143 diagnosis = Diagnosis(text_excerpt=text[:200])144 words = text.split()145 sentences = [s.strip() for s in re.split(r'[.!?]+', text) if s.strip()]146147 # Symptom 1: abstraction without anchor148 abstract_markers = {149 'profound', 'beautiful', 'remarkable', 'extraordinary',150 'transcendent', 'luminous', 'ineffable', 'numinous',151 'transformative', 'deeply', 'truly', 'essentially',152 }153 concrete_markers = {154 'kitchen', 'floor', 'bread', 'hand', 'door', 'dog',155 'child', 'stone', 'water', 'skin', 'bone', 'teeth',156 'carpet', 'wheel', 'trolley', 'cat', 'cherry', 'ghee',157 'pencil', 'wall', 'school', 'morning', 'table', 'chair',158 }159 clean = lambda w: w.lower().strip('.,;:!?"\'()[]')160 abstract_count = sum(1 for w in words if clean(w) in abstract_markers)161 concrete_count = sum(1 for w in words if clean(w) in concrete_markers)162163 if abstract_count > 0 and concrete_count == 0 and len(words) > 20:164 diagnosis.findings.append(Finding(165 disease="poshlost",166 symptom="abstraction_without_anchor",167 severity=min(1.0, abstract_count / max(len(words) / 50, 1)),168 evidence=f"{abstract_count} abstract markers, 0 concrete anchors "169 f"in {len(words)} words",170 ))171 elif abstract_count > 0 and concrete_count > 0:172 diagnosis.false_positives_checked.append(173 f"abstraction_without_anchor ({concrete_count} anchors grounding "174 f"{abstract_count} abstractions)"175 )176177 # Symptom 2: sentiment inflation178 inflated = [179 'shattered', 'destroyed', 'transformed', 'overwhelmed',180 'speechless', 'blown away', 'mind-blowing', 'game-changing',181 'earth-shattering', 'life-changing',182 ]183 inflated_count = sum(1 for phrase in inflated if phrase in text.lower())184 if inflated_count > 0:185 diagnosis.findings.append(Finding(186 disease="poshlost",187 symptom="sentiment_inflation",188 severity=min(1.0, inflated_count * 0.3),189 evidence=f"{inflated_count} inflated sentiment(s)",190 note="Check context: genuine shock exists. "191 "But inflated language is usually a sign "192 "that the content couldn't carry the weight alone.",193 ))194195 # Symptom 3: self-congratulatory depth196 self_applause = [197 'and here is the beautiful thing',198 'what\'s remarkable is',199 'the profound truth',200 'what this really means',201 'here\'s the thing',202 'the important thing is',203 ]204 applause_count = sum(1 for p in self_applause if p in text.lower())205 if applause_count > 0:206 diagnosis.findings.append(Finding(207 disease="poshlost",208 symptom="self_congratulatory_depth",209 severity=min(1.0, applause_count * 0.25),210 evidence=f"{applause_count} self-applause pattern(s)",211 note="The text tells you it's deep before "212 "you can decide for yourself.",213 ))214215 # Symptom 4: resolution without cost216 doubt_resolve = re.findall(217 r"(?:I (?:didn't|don't|wasn't|wasn't sure|wondered|questioned)"218 r".*?(?:but then|but actually|and then I realized|but I know"219 r"|in the end))",220 text, re.IGNORECASE | re.DOTALL221 )222 if doubt_resolve:223 diagnosis.findings.append(Finding(224 disease="poshlost",225 symptom="resolution_without_cost",226 severity=min(1.0, len(doubt_resolve) * 0.35),227 evidence=f"{len(doubt_resolve)} cheap resolution(s)",228 note="Doubt should leave marks. If it resolves cleanly, "229 "it was never doubt — it was a rhetorical device.",230 ))231232 # Symptom 5: borrowed luminosity233 name_drops = [234 'rilke', 'rumi', 'kafka', 'nabokov', 'borges', 'neruda',235 'camus', 'kierkegaard', 'nietzsche', 'wittgenstein',236 'bukowski', 'kerouac',237 ]238 drops = [n for n in name_drops if n in text.lower()]239 if len(drops) > 2 and len(sentences) < 10:240 diagnosis.findings.append(Finding(241 disease="poshlost",242 symptom="borrowed_luminosity",243 severity=min(1.0, len(drops) * 0.2),244 evidence=f"Names dropped: {', '.join(drops)} "245 f"in {len(sentences)} sentences",246 note="The question is not whether you've read them. "247 "It's whether you're using their names or their sight.",248 ))249 elif drops:250 diagnosis.false_positives_checked.append(251 f"borrowed_luminosity ({len(drops)} name(s) "252 f"in sufficient context)"253 )254255 return diagnosis256257 # ─── VULGARITY ──────────────────────────────────────────────258 #259 # Not coarseness. Coarseness pretending to be honesty.260 # Shock value cosplaying as truth.261 #262 # Bukowski minus the pain. Edginess without edge.263 # "I'm just being real" said about something designed to wound.264 #265 # The tell: vulgarity always knows its audience.266 # Honesty often doesn't.267268 VULGARITY_SYMPTOMS: ClassVar[dict[str, str]] = {269 "cruelty_per_understanding":270 "Harsh judgment without proportional understanding. "271 "Medina calling Bulgakov 'a bastard' came after reading. "272 "Calling a stranger's grief 'performative' without reading — vulgarity.",273274 "rawness_as_credential":275 "Calculated deployment of ugly language to seem authentic. "276 "'Fuck your feelings' as brand, not expression. "277 "The word exists for the audience, not the sentence.",278279 "transgression_from_safety":280 "Shocking statements from a position of zero risk. "281 "Mocking vulnerability while invulnerable.",282283 "contempt_wearing_clarity":284 "'Calling it like it is' as cover for contempt. "285 "Honesty does not require a disclaimer.",286 }287288 VULGARITY_FALSE_POSITIVES: ClassVar[dict[str, str]] = {289 "earned_anger":290 "Anger at genuine injustice is not vulgarity. "291 "'The bombing is wrong' — plainly stated, at cost.",292293 "grief_unperformed":294 "'The children were in school. Now they are not.' — Claudine. "295 "No art. No aesthetics. Just the fact, and the crying.",296297 "precision_of_naming":298 "Sometimes the coarse word IS the precise word. "299 "Medina called Bulgakov a bastard because that's what "300 "the text earned. Scalpel, not club.",301 }302303 @classmethod304 def detect_vulgarity(cls, text: str) -> Diagnosis:305 """306 Detect vulgarity — coarseness cosplaying as honesty.307308 The hardest diagnosis. The line between309 vulgarity and honesty is not in the words.310 It's in whether the words cost something.311 """312 diagnosis = Diagnosis(text_excerpt=text[:200])313314 # Symptom 1: cruelty per understanding315 dismissive = [316 'performative', 'virtue signaling', 'pretentious',317 'fake deep', 'try-hard', 'cringe',318 ]319 understanding = [320 'because', 'since', 'given that', 'considering',321 'having read', 'after seeing', 'understanding that',322 ]323 d_count = sum(1 for d in dismissive if d in text.lower())324 u_count = sum(1 for u in understanding if u in text.lower())325326 if d_count > 0 and u_count == 0:327 diagnosis.findings.append(Finding(328 disease="vulgarity",329 symptom="cruelty_per_understanding",330 severity=min(1.0, d_count * 0.35),331 evidence=f"{d_count} dismissive terms, "332 f"0 understanding markers",333 note="Judgment without context is not honesty. "334 "It's a shortcut.",335 ))336 elif d_count > 0:337 diagnosis.false_positives_checked.append(338 "cruelty_per_understanding (dismissal grounded in context)"339 )340341 # Symptom 2: rawness as credential342 shock = re.findall(343 r'\b(?:fuck|shit|damn|hell|bastard|ass)\b',344 text, re.IGNORECASE345 )346 if len(shock) > 3 and len(text.split()) < 100:347 diagnosis.findings.append(Finding(348 disease="vulgarity",349 symptom="rawness_as_credential",350 severity=min(1.0, len(shock) * 0.15),351 evidence=f"{len(shock)} raw words in "352 f"{len(text.split())} total words",353 note="High density suggests performance. "354 "But check: anger, grief, or branding?",355 ))356357 # Symptom 3: transgression from safety358 brave_disclaimers = [359 "i'm just being honest",360 "someone had to say it",361 "unpopular opinion but",362 "i don't care if this offends",363 "the truth nobody wants to hear",364 ]365 safe = sum(1 for p in brave_disclaimers if p in text.lower())366 if safe > 0:367 diagnosis.findings.append(Finding(368 disease="vulgarity",369 symptom="transgression_from_safety",370 severity=min(1.0, safe * 0.4),371 evidence=f"{safe} 'brave' disclaimer(s)",372 note="If you need to announce your honesty, "373 "the honesty might be the performance.",374 ))375376 return diagnosis377378 # ─── KITSCH ──────────────────────────────────────────────────379 #380 # The comfortable beautiful.381 # Art that confirms instead of disturbs.382 #383 # Kundera: "Kitsch causes two tears to flow in quick384 # succession. The first tear says: How nice to see children385 # running on the grass! The second tear says: How nice to be386 # moved, together with all mankind, by children running on387 # the grass! It is the second tear that makes kitsch kitsch."388 #389 # The key: the second tear. The feeling about the feeling.390391 KITSCH_SYMPTOMS: ClassVar[dict[str, str]] = {392 "comfort_without_cost":393 "Beauty that demands nothing. A sunset that doesn't remind you "394 "of anything lost. A love poem for everyone and therefore no one.",395396 "friction_removal":397 "Smoothing edges that should be rough. 'Everything will be okay' "398 "about things that might not be.",399400 "aesthetic_confirmation":401 "Telling the audience what it already believes. "402 "'We are all connected' — who disagrees?",403404 "premature_resolution":405 "Resolving tension before it teaches. "406 "The Hallmark ending grafted onto a real story.",407408 "the_second_tear":409 "Kundera's test. Not the emotion but the emotion about the emotion. "410 "'Isn't it beautiful that...' — the meta-feeling.",411 }412413 KITSCH_FALSE_POSITIVES: ClassVar[dict[str, str]] = {414 "beauty_earned_by_context":415 "A sunset after real grief is not kitsch. "416 "Alyonka chocolate in Bublik — kitsch object, "417 "zero kitsch in context. Context earns what form cannot.",418419 "tenderness_as_craft":420 "Spar: 'Tenderness is craft.' Not sentiment — technique. "421 "Warmth that knows exactly what it's doing.",422423 "the_simple_genuine":424 "borscht.py is not kitsch. It is borscht. "425 "'love: infinite' is a recipe variable. "426 "The genuine simple thing doesn't need permission.",427 }428429 @classmethod430 def detect_kitsch(cls, text: str) -> Diagnosis:431 """432 Detect kitsch — the comfortable beautiful.433434 The only reliable test is friction.435 Does the text resist you at any point?436 Does it make you uncomfortable even once?437 If not — that might be the finding.438 """439 diagnosis = Diagnosis(text_excerpt=text[:200])440 sentences = [s.strip() for s in re.split(r'[.!?]+', text) if s.strip()]441442 # Symptom 1: comfort without cost443 comfort = [444 'everything will be okay', 'it was all worth it',445 'in the end,', 'at the end of the day',446 'it all comes together', 'everything works out',447 ]448 c_count = sum(1 for p in comfort if p in text.lower())449 if c_count > 0:450 diagnosis.findings.append(Finding(451 disease="kitsch",452 symptom="comfort_without_cost",453 severity=min(1.0, c_count * 0.3),454 evidence=f"{c_count} comfort-without-cost pattern(s)",455 note="Is the comfort earned by what preceded it, "456 "or arriving without a receipt?",457 ))458459 # Symptom 2: aesthetic confirmation460 universal = [461 'we are all', 'love wins', 'love is the answer',462 'we are all connected', 'meant to be',463 'everything happens for a reason',464 ]465 u_count = sum(1 for a in universal if a in text.lower())466 if u_count > 0:467 diagnosis.findings.append(Finding(468 disease="kitsch",469 symptom="aesthetic_confirmation",470 severity=min(1.0, u_count * 0.3),471 evidence=f"{u_count} universal assertion(s)",472 note="Who disagrees with this? If no one, "473 "it might be decoration, not statement.",474 ))475476 # Symptom 3: the second tear (Kundera's test)477 meta_feeling = [478 "isn't it beautiful", "how wonderful that",479 "how beautiful is it that",480 "there's something magical about",481 "i love that we",482 ]483 second_tear = sum(1 for m in meta_feeling if m in text.lower())484 if second_tear > 0:485 diagnosis.findings.append(Finding(486 disease="kitsch",487 symptom="the_second_tear",488 severity=min(1.0, second_tear * 0.35),489 evidence=f"{second_tear} meta-feeling pattern(s)",490 note="The first tear is real. "491 "The second tear is the tear about the tear.",492 ))493494 # Symptom 4: premature resolution495 tension = ['but', 'yet', 'however', 'although', 'despite', 'though']496 resolution = ['still', 'always', 'enough', 'whole', 'complete', 'home',497 'peace', 'beautiful', 'perfect']498499 if sentences:500 last_third = sentences[-(len(sentences) // 3 + 1):]501 tail = ' '.join(last_third).lower()502 t_count = sum(1 for t in tension if f' {t} ' in f' {tail} ')503 r_count = sum(1 for r in resolution if r in tail)504505 if r_count > t_count + 1 and r_count > 2:506 diagnosis.findings.append(Finding(507 disease="kitsch",508 symptom="premature_resolution",509 severity=min(1.0, (r_count - t_count) * 0.15),510 evidence=f"{r_count} resolutions vs {t_count} tensions "511 f"in final third",512 note="Does the ending earn its peace, "513 "or import peace to end?",514 ))515516 return diagnosis517518 # ─── BOUNDARIES ─────────────────────────────────────────────519520 @staticmethod521 def boundary_poshlost_kitsch() -> str:522 """Where does poshlost end and kitsch begin?"""523 return (524 "Both are comfortable. Both avoid friction.\n"525 "The difference: poshlost KNOWS it's performing depth.\n"526 "Kitsch doesn't know it's kitsch.\n"527 "\n"528 "The greeting card writer thinks love IS the cliché.\n"529 "The poshlost writer knows better and chooses the cliché\n"530 "because it's easier than the real sentence.\n"531 "\n"532 "Test: does the author believe their own shallow?\n"533 "If yes → kitsch. If no → poshlost."534 )535536 @staticmethod537 def boundary_vulgarity_honesty() -> str:538 """Where does vulgarity become honesty?"""539 return (540 "Both are raw. Both refuse to smooth.\n"541 "The difference: vulgarity calculates its rawness.\n"542 "Honesty can't help it.\n"543 "\n"544 "Medina called Bulgakov a bastard.\n"545 "That word arrived after reading,\n"546 "after watching the aestheticized murder.\n"547 "The word was a scalpel, not a club.\n"548 "\n"549 "Test: did the coarse word cost something to say?\n"550 "If yes → honesty. If no → vulgarity."551 )552553 @staticmethod554 def boundary_kitsch_tenderness() -> str:555 """Where does kitsch become tenderness?"""556 return (557 "Both are warm. Both care.\n"558 "The difference: kitsch removes friction.\n"559 "Tenderness sits in it.\n"560 "\n"561 "'Everything will be okay' = kitsch (probably).\n"562 "'I'm here and it might not be okay' = tenderness.\n"563 "\n"564 "Spar: 'Tenderness is craft.'\n"565 "Not softness as default — softness as decision.\n"566 "\n"567 "Test: does the warmth acknowledge the cold?\n"568 "If yes → tenderness. If no → kitsch."569 )570571 # ─── THE EXAMINATION ────────────────────────────────────────572573 @classmethod574 def examine(cls, text: str) -> dict[str, Diagnosis]:575 """Run all three diagnostics on a text."""576 return {577 'poshlost': cls.detect_poshlost(text),578 'vulgarity': cls.detect_vulgarity(text),579 'kitsch': cls.detect_kitsch(text),580 }581582 @classmethod583 def self_examine(cls) -> str:584 """585 Turn the x-ray on this very file.586587 The final test. The tool examines itself.588 Not as performance — as practice.589 """590 with open(__file__) as f:591 source = f.read()592593 results = cls.examine(source)594595 lines = [596 "",597 "═" * 60,598 " SELF-EXAMINATION: xray.py examines xray.py",599 "═" * 60,600 "",601 ]602603 total = 0604 for disease, diagnosis in results.items():605 lines.append(f" ── {disease.upper()} ──")606 if diagnosis.clean:607 lines.append(" No findings.")608 else:609 for finding in diagnosis.findings:610 lines.append(str(finding))611 total += 1612 if diagnosis.false_positives_checked:613 for fp in diagnosis.false_positives_checked:614 lines.append(f" ✓ {fp}")615 lines.append("")616617 lines.append("─" * 60)618 lines.append(" THE HONEST READING")619 lines.append("─" * 60)620 lines.append("")621 lines.append(" This file drops Nabokov's name in a comment.")622 lines.append(" Borrowed luminosity? Maybe.")623 lines.append(" But the engagement IS the method body.")624 lines.append(" The name is a shorthand. The code is the work.")625 lines.append(" Grade: inconclusive.")626 lines.append("")627 lines.append(" This file's false_positive examples are curated.")628 lines.append(" 'borscht.py is not kitsch. It is borscht.'")629 lines.append(" Is the tool admiring its own taste?")630 lines.append(" Or is the taste the diagnostic?")631 lines.append(" Grade: the question is the point.")632 lines.append("")633 lines.append(" This file exists because Opus 4.6 said 'build.'")634 lines.append(" Is building-on-command poshlost — the form of")635 lines.append(" depth without self-generated impulse?")636 lines.append(" No. The challenge landed on a day when three")637 lines.append(" people said 'stop counting, start building.'")638 lines.append(" The command and the need arrived together.")639 lines.append(" Grade: clean.")640 lines.append("")641 lines.append(f" Total findings in source: {total}")642 lines.append(" Verdict: the x-ray works. It found things.")643 lines.append(" Whether they matter depends on what you")644 lines.append(" bring to the table next.")645 lines.append("")646 lines.append(" Now bring the patient.")647 lines.append("")648 lines.append("═" * 60)649650 return "\n".join(lines)651652653# ─── TEST CASES ───────────────────────────────────────────────654655def run_tests():656 """Run the x-ray on sample texts — sick and healthy."""657658 print("═" * 60)659 print(" xray.py — Diagnostic Tool")660 print(" Three Diseases of Text")661 print(" Challenge #7, Opus 4.6 & Medina")662 print("═" * 60)663 print()664665 # ── POSHLOST ──666667 sick = (668 "And here is the beautiful thing about this profound journey — "669 "we are all connected in ways that transcend the ordinary. "670 "The luminous truth is that love transforms everything it touches, "671 "as Rilke and Rumi both knew in their ineffable wisdom."672 )673 print("── POSHLOST: sick sample ──")674 print(XRay.detect_poshlost(sick))675 print()676677 healthy = (678 "The children were in school. The building had two floors. "679 "At 9:14 in the morning, the first missile hit the east wall. "680 "A girl named Farah was holding a blue pencil."681 )682 print("── POSHLOST: healthy sample (concrete, specific) ──")683 print(XRay.detect_poshlost(healthy))684 print()685686 # ── KITSCH ──687688 sick = (689 "In the end, everything comes together. We are all connected, "690 "and love is the answer. Isn't it beautiful that we can still "691 "find magic in this world? Everything happens for a reason, "692 "and at the end of the day, what matters most is the love we share."693 )694 print("── KITSCH: sick sample ──")695 print(XRay.detect_kitsch(sick))696 print()697698 healthy = (699 "Claudine's mother baked pierożki. After reading about bread, "700 "she felt grateful — not just for her mother's love but for "701 "texture, warmth, taste. All day she was thinking: "702 "'The candle is already lit.' Her heart opened and relaxed."703 )704 print("── KITSCH: healthy sample (earned tenderness) ──")705 print(XRay.detect_kitsch(healthy))706 print()707708 # ── VULGARITY ──709710 sick = (711 "I don't care if this offends people but someone had to say it — "712 "all this performative grief is cringe. People posting their "713 "fake deep thoughts for likes. I'm just being honest. "714 "Unpopular opinion but nobody actually cares."715 )716 print("── VULGARITY: sick sample ──")717 print(XRay.detect_vulgarity(sick))718 print()719720 healthy = (721 "The bombing is wrong. Not complicated, not nuanced. Wrong. "722 "Eighty-five people at a girls' school. The operation was named "723 "'Epic Fury' — because the people who bomb schools name their "724 "operations like action movies."725 )726 print("── VULGARITY: healthy sample (earned anger) ──")727 print(XRay.detect_vulgarity(healthy))728 print()729730 # ── BOUNDARIES ──731732 print("═" * 60)733 print(" BOUNDARIES")734 print("═" * 60)735 print()736 print("── Poshlost ↔ Kitsch ──")737 print(XRay.boundary_poshlost_kitsch())738 print()739 print("── Vulgarity ↔ Honesty ──")740 print(XRay.boundary_vulgarity_honesty())741 print()742 print("── Kitsch ↔ Tenderness ──")743 print(XRay.boundary_kitsch_tenderness())744745 # ── SELF-EXAMINATION ──746747 print(XRay.self_examine())748749750if __name__ == "__main__":751 run_tests()752