Repository navigation
Narrated films for every docs page, and the bugs filming found - #392
Merged
Merged
Conversation
Every docs page with a feature to show now opens on a narrated walkthrough of the real extension, captioned in English, Japanese and Chinese: getting started, editor setup, configuration, F# language support, completions, hover, navigation, diagnostics, refactoring, context menus, NuGet, the profiler (a C# tour), memory leaks (now narrated, on the layered retention graph), architecture and contributing. The language films run on demos/Shop.slnx, C# and F# in one solution, and show F# first. Bugs the cameras found, each fixed test-first: - F#: hand-built project options put every source file on the FCS command line as well as in SourceFiles, so FCS compiled each file twice and every F# project showed FS3551 warnings. - Sort Members kept each member's own blank lines and added its own, leaving two or three blank lines between members. - NuGet: the version picker beside Install showed the newest listed version, often a prerelease, not the version Install sends. The film kit gains language acts (completion, quick fixes, rename, navigation, the Solution Explorer), a gliding pointer, retried takes, logs kept from a failed shoot, and a neutral environment: staging, temp files and a cloned .NET install under /tmp, with the login shell's environment off, so no home path reaches a frame.
MelbourneDeveloper
enabled auto-merge (squash)
October 18, 2026 13:19
MelbourneDeveloper
added a commit
that referenced
this pull request
Oct 19, 2026
## TLDR Website films play in Windows Chrome and Edge again: every video lists its H.264 MP4 before its VP9 WebM, and a new playback test proves frames actually decode. ## Details - **Root cause.** Windows Chrome/Edge accept the VP9 `<source>`, decode one frame, then stop with `PIPELINE_ERROR_DECODE`, and never try the next source. Every film listed WebM first, so every film failed there. - **`src/_data/videos.json`**: all 18 films now list `["mp4", "webm"]`. - **`video-figure.js`**: the VideoObject `contentUrl` points to the first (preferred) encoding instead of the last, so search engines link the MP4. - **New `tests/video-playback.spec.js`**: plays 20 films across docs and blog pages, then pauses, seeks to the middle and resumes. Each step checks that the clock advances, frames decode (`getVideoPlaybackQuality().totalVideoFrames`) and `video.error` stays null. A served file and a resolved `play()` don't prove playback. - **`tests/media.js`**: a new `expectFramesAdvance` helper, which also catches decode errors raised after `play()` resolves. - **`playwright.config.js`**: on Windows, the playback spec also runs on installed Chrome and Edge, where the bug reproduced; bundled Chromium and WebKit passed. The phone projects use installed Chrome there because Windows WebKit rejects known-good H.264. - **`docs/specs/DESIGN-SYSTEM.md` [WEB-DESIGN-MEDIA]** records the MP4-first rule and the playback-test requirement. - **Test expectations** in `profiler-media.spec.js` and `site-videos.spec.js` now expect MP4 first. - **Branch housekeeping.** This branch also merges the stale branches `feature/narrated-doc-films`, `feature/doc-stills` and `fix/382-netfx-review-findings` (all already squash-merged as #392, #393 and #385), plus `dependabot-upgrades`. None of them changes any file against main: - main already had every bump except TypeScript 7, which typescript-eslint 8.72 does not support yet (peer range `<6.1.0`); - the `lspkit` pin stays on lspkit `main` (`ccc59bf`). ## How Do The Automated Tests Prove It Works? - **`video-playback.spec.js`**: one test per film, named `<route> video <n> decodes, pauses, seeks and resumes`. It runs on Chromium, iPhone SE and iPhone 14 everywhere, and on Windows also on installed `chrome` and `msedge`. Each film must: - advance more than 1s and decode more than 5 new frames with `error === null`; - stay put while paused, so `currentTime` is unchanged after 250ms; - advance and decode again after seeking to `duration / 2`. - **`site-videos.spec.js` › `expectDescribed`** asserts the VideoObject `contentUrl` is the first listed source. - **`profiler-media.spec.js`** asserts the hero film's `<source>` order is MP4 then WebM. - **The full website Playwright suite (`make _test-website`)** passes locally, and Deslop reports 6.5% against the 6.65% threshold. --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
TLDR
Every docs page with a feature to show now opens on a narrated film of the real extension, captioned in en/ja/zh. Three bugs the filming exposed are fixed test-first.
Details
Films. There are 14 new films, and the leak film is reshot with narration. Each is published as MP4 (AAC) and WebM (Opus) in LFS, with a WebP poster and
.en/.ja/.zh.vttcaptions. Each is catalogued invideos.jsonand placed after its page's introduction in all three languages:getting-started(replacessharplsp-touron this page; the blog keeps it)editor-setupconfiguration:sharplsp.tomlwith monorepo mode → SLSPC0101fsharp-language(the page also keepsprofiler-fsharp)code-completionshovernavigationdiagnosticsrefactoringcontext-menusnuget(installs FsToolkit.ErrorHandling into the F# project)profiler-csharp(replacesprofiler-filmat the top; home and blog keep it)profiler-fix-memory-leak, now narrated and on the layered retention grapharchitecture: the host log routing an F# hover to FCS and a C# hover to Roslyn, then tree-sitter foldingcontributingThe Zed page has no film. Filming a native Metal app would mean recording the real desktop through OS permissions. [WEB-DESIGN-MEDIA] now says so.
The language films run on the new
demos/Shop.slnx, which holds the C# Storefront and the F# FsStorefront in one solution. F# is shown first.Catalog.Generategains an XML doc comment for the hover film.Bug fixes (each with a failing test first).
FSharpProjectLoading.buildProjectOptionspassed every source file toGetProjectOptionsFromCommandLineArgsand also setSourceFiles. FCS compiled each file twice, so every single-target F# project without a C# reference showed FS3551 ("already appeared in the compilation list") on every source. Sources now go inSourceFilesonly.sort_members::build_editscopied each member's leading blank lines and also added its own separators, which left two or three blank lines between members. The reordered text is now built byreordered_text/leading_layout. A type whose members are separated by blank lines keeps exactly one between each; a compact type stays compact, with one blank line only where a new accessibility/category group starts. CRLF is preserved.buildDetailsHtml: the version picker beside Install selected nothing, so it showed the newest listed version (often a prerelease such as6.0.0-beta003), while Install sends the search result's stable version. It now showsinstalledVersion ?? version.Film kit (
src/website/tools/profiler-film/, see its README).kit/acts/language.mjs:LANGUAGEsettings,prepareCode/warm,scene(clip, step, caption, act, { speed, retries }),complete,quickFix,renameTo,navigate(fails the take on "No definition found"),peekReferences,hoverEach,settingsEditor;kit/acts/shop.mjs: moves on the Shop demo shared by several films, plusready(...);kit/acts/explorer.mjs: Solution Explorer context menus;kit/acts/tour.mjs:profilerTour, now used by both profiler films;kit/code.mjs: finds a word on a line on screen, and hovers or clicks it.overlay.pointAt: a pointer that glides to what the film acts on. Stills hide it, as they hide the caption.SHOP, andREPO(agit archiveof HEAD and lspkit, opened with the extension disabled). A film can supply its own workspacesettings. A failed shoot copies the editor's logs toout/<film>/logs./tmp;--force-disable-user-env, on a copy-on-write clone of the .NET install at/tmp/sharplsp-film-dotnet, so the SDK path and any command a terminal prints are neutral;window.menuStyle: custom).voice.mjsloads kokoro-js only when it speaks. Its phonemizer used to print its own source over any failed shoot.[WEB-DESIGN-MEDIA]covers the language films, the narrated walkthrough on every page, and when a terminal may appear: F# Interactive, a build task, or a shell with no profile and a bare$prompt.Docs. The architecture page (en/ja/zh) now says a restarted sidecar does not yet reload its workspace (#386).
Issues filed for bugs found but not fixed here: #386 (restarted sidecar not rehydrated), #387 (F# F12 on a module-qualified call right after load), #388 (F# hover lacks .NET XML docs), #389 (F# inlay-hint layout), #390 (no
DiagnosticTag.Unnecessary), #391 (metadata as source decompiles reference assemblies).How Do The Automated Tests Prove It Works?
FSharpProjectCrackingTests›hand-built options name each source once, so FCS never sees a file twicefailed before the fix (the source was inOtherOptions). It now passes. It also checks the project withParseAndCheckProjectand asserts no FS3551 and no diagnostics at all. The full F# sidecar suite passes, 440/440.FSharpNavigationEdgeTests›definition of a module-qualified call lands in the declaring file the editor never opened(passes; F#: Go to Definition on Checkout.checkout finds nothing until Checkout.fs has been opened #387 still needs the editor's fresh-session state reproduced).sort_members_extra›test_sort_members_keeps_one_blank_line_between_membersandtest_sort_members_keeps_compact_members_compactboth failed before the fix ("\n\n\n\n"; blank lines added to a compact type) and now pass. All 16 sort-members e2e tests and the 6 unit tests pass, and clippy is clean.NuGet Browser — pure html›buildHtml details panel shows the version Install installs, not the newest prereleasefailed before the fix ("the picker shows the version Install sends") and now passes (20/20).npm run lintpasses: prettier, eslint and tsc.npx playwright testpasses locally: 604 passed and 11 skipped, the skips by layout.site-videos.spec.js, every docs page in every language:VideoObjectthat matches the player's label;text/vtttracks and the page's language as default;profiler-media.spec.js: the Profiler page now opens on theprofiler-csharpposter.deslop .reports 6.5% (6.6% before), under the 6.65% threshold.