Seria type: tech-debt pelos templates, mas esse label não existe no repo (só type: bug, type: feature, type: metric). Vale criar.
Summary
tests/test_agent_settings_hook.py::test_status_reflects_state lê o ~/.iris/agent-usage/spool.jsonl real da máquina em vez do tmp_path, então falha para qualquer pessoa que tenha registros de telemetria pendentes.
Reproduction steps
- Ter pelo menos um registro no spool local (
iris agent status → Spooled records: 1).
git checkout main (reproduzido em 2ab402f, working tree limpa).
pytest tests/test_agent_settings_hook.py -q
E assert 1 == 0
tests/test_agent_settings_hook.py:127: AssertionError
1 failed, 6 passed
Expected behaviour
O teste é hermético: status()["spool"]["records"] reflete o spool isolado em tmp_path, que está vazio.
Actual behaviour
A isolação não pega o spool. O teste faz monkeypatch.setattr(recorder, "SPOOL_FILE", tmp_path/...) depois do import, mas spool_stats() amarra o caminho como default de parâmetro, avaliado em tempo de definição:
# iris/agent/recorder.py:24-25, 158
SPOOL_FILE = os.path.join(SPOOL_DIR, "spool.jsonl") # ~/.iris/agent-usage/spool.jsonl
...
def spool_stats(spool_file: str = SPOOL_FILE) -> dict: # default já resolvido no import
sh.status() → spool_stats() lê o arquivo real. flush.flush_spool(spool_file: str = SPOOL_FILE) tem o mesmo padrão (iris/agent/flush.py:19,77).
Nenhum caminho de produção está errado — iris agent status funciona. O problema é a suíte: o teste é verde só por acidente do ambiente (spool vazio, o que é sempre o caso no runner do CI e quase nunca na máquina de quem usa o iris). Efeito prático: quem roda o /check do repo antes de abrir PR vê vermelho sem relação com a própria mudança.
Como pagar
Menor caminho, só no teste: monkeypatchar onde o valor é lido em vez da constante.
Melhor, e também vale para produção: resolver o default em tempo de chamada — def spool_stats(spool_file: str | None = None) com spool_file = spool_file or SPOOL_FILE no corpo, em spool_stats e flush_spool. Assim monkeypatch.setattr(recorder, "SPOOL_FILE", ...) passa a funcionar como o teste já espera, sem mudar comportamento nenhum de produção.
Surface
Engine / CLI (Python)
Versão do CLI
v1.5.0
Achado ao rodar a suíte antes de abrir #144 / #145. Não incluí a correção em nenhum dos dois para não misturar escopo — abro um PR separado se quiserem.
Summary
tests/test_agent_settings_hook.py::test_status_reflects_statelê o~/.iris/agent-usage/spool.jsonlreal da máquina em vez dotmp_path, então falha para qualquer pessoa que tenha registros de telemetria pendentes.Reproduction steps
iris agent status→Spooled records: 1).git checkout main(reproduzido em2ab402f, working tree limpa).pytest tests/test_agent_settings_hook.py -qExpected behaviour
O teste é hermético:
status()["spool"]["records"]reflete o spool isolado emtmp_path, que está vazio.Actual behaviour
A isolação não pega o spool. O teste faz
monkeypatch.setattr(recorder, "SPOOL_FILE", tmp_path/...)depois do import, masspool_stats()amarra o caminho como default de parâmetro, avaliado em tempo de definição:sh.status()→spool_stats()lê o arquivo real.flush.flush_spool(spool_file: str = SPOOL_FILE)tem o mesmo padrão (iris/agent/flush.py:19,77).Nenhum caminho de produção está errado —
iris agent statusfunciona. O problema é a suíte: o teste é verde só por acidente do ambiente (spool vazio, o que é sempre o caso no runner do CI e quase nunca na máquina de quem usa oiris). Efeito prático: quem roda o/checkdo repo antes de abrir PR vê vermelho sem relação com a própria mudança.Como pagar
Menor caminho, só no teste: monkeypatchar onde o valor é lido em vez da constante.
Melhor, e também vale para produção: resolver o default em tempo de chamada —
def spool_stats(spool_file: str | None = None)comspool_file = spool_file or SPOOL_FILEno corpo, emspool_statseflush_spool. Assimmonkeypatch.setattr(recorder, "SPOOL_FILE", ...)passa a funcionar como o teste já espera, sem mudar comportamento nenhum de produção.Surface
Engine / CLI (Python)
Versão do CLI
v1.5.0
Achado ao rodar a suíte antes de abrir #144 / #145. Não incluí a correção em nenhum dos dois para não misturar escopo — abro um PR separado se quiserem.