=== modified file 'rules/annotations/frame_scoping.rules'
--- old/rules/annotations/frame_scoping.rules	2025-10-15 08:46:41 +0000
+++ new/rules/annotations/frame_scoping.rules	2026-01-16 10:11:59 +0000
@@ -5,7 +5,7 @@
 ** Module   : frame_scoping.rules
 ** Abstract : frame scoping and frame type tracking.
 **
-** Copyright (c) 2005-2025, Golden Code Development Corporation.
+** Copyright (c) 2005-2026, Golden Code Development Corporation.
 **
 ** _#_ _I_ __Date__ __JPRM__ ___________________________________Description___________________________________
 ** 001 SIY 20051014   @23090 Created.
@@ -486,6 +486,7 @@
 ** 211 SP  20250922          Fixed widget search for EXTENT field items.
 ** 212 DDF 20251015          Made fnameused into a CaseInsensitiveHasMap because the frame names could
 **                           collide in a case-insensitive file-system (Windows).
+** 213 SP  20260115          Fixed search for EXTENT fields by resolving extent index when it is a literal.
 */
 -->
 
@@ -713,6 +714,33 @@
          </rule>
       </function>
 
+      <!-- Resolve extent name when the index is a literal. In case of dynamic extent index
+           (the array offset is an expression that can be evaluated dynamically only at runtime)
+           we assume the whole extent item is part of same frame. 
+           In this case Progress will stop with error 71. -->
+      <function name="resolve_literal_extent_wname">
+         <parameter name="name" type="java.lang.String" />
+         <parameter name="node" type="com.goldencode.ast.Aast" />
+         <return    name="res"  type="java.lang.String" />
+
+         <variable name="ref" type="com.goldencode.ast.Aast" />
+
+         <rule>true
+            <action>res = null</action>
+            <action>ref = node.getFirstChild()</action>
+            <rule>ref != null and ref.type == prog.lbracket
+               <action>ref = ref.getFirstChild()</action>
+               <rule>ref.type == prog.expression
+                  <action>ref = ref.getFirstChild()</action>
+               </rule>
+               <!-- should be a constant numeric literal -->
+               <rule>ref != null and ref.isAnnotation("is-literal")
+                  <action>res = execLib("get_extent_wname", name, ref.text)</action>
+               </rule>
+            </rule>
+         </rule>
+      </function>
+
       <!-- add frame to current scope -->
       <function name="add_frame">
          <parameter name="name"  type="java.lang.String" />
@@ -4136,6 +4164,7 @@
          <variable name="is_f"  init="false" />
          <variable name="txt1"  type="java.lang.String" />
          <variable name="txt2"  type="java.lang.String" />
+         <variable name="ename" type="java.lang.String" />
          <return   name="res"   type="com.goldencode.ast.Aast" />
          
          <rule>true
@@ -4148,6 +4177,12 @@
                <rule>txt1 == null
                   <action>txt1 = node.text</action>
                </rule>
+
+               <!-- resolve only if index is a literal; helper returns null for dynamic -->
+               <action>ename = execLib("resolve_literal_extent_wname", txt1, node)</action>
+               <rule>ename != null
+                  <action>txt1 = ename</action>
+               </rule>
                <action>txt1 = txt1.toLowerCase()</action>
             </rule>
             
@@ -4183,6 +4218,12 @@
                      <rule>txt2 == null
                         <action>txt2 = ref.text</action>
                      </rule>
+
+                     <!-- resolve only if index is a literal; helper returns null for dynamic -->
+                     <action>ename = execLib("resolve_literal_extent_wname", txt2, ref)</action>
+                     <rule>ename != null
+                        <action>txt2 = ename</action>
+                     </rule>
                      <action>txt2 = txt2.toLowerCase()</action>
                      
                      <rule>node.getChildAt(0) != null and 
@@ -4224,10 +4265,10 @@
          <variable  name="nm"    type="java.lang.String" />
          <variable  name="fn"    type="java.lang.String" />
          <variable  name="reffn" type="java.lang.String" />
-         <variable  name="dyn"   type="java.lang.Boolean"/> <!-- dynamic extent index -->
          <variable  name="txt1"  type="java.lang.String" />
          <variable  name="txt2"  type="java.lang.String" />
          <variable  name="checked_override" type="java.lang.Boolean" init="false" />
+         <variable name="ename" type="java.lang.String" />
          <return    name="res"   type="java.util.Map" />
          
          <rule>true
@@ -4237,7 +4278,6 @@
                             evalLib("literals", node.type))</action>
             <action>is_f = evalLib("fieldtype", node.type)</action>
             <action>is_w = evalLib("widgettype", node.type)</action>
-            <action>dyn = false</action>
             
             <rule>is_w and node.descendant(1, prog.kw_in)
                <action>ref = node.getFirstChild()</action>
@@ -4254,20 +4294,10 @@
                <action on="false">txt1 = node.text</action>
             </rule>
             
-            <action>ref2 = node.getFirstChild()</action>
-            <rule>ref2 != null and ref2.type == prog.lbracket
-               <!-- this is an item of an EXTENT field -->
-               <action>ref2 = ref2.getFirstChild()</action>
-               <rule>ref2.type == prog.expression
-                  <action>ref2 = ref2.getFirstChild()</action>
-               </rule>
-               <rule>ref2 != null <!-- should be a constant numeric literal -->
-                  <rule>ref2.isAnnotation("is-literal")
-                     <action>txt1 = execLib("get_extent_wname", txt1, ref2.text)</action>
-                     
-                     <action on="false">dyn = true</action> <!-- dynamic extent index -->
-                  </rule>
-               </rule>
+            <!-- resolve only if index is a literal; helper returns null for dynamic -->
+            <action>ename = execLib("resolve_literal_extent_wname", txt1, node)</action>
+            <rule>ename != null
+               <action>txt1 = ename</action>
             </rule>
             <action>txt1 = txt1.toLowerCase()</action>
             
@@ -4312,28 +4342,13 @@
                         <action on="false">txt2 = ref.text</action>
                      </rule>
 
-                     <rule>!dyn
-                        <!-- in case of dynamic extent index (the array offset is an expression
-                             that can be evaluated dynamically only at runtime) we assume the 
-                             whole extent item is part of same frame. 
-                             In this case Progress will stop with error 71. -->
-                        
-                        <action>ref2 = ref.getFirstChild()</action>
-                        <rule>ref2 != null and ref2.type == prog.lbracket
-                           <!-- this is an item of an EXTENT field -->
-                           <action>ref2 = ref2.getFirstChild()</action>
-                           <rule>ref2.type == prog.expression
-                              <action>ref2 = ref2.getFirstChild()</action>
-                           </rule>
-                           <rule>ref2 != null <!-- should be a constant numeric literal -->
-                              <rule>ref2.isAnnotation("is-literal")
-                                 <action>txt2 = execLib("get_extent_wname", txt2, ref2.text)</action>
-                              </rule>
-                           </rule>
-                        </rule>
+                     <!-- resolve only if index is a literal; helper returns null for dynamic -->
+                     <action>ename = execLib("resolve_literal_extent_wname", txt2, ref)</action>
+                     <rule>ename != null
+                        <action>txt2 = ename</action>
                      </rule>
                      <action>txt2 = txt2.toLowerCase()</action>
-                     
+                              
                      <rule>node.getChildAt(0) != null and
                            ref.getChildAt(0) != null  and
                            txt1.equals(txt2)          and
@@ -4345,9 +4360,9 @@
                            txt1.equals(txt2)
                         <action>res = frame</action>
                      </rule>
-                     
+
                      <!-- check item of EXTENT field -->
-                     <rule>node.getNumImmediateChildren() == 1 and 
+                     <rule>node.getNumImmediateChildren() == 1 and
                            txt1.equals(txt2)
                         <action>res = frame</action>
                      </rule>
@@ -4535,6 +4550,7 @@
          <variable name="nm"    type="java.lang.String" />
          <variable name="txt1"  type="java.lang.String" />
          <variable name="txt2"  type="java.lang.String" />
+         <variable name="ename" type="java.lang.String" />
          <return   name="res"   type="java.util.Map" />
          
          <rule>true
@@ -4551,6 +4567,13 @@
                <rule>txt1 == null
                   <action>txt1 = node.text</action>
                </rule>
+
+               <!-- resolve only if index is a literal; helper returns null for dynamic -->
+               <action>ename = execLib("resolve_literal_extent_wname", txt1, node)</action>
+               <rule>ename != null
+                  <action>txt1 = ename</action>
+               </rule>
+
                <action>txt1 = txt1.toLowerCase()</action>
             </rule>
 
@@ -4591,8 +4614,14 @@
                            <rule>txt2 == null
                               <action>txt2 = ref.text</action>
                            </rule>
+
+                           <!-- resolve only if index is a literal; helper returns null for dynamic -->
+                           <action>ename = execLib("resolve_literal_extent_wname", txt2, ref)</action>
+                           <rule>ename != null
+                              <action>txt2 = ename</action>
+                           </rule>
                            <action>txt2 = txt2.toLowerCase()</action>
-                           
+
                            <rule>node.getChildAt(0) != null and 
                                  ref.getChildAt(0) != null  and
                                  txt1.equals(txt2)          and

