Skip to content

🚧 DO NOT MERGE — TEST ONLY: STT docs restructure (iteration 1) - #302

Draft
petemomo wants to merge 18 commits into
mainfrom
docs-restructure-test
Draft

🚧 DO NOT MERGE — TEST ONLY: STT docs restructure (iteration 1)#302
petemomo wants to merge 18 commits into
mainfrom
docs-restructure-test

Conversation

@petemomo

@petemomo petemomo commented Aug 12, 2026

Copy link
Copy Markdown
Collaborator

⛔️ DO NOT MERGE

This is a throwaway test branch, opened as a draft purely to get a Vercel preview
link for review. It is the first iteration of an exploratory restructure and is
not intended for main in this or any amended form. Close it when the preview has
served its purpose.

Why this exists

A test of a large restructure of the Speech to Text content and information architecture,
to improve usability and prepare for upcoming models and features. Open it to look at the
preview, not to review it as a merge candidate.

What it does

Reorganizes STT around the three interaction patterns in product-architecture.md
(pre-recorded, streaming, agent STT) instead of the two processing modes, and gives
availability a single home derived from feature-availability.md.

Pages 39 → 51
Routes 35 removed, 43 added
Commits 18, staged by phase

Main moves:

  • batch/pre-recorded/, realtime/streaming/
  • New agent-stt/ (6 pages), promoted from the unlisted /private/voice-agent-api page
  • New availability/ — the only place allowed to hold a pattern × model × deployment table, replacing six competing mechanisms
  • formatting.mdx split four ways; two diarization concept hubs dissolved; three copies of app usage tracking collapsed to one
  • Add-ons separated from features (translation, summaries, topics, chapters, sentiment, audio-alignment)
  • /voice-agents/ dissolved — the section contradicted terminology.md. Voice SDK moved to /integrations-and-sdks/voice-sdk/
  • Melia 1 streaming published as Preview, carrying over the content of draft PR Private RT melia 1 docs #296
  • Model choice signposted per interaction pattern — "Choose a model" is organized by pattern, reachable from interaction-patterns.mdx and from each pattern's sidebar

Verified

  • npm run build exits 0 with both onBrokenLinks and onBrokenAnchors throwing
  • Every removed route resolves via a redirect; 890 served redirects, 0 chains, 0 self-loops — down from 8 chains before this work
  • Redirect behaviour verified on the deployed preview, which is the only place it runs. /voice-agents-flow/setup is one hop (was three) and /on-prem/containers finally resolves (was a production 404)
  • All 23 load-bearing anchors resolve; sitemap has 0 stale paths
  • Content preservation checked per merge by extracting every identifier from each retired page — 0 lost
  • tsc and biome both hold at baseline

The preview run caught one thing no local check could: 17 redirect destinations were
written with a trailing slash, costing every visitor an extra normalisation hop under
trailingSlash: false. Fixed. Seven remain, all in the legacy historical redirect files.

Known gaps

The full register is .CLAUDE/restructure-debt.md on this branch — catalogue
corrections, content gaps needing an owner, structural decisions, tooling debt, the
redirect checks only a deployment can run, and Jira actions. The headlines:

  • feature-availability.md was hand-edited, which CLAUDE.md forbids. Done at the owner's request to correct on-prem notifications. The upstream product catalogue needs that fix and 9 others, or the next regeneration reverts it.
  • Agent STT has no runnable quickstart code (the source had only an Academy link) and no limits content at all.
  • Mermaid renders to nothing site-wide — pre-existing, also affects the Realtime API reference. Prose equivalents carry the information.
  • The Melia 1 streaming Preview has no feedback route, which its readiness rule requires; the draft's form URL was an unshippable placeholder.
  • On-prem container release numbers and Voice SDK preset names still need engineering confirmation.
  • Deployments (37 pages) is deliberately out of scope; its matrix is retained and corrected, not deleted.

Ticket impact

  • DEL-33243 — superseded. Its instruction is now forbidden by the readiness rules, and its blanket "not yet" framing was wrong for most of its scope.
  • DEL-33895 — 4 of its documentation ACs turn out to be already done; what remains is engineering.
  • DEL-34047 — unblocked by a fix in here: build:jobs-api-ref cleaned the wrong directory, so spec changes never reached the generated API reference.
  • DEL-34274 — premise stale (Melia 1 is GA on pre-recorded), still correctly blocked on Melia becoming the default.

🤖 Generated with Claude Code

petemomo and others added 13 commits August 11, 2026 17:40
Swaps CLAUDE.md, docs-style-guide.md, terminology.md and
product-architecture.md for the new versions, and adds
feature-availability.md as the generated source of truth for STT
availability and readiness.

Also amends the style guide with a catalogue-table exception: a table may
exceed 10 rows if it has at most 3 columns, is the page's only table, and
lookup is the page's whole purpose. The ~56-row transcription language
table and the 34-row translation-pair table cannot be split without
fragmenting the lookup. The 5-column cap still applies and comparison
tables never qualify.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Pre-flight fixes ahead of the STT restructure, all independent of it.

Six links in language-identification.mdx used a protocol-relative
`//api-ref/...` form. Docusaurus treats a leading `//` as an external
URL, so onBrokenLinks never saw them and browsers resolved them to
https://api-ref/... — six live 404s.

redirects.json sent /deployments/container to a misspelled
/deployements/... destination, which 404s /on-prem/containers in
production. The entry is unenforced by check-redirects, so nothing
caught it.

Two code assets carried stale doc URLs in comments: translation.mdx
pointed at /features-other/notifications and topics.py at
/batch-transcription/notifications. Neither is visible to any link
checker.

Also drops two duplicate /voice-agents-flow redirect entries (three
identical copies existed), and sets onBrokenAnchors to "throw". The
anchor baseline is clean, so making it fatal now protects the ~21
anchors that inbound links and redirects depend on through the
restructure.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Adds /speech-to-text/availability/ and /availability/on-prem, derived
from .CLAUDE/context/feature-availability.md. These become the only
place in the docs allowed to hold a table whose axes are interaction
pattern, model, deployment, region or readiness, replacing the six
inconsistent mechanisms in use today.

Rows are filtered mechanically: available combinations are marked, and
rows where no model is available are omitted entirely. A check mark means
available; an em dash means unavailable or not established, and states no
roadmap position either way — so "No", "Not yet" and "TBD" are
indistinguishable to the reader, as the authoring rules require.

The on-prem page omits agent STT and streaming Melia 1 completely rather
than listing them as unavailable, because both are In development and the
rules allow no feature lists and no page stubs for those.

Two catalogue discrepancies are published against the catalogue and noted
in source comments: streaming app usage tracking, and three agent STT
fields that ship on the /v2/agent endpoints. Corrections to raise.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Reframes the section entry points from two processing modes to the three
interaction patterns in product-architecture.md, and moves availability
claims out of the spine and onto the availability reference.

- index.mdx: three patterns instead of two modes, links to the new
  interaction-patterns page and to the availability reference. Use-case
  lists move to interaction-patterns, cutting the page from four
  admonitions to one.
- interaction-patterns.mdx (new): explains the pattern/processing-mode
  split, carries the authoritative crosswalk table and the session_type
  caveat, and absorbs the "what is a job" definition.
- models.mdx: drops the 13-row comparison table (duplicated the
  availability reference and would have gone to 5x13 with Linden 1),
  the Melia 1 gap list, the "early-access" claim, and the false
  "Enhanced and Standard are feature-identical" statement — medical
  domain is Enhanced-only. Adds Linden 1, and records that Linden 1 is
  selected by connecting to an agent endpoint rather than by setting
  `model`, which is what the API actually does.
- features/medical-domain.mdx (new): the medical content, off the
  forbidden "Enhanced Medical model" name. The Realtime/Batch columns
  become a plain language list, since pattern columns on a feature page
  are an availability table.
- languages/ splits into index.mdx (selection, packs, translation pairs)
  and transcription.mdx (the ~56-row code catalogue, which relies on the
  new catalogue-table exception).

The #melia-1 and #bilingual-and-multi-language-packs anchors are
preserved — six pages and two container docs depend on them. The
#healthcare-domain anchor moves, so Root.tsx's client-side shim now
covers both legacy paths, since server-side redirects cannot match a
fragment.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…y.md

Audited all 21 rows of the feature x deployment table in
deployments/index.md against .CLAUDE/context/feature-availability.md.
Two disagreed, in opposite directions:

- Notifications: the table was right. feature-availability.md said
  on-prem pre-recorded was No for all three models. Owner confirmed
  notifications work on-prem, so the file is corrected to Yes.
- Language identification: the table was wrong. feature-availability.md
  already had on-prem pre-recorded as Yes, so the table is corrected to
  "SaaS, On-prem".

19 of 21 rows now agree. The two that remain are not conflicts — feature
discovery and tracking are absent from feature-availability.md's Items
table entirely, though both are live, documented features. The table is
therefore kept rather than deleted: where it diverges it exposes gaps in
the product catalogue rather than contradicting it.

Adds the Notifications row back to the on-prem availability page, which
had dropped it under the all-unavailable filter rule.

Also normalizes a stray "On-Prem" to "On-prem" in the same table, and
corrects two source comments on the availability page that claimed
catalogue corrections "had been raised" when none had.

Note: hand-editing feature-availability.md is what CLAUDE.md forbids
("fix the catalogue and regenerate"). Done at the owner's explicit
request. The upstream product catalogue needs the same fix or the next
regeneration reverts it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Renames the two pattern directories so URLs follow the Level 1
interaction patterns in product-architecture.md. Batch and Realtime
remain in reference prose and in the generated /api-ref/ tree, which is
untouched.

  docs/speech-to-text/batch/    -> docs/speech-to-text/pre-recorded/
  docs/speech-to-text/realtime/ -> docs/speech-to-text/streaming/

Done with git mv so rename detection works: 60 renames, no content
rewritten in the moved files beyond path references.

Sidebar ids, category labels and imports updated. The two categories are
reordered to pre-recorded then streaming, matching the Level 1 sequence.
Deletes the dead pre-recorded/_category_.json rather than moving it — it
is inert only because nothing autogenerates that directory, and its
"Batch Transcription" label would revive if one ever did.

Rewrote 96 stale path references across 40 files in docs/ and spec/,
including the absolute docs.speechmatics.com links in spec/realtime.yaml
that no link checker can see. scripts/redirects/ and vercel.json are
deliberately excluded — they hold the old paths as redirect sources.

Also converts two repo-root-relative links in streaming/input.mdx to
site-relative, and strips file extensions from four absolute link
targets. The repo-root-relative form only resolved via Docusaurus's
siteDir fallback and would have broken silently on the rename.

Redirects: retargeted 6 existing entries in place rather than letting
them become two-hop chains, and added 32 new ones covering every moved
page, both section roots, three fragment variants and one trailing-slash
variant. The fragment variants are needed because sync-redirects matches
destinations by exact string, so a fragment-bearing older destination
will not flatten against a plain source.

Verified: build exits 0; route diff is a clean 26-out/26-in swap with
every removed route covered by a redirect; all 21 load-bearing anchors
resolve; no new chains or conflicting duplicate sources.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Promotes docs/private/voice-agent-api.mdx into six public pages under
docs/speech-to-text/agent-stt/. This resolves the contradiction that
Speechmatics sells agent STT, not voice agents, while the only docs for
it sat at a publicly routable /private/ URL named after a construct
terminology.md forbids.

  index.mdx         Explanation  How agent STT works
  quickstart.mdx    Tutorial     Quickstart
  profiles.mdx      Reference    Turn detection profiles
  configuration.mdx Reference    Agent STT configuration
  messages.mdx      Reference    Agent STT messages
  speaker-focus.mdx How-to       Speaker focus and identification

A rewrite, not a move. The source was en-GB throughout (finalise,
labelled, recognised, analyses), used title-case headings, skipped from
H2 to H4, called the product a "Voice Agent API" built "for building
voice agents", and used "RT API". All corrected.

The preview Warning with four bullets becomes the Info admonition that
feature-availability.md prescribes for Preview readiness, plus a prose
"Preview limitations" section — so the four substantive facts survive
without two adjacent admonitions or a second Warning on the page.

On-prem agent STT is In development, so it is not mentioned at all: no
feature list, no stub, no "not yet available". The cloud-only scope is
stated as a positive fact instead.

Adds a disambiguation of the three turn-detection naming systems that
previously collided undocumented: agent STT profiles, Voice SDK presets,
and the Realtime API silence trigger. Only external/EXTERNAL genuinely
correspond.

Per the owner's D6 ruling, enable_entities, volume_threshold and
ForceEndOfUtterance are published even though feature-availability.md
marks them No or Not yet — all three are shipped config on the /v2/agent
endpoints, and dropping ForceEndOfUtterance would have deleted the
external profile entirely.

The private page is deleted and redirected. It was in no redirect list
and no enforced route list, and had zero inbound references.

Verified: build exits 0; all 91 backticked identifiers and all 27 message
names from the source appear in the new pages; 11 cross-page anchors
resolve; the sidebar renders "Agent STT" not "Agent Stt"; one admonition
per page.

Known issue, pre-existing and filed separately: mermaid renders to
nothing site-wide, so the session-flow diagram is invisible. The prose
sequence walkthrough carries the same information, which the style guide
requires anyway.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The 448-line Formatting page covered five unrelated features. It is split
per the style guide's rule that a section serving more than one reader
need should be its own page:

  features/formatting.mdx                  output locale, smart
                                           formatting, punctuation
  features/entity-detection.mdx            enable_entities, entity output,
                                           entity classes
  features/disfluencies-and-profanities.mdx  both tagging features and
                                           remove_disfluencies
  features/text-replacement.mdx            replacements and regex

The 14-row entity class table is split into two 7-row tables, grouped by
numbers/quantities and dates/identifiers, to fit the row cap.

Redirects: the three most-linked fragments (#smart-formatting with 43
legacy sources, #punctuation, #output-locale) all stay on
features/formatting, so a single server redirect covers them. The
fragments that move away have zero legacy sources, so no client-side
shim is needed — only in-repo links, which are rewritten directly.

Also fixes the two broken redirect fragments found earlier by the
fragment-aware validator. Neither anchor ever existed on its target, so
both had been silently dumping readers at the top of the page:

  /features/accuracy-language-packs -> languages#multilingual-speech-to-text
  /features/word-tagging            -> formatting#output-formatting-options

Verified nothing lost: all 20 backticked identifiers, all 41 English
disfluency words, all 14 entity classes, and both 17-language lists
survive. 53 redirect destinations resolve including fragments.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The two concept hubs only described relationships between other pages,
which the style guide rejects as a content type. Their concepts merge
into real feature pages, and the per-mode duplicates collapse.

Five pages become four:

  features/diarization              -> features/speaker-diarization
  pre-recorded/batch-diarization       (concept, use cases, config)
  streaming/realtime-diarization    -> features/channel-diarization
                                    -> streaming/channels (protocol)
  pre-recorded/speaker-identification -> features/speaker-identification
  streaming/speaker-identification     (one page, three patterns)

Re-derived across three interaction patterns rather than two modes, which
surfaced facts the split pages had left implicit: max_speakers applies to
streaming and agent STT but is undocumented for pre-recorded; channel
diarization is unavailable for agent STT; channel_and_speaker is
streaming-only. The WebSocket channel protocol (AddChannelAudio,
EndOfChannel, limits, on-prem) moves to streaming/channels because those
are transport messages, not feature config.

Speaker identification documents an API asymmetry that was previously
invisible: pre-recorded and streaming use
speaker_diarization_config.speakers, while agent STT uses
transcription_config.known_speakers for the same concept.

Also in this change:
- app-analytics.mdx (an orphan) plus two duplicate "App usage tracking"
  H2 sections collapse into features/app-usage-tracking. Three copies
  become one.
- turn-detection moves to features/, since it serves streaming and agent
  STT rather than streaming alone.
- The two legacy guides consolidate: python-using-ffmpeg becomes
  streaming/ffmpeg-audio, and python-using-microphone is deleted after
  rescuing its Mac M1/M2 portaudio recipe into the streaming quickstart.
- Fixes invalid JSON in the channel_and_speaker sample, which used single
  quotes inside a JSON fence.
- spec/realtime.yaml linked to #max-speakers and #prefer-current-speaker,
  anchors that never existed on the old hub. Both now resolve, and an
  http:// link is upgraded to https://. These were invisible to the link
  checker because they are absolute URLs, and they render into the
  Realtime API reference.

Redirect fix: my earlier task-10 entry had a source that normalized to
the same path as its destination, which Vercel would have served as a
redirect loop. Replaced with a direct retarget of the legacy source.

Verified: build exits 0 with no broken links; all 31 identifiers and 10
key facts from the five retired pages survive; route diff is 10 out and
10 in with every removed route covered by a redirect; no self-loops.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Creates features/mixed-language-transcription.mdx, consolidating content
that was spread across three pages: the Melia 1 config from models.mdx,
language hints from pre-recorded/input, and the per-word language labels
and language_pack_info metadata from pre-recorded/output. Both source
sections become pointers, so nothing is duplicated.

Scoping the feature to its real availability surfaced a distinction the
split pages had obscured: language hints are available for pre-recorded
transcription but are "Not yet" for streaming, so the hints section is
scoped to pre-recorded rather than presented as a Melia 1 feature in
general. Streaming with Melia 1 carries the Preview admonition.

Also completes the features section:
- Availability sections added to audio-events, audio-filtering,
  custom-dictionary and turn-detection, which had none.
- Fixes the five genuine British spellings remaining in the STT tree
  (labelled, recognised x2, behaviour, analyse), all on pages carried
  over rather than rewritten.

features/ now holds 16 pages, every one with a single Availability
section except feature-discovery (absent from feature-availability.md)
and translation (which moves to add-ons in the next phase).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
feature-availability.md states that add-ons are not features, that each
is a separate product producing an output derived from a completed
transcript, and that they must not be folded into feature documentation.
Six add-ons were split across three locations that all implied the wrong
thing: translation sat in features/, four sat under a "speech
intelligence" category inside pre-recorded/, and audio alignment was an
unlisted orphan.

They now form a sibling of features/ at the same level:

  features/translation                     -> add-ons/translation
  pre-recorded/speech-intelligence/
    summarization                          -> add-ons/summaries
    topic-detection                        -> add-ons/topics
    auto-chapters                          -> add-ons/chapters
    sentiment-analysis                     -> add-ons/sentiment
  pre-recorded/alignment                   -> add-ons/audio-alignment

Filenames now match the canonical names in terminology.md, and the
"speech intelligence" term is retired — it appears nowhere in
terminology.md and was baked into URLs and a sidebar category.

A sibling directory rather than a child of pre-recorded/ is deliberate.
Five of the six are pre-recorded-only today, but translation already
works in streaming, so nesting them under a pattern would rebuild the
exact bug this restructure removes: availability implied by file
location.

Each page gains an Availability section, which records three facts the
old grouping hid: translation runs in streaming as well as pre-recorded;
sentiment is the only one of the four ex-"speech intelligence" add-ons
available on-prem; and audio alignment is Enterprise-only and cloud-only,
stated nowhere before.

Audio alignment also enters a sidebar for the first time. It was
reachable by URL and by two redirects but appeared in no navigation.

Fixes the second-H1 bug in sentiment, where "# Error responses" put a
second H1 on the page.

Verified: build exits 0; route diff is 6 out and 6 in with every removed
route covered; all 19 identifiers preserved; the #languages anchor
survives; assets render; the sidebar shows "Add-ons", not "Add Ons".

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
terminology.md forbids describing any Speechmatics product as a voice
agent, and product-architecture.md states a voice agent is a full
conversational pipeline that Speechmatics does not sell. The
/voice-agents/ section contradicted both. It is now dissolved.

  voice-agents/voice-sdk.mdx  -> integrations-and-sdks/voice-sdk/index.mdx
  voice-agents/assets/        -> integrations-and-sdks/voice-sdk/assets/
  voice-agents/overview.mdx   -> deleted, content redistributed

Moving the Voice SDK into a directory rather than a flat page keeps all
12 ?raw asset imports byte-identical, and matches the livekit/ and
pipecat/ layout. The page is also re-scoped: it wraps the Realtime API
over the streaming pattern, so it now says so and points at agent STT
for server-side turn detection. Two orphan assets are deleted, including
presets.py, which documented a fifth, contradictory set of preset names.

overview.mdx is deleted rather than moved: its three integration cards
were exact duplicates of the integrations index, and its feature bullets
were already stated verbatim on the Voice SDK page.

get-started/quickstart.mdx is deleted. It failed 5 of the 7 mandatory
Quickstart criteria, only described relationships between other pages,
duplicated the home page, had zero inbound links, and its derived title
was the lowercase string "quickstart". Its one unique item, the Academy
link, moves to the home page.

Entry points reworked:
- index.mdx drops the "building voice agents" product claim, gains a
  fourth pattern-led quickstart card for agent STT badged Preview,
  replaces the dead voice-agent card, corrects "Cloud SaaS" to "SaaS on
  Cloud", and cuts four card descriptions from 230-300 characters to
  under the 80-character limit.
- authentication.mdx gains a title, an agent STT endpoint tab, and an
  explicit statement that streaming is not available in the AUS region.
  Fixes a latent bug where both TabItems in one Tabs carried `default`,
  and scopes the "all production endpoints" claim so it does not cover
  the preview endpoint.

Redirects: the 8 /voice-agents-flow two-hop chains are collapsed to one
hop, and the 8 /voice-agents/flow* destinations are retargeted by reader
intent rather than dumped on one page. **Chain count is now zero** for
the first time in this migration; it was 8 before any of this work.

Also folded in:
- pre-recorded/usage.mdx, an orphan, merges into administration/usage.mdx,
  which already owned the topic. Fixes a factual bug in the merged text:
  the date range said "before 2023-01-01" where it should be 2024-01-01.
- 8 inert quickstart= props removed from sdks.mdx. LinkCard has no such
  prop and all 8 URLs were dead.
- The retired "variant" term replaced in administration/usage.mdx.
- "Speechmatics Voice Agent" removed from a rendered code asset.
- "cloud SaaS" corrected in a deployments page.
- spec/flow-api.yaml deleted; it was an orphan spec for a removed product.

Verified: build exits 0; route diff is 4 out and 1 in with every removed
route covered; all 12 Voice SDK assets render; 878 served redirects with
0 broken destinations and 0 broken anchors; 0 chains; 0 self-loops.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Completes the restructure with the checks the build cannot perform, and
fixes two build-correctness defects found by running them.

package.json: build:jobs-api-ref ran `rimraf docs/api-ref/jobs` while the
OpenAPI plugin writes to docs/api-ref/batch, so the generated API
reference was never cleaned and spec changes silently never reached the
rendered pages. Proven by fixing an en-GB spelling in spec/batch.yaml and
watching the generated page keep the old text through a full rebuild;
proven fixed by appending a marker to a generated page and watching the
next build wipe it. This matters beyond spelling: DEL-34047 requires a
spec-side change to reach the Create a New Job page, which this bug would
have silently blocked.

spec/batch.yaml: "analysed" -> "analyzed", which propagates to six
generated api-ref pages now that regeneration works.

Also fixed: two en-GB spellings the earlier sweep missed because they were
not in its stem list (summarise, initialisation), and one in a rendered
code asset (finalised). Left "colourise" in accuracy-benchmarking alone —
it is deliberate example data demonstrating spelling normalization.

Restored biome to its 5-error baseline by formatting two sidebar files
whose indentation my regex edits had disturbed. vercel.json is
deliberately left unformatted: sync-redirects writes it without a
trailing newline, so formatting it creates perpetual churn.

Verification results for the whole migration:
- build exits 0, with onBrokenLinks and onBrokenAnchors both throwing
- 35 routes removed, 43 added; every removed route resolves via a
  redirect (the one apparent gap, /speech-to-text/languages, is served by
  its directory index under trailingSlash: false)
- 878 served redirects: 0 broken destinations, 0 broken anchors
- 0 chains and 0 self-loops, down from 8 chains before this work
- all 23 load-bearing anchors resolve
- sitemap 136 entries with 0 stale paths; llms.txt regenerated with 0
  stale paths
- 20 absolute docs.speechmatics.com links in spec/ resolve
- sidebar link hrefs, the Root.tsx anchor shim and the AsyncAPIMessage
  link all verified by hand, since the build cannot see them
- Root.tsx shim live-tested from both legacy paths
- sidebar renders Agent STT, Add-ons and Pre-recorded transcription with
  no title-case corruption
- tsc holds at 27, biome at 5, spellcheck at 14 (12 of which are in
  build/ output that the script's glob should exclude)

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

vercel Bot commented Aug 12, 2026

Copy link
Copy Markdown

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

Project Deployment Actions Updated (UTC)
docs Ready Ready Preview Aug 12, 2026 1:15pm

Request Review

@petemomo

Copy link
Copy Markdown
Collaborator Author

Live redirect verification on the preview

These checks were impossible locally — vercel.json and middleware.ts are inert under
docusaurus start, so this deployment is their first real test.

All pass, single-hop, final=200:

Category Sample Result
Renamed paths /speech-to-text/batch/quickstart 308 → /pre-recorded/quickstart
Split pages /speech-to-text/formatting 308 → /features/formatting
Merged hubs /speech-to-text/features/diarization 308 → /features/speaker-diarization
Add-ons /…/speech-intelligence/summarization 308 → /add-ons/summaries
Dissolution /voice-agents/overview 308 → /speech-to-text/agent-stt/
Legacy Flow /voice-agents-flow/setup 308 → /agent-stt/quickstart in one hop (was two)
Heaviest legacy /introduction/rt-guide, /features-other/tracking 308, fragment preserved
Oldest layer /en/real-time-saas/user-guide, /en/alignment-service 308

Two fixes confirmed working on a real deployment:

  • /on-prem/containers now resolves. It was 404ing in production because of a
    /deployements/ typo in redirects.json.
  • /features/accuracy-language-packs and /features/word-tagging now land on the right
    section. Both had pointed at anchors that never existed, silently dumping readers at the
    top of the page.

One gap found

Old .md mirror URLs 404:

/speech-to-text/pre-recorded/quickstart.md   200
/speech-to-text/batch/quickstart.md          404

Vercel redirect sources don't match the .md suffix, so cached agent-facing mirror URLs
under the renamed directories break. /llms.txt is 200 with no stale paths, so agents that
re-read the index recover on their own. Fixable with wildcard entries appended after all
exact entries — worth deciding before the real iteration rather than patching this test branch.

Brings the content of the private Melia 1 Realtime draft (PR #296) into the
restructured IA, decomposed to match it rather than landing as one page:

- mixed-language-transcription: per-pattern Tabs for the config, the Preview
  endpoint, the supported-config requirement, the LanguageInfo message
  reference, and runnable Python and JavaScript examples.
- models: a Melia 1 for streaming subsection with the Preview admonition,
  the endpoint, and the accuracy characterisation.
- authentication: the Preview endpoint in the Realtime tab, and a generalised
  note that Preview combinations share the preview.rt host with agent STT.
- streaming/output: a pointer to the mixed-language output and LanguageInfo.

Omitted under the feature-availability.md readiness rules: the draft's
"Future plans" column, its 14 "Not yet" capability rows, the October 2026
production-release date, and the "early preview / early access" framing.
Also omitted: the demo URL, the placeholder feedback-form URL, and the
11 September 2026 feedback deadline.

Resolves the plan's open item on the unknown Melia 1 streaming Preview
endpoint: it is wss://preview.rt.speechmatics.com/v2, the same host that
serves agent STT.

Content preservation: all 24 backticked identifiers and CamelCase names
from the draft appear in the destinations. Build green, sitemap unchanged
at 136 routes, both new anchors resolve.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
petemomo and others added 2 commits August 12, 2026 13:11
A reader who knows their interaction pattern had nowhere to go to choose a
model. models.mdx organised its guidance by model, so a streaming reader had
to work out for themselves which of the four applied to them, and neither
interaction-patterns.mdx nor the pattern sidebars pointed anywhere useful.

- models.mdx: "Choose a model" is now organised by interaction pattern, with
  one subsection per pattern naming its models, when to pick each, and a link
  to that pattern's feature-by-feature tables on the availability reference.
- interaction-patterns.mdx: each pattern section now names its models and
  links to the matching subsection.
- pre-recorded and streaming sidebars: a "Choosing a model" link inside the
  pattern category, so the route is visible while browsing the section.

Also restores #compare-the-models, a load-bearing anchor lost when the model
comparison table was deleted. It now points at the section that does the
comparing, so inbound links land somewhere sensible.

Agent STT needs no sidebar link: it has one model, and agent-stt/index.mdx
already names Linden 1 and links to its availability section.

Verified: build green, 136 routes unchanged, all five models.mdx anchors
resolve in the built HTML, and all 4 sidebar link hrefs resolve including
fragments (sidebar hrefs bypass onBrokenLinks, so they need their own check).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Everything outstanding from this work in one durable, diffable place, so the
follow-ups survive the branch and the session: catalogue corrections, content
gaps needing an owner, structural decisions for DevX, build and tooling debt,
the redirect checks only a deployment can run, Jira actions, and a record of
what was resolved so it is not re-reported as open.

Marks each item New or Pre-existing, since that distinction drives triage.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
petemomo and others added 2 commits August 12, 2026 14:13
The Vercel preview exposed an extra hop on every redirect whose destination
was written with a trailing slash. Under trailingSlash: false, Vercel
normalises /speech-to-text/agent-stt/ to /speech-to-text/agent-stt, so
/voice-agents/overview cost two hops instead of one: the redirect, then the
normalisation. 17 destinations in redirects.json were affected, all of them
index pages.

Local checks could not catch this: vercel.json is inert under
docusaurus start, and check-redirects.ts resolves the destination after
normalisation, so it saw a valid target either way.

Verified no collisions before rewriting: no source in redirects.json
normalises to any of the four affected targets, so this creates no chains and
no self-loops. Entry count is unchanged at 890 — destinations were rewritten,
not added. Build green, chains 0, self-loops 0.

Seven trailing-slash destinations remain, all from the legacy historical
redirect files, which are not ours to edit. Recorded as debt.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Logs the preview redirect verification as done and passing, including the two
legacy URLs that were previously broken in production. Adds three measurement
corrections found while running it: check-redirects.ts does not validate
fragments, duplicate normalized sources are 10 rather than 4 (eight benign by
design), and a destination checker must special-case static assets like
/batch.yaml. Also records the stale legacy anchor and the seven remaining
trailing-slash destinations that live in files we do not edit.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

1 participant