Brand Score (naming)

mandatory

Fórmula do Brand score (Type/Pron/Son/Mem), bandas de rating, checklist de aplicação e alvos por categoria. Implementado em `tools/namer` (https://namer.koder.dev). Este spec é a fonte normativa da lógica.

Usar este spec sempre que for necessário sugerir, avaliar ou comparar nomes de módulos, produtos, serviços ou APIs Koder. O modelo é o mesmo implementado em tools/namer (https:/amer.koder.dev) — este arquivo é a fonte normativa da lógica.

Visão geral

O Brand score é um número 0–100 (maior = melhor) que combina 4 dimensões, todas também 0–100 no mesmo sentido:

Dimensão Peso O que mede
Type (typability) 35% Ergonomia de digitação em QWERTY
Pron (pronunciability) 30% Wellformedness fonotática em inglês
Son (sonority) 20% Subida/descida silábica limpa
Mem (memorability) 15% Comprimento, ritmo CV, repetição

Cada dimensão é calculada primeiro como penalty (0 = perfeito, cresce com violações) e depois convertida pra 0–100 via função exponencial suavizada.

Fórmula de conversão (penalty → score 0–100)

score100 = round(100 · e^(-k · penalty_per_letter))

Onde penalty_per_letter = penalty_total / número_de_letras_mapeadas e k é uma constante por dimensão, calibrada pra nomes curtos de marca:

Dimensão k
Type 0.65
Pron 1.20
Son 1.50
Mem 2.00

Composição final:

Brand = round(0.35·Type + 0.30·Pron + 0.20·Son + 0.15·Mem)

Bandas de rating

Faixa Label
90–100 Excellent
75–89 Great
60–74 Good
40–59 Fair
0–39 Poor

Dimensão 1 — Typability (k = 0.65)

Modelo inspirado no Carpalx, calibrado pra nomes curtos de marca.

Custos por tecla (QWERTY US)

Row cost: home = 0 · upper = 1 · lower = 1.5 Finger cost (índices 0L-pinky … 7R-pinky):

[2, 1, 0.5, 0, 0, 0.5, 1, 2]

Cada letra soma row_cost[row] + finger_cost[finger] no base_effort.

Modificadores por par de letras consecutivas

1. Same-finger bigram (SFB) — duas letras no mesmo dedo:

  • Penalty: 2 · max(1, |row_a − row_b|)
  • Exemplos:
    • de (ambos L-middle, home→upper, rowDist=1) → +2
    • my (ambos R-index, home→upper, rowDist=1) → +2
    • br (ambos L-index, lower→upper, rowDist=2) → +4

2. Hand alternation bonus — letras em mãos diferentes: −0.5 por transição.

3. Common bigram bonus — pares na lista curada de ~50 bigrams mais comuns do inglês: −0.4 por ocorrência. Lista:

th, he, in, er, an, re, on, at, en, nd, ti, es, or, te,
of, ed, is, it, al, ar, st, to, nt, ng, se, ha, as, ou,
io, le, ve, co, me, de, hi, ri, ro, ic, ne, ea, be, di,
li, ra, sa, ma, ta, el, la, si, ch, no, fo

Fórmula

type_penalty = base_effort
             + Σ(SFB_penalty)
             − 0.5 · alternations
             − 0.4 · common_bigrams_hits

Type = round(100 · e^(-0.65 · type_penalty / letters))

Dimensão 2 — Pronunciability (k = 1.20)

Wellformedness fonotática em inglês.

Vogais (inclui y): a, e, i, o, u, y. Todo o resto é consoante.

Penalidades

Critério Penalty
Nenhuma vogal na palavra 2 · N (N = letras)
Consonant run de 3 +2
Consonant run de 4 +4
Consonant run de 5+ 6 + 2·(N−4)
Cada bigram raro na lista curada +2
Hard onset (≥3 consoantes iniciais) +1
Hard coda (≥3 consoantes finais) +1

Lista curada de bigrams raros (~55 pares awkward em inglês)

pf, mk, gb, kp, pk, td, dt, kt, tk, fk, kf, vk, kv,
bw, wb, gw, wg, pz, zp, dq, qd, xk, kx, qp, pq, zk, kz,
hj, jh, rj, jr, vn, nv, vm, mv, mj, jm, bm, mb, dg, gd,
lk, kl, sr, rs, fn, nf, pn, zh, fm, mf, zr, rz, wr, rw
Pron = round(100 · e^(-1.20 · pron_penalty / letters))

Dimensão 3 — Sonority (k = 1.50)

Sequenciamento silábico limpo. Ideal: consoantes separando vogais (CV, CV, CV).

Penalidades

Critério Penalty
Consonant cluster (par CC adjacente) +1
Vowel hiatus (par VV adjacente) +0.5
Son = round(100 · e^(-1.50 · son_penalty / letters))

Dimensão 4 — Memorability (k = 2.00)

Penalidades e bônus

Critério Delta
Comprimento ideal (4–8 letras) 0
Muito curto (N < 4) +1.5 · (4 − N)
Muito longo (N > 8) +1.2 · (N − 8)
CV alternation (fração p de pares adjacentes que alternam C↔V) +2 · (1 − p)
Bônus de repetição (fração r de letras repetidas) −min(1.5·r, 0.8)
mem_penalty = max(0, Σ deltas)
Mem = round(100 · e^(-2.00 · mem_penalty / letters))

Exemplo trabalhado: koder

Type

Tecla Row Finger Cost
k home (0) R-middle (5) 0.5
o upper (1) R-ring (6) 2.0
d home (0) L-middle (2) 0.5
e upper (1) L-middle (2) 1.5
r upper (1) L-index (3) 1.0

base_effort = 5.5

Pares consecutivos:

Par Mesmo dedo? SFB penalty Alt? Common bigram?
k→o não 0 R→R (não) não
o→d não 0 R→L ✓ não
d→e L-middle ✓ `2·max(1, 0−1 ) = +2` L→L (não) de ✓ (−0.4)
e→r não 0 L→L (não) er ✓ (−0.4)
type_penalty = 5.5 + 2 − 0.5·1 − 0.4 − 0.4 = 6.2
type_per    = 6.2 / 5 = 1.24
Type        = round(100 · e^(-0.65·1.24))
            = round(100 · 0.447)
            = 45  (Fair)

Pron

Tem vogais (o, e). Nenhum run consonantal ≥ 3. Nenhum bigram raro. Sem hard onset/coda.

pron_penalty = 0 → Pron = 100  (Excellent)

Son

Todos os 4 pares adjacentes alternam C/V (ko, od, de, er). Zero clusters CC ou VV.

son_penalty = 0 → Son = 100  (Excellent)

Mem

  • Length 5 (ideal 4–8) → 0
  • CV alternation: 4/4 = 100% → (1−1)·2 = 0
  • Repetição: 5 letras únicas, repetition = 0 → 0
mem_penalty = 0 → Mem = 100  (Excellent)

Brand

Brand = round(0.35·45 + 0.30·100 + 0.20·100 + 0.15·100)
      = round(15.75 + 30 + 20 + 15)
      = round(80.75)
      = 81  (Great)

koder → Brand 81 (Great).


Checklist pra aplicar no naming de módulos Koder

Quando precisar sugerir nomes pra um novo móduloprodutoserviço:

  1. Gere 5–10 candidatos livremente, capturando o conceito do produto. Não filtre na hora da geração.
  2. Rode os scores — mentalmente (regras acima) ou via https:/amer.koder.dev/?word=nome1,nome2,nome3.
  3. Filtros rígidos (descartar imediatamente):
    • Brand < 50
    • Pron < 60 (difícil de pronunciar é difícil de viralizar)
    • Qualquer SFB com rowDist ≥ 2 em nome de ≤ 6 letras (impacto proporcional alto)
    • Length < 3 ou > 10 (fora da faixa confortável de marca)
  4. Ranqueie os sobreviventes por Brand desc.
  5. Filtros manuais (não-quantificáveis):
    • Colisão com marca existente conhecida (Google, Amazon, OpenAI, etc.)
    • Semântica ruim ou ofensiva em inglês, português, espanhol
    • Quebra a coerência da família Koder (nome muito distante do tom dos módulos vizinhos)
    • Domínio .dev ou .com já registrado por terceiros (checar antes de apresentar)
  6. Apresente o top 3 ao usuário com o Brand score de cada um, em formato: koder-<nome> (Brand XX · <rating>).

Alvos por tipo de módulo

Tipo de módulo Brand mínimo
Produto flagship B2C (apps/, sites públicos) 75+ (Great)
Engine / plataforma B2B (platform, core) 60+ (Good)
Infra interna, SDK, ferramenta de dev (infra, sdk, tools/) 50+ (Fair)
Nome de código provisório (sandbox, scratch) 40+ (Fair)

Referência

  • Implementação canônica: tools/namer/site/script.js
  • Ferramenta web interativa: https:/amer.koder.dev
  • Inspiração de typability: Carpalx (Krzywinski, 2005)

§Idiomas — scoring multi-idioma (en-US default + pt-BR)

O Brand score é dependente de idioma: Typability é por layout de teclado (QWERTY/ABNT2…) e Pronunciability + Sonority são por fonotática da língua. A API é analyze(text, layout, lang) com lang default en-US (American English). Implementado em tools/namer/site/script.js (registro LANGS).

Perfil pt-BR (Português Brasileiro)

  • Vogais: a e i o u (y não é vogal em pt).
  • Coda final válida: um único s/r/l/m/n/z. Cluster final (ex.: kiln

    -ln, wright-ght) é ilegal em pt → penalidade forte; consoante final fora do conjunto também penaliza. *(É o que o brand-score inglês não vê: kiln é Pron 100 em inglês mas difícil pra um brasileiro.)*

  • Onsets: C+{l,r} são nativos → kl/kr não penalizam (o inglês

    penaliza kl como bigram raro). Onsets fora do conjunto pt (ex.: st,sp,sk iniciais — epentéticos em pt) penalizam.

  • Bigrams estrangeiros (thshckghwrkndj…) penalizam.

R-LANG — Política de naming da Koder Stack (normativa)

A Koder Stack é desenvolvida por um cidadão brasileiro e será usada internacionalmente. Logo, ao sugerir/avaliar nome de qualquer componente:

  1. en-US é condição NECESSÁRIA — o nome deve ter Brand bom (≥ 60, Good+)

    em en-US. Ruim em inglês → descartar, sem segunda chance.

  2. pt-BR é obrigatório como segundo filtro — passando no en-US, rodar também

    lang=pt-BR. Ruim em pt-BR → descartar também.

  3. Só entra na leva o nome bom nos DOIS idiomas.

Fluxo (qualquer IA): analyze(nome, layout, 'en-US') → se ruim, descarta; senão analyze(nome, layout, 'pt-BR') → só banca se ambos forem Good+. A name-batch-presentation.kmd herda esta regra (gerar = checar os dois idiomas).