Joomla 4 with com_content on stark template - same thing. T4 caches almost the entire head ( links, scripts, stylesheets ) and after the first page is cached, all subsequent pages have 2 canonical links until the cache clears.
Verified by querying redis cache for keys, and filtering out T4 entries. All entries have a canonical link that is added to every page until the cache is cleared.
redis-cli -n 1 get cec23bf44f40d0effa5d472a5aeb9091-cache-t4-05edc499cd27cb5d85b961e713fb288c | grep canonical
";}}s:6:"links";a:1:{s:44:"https://carry-texas.com/glossary/youth-stock";a:3:{s:8:"relation";s:9:"canonical";s:7:"relType";s:3:"rel";s:7:"attribs";a:0:{}}}s:5:"_file";s:54:"/home/carrytx/public_html/templates/ja_stark/index.php";}
I resolved the issue by adding a line to prevent the duplicate canonical url from being included in the doc->_links array:
line 65 of plugins/system/t4/src/t4/Helper/Cache.php (insert after the foreach loop begins)
if($val['relation']??false=="canonical") continue;