S00-012: Record blocked task and remediation handoff

Changes: Preserve incomplete work and blocker metadata for S00-012. This checkpoint does not mark implementation accepted.
Validation: Session ended with status blocked.
Blocker: Required automation suite fails in existing all-prompts budget test: S21-006 exceeds even a diagnostic 90000-character prompt limit. This blocks verification of the stdin remediation; production limit remains 80000.

Task: S00-012
Agent: manual-ci-cd-stdin-20261015b
Role: ci-cd
Action: escalate
Status: blocked

Task title: Fix runner prompt delivery after partial stdin timeout
This commit is contained in:
wt committed 2026-10-15 01:37:36 +07:00
1 parent 59b9ff62fe
commit c28412ae8f
20 files changed
+491 -25

No files matched your search

+9 -9
View File
@@ -206,21 +206,21 @@ The coordinator commits each transition before launching another agent.
failure = None
stopped_after_transition = False
returncode = None
with (session / 'output.log').open('wb') as output:
# Give the child a complete UTF-8 stream ending at EOF. Feeding a pipe
# through short communicate() retries can strand a partially sent prompt
# when the child is slow to start reading. The prompt is already persisted.
with prompt_path.open('rb') as prompt_input, (session / 'output.log').open('wb') as output:
try:
process = subprocess.Popen(argv, cwd=self.root, env=env, stdin=subprocess.PIPE,
process = subprocess.Popen(argv, cwd=self.root, env=env, stdin=prompt_input,
stdout=output, stderr=subprocess.STDOUT, start_new_session=(os.name == 'posix'))
deadline = time.monotonic() + self.timeout
first_communicate = True
stopped_after_transition = False
try:
while True:
try:
process.communicate(prompt.encode('utf-8') if first_communicate else None,
timeout=min(.2, max(.01, deadline - time.monotonic())))
process.wait(timeout=min(.2, max(.01, deadline - time.monotonic())))
break
except subprocess.TimeoutExpired:
first_communicate = False
try:
live = self.tracker.state()
current = live['tasks'][item['id']]
@@ -231,17 +231,17 @@ The coordinator commits each transition before launching another agent.
blocker_exit = executor_exit = reviewer_exit = False
if blocker_exit or executor_exit or reviewer_exit:
stop_process_tree(process)
process.communicate()
process.wait()
stopped_after_transition = True
break
if time.monotonic() >= deadline:
stop_process_tree(process)
process.communicate()
process.wait()
failure = 'Agent timed out; process terminated before escalation'
break
except BaseException:
stop_process_tree(process)
process.communicate()
process.wait()
raise
finally:
# Even an exited harness must not leave source-writing descendants alive.