Your solution is using Passage Recursion to simulate a cycleing link, this causes the HTML structure of each iteration to be nested/embedded within the content of the previous iteration, and there is a limit to the maximum depth that nesting can become before the web-browser throws an error.
eg. The structure when showing the link the first time.
<tw-expression type="macro" name="display">
<tw-expression type="macro" name="if"></tw-expression>
<tw-hook>
<tw-expression type="macro" name="link"></tw-expression>
<tw-hook>
<tw-link tabindex="0" data-raw="">I agree</tw-link>
</tw-hook>
</tw-hook>
<tw-expression type="macro" name="if" class="false"></tw-expression>
<tw-hook></tw-hook>
</tw-expression>
The structure when showing the link the second time.
<tw-expression type="macro" name="display">
<tw-expression type="macro" name="if"></tw-expression>
<tw-hook>
<tw-expression type="macro" name="link"></tw-expression>
<tw-hook>
<tw-expression type="macro" name="set"></tw-expression>
<tw-expression type="macro" name="display">
<tw-expression type="macro" name="if" class="false"></tw-expression>
<tw-hook></tw-hook>
<tw-expression type="macro" name="if"></tw-expression>
<tw-hook>
<tw-expression type="macro" name="link"></tw-expression>
<tw-hook>
<tw-link tabindex="0" data-raw="">I disagree</tw-link>
</tw-hook>
</tw-hook>
</tw-expression>
</tw-hook>
</tw-hook>
<tw-expression type="macro" name="if" class="false"></tw-expression>
<tw-hook></tw-hook>
</tw-expression>
... if you notice, the structure where the tw-link element is show will increase in depth each time the link is selected. You can use a named hook combined with a (replace:) macro to get around this issue.
The following prototype show how to use the named hook method, it also shows how to use known variables names to: store the list of options to cycle ($cyclingOptions); and to indicate which story variable to store the selected item in.
1. The passage to show the cycling link in:
{
<!-- Initialise the story variable the cycling link will use to store the current selected option in. -->
(set: $selected to "")
<!-- Setup the list of option and the name of the story variable to use. -->
(set: $cyclingOptions to (array: "I agree", "I disagree"))\
(set: $cyclingVariable to "selected")
}\
[(display: "CyclingLink")]<cyclingLinks|
2. The contents of the CyclingLink passage:
(print: "(set: $" + $cyclingVariable + " to '" + ($cyclingOptions's 1st) + "')")\
(link: $selected)[\
(set: $cyclingOptions to $cyclingOptions's (range: 2, $cyclingOptions's length) + (array: $selected))
(replace: ?cyclingLinks)[(display: "CyclingLink")]
]
... the above uses a (print:) macro to dynamically update the indicated story variable with the current option, it also uses a (set:) macro within the body of the (link:) macro reorder the options array so that the last shown option is moved to the end of the options array.