fix(team): treat stale observe refresh marker as recoverable
This commit is contained in:
parent
8df2a8797b
commit
9924e447c8
6 changed files with 34 additions and 5 deletions
|
|
@ -976,6 +976,7 @@ function isOpenCodeSessionRefreshScheduledReason(message: string | null | undefi
|
||||||
normalized === 'opencode_prompt_delivery_session_refresh_scheduled' ||
|
normalized === 'opencode_prompt_delivery_session_refresh_scheduled' ||
|
||||||
normalized === 'opencode session refresh scheduled after resolved behavior changed' ||
|
normalized === 'opencode session refresh scheduled after resolved behavior changed' ||
|
||||||
normalized === 'opencode_session_refresh_scheduled_after_resolved_behavior_changed' ||
|
normalized === 'opencode_session_refresh_scheduled_after_resolved_behavior_changed' ||
|
||||||
|
normalized === 'opencode_session_stale_observe_scheduled_after_accepted_prompt' ||
|
||||||
normalized === 'opencode session changed; refreshing the session before retry'
|
normalized === 'opencode session changed; refreshing the session before retry'
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -61,6 +61,7 @@ function isOpenCodeRuntimeDeliverySessionRefreshScheduledDiagnostic(message: str
|
||||||
normalized === 'opencode_prompt_delivery_session_refresh_scheduled' ||
|
normalized === 'opencode_prompt_delivery_session_refresh_scheduled' ||
|
||||||
normalized === 'opencode session refresh scheduled after resolved behavior changed' ||
|
normalized === 'opencode session refresh scheduled after resolved behavior changed' ||
|
||||||
normalized === 'opencode_session_refresh_scheduled_after_resolved_behavior_changed' ||
|
normalized === 'opencode_session_refresh_scheduled_after_resolved_behavior_changed' ||
|
||||||
|
normalized === 'opencode_session_stale_observe_scheduled_after_accepted_prompt' ||
|
||||||
normalized === 'opencode session changed; refreshing the session before retry'
|
normalized === 'opencode session changed; refreshing the session before retry'
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -49,7 +49,8 @@ function isCleanOpenCodeSessionRefreshDiagnostic(message: string): boolean {
|
||||||
refreshMarkerText === 'opencode session changed; refreshing the session before retry' ||
|
refreshMarkerText === 'opencode session changed; refreshing the session before retry' ||
|
||||||
refreshMarkerText === 'opencode session refresh scheduled after resolved behavior changed' ||
|
refreshMarkerText === 'opencode session refresh scheduled after resolved behavior changed' ||
|
||||||
refreshMarkerText === 'opencode_prompt_delivery_session_refresh_scheduled' ||
|
refreshMarkerText === 'opencode_prompt_delivery_session_refresh_scheduled' ||
|
||||||
refreshMarkerText === 'opencode_session_refresh_scheduled_after_resolved_behavior_changed'
|
refreshMarkerText === 'opencode_session_refresh_scheduled_after_resolved_behavior_changed' ||
|
||||||
|
refreshMarkerText === 'opencode_session_stale_observe_scheduled_after_accepted_prompt'
|
||||||
) {
|
) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -163,6 +163,25 @@ describe('OpenCodeRuntimeDeliveryDiagnostics', () => {
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('treats stale observe scheduled diagnostics after an accepted prompt as session refresh', () => {
|
||||||
|
const record = {
|
||||||
|
diagnostics: [
|
||||||
|
'OpenCode API error',
|
||||||
|
'OpenCode API error. opencode_session_stale_observe_scheduled_after_accepted_prompt',
|
||||||
|
],
|
||||||
|
lastReason: 'OpenCode API error',
|
||||||
|
responseState: 'not_observed',
|
||||||
|
status: 'retry_scheduled',
|
||||||
|
} as Parameters<typeof selectOpenCodeRuntimeDeliveryReason>[0];
|
||||||
|
|
||||||
|
expect(selectOpenCodeRuntimeDeliveryReason(record)).toBe(
|
||||||
|
'OpenCode session changed; refreshing the session before retry.'
|
||||||
|
);
|
||||||
|
expect(
|
||||||
|
isActionRequiredOpenCodeRuntimeDeliveryReason(selectOpenCodeRuntimeDeliveryReason(record))
|
||||||
|
).toBe(false);
|
||||||
|
});
|
||||||
|
|
||||||
it('treats colon-terminated generic OpenCode API errors plus clean refresh evidence as session refresh', () => {
|
it('treats colon-terminated generic OpenCode API errors plus clean refresh evidence as session refresh', () => {
|
||||||
const record = {
|
const record = {
|
||||||
diagnostics: ['OpenCode API error:', 'resolved_behavior_changed:old->new'],
|
diagnostics: ['OpenCode API error:', 'resolved_behavior_changed:old->new'],
|
||||||
|
|
|
||||||
|
|
@ -228,6 +228,16 @@ describe('RuntimeDiagnosticClassifier', () => {
|
||||||
generic: true,
|
generic: true,
|
||||||
actionRequired: false,
|
actionRequired: false,
|
||||||
});
|
});
|
||||||
|
expect(
|
||||||
|
classifyRuntimeDiagnostic(
|
||||||
|
'OpenCode API error. opencode_session_stale_observe_scheduled_after_accepted_prompt'
|
||||||
|
)
|
||||||
|
).toMatchObject({
|
||||||
|
reasonCode: 'backend_error',
|
||||||
|
normalizedMessage: 'OpenCode session changed; refreshing the session before retry.',
|
||||||
|
generic: true,
|
||||||
|
actionRequired: false,
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
it('does not classify refresh markers with unknown extra text as clean refresh', () => {
|
it('does not classify refresh markers with unknown extra text as clean refresh', () => {
|
||||||
|
|
|
||||||
|
|
@ -129,7 +129,6 @@ function buildOpenCodeDeliveryRecord(
|
||||||
lastReason: 'OpenCode bridge command timed out',
|
lastReason: 'OpenCode bridge command timed out',
|
||||||
diagnostics: [
|
diagnostics: [
|
||||||
'OpenCode prompt_async accepted; response observation will continue through durable app-side ledger reconciliation.',
|
'OpenCode prompt_async accepted; response observation will continue through durable app-side ledger reconciliation.',
|
||||||
'project_behavior_changed',
|
|
||||||
'opencode_session_stale_observe_scheduled_after_accepted_prompt',
|
'opencode_session_stale_observe_scheduled_after_accepted_prompt',
|
||||||
'OpenCode bridge command timed out',
|
'OpenCode bridge command timed out',
|
||||||
],
|
],
|
||||||
|
|
@ -762,9 +761,7 @@ describe('TeamMemberRuntimeAdvisoryService', () => {
|
||||||
kind: 'api_error',
|
kind: 'api_error',
|
||||||
reasonCode: 'backend_error',
|
reasonCode: 'backend_error',
|
||||||
});
|
});
|
||||||
expect(advisory?.message).toContain(
|
expect(advisory?.message).toBe('OpenCode runtime delivery did not complete.');
|
||||||
'opencode_session_stale_observe_scheduled_after_accepted_prompt'
|
|
||||||
);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
it('keeps stale OpenCode advisories visible after unrelated later delivery success', async () => {
|
it('keeps stale OpenCode advisories visible after unrelated later delivery success', async () => {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue