Ir al contenido

Referencia del CLI `froga`

froga es el CLI de Risk-Driven Development (RDD) para sistemas de IA de alto riesgo. RDD es un término establecido de la ingeniería del software (Boehm, Fairbanks) que Venturalítica especializa para el tratamiento de riesgo regulatorio de IA (ver linaje). Cada subcomando opera sobre un repositorio git (flag --repo, por defecto el directorio de trabajo .). Los subcomandos que escriben artefactos los firman con ECDSA-P256+DSSE (firmante enchufable: local o Scaleway KMS, según FROGA_SIGNING_BACKEND) antes de escribirlos en .froga/. Son 22 subcomandos visibles (más assess oculto): init, run, status, verify, export, anchor, pubkey, compile, reconstruct, soa, conformance, risk-projection, impact, request, approve, review, reject, retire, auth, entitlement, sign-pliego y sign-detached.


Genera el esqueleto del proyecto en un repositorio git: crea el directorio .froga/ y el manifiesto froga.yaml (con la sección risk del programa de aseguramiento) si todavía no existen.

FlagTipoPor defectoDescripción
--reporuta.Ruta al repositorio git sobre el que operar.
  • froga.yaml — manifiesto del sistema (si no existía).
  • .froga/ — directorio de artefactos firmados (si no existía).
Ventana de terminal
froga init --repo /ruta/al/proyecto

Ejecuta el pipeline completo (pasos P1–P11) con detección de deriva: recomputa únicamente las secciones marcadas como stale respecto a froga.lock, ancla el resultado y firma el bundle de evidencia.

La barrera de riesgo determina el código de salida: si algún control bloqueante falla, froga run devuelve exit ≠ 0 aunque la evidencia quede igualmente anclada y firmada.

FlagTipoPor defectoDescripción
--reporuta.Ruta al repositorio git sobre el que operar.
  • .froga/bundle.json — bundle de evidencia firmado (ECDSA-P256+DSSE).
  • .froga/bundle.json.sig — firma DSSE del bundle.
  • froga.lock — ancla de frescura (hashes de las secciones del pipeline).

La barrera de riesgo implementa el requisito de supervisión continua del EU AI Act Art. 9 y el bucle de tratamiento ISO 23894 §6.5.

Ventana de terminal
froga run

Detecta deriva respecto a froga.lock y evalúa el estado de los controles de la barrera sin recomputar. Devuelve exit 0 si el sistema está al día y conforme; exit ≠ 0 en caso de deriva o de controles bloqueantes fallidos.

Úselo como barrera de CI/CD sin coste de recomputación.

FlagTipoPor defectoDescripción
--reporuta.Ruta al repositorio git sobre el que operar.
  • Imprime las secciones con deriva y los controles que fallan.
  • Exit 0 = frescura ✓ + conformidad ✓; exit ≠ 0 si alguno falla.
Ventana de terminal
froga status

Verifica las firmas ECDSA-P256+DSSE de todo el dossier de evidencia presente en .froga/: bundle.json, reconstruct.json, conformance/*.json y risk-projection/*.json (cada uno contra su .sig). entitlement.json se excluye deliberadamente: lo firma el emisor Venturalítica, no el sistema. Verifica contra una clave pública explícita — es la vía de verificación de terceros (auditor, AAPP), que no necesitan la clave privada del fabricante. La pubkey se resuelve en orden: --pubkey.froga/PUBKEY.txt → (solo con --allow-dev-key) el backend de firma local.

FlagTipoPor defectoDescripción
--reporuta.Ruta al repositorio git sobre el que operar.
--pubkeystring(.froga/PUBKEY.txt)Clave pública del firmante (SEC1 sin comprimir, hex 04…, 130 caracteres). Si se omite, se lee .froga/PUBKEY.txt.
--allow-dev-keyboolfalseCae al backend de firma local si no hay --pubkey ni .froga/PUBKEY.txt. Solo desarrollo: verificas contra tu propia clave, sin no-repudio frente a un tercero.
--exportruta(ninguno)En vez del dossier del repo, verifica un paquete de exportación (el directorio que genera froga export): comprueba el git bundle, la firma del manifiesto contra su pubkey.pem y que el manifiesto describe ese bundle. Ver froga export.
  • Imprime firma VÁLIDA y exit 0, o firma INVÁLIDA y exit ≠ 0.
  • Un artefacto del dossier sin su .sig es un fallo: un dossier firmado debe traer la firma de cada pieza.
  • Falla si no existe el bundle o la firma (indica que no se ha ejecutado froga run), o si no hay material público que verificar (ni --pubkey, ni PUBKEY.txt, ni --allow-dev-key).
Ventana de terminal
# Verificación de terceros: contra la pubkey publicada del firmante
froga verify --pubkey 04a1b2…
Ventana de terminal
# Con .froga/PUBKEY.txt presente en el repo
froga verify

Imprime la clave pública del firmante configurado del motor (ECDSA-P256, formato SEC1 sin comprimir, 65 bytes en hexadecimal). El cliente la exporta y la registra en la nube (campo signerPubkey de la conexión) para que la nube verifique su evidencia firmada (verificación por-conexión).

  • La clave pública en hexadecimal (130 caracteres, prefijo 04) por la salida estándar.
  • Respeta el firmante configurado por FROGA_SIGNING_BACKEND (local o scaleway-kms).
Ventana de terminal
froga pubkey
# 0477b3dc…c60

Compila el programa de aseguramiento (Art. 9) declarado en la sección risk de froga.yaml y genera el oscal.assessment_plan correspondiente. Este plan es el contrato formal de la barrera: define qué controles se miden y bajo qué condiciones.

También emite avisos advisories sobre la jerarquía de controles (prEN 18228 cl. 9.1.2): no bloquea la compilación, pero señala controles sin nivel de jerarquía declarado.

FlagTipoPor defectoDescripción
--reporuta.Ruta al repositorio git sobre el que operar.
  • El fichero declarado en oscal.assessment_plan (plan de evaluación OSCAL).

EU AI Act Art. 9 (sistema de gestión de riesgos); ISO 23894 §6.4 (planificación de la evaluación).

Ventana de terminal
froga compile

Reconstruye el ciclo de tratamiento de riesgos ISO 23894 por riesgo mediante replay de la historia git del bundle de evidencia (.froga/bundle.json). El proceso es determinista y no requiere un modelo de lenguaje.

Por cada riesgo, el informe recorre las cinco fases: ① identificación (commit que introdujo el riesgo en el AssuranceProgram), ② análisis (likelihood × impacto → nivel inherente), ③ evaluación (vs. apetito de riesgo), ④ tratamiento (arco empírico FALLA→PASA por commit), ⑤ riesgo residual (ciclo ISO: CERRADO / ABIERTO / DISCREPANCIA / ACEPTADO).

También reporta la aprobación de dirección más reciente (ISO 42001 §6.1.3) y la prioridad de tratamiento (ISO 42001 §6.1.2e2).

FlagTipoPor defectoDescripción
--reporuta.Ruta al repositorio git sobre el que operar.
--outboolfalseSi se especifica, escribe .froga/reconstruct.json (+ .sig) además de imprimir por stdout.
  • .froga/reconstruct.json — informe estructurado firmado (ECDSA-P256+DSSE).
  • .froga/reconstruct.json.sig — firma DSSE.

ISO 23894 §6.4.2 (identificación), §6.4.3 (análisis), §6.4.4 (evaluación), §6.5 (tratamiento y residual); ISO 42001 §6.1.2–6.1.3.

Ventana de terminal
froga reconstruct --out

Exporta un paquete de auditoría verificable sin conexión: un directorio autocontenido que un tercero (organismo notificado, auditor) comprueba sin red ni acceso a la forja. Empaqueta el DAG completo de git como git bundle y un manifiesto DSSE firmado que ata ese bundle al veredicto ISO 23894 derivado mediante reconstruct_sha256 (reproducible clonando el bundle y re-ejecutando froga reconstruct). El binding fuerte del veredicto es ese digest, no el hash del bundle.

FlagTipoPor defectoDescripción
--reporuta.Ruta al repositorio git sobre el que operar.
--outruta(froga-export-<sistema>-<oid>/)Directorio de salida del paquete.
--refstringHEADRef a exportar (se empaqueta todo su DAG ascendente).
  • <out>/repo.bundlegit bundle del DAG completo hasta la ref.
  • <out>/manifest.dsse.json — manifiesto DSSE in-toto firmado (predicado git-bundle/v1), con el keyid del firmante.
  • <out>/pubkey.pem — clave pública del firmante (SPKI PEM). El auditor debe confirmarla fuera de banda contra la clave conocida del emisor: la firma prueba integridad, no autenticidad por sí sola.
  • <out>/README.txt — instrucciones de verificación sin conexión.

Falla cerrado si el repositorio es shallow (clon superficial) o tiene refs/replace/* (el DAG no sería fiel), o si el destino existe y no está vacío.

EU AI Act Anexo IV (documentación técnica entregable a terceros); ISO 23894 §6.4–6.5 (reconstrucción verificable del ciclo de tratamiento).

Ventana de terminal
froga export --out paquete-auditoria/
froga verify --export paquete-auditoria/

Firma la punta del ref gobernado (por defecto HEAD) con un acto-ancla de topología DSSE y lo escribe en el tag anotado froga/anchor. Por la propiedad de Merkle del DAG de git, el OID de la punta compromete todo el historial ascendente: anclarlo cierra el vector A2 (que la nube derive el ciclo de vida confiando ciegamente en la topología que le reporta el REST de la forja, en vez de verificarla contra un compromiso firmado por el propio motor).

FlagTipoPor defectoDescripción
--reporuta.Ruta al repositorio git sobre el que operar.
--refstringHEADRef cuya punta se ancla.
  • El tag anotado froga/anchor (git tag -a -f), movido a la punta del ref, con el sobre DSSE firmado (predicado topology-anchor/v1) como mensaje del tag.

Falla cerrado si el repositorio es shallow (clon superficial) o tiene refs/replace/* (el DAG no sería fiel), o si no hay clave de firma configurada.

EU AI Act Art. 12 (mantenimiento de registros); ISO 23894 §6.4 (trazabilidad de la topología sobre la que se deriva el ciclo de tratamiento).

Ventana de terminal
froga anchor

Genera la Declaración de Aplicabilidad (Statement of Applicability, SoA — ISO/IEC 42001 §6.1.3 b/c/f). Cruza el catálogo del Anexo A de ISO/IEC 42001:2023 con las medidas declaradas en el AssuranceProgram y con el último bundle de evidencia. Clasifica cada control en:

  • INCLUIDO — cubierto por al menos una medida del AssuranceProgram (muestra el estado de implementación: IMPLEMENTADO / PARCIAL / PLANIFICADO / NO IMPLEMENTADO).
  • EXCLUIDO — decisión justificada explícitamente (§6.1.3f).
  • OMITIDO — sin medida que lo implemente ni exclusión declarada (hueco a revisar).
FlagTipoPor defectoDescripción
--reporuta.Ruta al repositorio git sobre el que operar.

ISO/IEC 42001:2023 §6.1.3 b/c/f (Declaración de Aplicabilidad del sistema de gestión de IA).

Ventana de terminal
froga soa

Evalúa la conformidad por cláusula del bundle de evidencia firmado contra un estándar normativo (prEN 18228 o ISO 23894). Proyecta el bundle sobre el catálogo de cláusulas del estándar y clasifica cada cláusula como CUBIERTA / PARCIAL / HUECO, agrupada por fase del ciclo del estándar.

Sin --standard, emite todos los estándares declarados en context.applicable_standards de froga.yaml (el estándar prioritario primero).

FlagTipoPor defectoDescripción
--reporuta.Ruta al repositorio git sobre el que operar.
--standardstring(todos los aplicables)Id del estándar, p. ej. eu/pren-18228@2026 o iso/23894@2023. Omitir = emite todos los declarados en applicable_standards.
--historyboolfalseProyecta la conformidad en cada iteración del bundle (commits de evidencia), no solo el estado actual.
--outboolfalseEscribe .froga/conformance/<slug>.json (+ .sig) por estándar, además de imprimir.
--against-pliegorutaCompuerta contra un pliego OSCAL firmado por la AAPP: intersecta las cláusulas exigidas por el pliego con la evidencia de conformidad firmada del licitador. Exit ≠ 0 si falla alguna cláusula block.
--aapp-pubkeystringClave pública de la AAPP que firmó el pliego (SEC1 hex 04…, 130 caracteres). Obligatoria con --against-pliego. El formato se valida al parsear: malformada → error de uso (exit 2), nunca un «Rechazado» engañoso.
--pubkeystring(.froga/PUBKEY.txt)Clave pública del licitador que firmó la evidencia. Si se omite, se lee .froga/PUBKEY.txt. Mismo formato SEC1 validado al parsear que --aapp-pubkey.
--allow-dev-keyboolfalseCae al backend de firma local para la pubkey del licitador (solo desarrollo, sin no-repudio).
  • .froga/conformance/<slug>.json — informe de conformidad firmado por estándar.
  • .froga/conformance/<slug>.json.sig — firma DSSE.

Compuerta contra un pliego firmado (--against-pliego)

Sección titulada «Compuerta contra un pliego firmado (--against-pliego)»

Con --against-pliego <pliego.oscal.yaml> --aapp-pubkey <hex>, conformance deja de ser una proyección informativa y pasa a ser una compuerta de contratación: verifica la firma del pliego de la AAPP (ver froga sign-pliego), intersecta las cláusulas que el pliego marca como block con la evidencia de conformidad firmada del licitador y devuelve exit ≠ 0 si falla alguna. Es lo que hace que el umbral lo imponga el pliego (la AAPP), no el proveedor. La autenticidad de las firmas no implica aceptación ni conformidad: son tres comprobaciones distintas.

Códigos de salida — el error de uso no se disfraza de veredicto:

  • exit 0 — la entrega sería Aceptada (todas las cláusulas block cubiertas).
  • exit 1 — la entrega sería Rechazada (nombrando la cláusula que falla), o un error de ejecución (falta --aapp-pubkey, no se resuelve la pubkey del licitador…).
  • exit 2error de uso: una pubkey malformada (--aapp-pubkey o --pubkey que no son 04 + 128 hex) se rechaza al parsear, con el formato esperado en el mensaje. Exit 2 no es un veredicto sobre la entrega — antes, una clave malformada acababa disfrazada de «Rechazado · ausente» en todas las cláusulas.

prEN 18228 (CEN/CENELEC JTC 21, gestión de riesgos EU AI Act Art. 9); ISO 23894 (gestión de riesgos IA); EU AI Act Art. 9; EU AI Act Art. 47 (cadena de suministro, con --against-pliego).

Ventana de terminal
froga conformance --standard eu/pren-18228@2026 --out
Ventana de terminal
froga conformance --history
Ventana de terminal
# La AAPP verifica la entrega del licitador contra su pliego firmado
froga conformance --against-pliego pliego.oscal.yaml \
--aapp-pubkey 04a1b2… --pubkey 0477b3…

Genera la evaluación de impacto del sistema de IA (ISO/IEC 42001 §6.1.4): por cada sistema declarado en el AssuranceProgram, lista la finalidad prevista, las decisiones que toma y las personas afectadas; y analiza el mal uso razonablemente previsible (EU AI Act Art. 9(2)(b)), cruzándolo con el registro de riesgos para identificar los casos de mal uso sin riesgo que los atienda.

Devuelve exit ≠ 0 únicamente si existen referencias colgantes: un campo addressed_by que apunta a un riesgo inexistente en el registro (indica que el AssuranceProgram está roto). El mal uso no atendido se señala, pero no bloquea (advisory).

FlagTipoPor defectoDescripción
--reporuta.Ruta al repositorio git sobre el que operar.

ISO/IEC 42001:2023 §6.1.4 (evaluación de impacto del sistema de IA); EU AI Act Art. 9(2)(b) (mal uso razonablemente previsible).

Ventana de terminal
froga impact

Registra la solicitud de aprobación del plan de tratamiento como un acto firmado en .froga/acts/ (un sobre DSSE firmado con la clave del actor --by, declarada en el bloque signers: de froga.yaml). El mantenedor usa este comando para iniciar el ciclo de revisión formal; el acto queda atribuido, fechado y verificable por firma, y lo recoge froga reconstruct.

El ciclo habitual es: froga request (mantenedor) → revisión humana → froga approve (dirección) o froga reject (dirección con motivo).

FlagTipoPor defectoDescripción
--reporuta.Ruta al repositorio git sobre el que operar.
--bystring(requerido)Persona o rol que solicita la aprobación, p. ej. "Ana García <ana@compania.com>".

Un acto firmado .froga/acts/NNNN-request.json: un sobre DSSE in-toto firmado con la clave del actor --by (sustituye al commit-trailer Froga-Approval-Requested-by: que escribía el nivel 2, decorativo y falsificable).

ISO/IEC 42001:2023 §6.1.3 (proceso de revisión y aprobación del tratamiento de riesgos).

Ventana de terminal
froga request --by "Ana García <ana@compania.com>"

Registra la aprobación de dirección del plan de tratamiento y la aceptación del riesgo residual (ISO/IEC 42001 §6.1.3) como un acto firmado en .froga/acts/ (un sobre DSSE firmado con la clave del actor --by). El acto queda así atribuido a una persona o rol, fechado y verificable por firma, y es recogido por froga reconstruct.

El cuatro-ojos es criptográfico: la aprobación ha de firmarse con una clave DISTINTA de la que firmó la solicitud (froga request); una autoaprobación con la misma clave no cuenta como segundo par de ojos.

Si se ejecuta froga run después de la aprobación sin una nueva aprobación, froga reconstruct marcará la aprobación como DESACTUALIZADA.

FlagTipoPor defectoDescripción
--reporuta.Ruta al repositorio git sobre el que operar.
--bystring(requerido)Persona o rol de dirección que aprueba, p. ej. "Jane Roe <jane@org>".
--reasonstring(opcional)Motivo de la aprobación, p. ej. la aceptación consciente de un residual ámbar.

Un acto firmado .froga/acts/NNNN-approve.json: un sobre DSSE in-toto firmado con la clave del actor --by (sustituye al commit-trailer Froga-Approved-by: que escribía el nivel 2).

ISO/IEC 42001:2023 §6.1.3 (aprobación del tratamiento de riesgos y aceptación del residual).

Ventana de terminal
froga approve --by "Ana García <ana@compania.com>"

Registra la revisión periódica del riesgo (ISO/IEC 23894 §6.6) como un acto firmado en .froga/acts/ (un sobre DSSE firmado con la clave del actor --by). Una revisión posterior a la aprobación, sin una nueva aprobación más reciente, reabre el ciclo (estado «en revisión periódica») hasta que la dirección vuelve a aprobar. Cubre la pata por TIEMPO de la revisión (la cadencia se declara en risk.review_interval de froga.yaml); la pata por «cambio significativo» ya la cubre la marca de aprobación DESACTUALIZADA.

FlagTipoPor defectoDescripción
--reporuta.Ruta al repositorio git sobre el que operar.
--bystring(requerido)Persona o rol que realiza la revisión, p. ej. "Jane Roe <jane@org>".

Un acto firmado .froga/acts/NNNN-review.json: un sobre DSSE in-toto firmado con la clave del actor --by (sustituye al commit-trailer Froga-Reviewed-by: que escribía el nivel 2).

ISO/IEC 23894:2023 §6.6 (revisión y seguimiento del proceso de gestión de riesgos).

Ventana de terminal
froga review --by "Ana García <ana@compania.com>"

Registra el rechazo de la aprobación como un acto firmado en .froga/acts/ (un sobre DSSE firmado con la clave del actor --by). El motivo es obligatorio (--reason). El ciclo de revisión vuelve a estado pendiente: el mantenedor ha de corregir las evidencias y volver a ejecutar froga request.

FlagTipoPor defectoDescripción
--reporuta.Ruta al repositorio git sobre el que operar.
--bystring(requerido)Persona o rol de dirección que rechaza, p. ej. "Jane Roe <jane@org>".
--reasonstring(requerido)Motivo del rechazo, p. ej. "faltan evidencias de sesgo en el subgrupo X".

Un acto firmado .froga/acts/NNNN-reject.json (sobre DSSE in-toto), con el motivo en el payload del acto (sustituye al commit-trailer Froga-Rejected-by: que escribía el nivel 2).

ISO/IEC 42001:2023 §6.1.3 (proceso de revisión del tratamiento de riesgos; trazabilidad de decisiones de rechazo).

Ventana de terminal
froga reject --by "Ana García <ana@compania.com>" --reason "faltan evidencias de sesgo en el subgrupo edad"

Fusiona una rama de tratamiento en su base con cuatro-ojos por clave verificado —un acto approve DSSE en la rama firmado con una clave distinta a la del request—, un merge --no-ff y un acto ancla de topología firmado sobre la nueva punta (A6b). Reproduce LocalForge.mergePR fuera del arnés TS.

Ventana de terminal
froga merge --branch tratar/species-recall --base main --by "Marta Dev <marta@example.com>"
FlagValorPor defectoSignificado
--reporuta.Repositorio sobre el que operar.
--branchnombre(obligatorio)Rama de tratamiento a fusionar (la que lleva el acto approve).
--basenombremainRama base donde aterriza el merge.
--byidentidad(obligatorio)Identidad del commit de merge (cosmética — el cuatro-ojos vive en la firma del acto, no en el autor del commit).
--titletexto(nombre de la rama)Título del PR/MR para el mensaje del merge.
--signerref(entorno)Firmante del acto ancla de topología tras fusionar (ver froga request).

Abre el PR/MR de la rama actual en la forja (A1: GitLab). Toma el subcomando open.

Ventana de terminal
froga pr open --base main --title "Tratar species-recall"
FlagValorPor defectoSignificado
--reporuta.Repositorio sobre el que operar.
--basenombremainRama destino del PR/MR.
--titletexto(ninguno)Título del PR/MR (por defecto, el de la propia forja).

Registra la entrega de un entregable obligatorio (Anexo IV, DoC, DORA RoI, DPIA, DoC-MDR) como un acto firmado en .froga/acts/. Es el registro de entrega que habilita el estado marketable: sustituye al antiguo commit-mensaje «deliverable: <kind> downloaded» (que era decorativo y falsificable).

FlagTipoPor defectoDescripción
--reporuta.Ruta al repositorio git sobre el que operar.
--bystring(requerido)Persona o rol que recoge el entregable, p. ej. "Jane Roe <jane@org>".
--kindstring(requerido)Tipo de entregable entregado: annex-iv, doc, dora-roi, dpia, doc-mdr.

Un acto firmado .froga/acts/NNNN-deliver.json: un sobre DSSE in-toto firmado con la clave del actor --by, con el kind del entregable en el payload.

EU AI Act Art. 11 y Anexo IV (documentación técnica); Art. 47 (declaración UE de conformidad, DoC); Reglamento DORA (Registro de Información, RoI).

Ventana de terminal
froga deliver --by "Ana García <ana@compania.com>" --kind annex-iv

Registra la retirada del sistema del mercado o de operación como un acto firmado en .froga/acts/ (un sobre DSSE firmado con la clave del actor --by). El motivo es opcional. froga reconstruct reportará el sistema como RETIRADO a partir de este acto.

FlagTipoPor defectoDescripción
--reporuta.Ruta al repositorio git sobre el que operar.
--bystring(requerido)Persona o rol que retira el sistema, p. ej. "Jane Roe <jane@org>".
--reasonstring(opcional)Motivo de la retirada, p. ej. "fin de ciclo de vida operativo".

Un acto firmado .froga/acts/NNNN-retire.json: un sobre DSSE in-toto firmado con la clave del actor --by (sustituye al commit-trailer Froga-Retired-by: que escribía el nivel 2).

EU AI Act Art. 9 (ciclo de vida del sistema de IA); EU AI Act Art. 61 (seguimiento post-comercialización y retirada).

Ventana de terminal
froga retire --by "Ana García <ana@compania.com>" --reason "fin de ciclo de vida operativo"

Proyecta los riesgos del bundle de evidencia firmado a un marco normativo de riesgo específico (ISO 14971, prEN 18228, ISO 23894) y escribe el resultado como artefacto firmado bajo demanda. El mecanismo es el espejo de froga conformance pero subido del nivel de medida al nivel del riesgo: por cada riesgo, deriva el vocabulario normativo del marco (hazard → hazardous situation → harm, para ISO 14971; source → pathway → consequence para prEN 18228) y evalúa la benefit-risk si está declarada.

Sin --framework, emite todos los marcos con catálogo de proyección declarados en context.applicable_standards de froga.yaml.

FlagTipoPor defectoDescripción
--reporuta.Ruta al repositorio git sobre el que operar.
--frameworkstring(todos los aplicables)Id del marco de riesgo (p. ej. iso/14971@2019, eu/pren-18228@2026, iso/23894@2023). Omitir = emite todos los declarados en applicable_standards que tienen catálogo de proyección.
  • .froga/risk-projection/<slug>.json — proyección firmada (ECDSA-P256+DSSE).
  • .froga/risk-projection/<slug>.json.sig — firma DSSE.

La proyección se deriva del bundle.risk_analysis sellado y se firma bajo demanda; nunca queda sellada en el bundle principal.

ISO 14971:2019 (análisis de riesgos para productos sanitarios: hazard→hazardous situation→harm + benefit-risk); prEN 18228 (source→pathway→consequence); ISO 23894 (ciclo de tratamiento ISO 23894 —test de paridad verifica que el nivel proyectado == residual_overall). La nube renderiza los artefactos verificados en el Anexo IV §5.

Ventana de terminal
# Proyectar a ISO 14971 (medtech)
froga risk-projection --framework iso/14971@2019
# Proyectar a todos los marcos aplicables con catálogo de proyección
froga risk-projection

Genera (o reutiliza) el par de claves ECDSA-P256 local del firmante sin tocar la red: escribe la clave privada en ~/.froga/signing.key (permisos 600) e imprime la clave pública SEC1 derivada y su origen (generada, reusada o tomada de FROGA_SIGNING_KEY). Es el camino offline de primera clase para entornos sin salida a internet (CI on-prem, fabricantes): permite firmar sin cuenta ni nube. El enrolado posterior es opcional: froga auth reutiliza esta clave si ya existe (no la regenera).

FlagTipoPor defectoDescripción
--outruta~/.froga/signing.keyRuta alternativa del fichero de clave a crear o reusar.
  • ~/.froga/signing.key (o --out) — clave privada del firmante (permisos 600); nunca se transmite.
  • En pantalla: la clave pública SEC1 en hex (la misma que froga pubkey) y dónde quedó la clave.

Registra el par de claves local del firmante en la nube: genera (o reutiliza) el par ECDSA-P256 en ~/.froga/signing.key (permisos 600) y enrola solo la clave pública en el sistema (ScmConnection) indicado. La clave privada nunca sale de la máquina. Es el paso que vincula un firmante (persona o CI) a un sistema por su rol antes de declarar, aprobar o ejecutar.

FlagTipoPor defectoDescripción
--systemstring(requerido)ID del sistema (ScmConnection) al que se asocia el firmante.
--urlstring(requerido)URL base de la nube, p. ej. https://app.venturalitica.ai.
--rolestringdeclarantRol del firmante: declarant, approver o executor.
--labelstringfroga-cliEtiqueta legible del firmante, p. ej. "laptop Nerea" o "CI GitHub Actions".
--codestringCódigo de enrolado interactivo (generado en la UI de Seigarrena). Excluye --token.
--tokenstringToken de despliegue para CI (alternativo al código interactivo). Excluye --code.
  • ~/.froga/signing.key — clave privada del firmante (permisos 600); nunca se transmite.
  • Registra la clave pública en la nube (ScmConnection.signerPubkey) con el rol declarado.

EU AI Act Art. 12 (registro atribuible); separación de funciones (four-eyes) mediante el rol del firmante.

Ventana de terminal
froga auth --system sys_abc123 --url https://app.venturalitica.ai --role declarant --code 482913

Solicita a la nube el entitlement de normas firmado del sistema y escribe .froga/entitlement.json en el repositorio. Es lo que habilita los catálogos de normas de pago (open-core): el motor lo lee para saber qué estándares puede proyectar. La nube nunca escribe en .froga/; lo escribe froga, y el usuario o el CI lo commitea.

La emisión está gateada por el plan de la organización: pedir una norma que el plan no licencia responde 403 con el plan mínimo que la incluye nombrado. Qué norma entra en qué plan, en Planes y normas.

FlagTipoPor defectoDescripción
--systemstring(requerido)ID del sistema (ScmConnection) en la nube.
--urlstring(requerido)URL base de la nube, p. ej. https://app.venturalitica.ai.
--tokenstring(requerido)Token de despliegue CI (FROGA_DEPLOY_TOKEN).
--reporuta.Directorio raíz del sistema (contiene froga.yaml y .froga/).
--standardsstring(los de froga.yaml)Estándares a solicitar, separados por comas (p. ej. eu/pren-18228@2026,eu/mdr@2017). Omitir = los applicable_standards del froga.yaml.
  • .froga/entitlement.json — entitlement de normas firmado por la nube (el usuario/CI lo commitea).
Ventana de terminal
froga entitlement sync --system sys_abc123 --url https://app.venturalitica.ai --token "$FROGA_DEPLOY_TOKEN"

froga entitlement dev (entorno efímero, SOLO desarrollo)

Sección titulada «froga entitlement dev (entorno efímero, SOLO desarrollo)»

En un entorno sin nube (demos, CI local) sync no está disponible (necesita --token). froga entitlement dev firma el entitlement LOCALMENTE con el issuer DEV embebido en el binario (froga_core::verify::dev_issuer_scalar_hex), cubriendo los estándares paid declarados en context.applicable_standards de froga.yaml, y lo escribe en el mismo .froga/entitlement.json.

Es advisory, NO válido en producción: el escalar del issuer DEV es público (vive en el binario compilado). Un binario release no lo ancla como emisor de confianza salvo que se fije FROGA_ISSUER_PUBKEY explícitamente a su pubkey — algo que solo hace el propio entorno efímero, nunca producción.

Ventana de terminal
froga entitlement dev --repo .

La AAPP (poder adjudicador) firma el pliego OSCAL (pliego.oscal.yaml) con su clave local del llavero (ECDSA-P256, el mismo esquema con que se firma la evidencia). La clave privada nunca sale de la máquina de la AAPP. El resultado es un sobre DSSE/in-toto (<FICHERO>.sig) verificable con la clave pública de la AAPP: es lo que hace el pliego vinculante, de modo que froga conformance --against-pliego pueda imponer sus cláusulas al licitador.

FlagTipoPor defectoDescripción
--outruta<FICHERO>.sigRuta donde escribir el sobre DSSE.
  • <FICHERO>.sig — sobre DSSE/in-toto del pliego, verificable con la clave pública de la AAPP.

EU AI Act Art. 47 (cadena de suministro); contratación pública: el pliego firmado fija el umbral de conformidad que el licitador debe cumplir.

Ventana de terminal
froga sign-pliego pliego.oscal.yaml

Firma un artefacto cualquiera (binario, tarball, wheel…) con ECDSA-P256 y escribe la firma destacada (detached) en formato DER. Verificable con OpenSSL usando la clave pública del motor en formato PEM (froga pubkey --pem).

FlagTipoPor defectoDescripción
--outruta<FICHERO>.sigRuta donde escribir la firma DER.
  • <FICHERO>.sig — firma DER destacada del artefacto.
Ventana de terminal
froga sign-detached froga-0.1.1-linux-x86_64.tar.gz
# Verificar la firma:
openssl dgst -sha256 -verify <(froga pubkey --pem) \
-signature froga-0.1.1-linux-x86_64.tar.gz.sig \
froga-0.1.1-linux-x86_64.tar.gz

El Anexo IV (EU AI Act Art. 11) no lo emite el motor. El motor solo produce evidencia firmada: el bundle.json (con procedencia por campo) y los artefactos .froga/*. El plano de control (la nube) ensambla y renderiza el Anexo IV a partir del bundle.json firmado y lo exporta a PDF (Typst). No es un artefacto del motor, no se commitea, y no existe ningún comando froga annex-iv.

Ver Los artefactos .froga/* para los artefactos que sí emite el motor.