# sphinx-doc__sphinx-10451
# Loki Mode Multi-Agent Patch
# Attempts: 1

Now I understand the code. The issue is in the `modify_field_list()` function. When processing docstring fields like `:param *args:`, the name includes the stars (`*args`), but when looking up annotations, the keys are just `args` and `kwargs` (without stars). This causes duplicates.

The fix needs to:
1. Strip leading `*` characters when building the `arguments` dictionary from docstring fields
2. When checking if a parameter already exists, normalize the name by stripping stars

Here's the patch:

```
--- a/sphinx/ext/autodoc/typehints.py
+++ b/sphinx/ext/autodoc/typehints.py
@@ -84,13 +84,15 @@ def modify_field_list(node: nodes.field_list, annotations: Dict[str, str]) -> No
         if parts[0] == 'param':
             if len(parts) == 2:
                 # :param xxx:
-                arg = arguments.setdefault(parts[1], {})
+                name = parts[1].lstrip('*')
+                arg = arguments.setdefault(name, {})
                 arg['param'] = True
             elif len(parts) > 2:
                 # :param xxx yyy:
                 name = ' '.join(parts[2:])
+                name = name.lstrip('*')
                 arg = arguments.setdefault(name, {})
                 arg['param'] = True
                 arg['type'] = True
         elif parts[0] == 'type':
             name = ' '.join(parts[1:])
+            name = name.lstrip('*')
             arg = arguments.setdefault(name, {})
             arg['type'] = True
         elif parts[0] == 'rtype':
@@ -136,12 +138,14 @@ def augment_descriptions_with_types(
         if parts[0] == 'param':
             if len(parts) == 2:
                 # :param xxx:
-                has_description.add(parts[1])
+                has_description.add(parts[1].lstrip('*'))
             elif len(parts) > 2:
                 # :param xxx yyy:
                 name = ' '.join(parts[2:])
+                name = name.lstrip('*')
                 has_description.add(name)
                 has_type.add(name)
         elif parts[0] == 'type':
             name = ' '.join(parts[1:])
+            name = name.lstrip('*')
             has_type.add(name)
         elif parts[0] == 'return':
             has_description.add('return')
```

Let me generate a cleaner unified diff:

--- a/sphinx/ext/autodoc/typehints.py
+++ b/sphinx/ext/autodoc/typehints.py
@@ -84,14 +84,16 @@ def modify_field_list(node: nodes.field_list, annotations: Dict[str, str]) -> No
         if parts[0] == 'param':
             if len(parts) == 2:
                 # :param xxx:
-                arg = arguments.setdefault(parts[1], {})
+                name = parts[1].lstrip('*')
+                arg = arguments.setdefault(name, {})
                 arg['param'] = True
             elif len(parts) > 2:
                 # :param xxx yyy:
                 name = ' '.join(parts[2:])
+                name = name.lstrip('*')
                 arg = arguments.setdefault(name, {})
                 arg['param'] = True
                 arg['type'] = True
         elif parts[0] == 'type':
             name = ' '.join(parts[1:])
+            name = name.lstrip('*')
             arg = arguments.setdefault(name, {})
             arg['type'] = True
         elif parts[0] == 'rtype':
@@ -136,14 +138,17 @@ def augment_descriptions_with_types(
         if parts[0] == 'param':
             if len(parts) == 2:
                 # :param xxx:
-                has_description.add(parts[1])
+                has_description.add(parts[1].lstrip('*'))
             elif len(parts) > 2:
                 # :param xxx yyy:
                 name = ' '.join(parts[2:])
+                name = name.lstrip('*')
                 has_description.add(name)
                 has_type.add(name)
         elif parts[0] == 'type':
             name = ' '.join(parts[1:])
+            name = name.lstrip('*')
             has_type.add(name)
         elif parts[0] == 'return':
             has_description.add('return')