diff --git a/src/DynamicModel.cc b/src/DynamicModel.cc
index 3752d0190d2eb1089689382e67ef4815e407de50..8eb6d38ef08f8efeebd3e5b236ad7fa09a648092 100644
--- a/src/DynamicModel.cc
+++ b/src/DynamicModel.cc
@@ -2354,7 +2354,7 @@ DynamicModel::computeChainRuleJacobian()
               break;
             }
 
-          if (d != Zero)
+          if (d != Zero && eq >= nb_recursives)
             blocks_derivatives[blk][{ eq, var, lag }] = d;
         }
 
@@ -2369,9 +2369,8 @@ DynamicModel::computeChainRuleJacobian()
           for (const auto &[indices, d1] : blocks_derivatives[blk])
             {
               auto &[eq, var, lag] { indices };
-              assert(lag >= -1 && lag <= 1);
-              if (eq >= nb_recursives && var >= nb_recursives
-                  && !(one_boundary && lag != 0))
+              assert(lag >= -1 && lag <= 1 && eq >= nb_recursives);
+              if (var >= nb_recursives && !(one_boundary && lag != 0))
                 blocks_jacobian_sparse_column_major_order[blk].try_emplace({eq-nb_recursives, var-nb_recursives+static_cast<int>(!one_boundary)*(lag+1)*mfs_size}, d1);
             }
           blocks_jacobian_sparse_colptr[blk] = computeCSCColPtr(blocks_jacobian_sparse_column_major_order[blk], (one_boundary ? 1 : 3)*mfs_size);
diff --git a/src/ModelTree.hh b/src/ModelTree.hh
index aa0f6fd8971fa5bcb575d2dd8656a7e7487f16d2..d7cdea22df167fdc13c22c47adde932fcc507aeb 100644
--- a/src/ModelTree.hh
+++ b/src/ModelTree.hh
@@ -1776,7 +1776,8 @@ ModelTree::writeBlockBytecodeHelper(BytecodeWriter &code_file, int block, tempor
                 const auto &[eq, var, lag] {indices};
                 int eqr {getBlockEquationID(block, eq)};
                 int varr {getBlockVariableID(block, var)};
-                if (eq >= block_recursive && var >= block_recursive)
+                assert(eq >= block_recursive);
+                if (var >= block_recursive)
                   {
                     if constexpr(dynamic)
                       if (lag != 0
@@ -1837,10 +1838,11 @@ ModelTree::writeBlockBytecodeHelper(BytecodeWriter &code_file, int block, tempor
       int varr {getBlockVariableID(block, var)};
       code_file << FNUMEXPR_{ExpressionType::FirstEndoDerivative, eqr, varr, lag};
       d->writeBytecodeOutput(code_file, output_type, temporary_terms_union, blocks_temporary_terms_idxs, tef_terms);
+      assert(eq >= block_recursive);
       if constexpr(dynamic)
-        code_file << FSTPG3_{eq, var, lag, getBlockJacobianEndoCol(block, var, lag)};
+        code_file << FSTPG3_{eq-block_recursive, var, lag, getBlockJacobianEndoCol(block, var, lag)};
       else
-        code_file << FSTPG2_{eq, getBlockJacobianEndoCol(block, var, lag)};
+        code_file << FSTPG2_{eq-block_recursive, getBlockJacobianEndoCol(block, var, lag)};
     }
 
   // Update jump offset for previous JMP