[DEBT] Stabilization narrative over-infers quality ("suggests durable delivery"); no i18n parity guard - #237
Open
rafaeldearaujop wants to merge 1 commit into
Open
[DEBT] Stabilization narrative over-infers quality ("suggests durable delivery"); no i18n parity guard#237rafaeldearaujop wants to merge 1 commit into
rafaeldearaujop wants to merge 1 commit into
Conversation
…parity guard Three narrative strings (EN and PT-BR) read persistence as durability: a file not revisited within the churn window is not evidence of correctness (Liu et al. 2026 report 22.7% of AI-introduced issues still at HEAD). Reword them, drop 'quality signal' from METRICS.md, and add tests/test_i18n_parity.py — key parity, placeholder parity, format smoke and a vocabulary guard for Absolute Rule #4. Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
[DEBT] Stabilization narrative over-infers quality ("suggests durable delivery"); no i18n parity guard
Aberta como PR direta, não como issue: a decisão já foi tomada e o fix
está validado; o texto segue o template
tech-debt.ymlpararastreabilidade. Referências
arquivo:linhaapontam paramain @ da16235.Esta mudança é independente: aplica, testa e valida sozinha sobre
main. Todapreocupação da análise adversária tem disposição final.
Qual é a dívida?
Três strings de narrativa (EN e PT-BR) inferem durabilidade/qualidade a
partir de persistência (arquivo não revisitado dentro da janela de churn):
iris/i18n.pyfinding_stabilization_hightrend_finding_stabilization_upexplain_intent_stability_bodyReforçadas pelo dicionário —
docs/METRICS.md§1 chamastabilization_ratiode "Core quality signal" — e pelo
docs/ONE-PAGER.md:72: "Platformteams evaluating which AI tools produce the most durable code" (enquadramento
de ranking de ferramentas, que o paper desmonta na RQ2).
Segunda parte da dívida: não existe nenhum teste de narrativa ou i18n
(
ls tests | grep -i "narrat|i18n|report"retorna vazio). Onarrative.pyformata por chave com placeholders nomeados (
narrative.py:99-108,720-724);uma chave faltando numa língua é
KeyErrorem runtime, um placeholderdivergente é erro de
format()— e nada pega isso antes do usuário.Por que é dívida?
CLAUDE.md:54): "Metrics arehypotheses, not truths". A frase transforma uma hipótese em veredito.
que a frase sugere: de 464.900 issues introduzidas por IA, 105.364
(22,7%) ainda estão no
HEAD, incluindo 4.893 com mais de nove meses(§V-C, Table VI, p.8). Código não revisitado é, com frequência, código
que ninguém olhou — não código bom.
stabilization_rationão distingue osdois casos, e o texto afirma que distingue.
(
platform/lib/translations.ts:43— "whether AI is making your code moredurable — or just more";
deck-content.ts:53;README.md§What It Does).Quando a métrica de durabilidade real existe (§8,
survival_rateviagit blame), deixar stabilization também se chamar "durável" mistura doisinstrumentos distintos sob uma palavra.
produção por uma chave esquecida, sem que nenhum teste da CI falhe.
Como chegou aqui?
A narrativa de stabilization é do v0 (
stabilization.pydocstring: "This isthe core signal/noise proxy in Iris"), quando era o único proxy de
durabilidade. Quando
durability.py(blame no HEAD) chegou, o vocabulárionão foi separado. A ausência de testes de i18n é dívida de origem: o módulo
nasceu como dicionário plano e nunca ganhou invariantes.
Plano de migração
(
{ratio}·{delta}{recent}{baseline}·{feat_ratio}{fix_ratio}{refactor_ratio}):finding_stabilization_high→ "…Persistence indicates low rework, not verified correctness." / "…Persistência indica pouco retrabalho, não correção verificada."trend_finding_stabilization_up→ "…Less of the recent code is being reworked." / "…Menos do código recente está sendo retrabalhado."explain_intent_stability_body→ "…which types of changes are revisited soon after landing and which are not." / "…quais tipos de mudanças são revisitadas logo após entrarem e quais não são."docs/METRICS.md§1: "Core quality signal" → "Core rework signal", coma frase: "Persistence means a file was not revisited within the window —
it is not evidence of correctness (unreviewed or defective code persists too)."
docs/ONE-PAGER.md:72→ "Platform teams understanding how AI-assistedchanges hold up after they land" (remove o enquadramento de ranking).
tests/test_i18n_parity.py(4 testes): mesmas chaves em todas aslínguas; mesmos placeholders por chave;
.format()das 4 chaves destabilization com os argumentos que
narrative.pypassa; guarda devocabulário ("durable/durável/duráveis") nas 3 chaves reescritas.
finding_stabilization_lowmantida como está (ataque 3).Critérios de aceite (antes do merge)
(ataque 5). As frases estão no plano acima; a revisão é de tom, não de
correção.
cli.Deadline / gatilho pra pagar
Antes do próximo release da CLI (é texto; entra em qualquer versão), e
antes de qualquer material externo novo que cite "79% vs 64%".
Evidência de validação (isolada:
main+ só esta mudança)tests/test_i18n_parity.pypassa nas duas línguas; ao rodar pela primeiravez sobre
mainnão encontrou nenhuma chave ou placeholder divergentepré-existente — a dívida i18n era de ausência de guarda, não de bug
latente.
LC_ALL=C; 473 da base + 4novos).
repo-alvo, runs em par,
ghdesabilitado, 90 dias):metrics.jsonbyte-idêntico (zero chaves alteradas, adicionadas ou removidas).
report.mdEN: exatamente 2 frases diferem (finding_stabilization_high,explain_intent_stability_body), com e sem--trend. A terceira string(
trend_finding_stabilization_up) só renderiza quando a estabilizaçãomelhora entre janela recente e baseline
(
narrative.py:668-674,717-725) — neste repo a estabilização caiu 7 pp(30 d vs baseline de 90 d), então renderizou
trend_finding_stabilization_down,inalterada e idêntica nos dois relatórios; a string
_upé coberta pelosmoke de
.format()emtest_i18n_parity.py, não pelo E2E. Nenhuma outralinha de narrativa mudou. PT-BR: idem.
README.md:23("AI-assisted code stabilizes at 79% vs 64%") mantida:é afirmação factual sobre a métrica, não inferência de qualidade.
Como reproduzir
Análise adversária (pós-implementação) — toda linha com disposição final
finding_stabilization_lowainda diz "may indicate significant corrective effort".systemic_stabilization_low, que oferece leituras alternativas. A positiva não tinha hedge nenhum; por isso foi o alvo.churn_calculator.pydocstring, relatório) — mudar uma string criaria inconsistência com o resto.README.md.survival_ratevia blame), uso correto. O problema era stabilization pegar a palavra emprestada.i18n.py, um arquivo de 1.780 linhas sem testes, em duas línguas.format().Fora do escopo
README.mdque usam "durável" para a métrica de durabilidade.stabilization_ratioou mudar seu cálculo.Issues relacionadas (verificado contra as 63 issues do repo, abertas e fechadas — sem duplicata)
Nenhuma issue existente trata da redação da narrativa de stabilization nem
de testes de i18n (busca por título e corpo em 2026-09-08). #189
(fechada, aiPct semanal sem tamanho mínimo de amostra) é o precedente mais
próximo em espírito — também corrigia uma leitura enganosa de um número
correto.
Referências
main @ da16235):iris/i18n.py:129-133,325-330,430-434(EN) e:1007-1011,1205-1210,1311-1315(PT-BR);iris/reports/narrative.py:97-108,668-674,717-725;iris/metrics/stabilization.py:1-16.docs/METRICS.md§1 e §8;docs/ONE-PAGER.md:19,37,72;docs/PRINCIPLES.md;CLAUDE.md:54(Rule build(deps): Bump actions/setup-node from 4 to 6 #4).