Skip to content

fix(links): repoint the 73 stale anchors left by the Jekyll/dev era - #1072

Merged
Iamfle4ka merged 3 commits into
docs/em-dash-prosefrom
docs/stale-anchors
Aug 4, 2026
Merged

fix(links): repoint the 73 stale anchors left by the Jekyll/dev era#1072
Iamfle4ka merged 3 commits into
docs/em-dash-prosefrom
docs/stale-anchors

Conversation

@Iamfle4ka

Copy link
Copy Markdown
Collaborator

Stacked on #1070 (base is docs/em-dash-prose). The follow-up I offered there.

Anchor targets have never been validated by CI: audit-phase2 checks link paths but not the #fragment. So every heading rename since the Jekyll days quietly left links pointing at nothing — including the ones #1046 carried over from dev. A checker over the built site found 73; this fixes all of them.

By cause:

Cause # Example
Heading renamed, article dropped ~30 #inviting-a-user#inviting-user, #running-a-component#running-component, #preparing-the-data-folder#preparing-data-folder
Section moved to another page 11 manifest-files/#dataouttables-manifestsmanifest-files/out-tables-manifests/; /storage/file-uploads/#limits/storage/files/#limits; /transformations/{python,r}/#development-tutorial → the -plain pages
Section no longer exists 10 #new-transformations (5 links) and /management/jobs/#jobs now link the page; #main-header was a Jekyll top-of-page artifact
{#id} heading syntax 1 page see below
Nothing to point at 3 link dropped, words kept
Never actually a link 1 see below

Three of those redirect-stub cases are worth calling out: /transformations/python/, /transformations/r/ and /extractors/other/aws-s3/ are redirect_from stubs, so the fragment never survived the hop — the link looked fine and always landed at the top of a different page.

{#id} heading syntax: management/telemetry/telemetry-dashboards/ wrote ### Organization Usage {#ac-organization-usage} to disambiguate two same-named sections. Starlight has no such syntax — it renders the braces literally on the page today and slugs them into the id (organization-usage-ac-organization-usage). Renamed to ### Organization Usage (Activity Center), which keeps the two sections distinct and gives the link a real target. It's the only {#…} heading in the repo.

Never actually a link: /overview/ shipped our Flows [/tutorial/automate/#main-header], obtaining — a bare bracketed path rendering as literal text. Now our [Flows](/tutorial/automate/), obtaining.

Needs an owner's eye (I dropped the link and kept the words rather than guess):

  • /transformations/ comparison table — the Phases and Dependencies cells linked to sections that don't exist on that page. Both rows say "Not available"; phases now live in Flows (/flows/#phases-and-tasks), dependencies nowhere. Say the word and I'll point Phases at Flows.
  • /extend/component/implementation/ — "make sure your component does not use any [output buffering]" pointed at #language-specific-notes, a section that vanished when the language notes were split into the php/python/r subpages. Each subpage has a Logging section; the buffering caveat is documented explicitly only on the Python one, so a single target would be misleading.

Verified with astro build:

  • 73 → 0 broken anchors, 8476 checked across 500 pages.
  • audit-phase2 unchanged on every category: 45 broken internal links / 0 missing images / 3 multiple-h1 / 0 unclosed fences / 0 malformed tables.
  • Its old-docs-smell count moves 99 → 101: two links now point at https://developers.keboola.com/#development-project, the one target with no help equivalent. Deliberate — they match the sibling link already in /tutorial/, and they're a to-do for whenever the dev homepage gets migrated.

Worth considering separately: adding the anchor check to audit-phase2 so this can't rot again.

Anchor targets were never validated by CI — audit-phase2 checks link *paths*
but not the `#fragment` — so every heading rename since the Jekyll days left a
link pointing at nothing. A checker over the built site found 73; this fixes all
of them. Grouped by cause:

- **Heading renamed, article dropped** (~30): `#inviting-a-user` →
  `#inviting-user`, `#running-a-component` → `#running-component`,
  `#preparing-the-data-folder` → `#preparing-data-folder`, and so on.
- **Section moved to another page** (11): the manifest-files hub became one page
  per manifest kind (`#dataouttables-manifests` → `out-tables-manifests/`);
  `/storage/file-uploads/#limits` → `/storage/files/#limits`;
  `/transformations/{python,r}/#development-tutorial` → the `-plain` pages —
  those three paths are redirect stubs, so the anchor never survived the hop.
- **Section is gone** (10): `#new-transformations` (5 links) and
  `/management/jobs/#jobs` now link the page itself; `#main-header` was a Jekyll
  top-of-page artifact.
- **Starlight has no `{#id}` heading syntax** (1 page): telemetry-dashboards
  wrote `### Organization Usage {#ac-organization-usage}` to disambiguate two
  same-named sections. Starlight rendered the braces *literally* on the page and
  slugged them into the id. Renamed to "Organization Usage (Activity Center)",
  which keeps the sections distinct and gives the link a real target.
- **Nothing to point at** (3): the Phases/Dependencies cells in the
  transformations comparison table and "output buffering" in the implementation
  notes are now plain text — the sections they referenced don't exist anywhere.
  Flagged in the PR for someone who knows the original intent.
- **A link that was never a link**: `/overview/` shipped
  `our Flows [/tutorial/automate/#main-header], obtaining` as literal text.

Verified with `astro build`: **73 → 0** broken anchors out of 8476 checked
across 500 pages. audit-phase2 unchanged on every category (45 broken internal
links / 0 missing images / 3 multi-h1 / 0 unclosed fences / 0 malformed tables);
its old-docs-smell count goes 99 → 101 for the two `developers.keboola.com/#development-project`
links, the one target with no help equivalent yet — deliberate, and they match
the sibling link already in `/tutorial/`.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@vercel

vercel Bot commented Aug 3, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
connection-docs Ready Ready Preview Aug 4, 2026 9:37am

Request Review

The sweep resolved every anchor, but the fact-check found better homes for a
few. All verified against the build:

- `/workspace/table-export/`: "returns a standard asynchronous storage job" →
  `/storage/jobs/`, the page that defines the concept, instead of
  `/management/jobs/#storage-jobs`, which is a UI walkthrough.
- `/management/project/limits/` (2 links): how table size is measured →
  `/storage/#storage-data`, where "backend" is defined. The section I had used,
  Storage Backend Types and Features, is about tenancy models (MT/KBDB/BYODB).
- `/overview/`: the Flows mention now goes to `/flows/`, matching the same
  page's other two Flows links, rather than to the Part 4 tutorial.
- MySQL binlog note: the original `#mysql-purges-binlog-files-used-by-debezium`
  was copied verbatim from Debezium's own docs and refers to the *failure mode*
  (connector stops too long → server purges the binlog → new snapshot needed).
  Our `### Functionality` only says snapshots exist because MySQL purges
  binlogs, and nothing in-repo covers the failure mode, so the link goes
  upstream to Debezium.
- Five `[advanced mode](…/sqldb/)` links pick up `#advanced-mode`, the anchor
  sqldb's own prose already uses.

Anchors still 0 broken (8480 checked); audit-phase2 unchanged.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@Iamfle4ka

Copy link
Copy Markdown
Collaborator Author

Fact-check pass done — no CRITICAL, no MAJOR. 66 of the 73 land squarely, all 73 resolve, and every one was already dead before this PR, so nothing regressed. Two things came out of it.

Five targets sharpened (commit c66a9650):

  • /workspace/table-export/: "returns a standard asynchronous storage job" → /storage/jobs/ (the page that defines the concept) instead of /management/jobs/#storage-jobs (a UI walkthrough).
  • /management/project/limits/ ×2: table-size measurement → /storage/#storage-data, where "backend" is actually defined. The section I'd used is about tenancy models (MT/KBDB/BYODB).
  • /overview/: the Flows mention → /flows/, matching the same page's other two Flows links, rather than the Part 4 tutorial.
  • MySQL binlog note → Debezium's own docs. That anchor (#mysql-purges-binlog-files-used-by-debezium) was copied verbatim from upstream and refers to the failure mode — connector stops too long, server purges the binlog, new snapshot needed. Our ### Functionality only says snapshots exist because MySQL purges binlogs, and nothing in-repo covers the failure mode.
  • Five [advanced mode](…/sqldb/) links picked up #advanced-mode, the anchor sqldb's own prose already uses.

Phases stays unlinked — I had this wrong in the description above. I offered to point it at /flows/#phases-and-tasks. Don't: those cells are legacy transformation features (deleted in 9c5151d7, "Cleanup of legacy transformations"), where a phase was a step run inside one workspace. Flow phases are a different mechanism, so that link would mislead. Both cells read "Not available" and no correct target exists, so plain text is right.

While we're here: that whole legacy-vs-new comparison table is vestigial, and its <th rowspan='9'>Other features</th> row (transformations/index.md:174-178) carries two <td>s where every sibling row has one — pre-existing, worth a look by whoever owns the section.

"output buffering" also stays plain text. A target does exist — implementation/python/index.md:389-391 under ## Logging — but PHP and R say nothing about buffering, so a single link would misinform two of the three audiences.

Last, unchanged but worth flagging: the five /transformations/ links are on the right page, but the sentences are stale — "You must be using new transformations to see this feature" points at a page that no longer explains that distinction, because it no longer exists. That's a rewrite, not a link fix.

Still 0 broken anchors (8480 checked); audit-phase2 unchanged.

@Iamfle4ka
Iamfle4ka merged commit 0b9713e into docs/em-dash-prose Aug 4, 2026
2 checks passed
@Iamfle4ka
Iamfle4ka deleted the docs/stale-anchors branch August 4, 2026 13:11
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant