Repository navigation
Description
Left out of #12 deliberately. Each one is here with what it is actually
blocked on, verified against the live feeds and the embed the reader loads
(v0.6.0), not assumed.
Blocked on <ote-events>, not on this repo
The reader renders nothing: it sets widget.events on <ote-events> and the
widget draws everything. inherit() copies whole event objects, so every
field below already reaches the widget intact — the gap is downstream.
Grepped https://tools.opentechevents.org/embed/v0.6.0/ote-events.js:
speakers/affiliation— 0 occurrences. Already live data:
2 of CoruñaJUG's 11 events carryspeakers, and nothing shows them.
"Ada Lovelace, Analytical Engines" is two fields and must never become one
string.recordings— 0 occurrences. No live publisher uses it yet.contributing— 0 occurrences. The reader now inherits it feed→event
(fix: judge feeds by the spec version they declare, not 0.3.0 only #12), so a "suggest a correction" affordance has the data the moment the
widget can draw one.partOf.offers+offers[].scope(D032) — not handled.partOfis
used only to group multi-part events; the onescopehit is an HTML
attribute name in a vendored list. So a part with nooffersof its own
does not fall back topartOf.offers, and anoffersentry without
scopeis not read asadmission. Latent, not live: no registered feed
publishes apartOfevent today, so nothing is currently displaying a wrong
price. It becomes a visible wrong answer — a paid talk reading as free — the
first time a multi-part conference ships on 0.5+.
Worth one issue upstream in ote-events covering all four. Nothing to do here
until the widget supports them, beyond bumping the pinned CDN version in
index.html once it does.
Reader-side, small
sourceis missing from the field toggles. The embed supports a
sourcefield, butEVENT_FIELD_OPTIONSinapp.jsdoesn't offer it, so
readers can't turn it on. The other ten ids match.
Reader-side, needs a decision first
feed.covershas nothing to attach to yet. It says what window a feed
claims completeness for, which matters exactly where a reader decides
whether an event that vanished was cancelled or just aged out of the
published window. This reader never drops anything —state.savedEventsis
vestigial and nothing prunes — so there is no wrong inference to correct
today. The order is: decide whether saved events should be pruned at all,
then usecoversto bound it. Building the consumer of a rule nobody
applies would be backwards.
Not a gap
The support window moves by itself: npm run check reads the npm registry and
the published event schema and fails when PUBLISHED_SPEC_VERSIONS or
INHERITED_FEED_FIELDS in app.js drift from them. A spec release needs one
line appended, and CI says so when it hasn't been.
Activity
hhkaos commentedon Nov 5, 2026
Corrección y avance.
sourceno es un hueco — me equivoquéLo saqué de grepear el bundle minificado, donde
"source"aparece por otrosmotivos. En la fuente,
FieldKey/ALL_FIELDSenapps/embed/src/attrs.tsson exactamente diez:
image,when,location,attendance,description,price,tags,organizer,eligibility,cfp.EVENT_FIELD_OPTIONSenapp.jstiene esos diez. No falta ninguno.Tachada esa tarea.
Hecho: #14 sube el widget de v0.6.0 a v0.8.2
Encontrado al verificar lo anterior: el reader iba dos releases por detrás.
Trae bump de seguridad de
dompurify, URLs eids no-ASCII sin recodificar,e imágenes
http://cayendo al placeholder en vez de dejar marco roto.Importante para el resto de esta issue: el widget apunta a OTE 0.4.0
(
oteSpecVersionen supackage.json), no a 0.6.0 — elv0.6.0que estabapineado era la versión del widget, no de la spec. Así que subir el pin no
acerca ningún campo de 0.5/0.6; eso es trabajo upstream.
Localizado el hueco de D032, y no está en
apps/embedEstá en
packages/preview-feed, que es quien mapea OTE →PreviewEvent:cheapestPrice()(src/format.ts) coge la entrada más barata deoffers[]que declare precio. Con D032 eso es incorrecto por construcción:admissionyadd-onno son alternativas entre las que elegir, sonaditivas. Un recargo de 20 € más barato que la entrada gana el
reduce.OteJsonEvent(src/json.ts) no declarascope, así que la distinciónadmission/add-ones invisible al mapeo.normalizePartOf()se queda conid,type,name,urly descartapartOf.offers. Una parte sinofferspropio sale sin precio, y no haydato con el que arreglarlo aguas abajo aunque el render quisiera.
Sigue siendo latente: ningún feed registrado publica eventos con
partOf.Abro una sola issue upstream con los cinco huecos (
speakers/affiliation,recordings,contributing, D032) y enlazo aquí.Pendiente de decisión tuya
coverssigue bloqueado en la misma pregunta: ¿los eventos guardados deberíanpodarse cuando desaparecen de un feed? Mientras la respuesta sea "no",
coversno tiene a qué engancharse.
hhkaos commentedon Nov 5, 2026
Upstream: OpenTechEvents/ote-tools#115 — cubre los cuatro (speakers/affiliation, recordings, contributing, D032) con la localización exacta en
packages/preview-feedyapps/embed/src/attrs.ts.Estado de esta issue:
— no existía, error míosourceen los togglescovers→ bloqueado en una decisión de producto, abajoLo único que queda por decidir en este repo: ¿deben podarse los eventos guardados cuando desaparecen de un feed? Hoy no se poda nada, así que
coversno tiene a qué engancharse. Si la respuesta es sí,coverses lo que acota la poda (dentro de la ventana, ausente = retirado; fuera, el feed no afirma nada). Si es no, esta tarea se cierra sin código.hhkaos commentedon Nov 5, 2026
El reader ya poda, en silencio y por la regla equivocada
Antes de diseñar nada miré cómo guardan las colecciones, y la premisa de esta
tarea estaba mal planteada por mí.
state.savedEventses vestigial, sí, perolas colecciones reales son
state.boards, yboardEvents()resuelve cadaeventRefcontraallEvents()— el feed vivo:Un evento guardado cuyo publicador lo quita del feed desaparece de tu
colección sin decir nada. Reproducido: dos eventos en Favorites, el
publicador borra uno, "Actualizar" →
Favorites · 1 evento, sin mensaje. LaeventRefsigue enlocalStoragepara siempre, invisible, apuntando a nada.Y lo hace ante cualquier ausencia: envejecido, cancelado, el publicador
recicló el
id, el feed devolvió una respuesta truncada, cambió la URL. Nadade eso es "retirado".
A quién le pasa hoy: eventos.wiki publica 485 eventos y Sarao 180 — los
publicadores que podan histórico son exactamente estos. Y la colección que más
lo sufre es "Mis charlas", que por definición acumula charlas pasadas.
Lo que recomiendo
El orden correcto no es "añadir poda", es quitar la poda que ya hay:
eventRefspasa a llevar el evento, no solo{feedUrl, eventId}. Un evento guardado deja de depender de que el feedsiga llevándolo. Es el prerrequisito de "marcar en vez de borrar": hoy no
hay nada que marcar porque la tarjeta ya no existe.
coverspor fin decidealgo real: ausente dentro de la ventana que el feed declara completa →
insignia "Retirado del feed"; fuera de la ventana → nada, porque el feed
no afirma nada. Sin
covers, tampoco nada: un feed sincoversno haceninguna promesa de completitud.
responder — depende del
coversde cada feed, que no ve. Una preferenciaaquí traslada al usuario una decisión que el dato ya contiene.
cuyo feed ya no está suscrito, y guardados marcados como retirados. Con
recuento y confirmación.
No una limpieza de "eventos pasados". Es justo lo que dijiste que quizá sí
tiene valor — a los que asististe, buscar quién habló — y un evento guardado
pasado es el único histórico que el reader tiene, porque el feed ya no lo
lleva. Cuesta unos KB en
localStoragey es lo que distingue una colección deun filtro. Para no ver pasados en las listas ya está "Solo futuros"; eso es
vista, no borrado.
El caso "buscar speakers que hablaron" no pide guardar más: pide que el widget
renderice
speakers, que es OpenTechEvents/ote-tools#115.hhkaos commentedon Nov 5, 2026
Cerrando. Todo lo que era de este repo está en
main(0.11.0, desplegado).sourceen los togglesALL_FIELDSson los diez que el reader ya teníacovers/ eventos guardadosCLAUDE.mdLo que cambió de forma por el camino: la premisa de
coversestaba mal. Elreader ya podaba, en silencio —
boardEvents()resolvía cada punterocontra el feed vivo, así que un evento guardado desaparecía de tu colección
en cuanto su publicador dejaba de llevarlo, y el puntero se quedaba en
localStorageapuntando a nada. Desuscribirse de un feed hacía lo mismo. Elorden correcto no era añadir poda sino quitar la que había: la colección
guarda el evento, y
coverssolo decide si la ausencia significa algo.Lo que queda es únicamente upstream, y cuando llegue toca trabajo de este
lado. Abro issue específico para eso en vez de dejar este abierto como
bitácora: #17.