@@ -3092,6 +3092,9 @@ function claudeSubagentModelSelection(
30923092
30933093const PENDING_CLAUDE_SUBAGENT_CAP = 64 ;
30943094const PENDING_CLAUDE_SUBAGENT_FRAME_CAP = 256 ;
3095+ // Workflow progress frames arrive about every 12 seconds; a running member's
3096+ // transcript is re-read at most this often to show its answer so far.
3097+ const WORKFLOW_MEMBER_LIVE_TRANSCRIPT_READ_INTERVAL_MS = 10_000 ;
30953098
30963099function rememberPendingClaudeSubagentLaunch (
30973100 pending : Map < string , PendingClaudeSubagentLaunch > ,
@@ -3422,6 +3425,7 @@ export const makeClaudeAdapterV2 = Effect.fn("makeClaudeAdapterV2")(function* (
34223425 readonly attempt : number ;
34233426 readonly transcriptAnswerDigest : string | undefined ;
34243427 readonly transcriptReadAttempts : number ;
3428+ readonly liveTranscriptReadAt : DateTime . Utc | null ;
34253429 readonly finalTranscriptRead : boolean ;
34263430 readonly result : string | undefined ;
34273431 readonly label : string ;
@@ -4525,7 +4529,19 @@ export const makeClaudeAdapterV2 = Effect.fn("makeClaudeAdapterV2")(function* (
45254529 ( input . coordinator . task . status === "running"
45264530 ? ( restarted ? 0 : ( previous ?. transcriptReadAttempts ?? 0 ) ) < 3
45274531 : restarted || previous ?. finalTranscriptRead !== true ) ;
4528- if ( ! changed && ! readTranscript ) continue ;
4532+ // A running member streams nothing, so its transcript is the only
4533+ // way to show its answer so far. A restart shows "Retry in
4534+ // progress." and starts a fresh throttle window before the next read.
4535+ const liveTranscriptReadAt = previous ?. liveTranscriptReadAt ?? null ;
4536+ const readLiveTranscript =
4537+ status === "running" &&
4538+ ! restarted &&
4539+ transcriptDir !== undefined &&
4540+ agentId !== undefined &&
4541+ ( liveTranscriptReadAt === null ||
4542+ DateTime . toEpochMillis ( now ) - DateTime . toEpochMillis ( liveTranscriptReadAt ) >=
4543+ WORKFLOW_MEMBER_LIVE_TRANSCRIPT_READ_INTERVAL_MS ) ;
4544+ if ( ! changed && ! readTranscript && ! readLiveTranscript ) continue ;
45294545
45304546 const nodeId = idAllocator . derive . nodeFromProviderItem ( {
45314547 driver : CLAUDE_PROVIDER ,
@@ -4651,21 +4667,22 @@ export const makeClaudeAdapterV2 = Effect.fn("makeClaudeAdapterV2")(function* (
46514667
46524668 let transcriptAnswerDigest = restarted ? undefined : previous ?. transcriptAnswerDigest ;
46534669 let transcript : ReadonlyArray < string > = [ ] ;
4654- if ( settled ) {
4655- transcript = readTranscript
4656- ? yield * readWorkflowAgentAnswers ( {
4657- transcriptDir,
4658- agentId,
4659- ...( adapterOptions . environment . CLAUDE_CONFIG_DIR === undefined
4660- ? { }
4661- : {
4662- configDir : path . resolve (
4663- session . cwd ,
4664- adapterOptions . environment . CLAUDE_CONFIG_DIR ,
4665- ) ,
4666- } ) ,
4667- } ) . pipe ( Effect . orElseSucceed ( ( ) : ReadonlyArray < string > => [ ] ) )
4668- : [ ] ;
4670+ if ( settled || readLiveTranscript ) {
4671+ transcript =
4672+ readTranscript || readLiveTranscript
4673+ ? yield * readWorkflowAgentAnswers ( {
4674+ transcriptDir,
4675+ agentId,
4676+ ...( adapterOptions . environment . CLAUDE_CONFIG_DIR === undefined
4677+ ? { }
4678+ : {
4679+ configDir : path . resolve (
4680+ session . cwd ,
4681+ adapterOptions . environment . CLAUDE_CONFIG_DIR ,
4682+ ) ,
4683+ } ) ,
4684+ } ) . pipe ( Effect . orElseSucceed ( ( ) : ReadonlyArray < string > => [ ] ) )
4685+ : [ ] ;
46694686 const transcriptAnswer = transcript . length > 0 ? transcript . join ( "\n\n" ) : undefined ;
46704687 const answerDigest =
46714688 transcriptAnswer === undefined
@@ -4677,11 +4694,13 @@ export const makeClaudeAdapterV2 = Effect.fn("makeClaudeAdapterV2")(function* (
46774694 if ( answerDigest !== undefined ) transcriptAnswerDigest = answerDigest ;
46784695 const answer =
46794696 transcriptAnswer ??
4680- ( member . result !== undefined && changed && previousDigest === undefined
4681- ? `Partial answer from workflow progress:\n\n${ member . result } `
4682- : attempt > 1 && changed && previousDigest === undefined
4683- ? "No answer from this workflow attempt."
4684- : undefined ) ;
4697+ ( ! settled
4698+ ? undefined
4699+ : member . result !== undefined && changed && previousDigest === undefined
4700+ ? `Partial answer from workflow progress:\n\n${ member . result } `
4701+ : attempt > 1 && changed && previousDigest === undefined
4702+ ? "No answer from this workflow attempt."
4703+ : undefined ) ;
46854704 if (
46864705 answer !== undefined &&
46874706 ( transcriptAnswer === undefined || restarted || answerDigest !== previousDigest )
@@ -4710,6 +4729,7 @@ export const makeClaudeAdapterV2 = Effect.fn("makeClaudeAdapterV2")(function* (
47104729 transcriptReadAttempts :
47114730 ( restarted ? 0 : ( previous ?. transcriptReadAttempts ?? 0 ) ) +
47124731 ( readTranscript ? 1 : 0 ) ,
4732+ liveTranscriptReadAt : readLiveTranscript || restarted ? now : liveTranscriptReadAt ,
47134733 finalTranscriptRead :
47144734 ( ! restarted && previous ?. finalTranscriptRead === true ) ||
47154735 ( readTranscript &&
0 commit comments