@@ -2106,6 +2106,46 @@ describe("runEmbeddedAttempt context engine sessionKey forwarding", () => {
21062106 expect ( hoisted . preemptiveCompactionCalls ) . toHaveLength ( 0 ) ;
21072107 } ) ;
21082108
2109+ it ( "keeps the generic precheck active when owning context engine assembly fails" , async ( ) => {
2110+ const lockEvents = trackSessionWriteLocks ( ) ;
2111+ let sawPrompt = false ;
2112+ const hugeHistory = "large raw history " . repeat ( 2_000 ) ;
2113+
2114+ const result = await createContextEngineAttemptRunner ( {
2115+ contextEngine : createTestContextEngine ( {
2116+ info : {
2117+ id : "test-context-engine" ,
2118+ name : "Test Context Engine" ,
2119+ version : "0.0.1" ,
2120+ ownsCompaction : true ,
2121+ } ,
2122+ assemble : async ( ) => {
2123+ throw new Error ( "assembly failed" ) ;
2124+ } ,
2125+ } ) ,
2126+ sessionKey,
2127+ tempPaths,
2128+ sessionMessages : [ { role : "user" , content : hugeHistory , timestamp : 1 } ] as AgentMessage [ ] ,
2129+ attemptOverrides : {
2130+ contextTokenBudget : 500 ,
2131+ } ,
2132+ sessionPrompt : async ( session ) => {
2133+ sawPrompt = true ;
2134+ session . messages = [
2135+ ...session . messages ,
2136+ { role : "assistant" , content : "done" , timestamp : 2 } ,
2137+ ] ;
2138+ } ,
2139+ } ) ;
2140+
2141+ expect ( sawPrompt ) . toBe ( false ) ;
2142+ expect ( result . promptErrorSource ) . toBe ( "precheck" ) ;
2143+ expect ( result . preflightRecovery ?. route ) . toBe ( "compact_only" ) ;
2144+ expect ( hoisted . preemptiveCompactionCalls ) . toHaveLength ( 1 ) ;
2145+ expect ( hoisted . preemptiveCompactionCalls . at ( - 1 ) ) . not . toHaveProperty ( "unwindowedMessages" ) ;
2146+ expectInitialLockReleasedBeforePostTurnWrite ( lockEvents ) ;
2147+ } ) ;
2148+
21092149 it ( "repairs tool-result pairing after context engine assembly" , async ( ) => {
21102150 let promptMessages : AgentMessage [ ] = [ ] ;
21112151
0 commit comments