Skip to content

fix(app-shell): one inbox feed for the bell and Home — already-read messages stop counting as "needs your attention" #967

fix(app-shell): one inbox feed for the bell and Home — already-read messages stop counting as "needs your attention"

fix(app-shell): one inbox feed for the bell and Home — already-read messages stop counting as "needs your attention" #967

Workflow file for this run

name: Docs Links
# Why this is its own workflow instead of a step in `ci.yml`'s `docs` job, which
# is where this check lived when it first reached CI (#3213 / #3292, PR #3450):
# `ci.yml` lists `'**/*.md'`, `content/**`, `docs/**` and `apps/site/**` under
# `paths-ignore`, and GitHub has no per-job path filter. The published site is
# built from `content/docs/**`, so a docs-ONLY pull request matched every ignore
# pattern, started no workflow at all, and was never link-checked — while a
# docs-only PR is the likeliest way an internal link breaks in the first place.
# The step therefore only ever saw PRs that touched docs *alongside code*, plus
# pushes to `main`; a broken link could land through a pure-docs PR and only turn
# `main` red later, under an unrelated author (#3448).
#
# `control-bytes.yml` hit the same wall and its header names the consequence: a
# gate that cannot see a markdown-only PR "rebuilds the hole it exists to close".
# `changeset-guard.yml` is the second instance of the shape in this repo.
#
# Hence: no `paths` and no `paths-ignore` here, deliberately.
# `scripts/__tests__/docs-links-workflow.test.ts` fails if either is ever added.
# A `paths: content/**` filter would look tighter and buy nothing measurable: the
# whole run is a checkout plus one `node` call — no install, no network, a few
# seconds — and the filter would be a second, drift-prone copy of the script's
# own scan surface. Keep it that way if you add checks here.
on:
pull_request:
branches: [main, develop]
push:
branches: [main, develop]
# Merge queue (objectui#3523 — see `ci.yml`'s trigger block for the full note
# and the measurements behind it). This repository's queue is enforced by a
# ruleset but had zero `merge_group` subscribers, so its required-check set
# could only ever be empty. This gate is one of the two the audit found safe
# to require today — deliberately unfiltered, so it reports on every shape of
# pull request — and a required check that does not report on a queue build
# stalls the queue until the ruleset's 60-minute timeout fails it. `types:` is
# named although `checks_requested` is currently the only one GitHub defines.
merge_group:
types: [checks_requested]
workflow_dispatch:
concurrency:
group: docs-links-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
permissions:
contents: read
jobs:
docs-links:
name: Internal Docs Link Check
runs-on: ubuntu-latest
timeout-minutes: 5
steps:
- name: Checkout code
uses: actions/checkout@v7
- name: Setup Node.js
uses: actions/setup-node@v7
with:
node-version: '22.x'
# Resolves every relative / `/docs/...` markdown link found in
# `content/docs/**` against the files actually on disk. Reads the checkout
# and nothing else, so no install is required. External URLs are a
# different problem with a different tool — Lychee, in `check-links.yml`,
# which sweeps both `content/docs/` and `docs/` on a weekly cron and on
# demand, and deliberately gates nothing (#3449 fixed its scope; #3213
# decided it stays off pull requests).
- name: Check internal docs links
run: node scripts/check-doc-links.mjs