@chrono-os/compliance-gate
v0.1.2
Published
Gate determinístico de compliance de copy — lint barato de texto por ruleset configurável por marca (forbid list + regex), zero deps de runtime. Rulesets seed: oab (publicidade advocatícia), brand-base (vícios universais de copy) e nina (tom do SobreViven
Maintainers
Readme
@chrono-os/compliance-gate
Gate determinístico de compliance de copy — um lint barato e previsível de texto por ruleset configurável por marca (forbid list + regex). Zero dependências de runtime, função pura, sem I/O e sem LLM.
É a primeira barreira antes de publicar: pega os vícios mecânicos (promessa de resultado, termo mercantil, urgência falsa, emoji demais…). A revisão profunda (humana ou agente especializado) roda depois, em outra camada.
Instalação
npm i @chrono-os/compliance-gateUso
import { checkCompliance, formatViolations, builtinRulesets } from "@chrono-os/compliance-gate";
const result = checkCompliance("vitória garantida no seu processo!", builtinRulesets.oab);
// result.ok === false
// result.violations: [{ rule, severity, match, hint }]
if (!result.ok) console.error(formatViolations(result.violations));ok === true ⇔ nenhuma violação com severity error (warn só sinaliza, não reprova).
Rulesets embutidos
| Nome | Contexto | Regras |
|---|---|---|
| oab | Publicidade advocatícia (Provimento 205/2021 CFOAB, Código de Ética, art. 34 da Lei 8.906/94 — normas públicas) | emoji, exclamacao, promessa-resultado, mercantil, sensacionalismo |
| brand-base | Vícios universais de copy (base neutra pra estender) | urgencia-falsa, promessa-magica, clickbait, caps-lock (warn) |
| nina | Tom do SobreVivendo Adulto (estende brand-base) | exclamacao-excesso (3+), nao-e-x-e-y (a fórmula-clichê "não é X, é Y"), promessa-financeira-absoluta, emoji-excesso (2+), jargão de coach (mindset etc.) |
Ruleset customizado
import { checkCompliance, brandBase, EMOJI_SOURCE, type Ruleset } from "@chrono-os/compliance-gate";
const minhaMarca: Ruleset = {
name: "minha-marca",
extends: [brandBase], // herda as regras da base
forbid: ["sinergia", { term: "disruptivo", severity: "warn", hint: "jargão vazio" }],
patterns: [
{ rule: "emoji", pattern: EMOJI_SOURCE, flags: "u", maxAllowed: 2 }, // tolera 2
],
};
checkCompliance(texto, minhaMarca);forbid: termo literal, case-insensitive, por substring.patterns: regex (RegExpou string; flags defaultiu,gé garantida).maxAllowedtolera N ocorrências antes de violar.extends: composição — as regras das bases rodam antes das locais; violações duplicadas (mesma regra na mesma posição) são deduplicadas.
API
checkCompliance(text, ruleset)→{ ok, violations: [{ rule, severity, match, hint? }] }formatViolations(violations)→ string legível, uma linha por violaçãobuiltinRulesets—{ oab, "brand-base": brandBase, nina }EMOJI_SOURCE— source de regex que casa uma sequência de emoji completa (ZWJ conta como 1; setas tipográficas ficam de fora)
Licença
MIT
