enrollments), e a agenda só segura o que já é dele.
A ideia
Cada condição responde com a data a partir da qual ela é verdadeira, e não com sim ou não. Por isso elas compõem sem ambiguidade:
Uma condição que depende de algo que o aluno ainda não fez — concluir uma aula,
por exemplo — não tem data. Dentro de um
all ela segura tudo; dentro de um
any é só um caminho que ainda não abriu, e os outros continuam valendo.
É isso que mantém a promessa que a tela precisa cumprir: sempre que existir uma
data, a resposta traz available_at; quando não existir, traz release, a
mesma árvore com o veredito de cada condição e a frase pronta.
As condições
Todas são monótonas: uma vez verdadeiras, verdadeiras para sempre.days atrasa o que o nó decidiu — “7 dias depois de concluir o módulo 1” — e
vale em qualquer nó, menos em immediate.
Não há condição de turma, de etiqueta ou de perfil, de propósito: elas podem
deixar de valer, e acesso que oscila é acesso que ninguém sabe explicar. Quem
tem direito é pergunta de matrícula.
Curso, módulo e aula
Os três níveis têm agenda, e elas se somam por conjunção: a aula abre quando as três abrirem. É o que evita repetir a mesma condição em vinte aulas — e o que faz a aula criada depois nascer segurada, em vez de vazar. “O curso abre 30 dias depois da compra” é uma linha na agenda do curso.published_at não serve para isso: ele é a data em que o curso vai ao ar para
todo mundo, e a agenda é contada da matrícula de cada aluno.
Exemplo
“Libera em 30 dias — ou 2 dias depois de concluir o módulo 1, o que vier primeiro.”Recusas
invalid_release(422): forma incoerente, atraso fora de 0–3650 dias, aninhamento acima de 5 níveis, mais de 50 condições, ou referência a uma aula ou módulo de outro curso.release_deadlock(422): a escrita fecharia um círculo — aulas esperando umas pelas outras, que não abririam nunca. A conferência é sobre o curso inteiro, porque o impasse é do conjunto, e nada é gravado.