Skip to content

Conversation

@tylerbutler
Copy link
Member

Bumps the version to the next patch version.

tylerbutler and others added 6 commits November 24, 2025 11:28
Bumps client release group to 2.74.0.

Command used:

```
pnpm -r --include-workspace-root exec npm pkg set version=2.74.0
pnpm build --worker
```
…25912)

## Description

This PR removes the use of `object-sizeof` from the summary size check
flow.

## Context

The [object-sizeof](https://www.npmjs.com/package/object-sizeof) library
has serious sizing inconsistencies, and has shown performance issues
with large data sizes.

Using the current dependency version of object-sizeof (1.6), we can see
a string of length 13 ("Hello, World!") shows up drastically different
in a few scenarios:
```plaintext
Original string length: 13 // str.length
Sizeof original string: 26 bytes
Original buffer length: 13 // buffer.bytelength
Sizeof original buffer: 2186 bytes
Compressed string length: 21 // using Pako.deflate
Sizeof compressed string: 232 bytes
Compressed buffer length: 21 // using Pako.deflate
Sizeof compressed buffer: 232 bytes
```

Even after upgrading to object-sizeof v2.6, we can see some oddities
```plaintext
Original string length: 13 // str.length
Sizeof original string: 28 bytes
Original buffer length: 13 // buffer.bytelength
Sizeof original buffer: 13 bytes
Compressed string length: 21
Sizeof compressed string: 21 bytes
Compressed buffer length: 21
Sizeof compressed buffer: 21 bytes
```

Sizeof is known to do _some_ amount of internal multipliers to align
sizes with ECMA storage values and memory allocation. For our use-case,
we want storage-size, and we have the ability to use built-in size
checks to achieve that.
…5914)

## Description

In some scenarios, Nexus' session pruning will attempt to iterate over
too many sessions, causing a timeout or limit errors. We should allow
pre-emptively limiting the amount of sessions to retrieve from storage.

---------

Co-authored-by: zhangxin511 <[email protected]>
## Description

Fixes a grammatical mismatch (documents -> is) and a missing word.

## Reviewer Guidance

The review process is outlined on [this wiki
page](https://github.com/microsoft/FluidFramework/wiki/PR-Guidelines#guidelines).
## Description

This PR updates our `glob` depdencies to `10.5.0` to avoid using
`10.4.5` which has security vulnerabilities. Since all
consumers of `10.4.5` are able to use `10.5.0`, we only need to update
the lockfiles.

To do so I did the following:
1. Add a pnpm override to use `[email protected]`
2. Run `pnpm i --no-frozen-lockfile`
3. Remove the override
4. Run `pnpm i --no-frozen-lockfile` again

This results in the lock file no longer referencing the `10.4.5`
version.

## Misc

[AB#53799](https://dev.azure.com/fluidframework/235294da-091d-4c29-84fc-cdfc3d90890b/_workitems/edit/53799)
Renames test modules, test-cases directory, and removes unneeded folder
hierarchy.
@github-actions github-actions bot added area: build Build related issues area: dds Issues related to distributed data structures area: dds: propertydds area: dds: sharedstring area: dds: tree area: dev experience Improving the experience of devs building on top of fluid area: driver Driver related issues area: examples Changes that focus on our examples area: framework Framework is a tag for issues involving the developer framework. Eg Aqueduct area: loader Loader related issues area: odsp-driver area: runtime Runtime related issues area: tests Tests to add, test infrastructure improvements, etc dependencies Pull requests that update a dependency file labels Nov 25, 2025
@github-actions
Copy link
Contributor

Warning

WARNING: This PR is targeting a release branch!

All changes must first be merged into main and then backported to the target release branch.
Please include a link to the main PR in the description of this PR.

Changes to release branches require approval from the Patch Triage group before merging.
You should have already discussed this change with them so they know to expect it.

For more details, see our internal documentation for the patch policy and processes for
patch releases.

@github-actions github-actions bot added the base: release PRs targeted against a release branch label Nov 25, 2025
tylerbutler and others added 8 commits November 25, 2025 12:04
This PR updates oclif and related plugins to their latest versions:

- Update @oclif/core from ^4.0.30 to ^4.8.0
- Update oclif from ^4.15.16 to ^4.22.50
- Update @oclif/plugin-autocomplete from ^3.2.7 to ^3.2.39
- Update @oclif/plugin-commands from ^4.1.5 to ^4.1.38
- Update @oclif/plugin-help from ^6.2.16 to ^6.2.36
- Update @oclif/plugin-not-found from ^3.2.24 to ^3.2.73
- Update @oclif/test from ^4.1.0 to ^4.1.15
Commands used:

```
pnpm exec flub typetests -g client --reset --normalize --previous
pnpm install --no-frozen-lockfile
pnpm run build
```
…#25923)

The RegEx used to implement this rule was overly permissive and yielded
lots of false positives. This PR updates the rule to leverage the TSDoc
parser directly to extract block tags/comments and evaluate them
explicitly.

Unfortunately, this makes it harder to implement auto-fix behavior, so
that has been removed.


[AB#50920](https://dev.azure.com/fluidframework/235294da-091d-4c29-84fc-cdfc3d90890b/_workitems/edit/50920)
…t#25663)

Updates @typescript-eslint packages from v7 to v8 with necessary rule
migrations and configuration adjustments.

## Changes
- Update @typescript-eslint/eslint-plugin and @typescript-eslint/parser
to v8
- Migrate rule: `no-throw-literal` → `only-throw-error`
- Remove deprecated and deleted rules: `ban-types`,
`no-empty-interface`, and others
- I removed all typescript-eslint rules that are deleted or deprecated.
This resulted in some trivial changes to the config of some rules
(rulesets often keep the old, even deleted, rules around for awhile
"just in case" -- they just set them to "off" -- so we'll still see them
in the printed configs).
- Update codebase for new rule requirements (explicit returns, type
annotations)

## Test plan
- CI passes with updated ESLint configuration
- All lint errors resolved across codebase
The APIs neede to enable incremental summary have been tagged as @ alpha
so that they can be used by applications.
The list of APIs that are marked @ alpha:
- `configuredSharedTreeAlpha` - This is a new API which is similar to
`configuredSharedTreeBeta` but has a couple more options exposed for
configuring incremental summaries.
- `SharedTreeOptionsAlpha` - Extension of `SharedTreeOptionsBeta` that
includes options to enable incremental summarization.
- `IncrementalEncodingPolicy` - Policy type to determine whether a node
/ field should be incrementally encoded.
- `incrementalEncodingPolicyForAllowedTypes` - This function returns an
`IncrementalEncodingPolicy` which will determine if `AllowedTypes` are
opted into incremental summarization.
- `incrementalSummaryHint` - This is a symbol that should be put in the
metadata property of `AllowedTypes` to opt-in these types to be
incrementally summarized.


[AB#54252](https://dev.azure.com/fluidframework/235294da-091d-4c29-84fc-cdfc3d90890b/_workitems/edit/54252)

[AB#46028](https://dev.azure.com/fluidframework/235294da-091d-4c29-84fc-cdfc3d90890b/_workitems/edit/46028)
## Description

There are several locations that we need/want to use `StageTrace`. It
should live in a shared location to facilitate that. This takes the move
from microsoft#25643 into its own PR.

## Breaking Changes

Not technically breaking: moves internal `StageTrace` API from Nexus and
R11s-base utils into `services-core`

## Reviewer Guidance

I'm open to moving this to `services-client`, but I think this is fine.
…osoft#25927)

The standard clear event has the below limitation. It does not tell you
which subdirectory was cleared.

- It's emitted on the root SharedDirectory for all clear operations
- But it does NOT include the path of which directory was cleared

The event only provides:
- local: Whether it was a local or remote operation
- target: SharedDirectory itself

This limitation came to notice while adding event testing for directory:
microsoft#25477. The oracle needs
to track the state of every directory in the tree (root and all
subdirectories). When a clear operation happens:

- Without path information: The oracle would have to clear ALL
directories in its model, even though only one specific directory was
cleared
- Can't distinguish: A clear on /subdir1 vs /subdir2 vs root (/) would
all look the same

This change adds a new event `clearInternal` which takes in the absolute
path and it is marked as internal.


[AB#54326](https://dev.azure.com/fluidframework/internal/_workitems/edit/54326)
WillieHabi and others added 25 commits December 29, 2025 13:12
…ithRetries (microsoft#26094)

## Description

Fixes a bug where `loadSummarizerContainerAndMakeSummary` wasn't
propagating the `fullTree` flag to `trySummarizeWithRetries`, causing
incremental summaries to always be generated even when full tree
summaries were requested via the `Fluid.Summarizer.FullTree.OnDemand`
config flag.

In`trySummarizeWithRetries` we hardcode `fullTree: false`, so this meant
the `fullTree` option was silently ignored when retry logic was enabled.

## Solution

- Added `summarizeOptions` parameter to `trySummarizeWithRetries` to
accept the caller's options
- Added `summarizeOptions` parameter to `summarizeOnDemandWithRetries`
to pass through options
- Updated `summarizeOnDemand` to pass `summarizeOptions` when calling
`summarizeOnDemandWithRetries`

## Testing

Added telemetry verification to existing e2e tests to validate that:
- `fullTree` is `false` in `Summarize_generate` telemetry when config is
not set
- `fullTree` is `true` in `Summarize_generate` telemetry when
`Fluid.Summarizer.FullTree.OnDemand` config is enabled
…t#26097)

These new restrictions insulate branches and their dependents from
experiencing incomplete transaction changes.
This is important because incomplete transaction changes may not uphold
application invariants.

## Breaking Changes

This breaking change only affects the behavior of `TreeBranch` methods
(currently released as beta). These changes will be released in the next
release (2.80) which allows breaking changes to beta APIs.
* Invoking `TreeBranch.fork()` now throws an error if a transaction is
ongoing on the branch.
* Invoking `TreeBranch.merge(sourceBranch)` now throws an error if a
transaction is ongoing on the source branch.
* Invoking `TreeBranch.rebaseOnto(targetBranch)` now throws an error if
a transaction is ongoing on the target branch.

---------

Co-authored-by: Copilot <[email protected]>
…#26088)

## Context

Revision tags are used in two places:
1. On commit objects (`GraphCommit.revision`) to give the commit a
unique ID
2. In the changeset data for a given commit, including in IDs identify
subtrees that are detached by the changeset (`ChangeAtomId.revision`)

There is a general expectation that if a commit has a given revision
`foo`, then the change atom IDs in the changeset for that commit will
also utilize revision `foo` for describing changes/entities (e.g.,
detached subtrees) brought about by the changeset.
This correspondence between commit ID and changeset IDs is leveraged
when garbage-collecting detached subtrees: once the graph commit with
revision `foo` falls outside the collaboration window (and some other
conditions are met), the `DetachedFieldIndex` (which tracks detached
subtrees) garbage-collects all detached subtrees that are associated
with revision `foo`.

Transactions present a challenge because the changesets produced for the
individual edits that make up the transactions are first housed within
individual commits (all with their own revision IDs) then composed under
a single commit (with its own revision).

## Before This Change

Before this PR, the commits that represent the edits that make up the
transaction would be produced like normal (non-transaction commits):
each edit would be represented by one commit with its own ID and the
changeset in that commit would use that ID.

This then forced us to do two things when the transaction was committed
and a composed changeset with a new commit ID was produced:
1. Update the composed changeset so that its IDs used the same revision
tags as the commit object for the whole transaction.
2. Tell the `DetachedFieldIndex` to update all the IDs associated with
each of the individual composed commits so that they instead refer to
the final transaction commit ID.

IOW, we started with individual commits like this:
`[{ revision: "bar", changeset: [{id: "bar"}]}, { revision: "baz",
changeset: [{ id: "baz"}]}]`
then composed them into this:
`{ revision: "foo",  changeset: [{ id: "bar"}, { id: "baz" }]}`
then updated the changeset IDs to get this:
`{ revision: "foo",  changeset: [{ id: "foo"}, { id: "foo" }]}`

## After This Change

After this change, we start with individual commits like this:
`[{ revision: "foo", changeset: [{id: "foo"}]}, { revision: "foo",
changeset: [{ id: "foo"}]}]`
then compose them into this:
`{ revision: "foo",  changeset: [{ id: "foo"}, { id: "foo" }]}`

## Motivation

* The new approach does not require the corrective steps 1 and 2 from
the old approach.
* Fewer revision tags are minted (because we no longer mint a tag for
each transaction step)

More generally, ensuring that IDs are adjusted before the changes
applied is better for supporting future features like merging another
branch in an open transaction and reverting edits in an open
transaction. This is because such changesets come with local IDs that
may collide with the ones used in the other transaction steps'
changesets, thus requiring a more complex ID replacement mechanism. The
new approach means that only the revision-replacing code (which will
need to be used for such cases) needs to have this more complex logic,
whereas the old approach would have required all entities that use these
IDs (at least `DetachedFieldIndex`, maybe more in the future) to adopt
this more complex logic. In other words, by making the ID substitution
before other components/subsystems take a dependency on them, these
other components can remain oblivious to it.

## Noteworthy Implications

Before this change, the `GraphCommit`s on a single branch all had unique
revision tags. This is still true outside of transactions but is no
longer true in general because all the commits in a transaction now have
the same revision (the revision of the transaction). This does not
affect existing logic outside the transaction code.

## Breaking Changes

None. Some snapshot files had to be updated because the number of
revisions minted has changed: a single revision is now minted for the
whole transaction as opposed to one per step + one for the overall
transaction. This does not affect compatibility.
## Description

This PR adds one option to track socket io sockets by using socket io
room feature. Instead of adding socket object to internal map, it makes
sockets to join another unique room for later operations. It helps with
some AFR improvements in token reovcation and draining.
The change is controlled by a flag: useSocketIoRoomFeature

Changes include:
1. Add logic to add socket to a room in tracking
1. Remove deprecated code
1. Add customization to set up socket io server in web socket server
setup

## Breaking Changes
None

---------

Co-authored-by: Yunho <[email protected]>
Co-authored-by: Yunho <[email protected]>
… deps (microsoft#26016)" (microsoft#26101)

This slightly reverts commit 7d88924 by
restoring client root dev dependency on `type-fest` that is required by
imports of `@fluidframework/build-tools` but is not declared as a
regular dependency.
)

This bug was discovered while adding an oracle for directory. The events
are being emitted for disposed or unreachable directory and
subdirectories. To fix this, I added the `isNotDisposedAndReachable`
check.

When processing remote operations (set, delete, clear), we need to
decide whether to emit events. However, there's a timing window issue:

1. User calls deleteSubDirectory("foo") locally
2. A pending delete is added, but disposed stays false
3. The directory won't be fully disposed until the delete op is
sequenced
4. During this window, the directory is invisible in the optimistic view
but not yet disposed
5. Just checking !this.disposed would be incorrect because:
- The directory might have a pending delete → should NOT emit events
- An ancestor might have a pending delete → directory is unreachable →
should NOT emit events

The below two conditions are needed:
- `!this.disposed`: Directory itself isn't fully deleted
- `getWorkingDirectory !== undefined`: Directory is reachable (no
pending ancestor deletes)


[ADO#54749](https://dev.azure.com/fluidframework/internal/_workitems/edit/54749)
…ar locally (microsoft#26102)

Remote ops emit valueChanged ops for deleted keys. This change adds the
same behavior for local ops.


[ADO#55457](https://dev.azure.com/fluidframework/internal/_workitems/edit/55457)
## Description

Portion of microsoft#25597 to expose `container.uploadBlob` via OdspClient's
OdspFluidContainer.

## Reviewer Guidance

Advice on tests/docs necessary to alter the beta API in this way would
be appreciated.
according to actual Audience behavior.
[AB#56268](https://dev.azure.com/fluidframework/235294da-091d-4c29-84fc-cdfc3d90890b/_workitems/edit/56268)

Pay attention to connectivity only while self-client is a member of the
[Signal-based] Audience. Attendee status can only be properly
represented while self client is a member of the audience. Otherwise,
audience might be in the process of refreshing.

Also fix
[AB#56270](https://dev.azure.com/fluidframework/235294da-091d-4c29-84fc-cdfc3d90890b/_workitems/edit/56270)
- PresenceDatastoreManager check for alternateProvider (alternate
primary join provider nomination) such that Join signal is actually
deferred (improving overall Join performance) until self is known in
audience.

Relocate "joined" sense to PresenceManager
- Move and simplify logic (from PresenceDatastoreManager) to handle Join
timing. SystemWorkspace (that manages Attendees) should be coordinated
as-well; so, keep all of the logic for when to Join in PresenceManager.
- Now self-Attendee status should reflect when Presence as a whole
thinks it has joined.

Future: self-Attendee connect event "attendeeConnected" should be
announced.

Add a container-runtime test option to disable Summarizer such that
Presence multi-client tests are more efficient and reliable (no
Summarizer needed).
…Core (microsoft#26113)

## Summary
- Fixes error "Internal error: calling method before _details is
initialized!" thrown when `disconnectCore` is called before the
connection handshake completes
- Added `this.hasDetails` check before accessing `this.clientId` in
`R11sDocumentDeltaConnection.disconnectCore`

## Problem
When `disconnectCore` is called before `initialize` completes (e.g.,
connection timeout, connect_error), `_details` is undefined. The
`clientId` getter accesses `details`, which throws if `_details` is not
initialized. This prevents proper socket disconnect and causes telemetry
errors.

## Solution
Check `this.hasDetails` (a protected getter in the base class) before
accessing `this.clientId`. If the handshake never completed, we skip the
`client_disconnect` emit—which is appropriate since there's no clientId
to report anyway.


[AB#56336](https://dev.azure.com/fluidframework/235294da-091d-4c29-84fc-cdfc3d90890b/_workitems/edit/56336)
…microsoft#26118)

Packages that re-export type-fest types in their public API need
type-fest as a production dependency, not a dev dependency.

## Changes

- **build-infrastructure**: exports `Opaque`, `PackageJson`,
`SetRequired` from type-fest in its public API
- **build-tools**: exports `PackageJson` which uses `SetRequired` from
type-fest

This ensures consumers of these packages have access to the type-fest
types at compile time.
…26108)

Enable the unicorn/explicit-length-check ESLint rule in the
@fluidframework/tree package. This is part of an ongoing effort to
incrementally remove global ESLint rule overrides from eslint.config.mts
and .eslintrc.cjs.

This rule enforces more explicit and readable length/size checks by
standardizing:
  - length !== 0 → length > 0 (checking for non-empty)
  - length >= 1 → length > 0 (checking for non-empty)
  - length < 1 → length === 0 (checking for empty)
…#26114)

Removes multiple unicorn/prefer-* rule overrides from the
@fluidframework/tree package and fixes the resulting errors. This PR
enables the following ESLint rules by fixing all violations:

  - prefer-string-slice: Replace substring() with slice()
- prefer-native-coercion-functions: Use String/Number directly instead
of wrapper arrows
- prefer-array-some: Replace .find() !== undefined and .findIndex() !==
-1 with .some()
  - prefer-set-has: Use Set.has() for repeated membership checks
- prefer-default-parameters: Use default parameter syntax instead of ||
fallbacks
- prefer-array-index-of: Replace .findIndex(x => x === val) with
.indexOf(val)

This is part of an ongoing effort to incrementally remove global ESLint
rule overrides from eslint.config.mts and .eslintrc.cjs.
| Override Name | Errors Fixed | Files Touched | Overrides Still
Required |

|---------------|--------------|---------------|--------------------------|
  | `unicorn/prefer-string-slice` | 6 | 3 | 0 |
  | `unicorn/prefer-native-coercion-functions` | 3 | 1 | 0 |
  | `unicorn/prefer-array-some` | 3 | 3 | 0 |
  | `unicorn/prefer-dom-node-remove` | 0 | 2 | 2 (inline) |
  | `unicorn/prefer-set-has` | 1 | 1 | 0 |
  | `unicorn/prefer-default-parameters` | 1 | 1 | 0 |
  | `unicorn/prefer-math-trunc` | 0 | 0 | 0 |
  | `unicorn/prefer-array-index-of` | 1 | 1 | 0 |
…crosoft#26115)

Removes the unicorn/no-lonely-if: off override from the
@fluidframework/tree package and fixes the resulting errors. Combines
nested if statements that are the only statement in their parent if
block (without an else) into single conditions using &&.

This is part of an ongoing effort to incrementally remove global ESLint
rule overrides from eslint.config.mts and .eslintrc.cjs.

All fixes follow the same pattern - combining nested conditions with &&:
…6109)

Removes the unicorn/prefer-spread: off override from the
@fluidframework/tree package and fixes the resulting errors. Replace
Array.from(), Array.slice(), and Array.concat() calls with spread syntax
to comply with the unicorn/prefer-spread ESLint rule. This is part of an
ongoing effort to incrementally remove global ESLint rule overrides from
eslint.config.mts and .eslintrc.cjs.

**ESLint Disable Overrides:**
In src/test/simple-tree/list.spec.ts, five instances required inline
eslint-disable-next-line comments:

- concat() method tests (3 occurrences): These tests specifically verify
concat() behavior with proxy arrays and spreadability - converting them
would defeat the test purpose.
- reduce()/reduceRight() callbacks (2 occurrences): concat() preserves
TypeScript type inference better than spread in this context, avoiding
@typescript-eslint/no-unsafe-return errors.
This partially reverts "build: streamline by removing unneeded build
deps (microsoft#25733)" (commit ee07c75).

It lets "compile" task only depend on ancestor "api" and preserves the
commented out line removal.

To make the build more efficient, API entrypoint generation should be
made distinct from api-extractor reports.
…26106)

## Description

This PR addresses two limitations of the current revision replacement
capabilities:
1. The inability to handle inputs where the same `localId` value is used
in the context of different revisions.
2. The inability to map the same `ChangeAtomId` input value to the same
`ChangeAtomId` output value across multiple modular changesets.

See the new tests in src/test/shared-tree/sharedTreeChangeFamily.spec.ts
for more details on the relevant scenarios.

## Motivation

Both limitations need to be addressed in order for merging and reverting
to be supported within open transactions.

## Breaking Changes

None

---------

Co-authored-by: daesunp <[email protected]>
…26122)

Removes the unicorn/no-negated-condition: off override from the
@fluidframework/tree package and fixes the resulting errors. Refactors
negated conditions to use positive conditions with swapped branches.
This is part of an ongoing effort to incrementally remove global ESLint
rule overrides from eslint.config.mts and .eslintrc.cjs. No inline
overrides needed.

Changes include:
  - x !== undefined ? valueA : valueB
  + x === undefined ? valueB : valueA

  - !isValid(x) ? defaultValue : x
  + isValid(x) ? x : defaultValue

  - if (!condition) { doA(); } else { doB(); }
  + if (condition) { doB(); } else { doA(); }

  - if (x !== y) { doA(); } else { doB(); }
  + if (x === y) { doB(); } else { doA(); }

Some changes had nested negated conditions that needed multiple swaps.
…n receiving ops (microsoft#26099)

Added validation that the clientSequenceNumbers for a given client are
always increasing. Currently, if the clientSequenceNumber for a client
is repeated (say, the same op is sequenced twice by the service), it
doesn't fail when the op is received in delta manager. It instead fails
later when the op is processed for consumption. For exampls, we have
been seeing failures with assert 0x645 which is thrown by id compressor
when it sees these duplicate ops.

With this validation, these failures should be deteced as soon as the op
is received by the delta manager with a much clear data corruption error
because the document is corrupted in these scenarios.


[AB#53297](https://dev.azure.com/fluidframework/235294da-091d-4c29-84fc-cdfc3d90890b/_workitems/edit/53297)
Generates release notes and changelogs for the 2.80.0 release.
## Problem
The `glob.IOptions` type is exported in the public API of build-tools,
so the types need to be a prod dep, not a devDep.
This change implements the No Change constraint in SharedTree for the
table support effort.

To implement this constraint, we:
1 - Added a new EncodedModularChangesetV2 type
i - This also required us to refactor EncodedModularChangeset by
renaming it to EncodedModularChangesetV1 and exporting a couple more
types from that file for reuse by EncodedModularChangesetV2
ii - Lightly refactored modular changeset codec to handle codec versions
iii - Created new versions for related codecs to use the new encoded
modular changeset

2 - Added a new TransactionConstraint, named NoChangeConstraint, to the
public API
i - Since the new constraint is an alpha API, we couldn't union it
directly onto the preexisting TransactionConstraint type (which is
public), this PR adds a new TransactionConstraintAlpha type which
includes NoChangeConstraint
ii - Update SharedTree alpha APIs which used to use
TransactionConstraints use TransactionConstraintAlpha

---------

Co-authored-by: yann-achard-MS <[email protected]>
@tylerbutler tylerbutler closed this Jan 8, 2026
@tylerbutler tylerbutler deleted the bump-release-branch branch January 8, 2026 02:34
@tylerbutler tylerbutler restored the bump-release-branch branch January 8, 2026 02:35
@github-actions
Copy link
Contributor

github-actions bot commented Jan 8, 2026

🔗 No broken links found! ✅

Your attention to detail is admirable.

linkcheck output


> [email protected] ci:check-links /home/runner/work/FluidFramework/FluidFramework/docs
> start-server-and-test "npm run serve -- --no-open" 3000 check-links

1: starting server using command "npm run serve -- --no-open"
and when url "[ 'http://127.0.0.1:3000' ]" is responding with HTTP status code 200
running tests using command "npm run check-links"


> [email protected] serve
> docusaurus serve --no-open

[SUCCESS] Serving "build" directory at: http://localhost:3000/

> [email protected] check-links
> linkcheck http://localhost:3000 --skip-file skipped-urls.txt

Crawling...

Stats:
  248690 links
    1795 destination URLs
    2034 URLs ignored
       0 warnings
       0 errors


Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area: build Build related issues area: dds: propertydds area: dds: sharedstring area: dds: tree area: dds Issues related to distributed data structures area: dev experience Improving the experience of devs building on top of fluid area: driver Driver related issues area: examples Changes that focus on our examples area: framework Framework is a tag for issues involving the developer framework. Eg Aqueduct area: loader Loader related issues area: odsp-driver area: runtime Runtime related issues area: tests Tests to add, test infrastructure improvements, etc base: release PRs targeted against a release branch dependencies Pull requests that update a dependency file

Projects

None yet

Development

Successfully merging this pull request may close these issues.