mirror of
https://github.com/fsolla/teqo.git
synced 2026-11-13 15:05:19 +00:00
O escopo A/C do gate (PR #1370) é superado por decisão do dono (2026-10-01, aval jurídico declarado): o índice vira anônimo (archivePhotoFace, foto + descritor 128-d, sem nome/vínculo), o enrollment por pessoa morre (faceSubject/faces:enroll removidos) e qualquer visitante encontra as próprias fotos aprovadas. - faces:index persiste os descritores por foto (transação substitui as linhas + marker = modelo); desaprovar/remover/deletar foto apaga os descritores (hooks + FK cascade) - POST /api/fotos/selfie casa o vetor da consulta contra o índice em memória (TTL 60 s) e devolve só a interseção com o read aprovado do C233, sem score/nome de terceiro; leave-index apaga os descritores que casarem - Consentimentos seguem fail-closed: busca-selfie-fotos (consulta) e busca-selfie-indice (aviso público do índice), textos versionados em scripts/lib/faceConsentTexts.mjs e provisionados por pnpm seed:face-consents - pnpm archive:publish aprova o acervo em lote (draft -> approved; removed nunca) com guardas e recibo - C243: seção condicional SelfieSearchHomeSection (port do design hi-fi, cenas 390/1280) entre a Central e a newsletter; sem engine/captura na home e sem CTA morto quando fechada - docs: planos C242/C243, AGENTS-public, runbook §C242, changelog Provas: gate:fast 457 arquivos/5.055 testes; int full 109/1.075; e2e frontendFotosSelfie 9/9; knip verde.
52 lines
3.6 KiB
JavaScript
52 lines
3.6 KiB
JavaScript
/**
|
|
* C242 — the legal texts the selfie search resolves by stable key, versioned in
|
|
* the repo so the delivery that opens the surface owns what the visitor reads:
|
|
*
|
|
* - `busca-selfie-fotos` is the QUERY consent: authorizes the use of the
|
|
* visitor's own selfie/biometrics for this one search, on device.
|
|
* - `busca-selfie-indice` is the PUBLIC NOTICE of the anonymous archive index
|
|
* (scope B): transparency about the descriptor index over approved photos
|
|
* and the self-service opt-out. It is not an enrollment consent — nobody is
|
|
* individually enrolled.
|
|
*
|
|
* Both are written to the `consent` collection by `pnpm seed:face-consents`
|
|
* (create-if-missing, idempotent, guarded); editing a text here and re-running
|
|
* updates the row (versioned by Payload).
|
|
*/
|
|
|
|
/** Builds the Lexical root of a Consent text from plain paragraphs. */
|
|
export const buildConsentRichText = (paragraphs) => ({
|
|
root: {
|
|
type: 'root',
|
|
children: paragraphs.map((text) => ({
|
|
type: 'paragraph',
|
|
children: [{ type: 'text', text, version: 1 }],
|
|
direction: null,
|
|
format: '',
|
|
indent: 0,
|
|
version: 1,
|
|
})),
|
|
direction: null,
|
|
format: '',
|
|
indent: 0,
|
|
version: 1,
|
|
},
|
|
})
|
|
|
|
export const FACE_SEARCH_CONSENT_PARAGRAPHS = [
|
|
'Autorizo, de forma livre, informada e específica, o uso da minha selfie e dos dados biométricos faciais dela extraídos exclusivamente para esta consulta: procurar, entre as fotos públicas aprovadas do acervo do mandato de Jorge Solla, aquelas em que eu apareço.',
|
|
'O reconhecimento acontece no meu próprio aparelho. A imagem da selfie não é enviada nem armazenada; ao servidor é enviado apenas o vetor matemático necessário para a comparação, que é descartado ao fim da consulta e não fica guardado.',
|
|
'Estou ciente de que o resultado não mostra nomes de terceiros e não informa grau de semelhança. A busca pode não encontrar fotos, e posso interrompê-la a qualquer momento.',
|
|
'A base legal é o consentimento específico para dados pessoais sensíveis (art. 11, I, da LGPD). Posso retirar este consentimento a qualquer momento, sem custo, pelo próprio fluxo ou pelos canais do mandato — a retirada não afeta o que já foi realizado.',
|
|
'Controlador: campanha Jorge Solla 1313. Mais detalhes na Política de Privacidade do site.',
|
|
]
|
|
|
|
export const FACE_INDEX_CONSENT_PARAGRAPHS = [
|
|
'Aviso público sobre o índice de fotos: as fotos públicas aprovadas do acervo podem conter rostos de várias pessoas. Para que cada pessoa encontre as próprias fotos pela busca por selfie, o sistema mantém um índice biométrico anônimo — vetores matemáticos extraídos dos rostos presentes nessas fotos, sem nome, sem vínculo com cadastro de pessoas e sem qualquer identificação de quem aparece.',
|
|
'O índice serve apenas para localizar as fotos da própria pessoa que faz a busca. Ele nunca é usado para identificar, nomear ou listar terceiros, e nunca cruza os dados biométricos com contatos, lideranças ou apoiadores.',
|
|
'Qualquer pessoa pode retirar seu rosto do índice a qualquer momento, sem custo: use a opção “Minha presença” na página da busca e siga as instruções. A retirada apaga do índice as referências biométricas correspondentes, e o rosto deixa de ser encontrado.',
|
|
'Para pedir a remoção de uma foto específica, use o canal indicado no álbum público. Fotos que não estejam aprovadas para o público não fazem parte do índice.',
|
|
]
|
|
|
|
export const FACE_SEARCH_CONSENT_TEXT = buildConsentRichText(FACE_SEARCH_CONSENT_PARAGRAPHS)
|
|
export const FACE_INDEX_CONSENT_TEXT = buildConsentRichText(FACE_INDEX_CONSENT_PARAGRAPHS)
|