Planning Notes: Reusable CRP Scope¶
Estas notas preservam a direção técnica sugerida pelo responsável pelo produto. Elas devem ser investigadas e validadas durante $speckit-plan; não substituem requisitos nem constituem contrato fechado.
Proposed Request Scope¶
- A interface pode enviar o CRP selecionado em um header de escopo comum.
- A ausência do header representa o filtro “Todos”.
- A API pode resolver o valor em um middleware reutilizável, confirmar que o CRP pertence ao usuário autenticado e disponibilizar um escopo normalizado aos endpoints.
- Endpoints sensíveis devem consumir um filtro comum para evitar implementações divergentes.
- “Todos” significa ausência de restrição adicional por CRP, nunca ausência da restrição obrigatória por
ownerUserId. - Um valor de CRP controlado pelo cliente pode apenas reduzir o conjunto já autorizado; nunca pode ampliar acesso.
Proposed Migration Strategy¶
- Favorecer a atribuição de CRP em entidades-raiz e derivação segura nas dependentes.
- Evitar adicionar a mesma referência a todas as tabelas quando um relacionamento obrigatório já determina o CRP sem ambiguidade.
- Manter registros ainda não classificados visíveis somente em “Todos” até atribuição explícita.
- Criar inventário por endpoint e por entidade para decidir onde o filtro é direto, derivado ou não aplicável.
- Criações realizadas sob “Todos” devem receber CRP explícito no comando; o backend não deve escolher um registro silenciosamente.
Proposed Data Shape¶
- O isolamento não requer banco, schema ou infraestrutura separados por CRP.
- Uma referência de CRP em uma entidade-raiz pode ser suficiente quando as entidades dependentes conseguem derivar o escopo por relacionamento obrigatório.
- Para esta primeira versão, cada paciente pertence a exatamente um CRP; uma coluna de referência no paciente é a direção preferida.
- A cota continua sendo consultada por proprietário sem filtro CRP, somando todos os pacientes ativos da conta.
- Entidades dependentes do paciente devem derivar o CRP por relacionamento sempre que isso for inequívoco, evitando replicar a coluna.
- Suporte futuro a um mesmo paciente simultaneamente em vários CRPs exigirá nova decisão de produto e possível mudança de cardinalidade; não faz parte desta feature.
Proposed Future-Task Flow¶
- Uma associação provisória deve persistir
graceStartedAt,graceExpiresAt, estado atual, última tentativa e próximo momento elegível. - O fluxo deve agendar novas tentativas de validação e aceitar repetição idempotente.
- O vencimento não pode depender apenas de uma tarefa executada exatamente no quinto dia; toda avaliação de operação deve reconhecer um prazo já expirado mesmo que a fila esteja atrasada.
- Uma tentativa bem-sucedida deve cancelar ou tornar inofensivos os trabalhos futuros já agendados para o mesmo vínculo.
- Política de intervalo, backoff, quantidade de tentativas e recuperação de trabalhos mortos deve ser decidida em
$speckit-plan.
Proposed Capability Decision¶
- Não modelar um único
userStatusque misture cadastro, CRP e plano. - Manter estados independentes e calcular uma decisão por ação, por exemplo
patient.create. - Uma decisão pode retornar múltiplos motivos, como
PLAN_PATIENT_LIMIT_REACHEDeCRP_VALIDATION_EXPIRED. - O tier pertence ao usuário; os identificadores iniciais são
freeestandard. - Esta feature implementa somente a regra conhecida do
free(cinco pacientes) e a fundação extensível. Catálogo, cobrança e benefícios dostandarddevem constituir uma feature/spec própria.
Questions for Planning¶
- O escopo selecionado deve persistir por sessão, dispositivo ou preferência do usuário?
- Quais endpoints podem aplicar filtro direto e quais precisam derivá-lo por paciente ou outra entidade-raiz?
- Como impedir que cache, jobs, exportações e integrações reutilizem dados de outro filtro?
- Como executar com segurança uma futura troca de CRP do paciente preservando todo o histórico derivado?
- Quais eventos e qual periodicidade devem disparar a revalidação de CRP?
- Qual será o catálogo de capacidades do
standardquando a feature comercial de planos for especificada?