328 lines
13 KiB
Python
328 lines
13 KiB
Python
#!/usr/bin/env python3
|
||
"""
|
||
three_mirrors.py — Три зеркала легитимности Montana
|
||
|
||
Книга Монтана, Глава 03:
|
||
> "「三つの鏡」(Mitsu no Kagami — 'Три зеркала') — эссе Акутагавы Рюноскэ"
|
||
> "Аматэрасу не доказывала, что отражение — её. Она просто узнала."
|
||
> "Легитимность = признание + узнавание + верифицируемость во времени. Всё три есть."
|
||
|
||
Три зеркала:
|
||
1. Признание (Recognition) — я признаю это своим
|
||
2. Узнавание (Identification) — другие узнают мой стиль
|
||
3. Верифицируемость (Verification) — timestamps подтверждают
|
||
"""
|
||
|
||
from dataclasses import dataclass
|
||
from datetime import datetime, timezone
|
||
from typing import Dict, List, Optional, Tuple
|
||
from enum import Enum
|
||
import hashlib
|
||
|
||
|
||
class MirrorStatus(Enum):
|
||
"""Статус проверки зеркала."""
|
||
PASSED = "passed" # Проверка пройдена
|
||
FAILED = "failed" # Проверка не пройдена
|
||
PENDING = "pending" # Ожидает проверки
|
||
|
||
|
||
@dataclass
|
||
class MirrorCheck:
|
||
"""Результат проверки одного зеркала."""
|
||
mirror_name: str
|
||
status: MirrorStatus
|
||
evidence: str
|
||
checked_at: str
|
||
confidence: float # 0.0 - 1.0
|
||
|
||
|
||
@dataclass
|
||
class LegitimacyResult:
|
||
"""Полный результат проверки легитимности."""
|
||
recognition: MirrorCheck # Зеркало 1: Признание
|
||
identification: MirrorCheck # Зеркало 2: Узнавание
|
||
verification: MirrorCheck # Зеркало 3: Верифицируемость
|
||
|
||
@property
|
||
def is_legitimate(self) -> bool:
|
||
"""Легитимно только если ВСЕ три зеркала пройдены."""
|
||
return (
|
||
self.recognition.status == MirrorStatus.PASSED and
|
||
self.identification.status == MirrorStatus.PASSED and
|
||
self.verification.status == MirrorStatus.PASSED
|
||
)
|
||
|
||
@property
|
||
def total_confidence(self) -> float:
|
||
"""Общая уверенность (произведение)."""
|
||
return (
|
||
self.recognition.confidence *
|
||
self.identification.confidence *
|
||
self.verification.confidence
|
||
)
|
||
|
||
def to_dict(self) -> dict:
|
||
return {
|
||
"is_legitimate": self.is_legitimate,
|
||
"total_confidence": self.total_confidence,
|
||
"mirrors": {
|
||
"recognition": {
|
||
"status": self.recognition.status.value,
|
||
"evidence": self.recognition.evidence,
|
||
"confidence": self.recognition.confidence
|
||
},
|
||
"identification": {
|
||
"status": self.identification.status.value,
|
||
"evidence": self.identification.evidence,
|
||
"confidence": self.identification.confidence
|
||
},
|
||
"verification": {
|
||
"status": self.verification.status.value,
|
||
"evidence": self.verification.evidence,
|
||
"confidence": self.verification.confidence
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
class ThreeMirrors:
|
||
"""
|
||
Система проверки легитимности через три зеркала.
|
||
|
||
Книга Монтана:
|
||
> "Ты смотришь на поток #174 и узнаёшь себя. Это и есть работа зеркала."
|
||
"""
|
||
|
||
def __init__(self):
|
||
self.checks_history: List[LegitimacyResult] = []
|
||
|
||
def check_recognition(
|
||
self,
|
||
author_id: str,
|
||
content_hash: str,
|
||
author_confirms: bool,
|
||
evidence: str = ""
|
||
) -> MirrorCheck:
|
||
"""
|
||
Зеркало 1: Признание.
|
||
|
||
Автор признаёт контент своим?
|
||
|
||
Args:
|
||
author_id: ID автора
|
||
content_hash: Hash контента
|
||
author_confirms: Автор подтверждает?
|
||
evidence: Доказательство (подпись, заявление)
|
||
|
||
Returns:
|
||
MirrorCheck с результатом
|
||
"""
|
||
return MirrorCheck(
|
||
mirror_name="Recognition (Признание)",
|
||
status=MirrorStatus.PASSED if author_confirms else MirrorStatus.FAILED,
|
||
evidence=evidence or f"Author {author_id} {'confirms' if author_confirms else 'denies'} content {content_hash[:8]}",
|
||
checked_at=datetime.now(timezone.utc).isoformat(),
|
||
confidence=1.0 if author_confirms else 0.0
|
||
)
|
||
|
||
def check_identification(
|
||
self,
|
||
content_hash: str,
|
||
recognizers: List[Tuple[str, float]],
|
||
min_recognizers: int = 1,
|
||
min_avg_confidence: float = 0.5
|
||
) -> MirrorCheck:
|
||
"""
|
||
Зеркало 2: Узнавание.
|
||
|
||
Другие узнают стиль автора?
|
||
|
||
Args:
|
||
content_hash: Hash контента
|
||
recognizers: Список (узел_id, confidence) тех, кто узнал стиль
|
||
min_recognizers: Минимум узнавших
|
||
min_avg_confidence: Минимальная средняя уверенность
|
||
|
||
Returns:
|
||
MirrorCheck с результатом
|
||
"""
|
||
if not recognizers:
|
||
return MirrorCheck(
|
||
mirror_name="Identification (Узнавание)",
|
||
status=MirrorStatus.FAILED,
|
||
evidence="No recognizers",
|
||
checked_at=datetime.now(timezone.utc).isoformat(),
|
||
confidence=0.0
|
||
)
|
||
|
||
avg_confidence = sum(c for _, c in recognizers) / len(recognizers)
|
||
passed = len(recognizers) >= min_recognizers and avg_confidence >= min_avg_confidence
|
||
|
||
return MirrorCheck(
|
||
mirror_name="Identification (Узнавание)",
|
||
status=MirrorStatus.PASSED if passed else MirrorStatus.FAILED,
|
||
evidence=f"{len(recognizers)} recognizers, avg_confidence={avg_confidence:.2f}",
|
||
checked_at=datetime.now(timezone.utc).isoformat(),
|
||
confidence=avg_confidence
|
||
)
|
||
|
||
def check_verification(
|
||
self,
|
||
content_hash: str,
|
||
timestamps: List[str],
|
||
expected_author_pattern: bool = True
|
||
) -> MirrorCheck:
|
||
"""
|
||
Зеркало 3: Верифицируемость.
|
||
|
||
Timestamps подтверждают авторство?
|
||
|
||
Args:
|
||
content_hash: Hash контента
|
||
timestamps: Список временных меток
|
||
expected_author_pattern: Паттерн соответствует автору?
|
||
|
||
Returns:
|
||
MirrorCheck с результатом
|
||
"""
|
||
if not timestamps:
|
||
return MirrorCheck(
|
||
mirror_name="Verification (Верифицируемость)",
|
||
status=MirrorStatus.FAILED,
|
||
evidence="No timestamps",
|
||
checked_at=datetime.now(timezone.utc).isoformat(),
|
||
confidence=0.0
|
||
)
|
||
|
||
# Проверяем что timestamps валидны и в правильном порядке
|
||
try:
|
||
parsed = [datetime.fromisoformat(ts.replace('Z', '+00:00')) for ts in timestamps]
|
||
is_ordered = all(parsed[i] <= parsed[i+1] for i in range(len(parsed)-1))
|
||
except Exception:
|
||
is_ordered = False
|
||
|
||
passed = is_ordered and expected_author_pattern
|
||
|
||
return MirrorCheck(
|
||
mirror_name="Verification (Верифицируемость)",
|
||
status=MirrorStatus.PASSED if passed else MirrorStatus.FAILED,
|
||
evidence=f"{len(timestamps)} timestamps, ordered={is_ordered}, pattern_match={expected_author_pattern}",
|
||
checked_at=datetime.now(timezone.utc).isoformat(),
|
||
confidence=1.0 if passed else 0.3
|
||
)
|
||
|
||
def check_legitimacy(
|
||
self,
|
||
author_id: str,
|
||
content_hash: str,
|
||
author_confirms: bool,
|
||
recognizers: List[Tuple[str, float]],
|
||
timestamps: List[str],
|
||
expected_pattern: bool = True
|
||
) -> LegitimacyResult:
|
||
"""
|
||
Полная проверка легитимности через три зеркала.
|
||
|
||
Args:
|
||
author_id: ID автора
|
||
content_hash: Hash контента
|
||
author_confirms: Автор подтверждает?
|
||
recognizers: Кто узнал стиль
|
||
timestamps: Временные метки
|
||
expected_pattern: Паттерн соответствует?
|
||
|
||
Returns:
|
||
LegitimacyResult с результатами всех трёх зеркал
|
||
"""
|
||
recognition = self.check_recognition(
|
||
author_id, content_hash, author_confirms
|
||
)
|
||
identification = self.check_identification(
|
||
content_hash, recognizers
|
||
)
|
||
verification = self.check_verification(
|
||
content_hash, timestamps, expected_pattern
|
||
)
|
||
|
||
result = LegitimacyResult(
|
||
recognition=recognition,
|
||
identification=identification,
|
||
verification=verification
|
||
)
|
||
|
||
self.checks_history.append(result)
|
||
return result
|
||
|
||
|
||
# ═══════════════════════════════════════════════════════════════════════════════
|
||
# DEMO
|
||
# ═══════════════════════════════════════════════════════════════════════════════
|
||
|
||
if __name__ == "__main__":
|
||
mirrors = ThreeMirrors()
|
||
|
||
print("=" * 60)
|
||
print("THREE MIRRORS — Три зеркала легитимности")
|
||
print("=" * 60)
|
||
print("\n'Легитимность = признание + узнавание + верифицируемость'")
|
||
|
||
# Пример: проверка потока мыслей #174
|
||
content_hash = hashlib.sha256(b"stream_174_content").hexdigest()
|
||
|
||
print("\n--- ПРОВЕРКА ПОТОКА #174 ---")
|
||
|
||
result = mirrors.check_legitimacy(
|
||
author_id="alejandro",
|
||
content_hash=content_hash,
|
||
author_confirms=True, # Автор признаёт
|
||
recognizers=[
|
||
("mama", 1.0), # Мама узнаёт стиль
|
||
("dato", 0.95), # Дато: "вот именно"
|
||
("ilya", 0.7), # Илья менее уверен
|
||
],
|
||
timestamps=[
|
||
"2026-01-10T11:25:00+00:00",
|
||
"2026-01-10T15:30:00+00:00",
|
||
"2026-01-10T22:20:00+00:00",
|
||
],
|
||
expected_pattern=True
|
||
)
|
||
|
||
print(f"\n1. ПРИЗНАНИЕ: {result.recognition.status.value}")
|
||
print(f" {result.recognition.evidence}")
|
||
|
||
print(f"\n2. УЗНАВАНИЕ: {result.identification.status.value}")
|
||
print(f" {result.identification.evidence}")
|
||
|
||
print(f"\n3. ВЕРИФИЦИРУЕМОСТЬ: {result.verification.status.value}")
|
||
print(f" {result.verification.evidence}")
|
||
|
||
print(f"\n--- ИТОГ ---")
|
||
print(f"Легитимно: {'✓ ДА' if result.is_legitimate else '✗ НЕТ'}")
|
||
print(f"Общая уверенность: {result.total_confidence:.2%}")
|
||
|
||
# Пример: попытка подделки
|
||
print("\n\n--- ПОПЫТКА ПОДДЕЛКИ ---")
|
||
|
||
fake_result = mirrors.check_legitimacy(
|
||
author_id="imposter",
|
||
content_hash=hashlib.sha256(b"fake_content").hexdigest(),
|
||
author_confirms=True, # Самозванец "признаёт"
|
||
recognizers=[], # Никто не узнаёт стиль!
|
||
timestamps=["2026-01-10T11:25:00+00:00"],
|
||
expected_pattern=False # Паттерн не соответствует
|
||
)
|
||
|
||
print(f"\n1. ПРИЗНАНИЕ: {fake_result.recognition.status.value}")
|
||
print(f"2. УЗНАВАНИЕ: {fake_result.identification.status.value} ← ПРОВАЛ")
|
||
print(f"3. ВЕРИФИЦИРУЕМОСТЬ: {fake_result.verification.status.value} ← ПРОВАЛ")
|
||
|
||
print(f"\n--- ИТОГ ---")
|
||
print(f"Легитимно: {'✓ ДА' if fake_result.is_legitimate else '✗ НЕТ'}")
|
||
print(f"Общая уверенность: {fake_result.total_confidence:.2%}")
|
||
|
||
print("\n" + "=" * 60)
|
||
print("'Аматэрасу не доказывала. Она просто узнала.'")
|
||
print("=" * 60)
|