diff --git a/invitacion/index.html b/invitacion/index.html index fadd00e..9a980af 100644 --- a/invitacion/index.html +++ b/invitacion/index.html @@ -4,8 +4,9 @@ - - Tu invitación personal · Harmonic Beacon + + + Encuentro finalizado · Harmonic Beacon @@ -543,7 +544,7 @@ - +
@@ -551,49 +552,29 @@ HARMONIC BEACON - Invitación personal · 001 + Invitación archivada · 001
-

Acceso al encuentro

-

11:00 · Costa Rica

-

El ingreso estará habilitado diez minutos antes del inicio.
Entry will be enabled ten minutes before the start.

-

Inicio: 11:00, hora local de Costa Rica.
Apertura del acceso: 10:50, hora local de Costa Rica.

-
-
00horas
-
00minutos
-
00segundos
-
+

Archivo del encuentro · Event archive

+

Este encuentro finalizó.
This gathering has ended.

+

Domingo 2 de agosto de 2026 · 11:00, hora de Costa Rica.
Sunday, August 2, 2026 · 11:00 AM Costa Rica time.

+

La invitación gratuita NICO100 está cerrada y ya no genera accesos.
The free NICO100 invitation is closed and no longer grants access.

-
+
-

Antes de entrar

-

Decinos cómo querés aparecer en la sala y aceptá los términos de inscripción, participación, grabación y privacidad.

-
- - -
- - -

Completá tu nombre, correo y aceptación para entrar.

- - +

Próximos encuentros
Upcoming gatherings

+

Harmonic Beacon abre nuevos encuentros cada fin de semana. Consultá la agenda vigente para ver horarios, idiomas y disponibilidad.

+

Harmonic Beacon opens new gatherings every weekend. Check the current schedule for times, languages and availability.

+ Ver próximos encuentros
See upcoming gatherings
+
-

Indicaciones

+

Para un próximo encuentro

Prepará el espacio.
Nosotros preparamos el campo.

@@ -609,12 +590,12 @@

Un lugar tranquilo y cómodo

03 · CONEXIÓN

Computadora e internet estable

-

Entrá desde un equipo cargado, comprobá tu conexión y mantené esta invitación abierta hasta ingresar.

+

Entrá desde un equipo cargado y comprobá tu conexión antes del horario publicado.

04 · LLEGADA

Entrá con tiempo

-

La puerta abre a las 10:50 para que puedas resolver el ingreso sin apuro. El encuentro comienza a las 11:00.

+

Consultá la agenda de cada encuentro y conectate con tiempo para resolver el ingreso sin apuro.

@@ -622,7 +603,7 @@

Entrá con tiempo

-

Al finalizar

+

Si participaste

Tu voz abre
la amplificación.

Después del encuentro, entrá al bot por WhatsApp y envianos un audio contando tu mito: imágenes, escenas, sensaciones, personajes o palabras que recuerdes. No hace falta ordenarlo ni explicarlo perfectamente.

Abrir el bot de Harmonic Myth Projection @@ -630,8 +611,8 @@

Tu voz abre
la amplificación.

@@ -641,87 +622,5 @@

Tu voz abre
la amplificación.

- diff --git a/tests/invitation-entry.test.js b/tests/invitation-entry.test.js index 5612a57..19650b9 100644 --- a/tests/invitation-entry.test.js +++ b/tests/invitation-entry.test.js @@ -4,20 +4,60 @@ import test from 'node:test'; const invitation = readFileSync(new URL('../invitacion/index.html', import.meta.url), 'utf8'); -test('invitation collects identity and posts directly to the secure Beacon admission route', () => { - assert.match(invitation, /]+method="post"[^>]+action="https:\/\/live\.harmonicbeacon\.com\/api\/auth\/ticket"/); - assert.match(invitation, /name="name"[^>]+autocomplete="name"[^>]+required/); - assert.match(invitation, /name="email"[^>]+type="email"[^>]+autocomplete="email"[^>]+required/); - assert.match(invitation, /name="code" value="NICO100"/); - assert.match(invitation, /name="termsAccepted" value="accepted" required/); - assert.match(invitation, />Entrar a la sala<\/button>/); - assert.match(invitation, /termsAccepted && identityComplete && accessIsOpen/); +function archivedSnapshotAt(now) { + const originalNow = Date.now; + Date.now = () => now; + try { + return { + timestamp: Date.now(), + ended: /Este encuentro finalizó[\s\S]+This gathering has ended/.test(invitation), + canSubmit: / { + assert.match(invitation, /Encuentro finalizado · Harmonic Beacon<\/title>/); + assert.match(invitation, /Archivo del encuentro virtual de Harmonic Beacon del domingo 2 de agosto de 2026/); + assert.match(invitation, /<meta name="robots" content="noindex, follow">/); + assert.match(invitation, /Este encuentro finalizó/); + assert.match(invitation, /This gathering has ended/); + assert.match(invitation, /Domingo 2 de agosto de 2026/); + assert.match(invitation, /Sunday, August 2, 2026/); + assert.match(invitation, /href="\/eventos\/#virtuales"/); + assert.match(invitation, /Ver próximos encuentros/); + assert.match(invitation, /See upcoming gatherings/); +}); + +test('the archived NICO100 campaign cannot submit or redirect to an expired room', () => { + assert.match(invitation, /NICO100[\s\S]+está cerrada/); + assert.doesNotMatch(invitation, /<form\b/); + assert.doesNotMatch(invitation, /name="code"/); + assert.doesNotMatch(invitation, /type="submit"/); + assert.doesNotMatch(invitation, /\/api\/auth\/ticket/); + assert.doesNotMatch(invitation, /live\.harmonicbeacon\.com/); + assert.doesNotMatch(invitation, /\/session\//); }); -test('invitation no longer sends guests to the obsolete app or asks for an account', () => { - assert.doesNotMatch(invitation, /beacon\.altermundi\.net/); - assert.doesNotMatch(invitation, /iniciá sesión con tu cuenta/i); - assert.doesNotMatch(invitation, /cuenta de la app/i); - assert.match(invitation, /El ingreso estará habilitado diez minutos antes del inicio/); - assert.match(invitation, /Entry will be enabled ten minutes before the start/); +test('the permanent archive cannot reopen before, during, or after the old event', () => { + const checkpoints = [ + Date.UTC(2026, 7, 2, 16, 49, 59), + Date.UTC(2026, 7, 2, 16, 50, 0), + Date.UTC(2026, 7, 2, 17, 0, 0), + Date.UTC(2026, 7, 3, 17, 0, 0), + ]; + + for (const now of checkpoints) { + assert.deepEqual(archivedSnapshotAt(now), { + timestamp: now, + ended: true, + canSubmit: false, + hasSessionRedirect: false, + }); + } + + assert.doesNotMatch(invitation, /ACCESS_OPENS_AT|EVENT_STARTS_AT|setInterval\(updateAccess/); });