An approval item is a promise: a named person approved a specific action, at a specific time, after seeing specific evidence. That promise only holds if the evidence can still be opened. The most common way teams break it is by pasting a CI job URL into the approval record.
A job URL is not a reference to an artifact. It is a reference to a slot that the pipeline can refill. GitLab describes job artifacts as output that belongs to one pipeline, and warns explicitly that the URL for the latest artifacts on a branch points to different files after each new pipeline; artifacts kept by the "keep artifacts from most recent successful jobs" setting ignore their expiry dates GitLab's job artifacts documentation. If a reviewer opens that URL after a retry, they see the newest build and believe they are looking at the one that was approved. No error appears. The evidence has silently been swapped.
This is a pipeline-flavored case of link rot, the general phenomenon where hyperlinks stop pointing at their original target because the resource moved or disappeared the Wikipedia entry on link rot. The rates are not trivial: a review of links in Harvard legal journals and U.S. Supreme Court opinions found that more than 70 percent of the journal URLs and 50 percent of the court URLs suffered from reference rot the NC Bar Association's write-up. Pipeline URLs rot faster than that, because retries are routine rather than exceptional.
Two more failure modes compound it. First, retention: most artifact stores expire files on a schedule, so a link that resolved during the review window may be gone by the time an auditor asks about it three quarters later. Second, identifier churn: some CI systems generate new internal IDs on every attempt. Empirical's API, for example, keys artifacts by a test run database ID and returns a path, URL and last-modified time per artifact, so a new run means a new ID to cite the Empirical test run artifacts API. Paste the URL for run 4471, retry the job, and the artifact now hangs off run 4472, or a renumbered 4471 that means something else.
The consequence is practical, not philosophical. When an incident review asks "who approved the deploy that broke checkout, and what did they see?", the answer must be reconstructable from the record itself. That is why teams that care about this bind approval decisions to a policy snapshot and a request hash rather than to a page that can change underneath them Cordum's approval gate guide.



