Faro · Especificación viva

Lo que el producto promete

Cada caso lo escribió el equipo en castellano y se corre contra la aplicación. Lo que figura como pendiente ya está definido por el negocio y el producto todavía no lo hace.

20 de agosto de 2026, 22:19267db756666c41a0142c0f60bb9d4eaa9f6e41fdrama mainVer la corrida

48escenarios especificados
  • 29Pasa
  • 0Falla
  • 13Pendiente
  • 0Borrador
  • 6Salteado
  • 0No corrió

Back office

5 escenarios · 3 pasan · 2 pendientes

Clientes y sus entidades

back-office/clientes-y-entidades.feature

Un cliente puede tener más de una empresa, y cada empresa tiene hechos legales propios: dónde está constituida y qué EIN le asignó el IRS. El equipo necesita registrarlos para poder operar la formación.

Permisos por responsabilidad

back-office/roles-y-permisos.feature

El contador que ejecuta una formación y el socio que firma los contratos no necesitan ver lo mismo. Hoy el producto no distingue: existen sólo dos roles, `client` y `staff`, y todo el staff puede todo.

Regla

el contador y el revisor son responsabilidades, no permisos

El documento de negocio define Accountant, Reviewer y Owner. El código tiene `Role { client, staff }` y asigna contador y revisor a nivel contrato, sin que eso cambie lo que cada uno puede ver o hacer. La vista "Todos los work items" tampoco está restringida al Owner. Es FT-92.

Regla

pedir un recurso ajeno se rechaza con una explicación

Los cuatro errores de titularidad del contexto de contratos (`ForbiddenEngagementError`, `EngagementNotSignableError`, `EngagementNotConvertibleError`, `EngagementAlreadyConvertedError`) no están mapeados en el filtro HTTP, así que hoy salen como 500. Un cliente pidiendo el contrato de otro recibe un error de servidor, no un 403.

Quién es parte del equipo

back-office/usuarios-y-roles.feature

El acceso al panel no se configura por archivo: se otorga desde el producto. Pero hay dos cosas que el producto no deja hacer, porque dejarían a Faro sin forma de administrarse.

Regla

nadie puede dejar a Faro sin administración

Un rol es la llave del panel. Si alguien pudiera quitarse el suyo, o revocar al último miembro del equipo, nadie podría volver a entrar a otorgarlo.

Captación

4 escenarios · 4 pendientes

Los límites de la agenda

captacion/agenda-y-turnos.feature

La consulta es el único recurso escaso del negocio: hay una agenda finita y cada reserva confirmada la consume.

Regla

sin lugar en la agenda no se ofrece reservar

No hay forma de cerrar la agenda desde afuera del arnés: el único lugar autorizado a tocar la disponibilidad es el `global-setup`, que la siembra para toda la corrida. Haría falta poder vaciarla por escenario.

Regla

un turno confirmado no se vuelve a ofrecer

La disponibilidad se calcula como las ventanas publicadas menos los bloques ocupados del calendario, y **nunca consulta las reservas confirmadas propias**. Si el bloque ocupado no llegó a proyectarse, el turno se sigue ofreciendo: un segundo cliente paga y su reserva se rechaza con "the slot was taken by another payment". Verificado en la base de datos: existió una reserva confirmada sin su bloque correspondiente.

Seguimiento de leads que se enfrían

captacion/leads-frios.feature

Un prospecto que pagó la consulta y no firmó es la oportunidad más cara de perder: ya demostró intención y ya pagó. El seguimiento tiene que ocurrir sin trabajo manual.

Regla

un lead sin novedades se enfría a los 30, 60 y 90 días

El enum del lead ya tiene `cold_30`, `cold_60` y `cold_90`, pero ningún método del agregado los escribe: hoy son inalcanzables. Falta el job de enfriamiento y, para poder probarlo, alguna forma de mover el reloj. Es FT-86, sin empezar.

Regla

el equipo puede dar un lead por perdido con su motivo

`lost` tampoco lo escribe ningún método, y no hay pantalla para hacerlo. Es parte de FT-85 (pipeline Kanban), sin empezar.

Contratación

12 escenarios · 8 pasan · 2 pendientes · 2 salteados

Envío y congelamiento del contrato

contratacion/envio-y-congelamiento.feature

Mandar el contrato es irreversible desde donde lo ve el cliente: le aparece en el portal para firmarlo y pagarlo. De ahí salen las dos reglas de esta característica.

Antes de salir, el borrador tiene que estar completo: sin alcance el contrato no dice qué se contrató, y sin firmante nadie responde por el estudio. Las dos cosas se piden en la pantalla, antes de tocar al proveedor de firma, para que el equipo se entere de lo que falta al lado del campo que falta.

Después de salir, el precio y el alcance quedan congelados: cambiarlos dejaría el contrato desincronizado del documento que el cliente está por firmar. El nombre es la única excepción y es deliberada: es una etiqueta interna del CRM que no sale impresa en el PDF, así que corregirlo tarde sigue estando permitido.

Regla

un borrador incompleto no sale

Regla

el idioma es dueño del alcance

El contrato se redacta en el idioma del lead y las líneas de alcance se guardan ya traducidas, así que cambiar el idioma no puede conservarlas: vuelve a traer las del catálogo en el idioma nuevo. Lo que el equipo haya escrito a mano se pierde, y por eso la pantalla lo pregunta antes.

Regla

enviado el contrato, sólo el nombre sigue siendo editable

El trámite express (Expedite)

contratacion/expedite.feature

Quien quiere su LLC antes puede pedir el trámite express por $100 más.

Regla

pedir el trámite express se cobra

Hoy el producto le promete el cargo al cliente y no lo hace. El wizard muestra "Se te cobrarán $100 USD adicionales" y la revisión dice "Sí (+$100 USD)", pero la preferencia sólo se guarda: no genera línea de honorarios, no abre un cargo y no aparece en el detalle del work item. Además el precio del contrato queda congelado al salir de borrador, así que en ese punto del flujo el equipo tampoco puede agregar la línea a mano. Es FT-236, sin empezar.

Firmar y pagar en un solo flujo

contratacion/firma-y-pago.feature

El contrato y el saldo son dos mitades de un mismo acto: nadie queda firmado sin pagar ni pagado sin firmar. Cuando las dos se completan, el prospecto pasa a ser cliente, nace su entidad y aparece el work item con el que el equipo ejecuta la formación.

Regla

el saldo y la firma son independientes

Stripe y el proveedor de firma no se coordinan entre sí, así que el pago puede acreditarse antes de que el contrato esté firmado. Faro tiene que aceptar las dos llegadas en cualquier orden y no dar por activa la formación hasta que ocurrieron las dos.

Generación del contrato

contratacion/generacion-del-contrato.feature

Con la consulta ya pagada, el equipo genera el contrato desde el lead. El generador es la única pantalla donde se decide qué se contrató y cuánto se cobra.

Dos cosas viajan solas desde el lead y son las que más se rompen sin que nadie se entere: el crédito de la consulta, que ya viene descontado del saldo para que el cliente no pague dos veces los $99 que puso para hablar con nosotros, y el alcance, que se precarga desde el catálogo según el tipo de entidad y la jurisdicción que el lead declaró antes de la llamada.

Todos los importes que se afirman acá los calcula el servidor: el arnés nunca suma de su lado.

Cuentas y acceso

13 escenarios · 10 pasan · 3 pendientes

Control de acceso a las pantallas privadas

cuentas/control-de-acceso.feature

El portal guarda la documentación fiscal de cada persona y el panel del equipo, la cartera entera de clientes. Ninguno de los dos se abre por conocer la dirección: quien no ingresó tiene que ingresar primero, y una cuenta de cliente nunca alcanza las pantallas del equipo.

Regla

sin sesión no se abre ninguna pantalla privada

Regla

una cuenta de cliente no alcanza las pantallas del equipo

Registro e ingreso

cuentas/registro-e-ingreso.feature

Tener cuenta es la puerta de entrada a todo lo demás: sin cuenta no hay consulta reservada, ni contrato para firmar, ni trámite que seguir. Por eso registrarse tiene que dejar a la persona adentro del portal en un solo paso, y volver con la misma contraseña tiene que devolverla al mismo lugar.

Regla

la contraseña necesita al menos 8 caracteres, con una letra y un número

La cuenta custodia documentación fiscal y datos personales de los dueños, así que no se crea hasta que la contraseña cumple la política.

Segundo factor por mail

cuentas/segundo-factor.feature

Quien activa el segundo factor está pidiendo que su contraseña sola no alcance. Desde ese momento cada ingreso necesita, además, un código que Faro le manda por mail: una contraseña filtrada ya no abre la cuenta.

Verificar el correo y recuperar la contraseña

cuentas/verificacion-de-email.feature

Faro le manda un enlace por mail para confirmar la dirección, y otro para fijar una contraseña nueva cuando alguien la olvidó.

Regla

los dos flujos terminan en un enlace que llega por mail

Los endpoints existen (`POST /auth/verify-email`, `/auth/password/forgot`, `/auth/password/reset`) y funcionan, pero **no hay forma de leer el token desde el arnés**: el único seam de correo que existe es `GET /auth/2fa/last-code`, que sólo devuelve códigos de segundo factor. Con un seam análogo para el último token enviado, estos dos escenarios pasan a verde sin cambiar el Gherkin.

Formación de LLC

4 escenarios · 4 salteados

Los datos de la LLC

formacion-llc/datos-de-la-empresa.feature

Con el contrato firmado y el saldo pagado, lo único que falta para presentar la formación son los datos: los nombres que la persona quiere para su empresa, dónde la constituye, a qué se va a dedicar y quiénes son sus socios. Hasta que eso llega, el equipo no puede avanzar.

La información sensible de los socios

formacion-llc/privacidad-de-la-pii.feature

El cuestionario pide lo más sensible que Faro llega a guardar: el SSN o ITIN de cada socio y su dirección residencial. El equipo necesita esos datos en claro para presentar la formación, pero el portal del cliente no: una vez cargados, no vuelven a salir por ahí.

ITIN

1 escenario · 1 pendiente

Gestionar el ITIN de un socio que no lo tiene

itin/registracion-de-itin.feature

Un socio extranjero sin SSN ni ITIN no puede ser dueño de una LLC ante el IRS hasta que tenga uno. Faro lo gestiona como un servicio aparte de $350.

Regla

declarar que no se tiene SSN ni ITIN dispara el servicio de ITIN

El dominio ya calcula `needsItin` cuando el socio elige "No tengo (lo gestionamos)", y el wizard ya ofrece esa opción. Pero nada consume ese dato: no se crea la línea de $350, no nace un trámite, y el equipo no lo ve en ninguna pantalla. Son FT-237 y FT-238, sin empezar.

Operación

7 escenarios · 7 pasan

Ciclo de vida del work item

operacion/ciclo-de-vida-del-work-item.feature

El work item es el trabajo concreto que se prometió en el contrato: para el caso de formación, constituir la LLC. Nace Nuevo cuando el contrato se firma, se trabaja, y termina archivado sin borrarse nunca.

Este es el recorrido completo, de punta a punta, en un solo escenario: la cadena es irrompible —no se puede completar sin haber iniciado, ni archivar sin haber completado— así que partirla en escenarios sueltos obligaría a sembrar por atrás justamente los pasos que se quieren probar.

Colas de trabajo del equipo

operacion/colas-de-trabajo.feature

Las vistas de work items son la bandeja del equipo: Todos es lo que queda por hacer y Archivados es la memoria. Archivar es una vista, no un estado: un work item archivado sigue mostrando en qué terminó —Completado— y agrega que está archivado, en vez de que un rótulo le pise al otro.

Archivado tampoco significa congelado del todo: los datos quedan de sólo lectura, pero pedirle la reseña al cliente es la única acción que sobrevive, y tiene que seguir a mano porque completar es justamente lo que archivó al work item.

La última regla es la asimetría de la espera: un work item que ya lleva siete días esperando información no puede volver a llevar tres, así que bajar sólo se puede pasando otra vez por En curso.

Invariantes de cierre del work item

operacion/invariantes-de-cierre.feature

Dar por terminada una formación exige tres cosas al mismo tiempo: que el cliente haya completado su cuestionario, que el estado haya aprobado la presentación y que el IRS haya asignado el EIN. El EIN entra en la lista porque el alcance que el cliente firmó promete la presentación del SS-4: sin eso, lo contratado no está entregado.

Que falte una de las tres no es un error del equipo, es información: el IRS tarda semanas y el work item se queda legítimamente en curso mientras tanto. Por eso lo que se prueba acá no es sólo que el cierre se rechace, sino que el rechazo llegue a la pantalla diciendo cuál de las tres falta.

Plataforma

2 escenarios · 1 pasa · 1 pendiente

Disponibilidad del sitio

plataforma/home.feature

El sitio público de Faro tiene que estar en pie: es la primera puerta de entrada de cualquier prospecto.