When multiple MCP servers start within the same second, they derive the
same log filename from datetime_tag() (second-level precision only).
Both then open the file with mode='w', causing one server's logs to be
truncated and all subsequent output to be interleaved.
Appending os.getpid() to the filename guarantees uniqueness across
concurrent processes regardless of timing.
* Apply in FSharpLanguageServer and CSharpLanguageServer
* CSharpLanguageServer: Disabled auto-install of .NET (does not work reliably)
and remove corresponding test
* Remove TestFSharpLanguageServerSetup
Marksman returns all headings (h1-h6) with SymbolKind.String (15), which
causes them to be treated as low-level symbols and filtered out of
get_symbols_overview results.
Override request_document_symbols in Marksman to remap SymbolKind.String
to SymbolKind.Namespace, which is semantically appropriate for headings
(named sections containing other content) and ensures they appear in
symbol overviews.
Modes could not activate optional tools, because optional tools were not in the base toolset.
Base toolset computation was fully refactored, now considering all initial modes in the sense
that their inclusions are definitely part of the base toolset.
Dynamic mode changes after agent creation are still subject to the constraint that they
can essentially only disable tools; while they can technically also enable tools,
enabling is not effective unless the tools were also in the exposed toolset (as clients
otherwise cannot "see" them).
Fixes#1105
Replace the automatic timed banner rotation with a random initial banner
selection and small, manually operated arrow buttons for navigation.
Previous behavior can be restored by setting BannerRotation.automaticRotationEnabled to true.
The original slides used position:absolute + opacity for transitions.
This was changed to display:none/block because absolutely positioned
children don't contribute to their parent container's dimensions, causing
the banner containers to collapse to zero width/height. The arrow buttons
(position:absolute, top:50%) need a parent with real dimensions to
center correctly. With display:none/block, the active slide determines
the container's natural size.
The fixed height:60px on .gold-banner was removed for the same reason —
it clipped banner images that are taller than 60px.
An explicit height was added to .header-banner to ensure the arrow
buttons can vertically center via top:50% within the platinum banner area.
The test wrote two values to a file and relied on a 3-second sleep for
the filesystem mtime to advance, which fails when both writes land in
the same second (ext4/tmpfs have 1-second mtime granularity).
Fix: use os.utime() to explicitly bump mtime after the second write.
This is deterministic, instant, and tests the actual cache invalidation
logic (mtime comparison) rather than hoping the clock advances.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>