Problema observado
No Windows com Python 3.14, os caminhos de worker do simplicio-mapper falham antes de iniciar o processo filho quando o processo pai tem stdin capturado/fechado, como ocorre em pytest e em alguns hosts Codex/PowerShell.
Reprodução passo a passo
- Usar checkout do mapper em Windows.
- Executar:
python -m pytest tests/python/test_cli.py::CliTest::test_background_index_reports_pid_and_log -q
- Observar falha antes de criar o worker:
OSError: [WinError 6] Identificador inválido
- O traceback aponta para
subprocess.Popen -> _get_handles -> _winapi.DuplicateHandle.
- Os mesmos sintomas aparecem em
scan --sync e scan assíncrono, impedindo o teste do worker com timeout.
- O erro não é específico do repositório mapeado: testes que chamam
git init também podem reproduzi-lo sob o mesmo host de teste, mas o mapper agrava o impacto porque seus caminhos de background dependem de Popen.
Impacto
Plano de correção
- Tornar o worker não-interativo, passando stdin explícito
subprocess.DEVNULL.
- Manter stdout/stderr no log estruturado e não herdar handles do host.
- Adicionar teste Windows/pytest para background, sync e async.
- Verificar que timeout/kill ainda recupera lock e escreve receipt terminal.
- Validar pacote instalado além do checkout in-tree.
Critérios de aceite
Problema observado
No Windows com Python 3.14, os caminhos de worker do
simplicio-mapperfalham antes de iniciar o processo filho quando o processo pai tem stdin capturado/fechado, como ocorre em pytest e em alguns hosts Codex/PowerShell.Reprodução passo a passo
OSError: [WinError 6] Identificador inválidosubprocess.Popen -> _get_handles -> _winapi.DuplicateHandle.scan --syncescanassíncrono, impedindo o teste do worker com timeout.git inittambém podem reproduzi-lo sob o mesmo host de teste, mas o mapper agrava o impacto porque seus caminhos de background dependem dePopen.Impacto
Plano de correção
subprocess.DEVNULL.Critérios de aceite
index --background --jsoninicia em Windows com stdin fechado/capturado.scan --sync --jsoninicia o worker e retorna envelope completo ou timeout estruturado.scan --jsonassíncrono inicia e reaping não deixa handles inválidos.