You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
[P3][licensing-ux] msg FeatureTierBlocked sugere 'set effective_tier', mas é ignorado em enforced (a runtime audita 'no effect') — remediação enganosa #932
Contexto — nasceu do teste #1 (completão "1ª rodada SEM licença")
Fail-closed validado e correto: mode: enforced sem licença → cai pra Community (tier_fail_closed ... detail=missing_public_key), Community liberado (scan_filesystem, detector_cpf), Pro bloqueado (connector_powerbi, ocr_images) com FeatureTierBlockedError. Audit trail LICENSE_AUDIT action=feature_denied/tier_fail_closed presente — ótimo pra compliance. ✅
O atrito — remediação enganosa na mensagem
Empírico (processo fresco, sem o singleton cache): mode=open → Pro ALLOWED (bypassa ✅); enforced + licensing.effective_tier=pro → ainda BLOCKED.
By design e correto:core/licensing/runtime_feature_tier.py:15 — "effective_tier from YAML is ignored in enforced mode"; :114 audita detail="licensing.effective_tier has no effect in enforced mode". Security-positivo: não dá pra auto-conceder Pro editando config em enforced.
Defeito = só a MENSAGEM:core/licensing/feature_gate.py:59 (mostrada SÓ em enforced, onde o block ocorre) diz "Upgrade your subscription or set licensing.effective_tier in lab config" — exatamente o caminho que a runtime audita como no-op. As duas camadas se contradizem.
3 eixos
(a) graciosa ✅ · (b) msg enganosa⚠️ (sugere remediação não-funcional no modo em que aparece) · (c) caminho sugerido não resolve; resolução real = licença JWT válida.
Fix (pequeno, doc/UX — NÃO mexe no enforcement)
feature_gate.py:56-60: escopar a dica por modo —
enforced:"requires Pro tier; provide a valid license (JWT dbtier). effective_tier não se aplica em enforced."
mencionar effective_tier só como simulação de open/lab mode.
Prioridade
P3 — UX de licença comercial. NÃO bloqueia o gate e o comportamento de segurança está correto (fail-closed sólido). Polish de consistência interna.
Sinal forte de trabalho ativo na área, não confirma o bug específico
effective_tier aparece 23x, incluindo runtime_feature_tier.py e feature_gate.py — trabalho substancial na área de tier enforcement. Não confirmei se a mensagem enganosa específica (sugerir "set effective_tier" quando é ignorado em modo enforced) foi corrigida.
Verificado via A.I.I.D.C.O.B.P.P. v1.4 — Claude (Sonnet 5), auditor externo.
Nota de fronteira entre repos (auditor read-only).
Doutrina do operador (2026-08-27) sobre onde cada camada de licenciamento vive:
camada
dono
emissão de licença — assinar, revogar, distribuir
license-studio
guard interno — consumir a licença e barrar a feature
cada bestial, no próprio código
⚠️lang-agnostic é requisito, não detalhe: o bestiário é poliglota (Rust, Python, …), então o guard não pode depender de uma lib Python — precisa ser contrato verificável em qualquer linguagem.
Consequência para esta issue: ela não é caso de re-target. O enforcement descrito aqui é do data-boar; a semântica do que foi emitido é do license-studio. É trabalho de fronteira, e a recomendação é registrar essa divisão aqui em vez de mover a issue.
Contexto: varredura de issues abertas que nasceram antes das bestiais existirem, quando ainda não se sabia se a capacidade seria embarcada, sidecar, ou outra coisa. Decisão do operador.
Activity
FabioLeitao commentedon Jul 20, 2026
Sinal forte de trabalho ativo na área, não confirma o bug específico
effective_tieraparece 23x, incluindoruntime_feature_tier.pyefeature_gate.py— trabalho substancial na área de tier enforcement. Não confirmei se a mensagem enganosa específica (sugerir "set effective_tier" quando é ignorado em modo enforced) foi corrigida.Verificado via A.I.I.D.C.O.B.P.P. v1.4 — Claude (Sonnet 5), auditor externo.
FabioLeitao commentedon Aug 27, 2026
Nota de fronteira entre repos (auditor read-only).
Doutrina do operador (2026-08-27) sobre onde cada camada de licenciamento vive:
license-studiolang-agnosticé requisito, não detalhe: o bestiário é poliglota (Rust, Python, …), então o guard não pode depender de uma lib Python — precisa ser contrato verificável em qualquer linguagem.Consequência para esta issue: ela não é caso de re-target. O enforcement descrito aqui é do
data-boar; a semântica do que foi emitido é dolicense-studio. É trabalho de fronteira, e a recomendação é registrar essa divisão aqui em vez de mover a issue.Contexto: varredura de issues abertas que nasceram antes das bestiais existirem, quando ainda não se sabia se a capacidade seria embarcada, sidecar, ou outra coisa. Decisão do operador.