fix(reset): EOFError gracioso + doc de operação correta (M4)#115
Merged
Conversation
…ona (M4)
reset_paper_state.py estava "inoperável como documentado" na VPS. A exploração
mostrou que o fix é menor que o descrito: --yes JÁ existe e o docstring JÁ usa
`python -m`. Os tropeços reais eram dois:
1. EOFError: sem --yes e sem TTY (`docker compose exec` sem -it), o input() do prompt
estourava um traceback. Fix: try/except EOFError em main() → aborta limpo
(return 1, sem traceback) com mensagem apontando --yes.
2. Doc de operação: o fluxo documentado era `stop orchestrator → python -m … → start`,
mas (a) rodar `python -m` no HOST não tem o ambiente (é dockerizado) e (b)
`docker compose exec orchestrator` falharia — exec exige container DE PÉ e o
fluxo para o orchestrator. Fix: a linha não-interativa passa a mirar o container
`app` (fica de pé, compartilha o mesmo volume ./data / LEDGER_DIR que o
orchestrator — confirmado no docker-compose.vps.yml), com --yes (sem TTY):
docker compose -f docker-compose.vps.yml stop orchestrator
docker compose -f docker-compose.vps.yml exec app python -m scripts.reset_paper_state --yes
docker compose -f docker-compose.vps.yml start orchestrator
Reforçado também que a invocação é SEMPRE `python -m` (rodar `python
scripts/reset_paper_state.py` daria ModuleNotFoundError: src).
NÃO adicionei bootstrap de sys.path: bateria no gate E402 do ruff (select E4) e
fugiria da convenção `python -m` de todos os scripts do repo.
Testes (tests/test_reset_paper_state.py — antes só cobriam a função pura, não o
main() CLI; LEDGER_DIR isola ledger E app db via get_db_path):
- +test_main_yes_resets_without_prompting (--yes pula o prompt e reseta; input()
não é chamado).
- +test_main_eof_without_yes_aborts_cleanly (EOFError → return 1, sem traceback,
estado intacto).
Validação: pytest completo verde, cobertura 78.12% ≥ 72%; ruff (gate) limpo.
Fecha a faixa de manutenção M1–M4 (M1 #113, M2+M3 #114, M4 este PR).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UZ3vLNTHKekjQVtjFVRi5D
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.
M4 ·
reset_paper_stateoperável — EOFError gracioso + doc de operação corretaÚltimo da faixa de manutenção.
reset_paper_state.pyestava "inoperável como documentado" na VPS. A exploração mostrou que o fix é menor que o descrito:--yesjá existe e o docstring já usapython -m. Os tropeços reais eram dois.1.
EOFErrorSem
--yese sem TTY (docker compose execsem-it), oinput()do prompt estourava um traceback. Fix:try/except EOFErroremmain()→ aborta limpo (return 1, sem traceback) com mensagem apontando--yes.2. Doc de operação (com o nit do PM)
O fluxo era
stop orchestrator → python -m … → start, mas (a)python -mno host não tem o ambiente (é dockerizado) e (b)docker compose exec orchestratorfalharia —execexige container de pé e o fluxo para o orchestrator. Fix: a linha não-interativa passa a mirar o containerapp(fica de pé, compartilha o mesmo volume./data/LEDGER_DIRque o orchestrator — confirmado nodocker-compose.vps.yml), com--yes:Reforçado que a invocação é sempre
python -m(rodarpython scripts/reset_paper_state.pydariaModuleNotFoundError: src).Sem hack de
sys.path: bateria no gate E402 do ruff (select E4) e fugiria da convençãopython -mde todos os scripts do repo.Testes (antes só cobriam a função pura, não o
main()CLI)LEDGER_DIRisola ledger e app db (viaget_db_path):test_main_yes_resets_without_prompting(--yespula o prompt e reseta;input()não é chamado).test_main_eof_without_yes_aborts_cleanly(EOFError →return 1, sem traceback, estado intacto).Validação
Fechamento da faixa M1–M4
Confirmando (sua pergunta): M1 já foi mergeado — PR #113 (Config de Risco:
confirm=true+ salvar em lote com confirmação). Então:Com o M4 verde, a faixa de manutenção pós-validação M1–M4 fecha oficialmente.
🤖 Generated with Claude Code
Generated by Claude Code