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)
|