Internal links that do not rewrite your sentences

Internal linking is the cheapest SEO work available and the one most sites never do. Not because it is hard, but because doing it by hand across a hundred articles is tedious enough that it stays on the list forever.
The automated versions have a failure mode worth understanding before you turn one on.
The failure mode
Ask a language model to add an internal link to an article and it will often rewrite a sentence to make room for one.
You wrote:
Most teams underestimate how long a migration takes.
It produces:
Most teams underestimate how long a [site migration](/guides/site-migration)
takes, which is why having a clear migration checklist matters.
The link is relevant. The sentence is no longer yours. Half a clause got added to justify the anchor, and it reads like what it is.
Do that to forty articles and your blog acquires a texture. Not wrong exactly, just slightly padded everywhere, in the way that makes a reader suspect a machine has been through it. The articles that suffer most are the ones that were written most carefully, because those are the ones where an inserted clause is most visible.
The rule that prevents it
A link may only ever wrap a phrase that already exists, word for word, in the article.
The model proposes an anchor. The anchor is then checked against the text. If it is not present exactly, including capitalisation, the link is discarded rather than accommodated. No rewriting, no "close enough", no inserting a sentence to hold it.
This sounds restrictive and is. In our own runs roughly four out of five proposed anchors get thrown away. That is the correct outcome. The alternative to a discarded link is not a better link, it is an edited sentence you did not approve.
The other things that have to be true
Verbatim matching is necessary and not sufficient. A few more rules earn their place.
Never link inside code, headings, or existing links. A phrase can appear verbatim inside a fenced code block, an image's alt text, or another link's anchor. Wrapping any of those produces broken markdown rather than a link, and it renders wrong rather than erroring, so nobody notices until a reader does. Mask those regions before searching for the anchor.
Only link to pages that are live right now. Not to pages in your link map, to pages that are published and have a URL at the moment the link is written. A link map built last month will cheerfully point at a page that has since been unpublished, and the resulting 404 is invisible until someone hits it.
Record the links you placed. Not for reporting. Because you need to find the ones whose target later stopped being published, and because knowing how many incoming links a page already has is what lets you prioritise.
Favour orphans. Relevance alone links the same three hub pages from everything, which is the opposite of what internal linking is for. A page with no incoming links is the one that benefits most, so it should win ties against a page that already has nine.
Cap the density. Roughly one link per three hundred words, no more than five in an article. Dense internal linking reads as spam to a human long before it does to a crawler, and the human is the one who leaves.
Two to seven words for an anchor. Single words are usually too generic to tell a reader what they are getting. Long ones are usually a model quoting half a sentence.
What it looks like when it runs
On a site with few published articles, almost nothing happens, and that is correct. Six articles give each one five possible targets, most unrelated. You need a body of content before internal linking has anything to work with.
On a site with a real archive, a pass places a handful of links per article, all wrapping phrases you wrote, all pointing at pages that are live. Articles get revisited when newer articles exist to link to, because something written in January has no way to link to something written in March unless a later pass goes back for it.
And one operational detail that catches everyone: links are written into the stored markdown. If an article was already published, it keeps serving its old body until it is published again. A tool that reports "12 links placed" and leaves your live site unchanged is technically telling the truth and practically lying. Republish after a pass.
If you are doing this by hand
The rules above are not specific to software. Open your most recent article, find two phrases you already wrote that genuinely introduce another page on your site, and link them. Do not add a sentence. If no phrase fits, link nothing and move on.
That is the whole method. The only thing automation adds is doing it across the archive and remembering what it did.