refactor: gpt 스트림 오류 최소화

This commit is contained in:
donghyeon-ka
2026-09-17 15:34:01 +09:00
parent d7ceca39a0
commit 0a8c8e55a8
11 changed files with 957 additions and 29 deletions
+30
View File
@@ -0,0 +1,30 @@
# Agent Execution Policy
## Coka MCP long-running work
Use the managed-task tools for builds, tests, package installs, Docker builds, integration tests, migrations, benchmarks, and any command that may take more than a few seconds or emit substantial output.
- Prefer `start_managed_task` over `exec_command` for long-running work.
- Give every managed task a stable, descriptive `taskKey` such as `root-ci`, `backend-tests`, or `docker-build-api`.
- Reuse the same `taskKey` when recovering after a ChatGPT/message-stream interruption. Do not start the same command again merely because the response stream was interrupted.
- Before retrying work after an interruption, call `list_managed_tasks` or `read_managed_task` and inspect the existing task state.
- Use `read_managed_task` with long waits rather than repeatedly polling at short intervals.
- Managed-task responses are intentionally compact. Full stdout/stderr is stored in the task log file; inspect only the reported tail/highlights unless deeper diagnostics are required.
- Do not dump full build/test logs into MCP responses. Prefer exit status, important lines, and a bounded tail.
- Group related repository inspection and edits into coherent calls instead of issuing many tiny shell commands.
- Run targeted tests before the full suite. Run the full CI/build once near the end unless a failure requires another run.
- Never re-run an already successful build/test solely to reconstruct conversational context.
## Low-level process tools
Use `exec_command`, `read_process`, `write_stdin`, and `terminate_process` when interactive stdin, exact paged stdout/stderr, or low-level process control is specifically required. They remain the escape hatch, not the default for long-running non-interactive work.
## Recovery order
When a response is interrupted:
1. Inspect `list_managed_tasks`.
2. Reuse the matching task by `taskKey`.
3. If it is still running, wait with `read_managed_task`.
4. If it finished, consume its existing result and log summary.
5. Re-run only when the prior task failed for a reason that requires a retry, or when an explicit fresh run is requested.