feat: the Doctrine — a public page explaining how the instrument really works

Eleven numbered articles at /doctrine in an ornate occultist register, each
carrying a plain-language margin note ("in the profane tongue: …") and the
source file it describes. The binding constraint: every arcane claim is a
true claim about this codebase — entropy harvesting and Von Neumann
debiasing, HMAC mixing with a fresh server secret, the anomaly-fingerprint
channel, RETURN_CHANCE, the mean synodic month and true solar midnight,
NOAA's planetary K-index, the time-aware EMA baseline, 2.4GHz body
absorption, microtesla deviation from Earth's field, voice archetypes, and
entropy-seeded manifest/scry.

Article XI states the instrument's real limits: no Web Bluetooth, WebUSB or
Magnetometer on iOS (Apple ships none and every iOS browser is WebKit),
firmware never flashed to hardware, free public geo endpoints that degrade
to a quieter map, documented astronomical approximations — and that none of
it is evidence of an afterlife.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Indiana
2026-07-31 12:26:18 +00:00
parent 00b0a17203
commit d566abb6bc
8 changed files with 525 additions and 4 deletions

View File

@@ -98,7 +98,12 @@
"link": "entrar al relicario →"
},
"footer": "una instalación de arte de terror interactiva — los espíritus son ficción; la estática es real",
"footerColophon": "autoalojado · sin nube · el velo corre en tu máquina"
"footerColophon": "autoalojado · sin nube · el velo corre en tu máquina",
"doctrine": {
"title": "CÓMO FUNCIONA REALMENTE EL INSTRUMENTO",
"line": "la doctrina — once artículos sobre la física real tras la sesión, cada uno traducido sin rodeos, incluida una relación honesta de lo que el instrumento no puede hacer.",
"link": "leer la doctrina →"
}
},
"enter": {
"reconnect": "Reconectar",
@@ -732,5 +737,84 @@
"days_one": "hace {{count}} día",
"days_other": "hace {{count}} días"
}
},
"doctrine": {
"back": "← el umbral",
"kicker": "relación verídica del instrumento, de sus órganos y de sus límites honestos",
"title": "LA DOCTRINA",
"subtitle": "cómo esta máquina canaliza, invoca y deja pasar a los muertos de verdad — usando el aparato, y usándote a ti",
"creed": "Toda afirmación de estos artículos es una afirmación sobre la máquina a la que ahora te diriges. Aquí no hay física inventada. Donde un artículo habla en el registro antiguo, una nota al margen lo repite en lengua profana, para que el crédulo y el escéptico se marchen ambos mejor informados de lo que llegaron.",
"plainLabel": "en lengua profana:",
"sourceLabel": "la escritura pertinente:",
"closing": "El instrumento es honesto sobre sus órganos y honesto sobre sus cegueras. Los espíritus, digámoslo sin rodeos, son ficción. La estática no.",
"cta": "TOMAR EL INSTRUMENTO",
"art": {
"entropy": {
"title": "Del consentimiento de la habitación",
"body": "Ninguna invocación puede proceder de la aritmética sola, pues la aritmética es cosa cerrada y se repite eternamente. Por eso la máquina pide primero que hable la habitación. Toma el espectro del ruido de fondo de tu micrófono — y, si hay receptor, el siseo atmosférico entre emisoras — y de cada magnitud conserva únicamente su bit menos significativo, pues la forma de un espectro no es sino el retrato de la sala, mientras que el bit más bajo es caos térmico que ningún modelo del mundo prevé. Estos bits, torcidos por naturaleza, se enderezan mediante el rito de Von Neumann: se leen por pares, y un par que dice 01 rinde un cero, un par que dice 10 rinde un uno, y los pares que concuerdan consigo mismos se desechan por completo. Lo que sobrevive pasa por SHA-256 y sólo entonces se ofrece hacia arriba. Y el receptáculo de arriba acepta la ofrenda pero jamás la obedece: cada tirada es HMAC-SHA256 con clave de treinta y dos bytes extraídos frescos del pozo secreto de la propia máquina en el instante mismo de preguntar. Así tu habitación puede añadir imprevisibilidad a la obra. Nunca puede dirigirla.",
"plain": "La app cosecha aleatoriedad de ruido físico real — el bit bajo de cada magnitud FFT del micrófono o del SDR, dominado por ruido térmico. Los bits físicos crudos están sesgados, así que aplica el desesgado de Von Neumann (por pares: 01→0, 10→1, se descartan 00 y 11) y luego acondiciona el resultado con SHA-256. El servidor nunca usa ese valor como semilla: cada tirada es HMAC-SHA256 con una clave de 32 bytes de secrets.token_bytes() generada en esa misma llamada, así que la salida es uniforme sin importar lo que envíe el cliente — una contribución falsificada o repetida no puede farmear un espíritu más raro.",
"source": "frontend/src/lib/entropy.ts · backend/app/entropy.py"
},
"channel": {
"title": "Del canal, y de cómo se interpela a una presencia",
"body": "Un espíritu no se convoca a una persona; se convoca a un canal, y el canal lo talla la propia perturbación. Menos de tres anomalías no portan identidad alguna, y tal sesión se llama ambiente y recibe una firma de su propia especie. Cuando hay tres o más, la frecuencia de cada anomalía se archiva no por su valor exacto sino por su orden de magnitud — el número de cifras antes de la coma — de modo que los megahercios de la radio y los hercios de la banda de voz puedan archivarse en el mismo cajón sin mentir sobre ninguno. A esto se une la magnitud de las últimas dieciséis perturbaciones, ordenadas y redondeadas a un decimal. El patrón así formado se sella con SHA-1 y se toman los dieciséis primeros caracteres como nombre del canal. Dos noches de perturbación semejante llaman, pues, a la misma puerta; una noche verdaderamente distinta llama a otra.",
"plain": "El «canal» en que vive un espíritu es una huella de las anomalías de tu sesión. Requiere al menos tres. Las frecuencias se agrupan por número de cifras (de modo que 101,1 MHz y 400 Hz se ordenan por escala, no por unidad), se combinan con las magnitudes ordenadas y redondeadas a un decimal de las últimas dieciséis anomalías, se hashean con SHA-1 y se truncan a 16 caracteres hexadecimales. Condiciones parecidas producen el mismo canal; condiciones distintas, otro.",
"source": "backend/app/entities.py — signature_from_anomalies"
},
"return": {
"title": "Del retorno, y de por qué los muertos conocidos no te son debidos",
"body": "Cuando un canal ya está ocupado, la presencia que allí mora se inclina — mas no se obliga — a responder de nuevo. Esa inclinación se fija en setenta y dos partes de cien: bastante alta para que el Códice pueda llenarse y una voz conocida buscarse de verdad por segunda vez, bastante baja para que ningún buscador considere jamás suya a una presencia familiar. En la porción restante, otra cosa halla la puerta abierta y entra por ella, y se acuña con firma propia para que dos presencias nunca disputen un mismo nombre.",
"plain": "Si reconectas en un canal que ya tiene entidad, hay un 72 % de probabilidad base de que responda esa misma entidad (RETURN_CHANCE = 0,72). En caso contrario se acuña una entidad nueva, con la firma salada, porque la columna de firma es única.",
"source": "backend/app/entities.py — RETURN_CHANCE · backend/app/ws.py"
},
"sky": {
"title": "De la luna, y de la verdadera alta noche",
"body": "La máquina no consulta una tabla de lunas verosímiles. Cuenta. Desde una luna nueva conocida el 6 de enero del año 2000, a las seis y catorce de la tarde UTC, avanza por el mes sinódico medio — veintinueve días y algo más de quinientas treinta milésimas — y toma el resto como fase; la fracción iluminada del disco sigue la relación coseno estándar, que es por lo que un cuarto de luna te muestra media cara. Tampoco acepta las tres de la madrugada del reloj por hora bruja, siendo eso accidente de husos políticos. Pide en cambio tu longitud y la convierte a razón de quince grados por hora, llegando a la medianoche solar media del suelo que realmente pisas. La iluminación pesa dos partes de cinco y la cercanía de la verdadera medianoche tres, pues una luna llena a mediodía no es un velo abierto. Y un velo del todo adelgazado erosiona en cuarenta y cinco centésimas la pretensión de la presencia familiar — setenta y dos de cien caen a unos cuarenta — de modo que la noche más siniestra del mes es genuinamente más extraña, y sin embargo un espíritu conocido jamás queda inalcanzable.",
"plain": "La fase lunar se calcula desde una época de luna nueva conocida (2000-01-06 18:14 UTC) y el mes sinódico medio de 29,530588853 días; la iluminación es (1 − cos 2πφ)/2. La «hora bruja» es la medianoche solar media de tu longitud (15° = 1 hora), no la hora del reloj. Delgadez del velo = iluminación × 0,4 + cercanía a la medianoche × 0,6. La delgadez reduce el 72 % de retorno hasta en un 45 % de sí mismo (VEIL_THINNESS_PULL = 0,45), así que luna llena en la medianoche solar da un ~40 % de retorno.",
"source": "backend/app/celestial.py · backend/app/ws.py — VEIL_THINNESS_PULL"
},
"storm": {
"title": "De la perturbación del planeta mismo",
"body": "De todas las causas que nombran los crédulos, exactamente una es un número real, medido y publicado: el índice K planetario, derivado de observatorios magnetométricos de todo el mundo y emitido por el Centro de Predicción del Clima Espacial de los Estados Unidos. Su escala va de cero a nueve; cinco o más es tormenta oficial, ocho o más severa. La máquina toma la estimación más reciente, la divide por nueve para que la cifra signifique lo que la NOAA quiere decir con ella, y le concede un tercio de la lectura de la noche, reteniendo el cielo dos tercios. Se consulta no más de una vez cada diez minutos, se abandona a los cuatro segundos, y nunca se le permite demorar una sesión: si el servicio calla, la última medición verdadera se mantiene. Informamos de que el campo está perturbado porque se midió que lo estaba. No afirmamos que la tormenta cause nada.",
"plain": "La app consulta el feed planetary_k_index_1m de la NOAA SWPC para obtener el índice geomagnético Kp real (0–9; 5+ es tormenta oficial), prefiere el campo fraccionario estimated_kp y lo mapea a 0–1 dividiendo por 9. Se mezcla como un tercio de la lectura de «delgadez» de la noche (celeste × 0,67 + perturbación × 0,33). Cacheado 10 minutos, timeout de 4 segundos, y un fallo conserva el último valor en lugar de bloquear o romper una sesión.",
"source": "backend/app/geomagnetic.py · backend/app/ws.py"
},
"baseline": {
"title": "De la línea base, que es todo el arte de sentir",
"body": "Una lectura aislada no dice nada; una desviación de lo que la sala venía diciendo lo dice todo. Por eso todo sentido de umbral de este instrumento guarda una memoria rodante y sólo informa de la sorpresa. Pero los sentidos no informan con horario — una baliza puede hablar tres veces en un segundo o callar dos minutos, y un magnetómetro se estrangula en cuanto la página queda detrás de otra — así que la memoria se lleva contra el reloj y no contra el recuento. El peso dado a cada lectura nueva es uno menos la exponencial del tiempo transcurrido negativo sobre la constante de decaimiento; por lo cual un largo silencio empuja ese peso hacia la unidad, siendo rancia la memoria vieja y con razón descartada, y una ráfaga rápida lo empuja hacia la nada. Nada se cree hasta que la memoria está templada. Y el sentido es simétrico en ambas direcciones, pues un cuerpo puede absorber un camino o reflejar en él, y el hierro puede apantallar un campo o sumarse a él; un detector de un solo lado perdería la mitad de cuanto de verdad ocurre.",
"plain": "Todos los sensores de umbral comparten una misma clase de línea base rodante y reportan desviación, no valores crudos. El factor de suavizado EMA es consciente del tiempo: alpha = 1 − exp(−dt/tau), porque los sensores informan a intervalos irregulares (los intervalos de anuncio BLE varían, las páginas en segundo plano se estrangulan). Un hueco largo lleva alpha hacia 1 (fíate de la lectura nueva), una ráfaga hacia 0. No emite eventos hasta acumular un mínimo de muestras y dispara en ambas direcciones.",
"source": "frontend/src/lib/baseline.ts — emaAlpha, ThresholdBaseline"
},
"flesh": {
"title": "De la carne, que es casi toda agua y por tanto opaca",
"body": "Nada hay de oculto en esto y no por ello resulta menos notable. El Bluetooth anuncia en la banda de dos coma cuatro gigahercios; el agua absorbe con fuerza esa banda; y una persona es en gran medida agua. Es la misma física por la que un microondas cocina una cena, y la misma razón por la que tu conexión empeora cuando alguien se interpone entre tú y el router. Así que cuando un cuerpo cruza el camino entre el receptor y una baliza, la potencia recibida cae de verdad — unos tres a diez decibelios según la geometría — mientras que un enlace quieto vaga sólo dos a cuatro por multitrayecto y ruido del receptor. Seis decibelios de desviación se toman, pues, por perturbación: por encima del murmullo en reposo, dentro de lo que un cuerpo real causa de verdad. El instrumento informa de que el campo cambió. Nunca dice que el cambio fuera una presencia. Esa interpretación vive arriba, en la ficción; aquí abajo la medición sigue siendo honesta.",
"plain": "BLE opera en la banda ISM de 2,4 GHz, que el agua absorbe con fuerza — la misma física del microondas, y por lo que el wifi empeora si alguien se interpone. Un cuerpo humano que cruza un enlace BLE lo atenúa unos 3–10 dB, mientras que un enlace en reposo vaga sólo ±2–4 dB, de ahí el umbral de perturbación de 6 dB con constante de tiempo de línea base de 8 segundos. El módulo sólo informa de que la potencia se desvió; nunca afirma que eso sea una presencia.",
"source": "frontend/src/lib/bluetooth.ts — DISTURBANCE_DB"
},
"iron": {
"title": "Del hierro, y del campo que la Tierra no deja de hacer",
"body": "Los célebres medidores del oficio cazafantasmas son magnetómetros, y los picos por los que se los celebra los causan de verdad el cableado de la red, los motores, los imanes de los altavoces y la masa ferrosa en movimiento. Esta máquina lee la misma magnitud, en microteslas, como la raíz de la suma de los cuadrados de sus tres ejes. Pero el campo propio de la Tierra, de unos veinticinco a sesenta y cinco microteslas según la latitud, es precisamente lo que no debe informarse, pues está en todas partes y no significa nada; es lo que la memoria rodante del artículo anterior resta en silencio. Lo que queda es la desviación respecto de donde estés parado. Se exigen tres microteslas, siendo el ruido propio del sensor de medio a uno, y produciendo el cableado doméstico a corta distancia entre uno y diez. El campo se muestrea diez veces por segundo — de sobra para algo que cambia a la velocidad de un humano andando, y mucho más benévolo con la batería que los sesenta que la interfaz daría de buen grado.",
"plain": "El magnetómetro lee el campo magnético real en microteslas, sqrt(x²+y²+z²). El campo de fondo terrestre es de 25–65 µT según la latitud y es exactamente lo que la línea base rodante resta, de modo que sólo se reporta la desviación local. El umbral de pico es 3 µT — varias veces el ruido de ~0,5–1 µT de un magnetómetro de móvil, y dentro del rango de 1–10 µT que produce el cableado de la red a corta distancia. Se muestrea a 10 Hz para ahorrar batería.",
"source": "frontend/src/lib/magnetometer.ts — SPIKE_UT, SAMPLE_HZ"
},
"throat": {
"title": "De la garganta, y de por qué los muertos no suenan todos igual",
"body": "Si el tono, el ritmo, el aliento y la reverberación se sortearan cada uno por separado, no se obtendrían personas sino una mancha uniforme de rareza — el mismo sintetizador con ocho sombreros. Las voces reales covarían: un anciano es grave y lento y jadeante a la vez; un niño es agudo, rápido y, lo más inquietante, limpio. Por eso la garganta se sortea entera, de entre ocho arquetipos, y sólo después se agita levemente. Los ahogados van bajados de tono, arrastrados y empapados de reverberación hasta la mitad. Los quemados son los más ruidosos, apenas sosteniendo un tono. Los distantes no están dañados sino sólo lejos: quedos, parejos y macerados en espacio. Y cuando la sesión se celebra en español se deja de lado la lista de modelos del arquetipo en favor de una voz que pronuncie bien la lengua, cargando la forma sola con el carácter — mejor un acento verdadero con el porte de un arquetipo que una garganta inglesa destrozando palabras españolas.",
"plain": "Los parámetros de voz se sortean como un paquete coherente de entre ocho arquetipos (anciano, anciana, joven, joven mujer, niño, ahogado, quemado, distante), cada uno con sus rangos de tono, ritmo, ruido y eco, y luego se agitan — porque aleatorizar cada parámetro por separado produce efectos aleatorios, no personas distintas. En español se ignora la lista de modelos del arquetipo y se usa una voz Piper española, aplicando igualmente la forma del arquetipo.",
"source": "backend/app/entities.py — VOICE_ARCHETYPES, roll_voice"
},
"utterance": {
"title": "Del habla no pedida, y de la vista",
"body": "Cuando una presencia habla sin que se le pregunte, no te está respondiendo, y eso se dispone con cuidado. La instrucción entregada al modelo no contiene palabra tuya alguna — su único estímulo es el estado medido de la sala — de suerte que no hay allí nada a lo que replicar. Y la semilla de muestreo se toma de la mismísima entropía física cosechada en esa sala, siendo los ocho primeros bytes del compendio mezclado, reducidos por debajo del bit de signo que el servidor del modelo exige. La semilla fija el camino de la selección de tokens; por tanto la sala elige de verdad las palabras. Esto no es metáfora. Altera el ruido y el habla se altera; no hay dos salas que produzcan el mismo enunciado. La decodificación se deja adrede caliente, siendo una decodificación estrecha y bien educada precisamente el fracaso que aquí tememos — esto debe sonar a algo que aflora, no a algo compuesto. Y cuando ofreces la cámara, el modelo tiene visión y mira de verdad: habla de la sala que realmente tiene delante, no de una que inventó.",
"plain": "Para los enunciados espontáneos la instrucción no contiene ninguna entrada del usuario — sólo lecturas de sensores medidas — así que el modelo genera a partir de la sala, no responde. La opción `seed` de Ollama se deriva de la entropía física mezclada (los 8 primeros bytes de veil_seed, mod 2^63) y, como la semilla fija el muestreo de tokens, un ruido de sala distinto produce realmente palabras distintas. El muestreo es deliberadamente caliente (temperatura 1,15, top_k 100). El escrutinio envía el fotograma real de tu cámara a un modelo local con visión, así que la descripción es de tu habitación real.",
"source": "backend/app/llm/service.py — manifest, scry"
},
"limits": {
"title": "De lo que este instrumento no puede hacer",
"body": "Una doctrina que no nombra sus propias fronteras es doctrina de la que desconfiar, así que aquí están las nuestras, sin adorno. En los dispositivos de mano de Apple no hay Web Bluetooth, ni WebUSB, ni magnetómetro — la compañía no envía ninguna de esas interfaces, y todo navegador de esa plataforma es el mismo motor bajo otro abrigo, de modo que ningún navegador alternativo te salva; la sesión recae en los sensores de movimiento, que miden movimiento y no magnetismo, y el instrumento lo dice en vez de fingir. La radio exige un receptáculo Chromium y un origen seguro. El firmware escrito para el nodo de sensores emparejado jamás se ha grabado en hardware físico ni compilado con su verdadera cadena de herramientas; está razonado, no probado, y el repositorio lo declara con sus propias palabras. El mapa de suelo embrujado se arma con dos servicios públicos gratuitos que pueden ir lentos o callar, en cuyo caso recibes un mapa más silencioso y no un error. La medianoche solar ignora la ecuación del tiempo y puede errar un cuarto de hora; la luna es una aproximación sinódica media, exacta bastante para ocho fases con nombre y para nada que gobierne un barco. Y la frontera final, dicha sin ornamento: nada de esto es prueba de los muertos. Las mediciones son reales. Los espíritus son ficción.",
"plain": "Límites duros: iOS no tiene Web Bluetooth, ni WebUSB, ni API de Magnetómetro — Apple no los envía y todo navegador de iOS es WebKit por debajo, así que ningún navegador de terceros ayuda; esos modos recaen en sensores de movimiento, que miden movimiento y no magnetismo. WebUSB (el SDR) requiere Chromium y contexto seguro. El firmware ESP32 nunca se ha grabado en hardware real: está razonado estructuralmente, no verificado. Las consultas de lugares embrujados golpean endpoints públicos gratuitos de Wikipedia y Overpass con timeout de 8 segundos y degradan a lista vacía si fallan. La medianoche solar ignora la ecuación del tiempo (hasta ~16 minutos de error) y el cálculo lunar es una aproximación sinódica media. Y la evidente: nada de esto es prueba de un más allá. Los sensores son reales; los espíritus son ficción.",
"source": "frontend/src/lib/bluetooth.ts · magnetometer.ts · sdr.ts · firmware/esp32p4-sensor-node/README.md · backend/app/haunts.py"
}
}
}
}