Skip to content

Auditoria da épica #624: correções da revisão, search-text sem Python, paridade no gate e imagem pelos nossos encoders kitty, iTerm2 e sixel - #628

Merged
brennercruvinel merged 14 commits into
patternsfrom
audit-624
Oct 17, 2026
Merged

brennercruvinel merged 14 commits into
patternsfrom
audit-624

Conversation

@brennercruvinel

@brennercruvinel brennercruvinel commented Oct 16, 2026 •

Copy link
Copy Markdown
Member

Parte de #606, dentro de #603 e da épica #624. Toca também #608: sem a ratatui-image, o cargo deny check segue verde sem mudança no deny.toml.

Resumo

Auditoria do PR #627 e da épica #624: os achados da revisão de código corrigidos com teste, a pendência da #205 (search-text ainda abria Python) fechada, a paridade do tokenizer e do decoder AV1 dentro do gate de release, e a imagem da aba ask desenhada pelos nossos encoders Kitty, iTerm2 e Sixel, com o terminal perguntado por uma consulta nossa, como a #606 pede, e um codec de glifos próprio onde o terminal não desenha pixels.

Nove commits. A base é a patterns (#627); ao mergear o #627 este PR passa a apontar para a main.

Itens

1. Sintaxe Scryfall: termos que eram lidos errado

rust/engine/src/scalars/query.rs, rust/engine/src/scalars/filter.rs

  • kw:haste era quebrado em letras (h, a, s...); agora um termo de lista fica inteiro.
  • r!=common dava erro de operador; != em enum compara, só >, >=, <, <= são intervalo.
  • -o:flying e -palavra perdiam o sinal de negação em silêncio; agora são recusados com erro claro. -1/-1 continua texto.
  • c:rg num dicionário de letras únicas (cores) exige cada letra; uma letra que o dicionário não tem não casa nada.
  • Testes novos para cada caso.

2. Coluna enum sem valor em nenhuma linha

rust/format/src/sections/scalars/{mod.rs,decode.rs,from_json.rs}

  • Uma coluna enum vazia (dicionário com zero entradas) falhava no encode, porque a conferência de códigos não sabia quais linhas estavam ausentes.
  • check_codes recebe a validade: linha presente exige código dentro do dicionário, linha ausente exige código 0. O decoder passa a mesma validade.
  • Teste de ida e volta com [{"loyalty":null},{}].

3. Rótulo repetido no type-ahead

rust/engine/src/labels/mod.rs

  • exact() só conferia duplicata nos últimos 64 hits; um rótulo com duas palavras que começam com a consulta podia aparecer duas vezes quando o índice de palavras as separava.
  • Agora um registro por rótulo, ficando a palavra de menor posição. Teste que falha no código anterior.

4. urna scalars --out apontando para o próprio corpus

rust/clitui/src/cmd/scalars.rs

  • A guarda só comparava o caminho textual; um symlink ou hard link para o mesmo arquivo passava e truncava o corpus que o mmap ainda lia.
  • same_file() compara dev+ino no unix, caminho canônico nos demais.

5. #205: search-text sem Python

rust/clitui/src/cmd/{embed_gate.rs,search_text.rs}, rust/clitui/src/cli.rs, rust/clitui/tests/embedder_resolution.rs

  • search-text sempre chamava searchtxt.py, mesmo em corpus potion.
  • Agora passa pelo mesmo embed_and_route de ask e retrieve: potion em processo, qualquer outro modelo pelo embedder de consulta. Mantém --skip-model-hash-check para corpus legado.
  • Conferido com URNA_PYTHON apontando para um caminho inexistente: a busca responde.

6. Gate de release

rust/clitui/src/cmd/potion.rs, tool/tasks/fullcheck.sh, rust/images/parity/Cargo.lock, rust/clitui/src/tui/app/headless.rs

  • Passo novo parity: roda os workspaces rust/neural/parity e rust/images/parity contra o corpus de cartas apontado por URNA_CARDS_CORPUS; sem a variável o passo é reportado como pulado, não como passado.
  • O teste de paridade do potion falha, em vez de pular em silêncio, quando URNA_REQUIRE_PARITY=1 (o fullcheck seta).
  • O Cargo.lock de rust/images/parity estava preso à versão 0.1.0 das crates; atualizado.
  • urna tui --eval sai com código 2 quando nenhum chunk carrega rótulo e rank, em vez de dividir por zero; --snapshot/--eval exigem coluna de rótulo no schema.

7. Imagem da aba ask (#606)

rust/clitui/src/tui/graphics/{mod.rs,probe.rs,glyphs.rs,kitty.rs,iterm.rs,sixel.rs,png.rs,base64.rs}, rust/clitui/src/tui/app/{blocks.rs,media.rs,mod.rs,draw.rs,headless.rs}, rust/clitui/Cargo.toml, Cargo.lock

  • A detecção anterior só lia variáveis de ambiente; dentro de tmux, em terminais não listados e em qualquer terminal Sixel caía em quadrantes.
  • Agora o terminal é perguntado uma vez, numa escrita só: a consulta de imagem do Kitty, XTVERSION (nome), CSI 16 t (célula) e DA1 por último (Sixel; toda resposta termina nele). A leitura é com poll e prazo de 1 s, na própria thread: terminal que não responde custa o prazo e não deixa leitor no stdin.
  • Os encoders Kitty, iTerm2, Sixel, PNG e base64 são os nossos; a ratatui-image (45 crates) e a image saem do lock. libc, já na árvore, entra direto para o poll.
  • Dentro do tmux, só o Sixel que o próprio tmux desenha; Kitty ou iTerm2 por passthrough cairiam no cursor do terminal de fora, não no pane.
  • As células que a imagem deixa são redesenhadas (AlwaysUpdate) e as que ela cobre ficam de fora da diff (Skip); toast, painel de instalação ou seletor por cima escondem a imagem naquele frame; resize reenvia.
  • Sem protocolo, entra o codec de glifos (Oklab, 8x24 subpixels), com URNA_GLYPHS para sextantes e octantes.
  • A primeira tela limpa com CSI 2J direto, não com Terminal::clear, que consulta a posição do cursor e trava em terminal que não responde.

8. Correções da revisão do PR

rust/engine/src/scalars/{query.rs,filter.rs}, rust/engine/src/labels/mod.rs, tool/tasks/fullcheck.sh, rust/clitui/src/cmd/{embed_gate.rs,payload.rs}, rust/clitui/src/tui/app/media.rs

  • c:"" casava todas as linhas; valor vazio agora é erro, e o filtro também se protege.
  • fullcheck.sh resolve URNA_CORPUS e URNA_CARDS_CORPUS relativos antes do cd; antes, a paridade abria o caminho a partir do diretório de cada crate.
  • Painel de imagem com largura ou altura 0 estourava em fit.
  • search-text --skip-model-hash-check escreve no stderr qual embedder rodou.
  • exact() deduplica ordenando por (id, posição) em vez de HashMap por tecla.

O que ficou de fora

  • Em terminal sem protocolo de imagem (Terminal.app, Zed, Alacritty, VS Code no padrão) a carta sai em glifos; pixel dentro do painel só existe por protocolo. Uma janela nativa por cima do terminal foi prototipada e descartada; não há nada dela neste PR.
  • UI e responsividade da aba ask: problemas levantados (barras entre hits, nomes cortados, ficha sem hierarquia, facetas cortadas), nenhum corrigido aqui.
  • cleanhost não rodou localmente por ambiente (VM de 24 GB e montagem do container); fica para o CI.
  • Alterações de working tree que não são deste trabalho ficaram de fora: a remoção de data/gitignore/*, o .gitignore, rustfmt.toml e nixosship.yml.

Validação

  • cargo fmt --all --check, cargo clippy (workspace e -p urna --no-default-features): limpos.
  • cargo test --workspace: 639 passaram, 0 falharam.
  • cargo deny check: advisories, bans, licenses e sources ok.
  • tool/tasks/fullcheck.sh: exit 0, com URNA_CARDS_CORPUS relativo apontando para o mtg-urna-benchmark e o gate de regressão no corpus fixado; cleanhost pulado (URNA_CLEANHOST=0, VM de 24 GB), fica com o CI.
  • Paridade AV1 e tokenizer no corpus de cartas: idênticos.
  • CI: o doctor_through_a_pipe_has_no_escapes_and_names_setup falhava também na patterns, porque o checkout traz a tabela do potion como ponteiro do lfs; o gatecheck agora roda tool/tasks/getpotion.sh (Hugging Face na revisão fixada, conferido contra o oid do ponteiro) antes dos testes.
  • Binário real num pty respondendo como kitty, foot, iTerm2, Terminal.app e um terminal mudo: escolhe kitty, sixel, iterm2, blocos e blocos, cada um emitindo os bytes do seu protocolo; no mudo, Ctrl+C encerra em 0,5 s.

Primeiro ponto visível

[POCS] urna tui <corpus>, aba ask, buscar uma carta: a linha de status mostra image N ms (kitty|iterm2|sixel|blocks), que é o que o terminal aceitou, e a carta aparece no painel por esse caminho.

…tead of ranging, and a negated word or `-o:` is refused instead of losing its sign; `c:rg` on a dictionary of single letters holds every letter
…ows carry code 0 against an empty dictionary, and the check knows which rows are absent
…ink or a hard link too, not only the same path
… potion corpus in process, any other model through its query embedder, no python on the potion path
…s and fails the potion parity instead of skipping it; the headless eval exits 2 when no chunk carries both a label and a rank
…minal its protocol and cell size; a terminal with none gets block glyphs chosen per cell in Oklab from the set its font carries
@brennercruvinel brennercruvinel added clitui The urna binary: cli verbs, urna setup and urna tui engine rust/format, rust/engine and the inference runtime labels Oct 16, 2026
…ase gate resolves a relative corpus before it changes directory, search-text names the embedder when the model_hash check is skipped, and the type-ahead keeps one hit per label by sorting instead of hashing
…ders again, without ratatui-image: the terminal is asked once (kitty query, XTVERSION, cell size, DA1) and read with poll and a deadline, no thread left on stdin; inside tmux only the sixel tmux draws itself; the cells an image leaves are drawn again
…ed (unix) and in the tests, and gatecheck fetches the potion table, checked against its lfs pointer, before the tests that need it
…itted demo/starter/docs.jsonl instead of reading a local build the checkout does not have
…e prefix is an empty value instead of text, an empty contains is an error outside the parser too, the model_hash notice prints only when the check was really skipped, a late terminal reply is not typed, the image a new corpus or a resize leaves is deleted, and a flat cell draws blank with the sRGB table
…tion in process, presetqry.py for any other model
@brennercruvinel brennercruvinel changed the title Auditoria da épica #624: correções da revisão, search-text sem Python, paridade no gate e imagem pela ratatui-image Auditoria da épica #624: correções da revisão, search-text sem Python, paridade no gate e imagem pelos nossos encoders kitty, iTerm2 e sixel Oct 17, 2026
@brennercruvinel
brennercruvinel merged commit b977846 into patterns Oct 17, 2026
49 checks passed
@brennercruvinel
brennercruvinel deleted the audit-624 branch October 17, 2026 20:18
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

clitui The urna binary: cli verbs, urna setup and urna tui engine rust/format, rust/engine and the inference runtime

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant