fluid-framework 2.71.0 → 2.73.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,126 @@
1
1
  # fluid-framework
2
2
 
3
+ ## 2.73.0
4
+
5
+ ### Minor Changes
6
+
7
+ - Schema snapshot compatibility checker ([#25861](https://github.com/microsoft/FluidFramework/pull/25861)) [e5be416321](https://github.com/microsoft/FluidFramework/commit/e5be4163210ef68b7f8a7c10502f4871c30ec9f3)
8
+
9
+ This change adds alpha APIs for creating snapshots of view schema and testing their compatibility for the purposes
10
+ of schema migrations.
11
+
12
+ New APIs:
13
+ - `checkCompatibility` - Checks the compatibility of the view schema which created the document against the view schema
14
+ being used to open it.
15
+ - `importCompatibilitySchemaSnapshot` - Parse a JSON representation of a tree schema into a concrete schema.
16
+ - `exportCompatibilitySchemaSnapshot` - Returns a JSON representation of the tree schema for snapshot compatibility checking.
17
+
18
+ #### Example: Current view schema vs. historical view schema
19
+
20
+ An application author is developing an app that has a schema for storing 2D Points.
21
+ They wish to maintain backwards compatibility in future versions and avoid changing their view schema in a way that breaks
22
+ this behavior.
23
+ When introducing a new initial schema, they persists a snapshot using `exportCompatibilitySchemaSnapshot`:
24
+
25
+ ```ts
26
+ const factory = new SchemaFactory("test");
27
+
28
+ // The past view schema, for the purposes of illustration. This wouldn't normally appear as a concrete schema in the test
29
+ // checking compatibility, but rather would be loaded from a snapshot.
30
+ class Point2D extends factory.object("Point", {
31
+ x: factory.number,
32
+ y: factory.number,
33
+ }) {}
34
+ const viewSchema = new TreeViewConfiguration({ schema: Point2D });
35
+ const encodedSchema = JSON.stringify(
36
+ exportCompatibilitySchemaSnapshot(viewSchema),
37
+ );
38
+ fs.writeFileSync("PointSchema.json", encodedSchema);
39
+ ```
40
+
41
+ Next they create a regression test to ensure that the current view schema can read content written by the original view
42
+ schema (`SchemaCompatibilityStatus.canUpgrade`). Initially `currentViewSchema === Point2D`:
43
+
44
+ ```ts
45
+ const encodedSchema = JSON.parse(fs.readFileSync("PointSchema.json", "utf8"));
46
+ const oldViewSchema = importCompatibilitySchemaSnapshot(encodedSchema);
47
+
48
+ // Check to see if the document created by the historical view schema can be opened with the current view schema
49
+ const compatibilityStatus = checkCompatibility(
50
+ oldViewSchema,
51
+ currentViewSchema,
52
+ );
53
+
54
+ // Check to see if the document created by the historical view schema can be opened with the current view schema
55
+ const backwardsCompatibilityStatus = checkCompatibility(
56
+ oldViewSchema,
57
+ currentViewSchema,
58
+ );
59
+
60
+ // z is not present in Point2D, so the schema must be upgraded
61
+ assert.equal(backwardsCompatibilityStatus.canView, false);
62
+
63
+ // The schema can be upgraded to add the new optional field
64
+ assert.equal(backwardsCompatibilityStatus.canUpgrade, true);
65
+ ```
66
+
67
+ Additionally, they a regression test to ensure that older view schemas can read content written by the current view
68
+ schema (`SchemaCompatibilityStatus.canView`):
69
+
70
+ ```ts
71
+ // Test what the old version of the application would do with a tree using the new schema:
72
+ const forwardsCompatibilityStatus = checkCompatibility(
73
+ currentViewSchema,
74
+ oldViewSchema,
75
+ );
76
+
77
+ // If the old schema set allowUnknownOptionalFields, this would be true, but since it did not,
78
+ // this assert will fail, detecting the forwards compatibility break:
79
+ // this means these two versions of the application cannot collaborate on content using these schema.
80
+ assert.equal(forwardsCompatibilityStatus.canView, true);
81
+ ```
82
+
83
+ Later in the application development cycle, the application author decides they want to change their Point2D to
84
+ a Point3D, adding an extra field:
85
+
86
+ ```ts
87
+ // Build the current view schema
88
+ const schemaFactory = new SchemaFactory("test");
89
+ class Point3D extends schemaFactory.object("Point", {
90
+ x: factory.number,
91
+ y: factory.number,
92
+
93
+ // The current schema has a new optional field that was not present on Point2D
94
+ z: factory.optional(factory.number),
95
+ }) {}
96
+ ```
97
+
98
+ The test first compatibility test will pass as the Point2D schema is upgradeable to a Point3D schema.
99
+ However, the second compatibility test fill fail as an application using the Point2D view schema cannot collaborate on
100
+ content authored using the Point3D schema.
101
+
102
+ ## 2.72.0
103
+
104
+ ### Minor Changes
105
+
106
+ - `formatVersion` removed from the options passed to `configuredSharedTree` ([#25752](https://github.com/microsoft/FluidFramework/pull/25752)) [df533906e3](https://github.com/microsoft/FluidFramework/commit/df533906e3a8e5d54024009704ca0c0eedb95e95)
107
+
108
+ Note: this change may break users of alpha APIs. See below for details.
109
+
110
+ `SharedTreeOptions` (which is passed to `configuredSharedTree`) no longer includes a `formatVersion: SharedTreeFormatVersion[keyof SharedTreeFormatVersion]` field.
111
+ The concept of `SharedTreeFormatVersion` has been removed altogether.
112
+ Instead, users are expected to leverage the already existing `minVersionForCollab` field.
113
+
114
+ For migration purposes, the mapping from `SharedTreeFormatVersion` to `minVersionForCollab` is as follows:
115
+ - `SharedTreeFormatVersion.v1`: no supported equivalent
116
+ - `SharedTreeFormatVersion.v2`: no supported equivalent
117
+ - `SharedTreeFormatVersion.v3`: `minVersionForCollab: FluidClientVersion.v2_0`
118
+ - `SharedTreeFormatVersion.v5`: `minVersionForCollab: FluidClientVersion.v2_43`
119
+ - `SharedTreeFormatVersion.vSharedBranches`: `minVersionForCollab: FluidClientVersion.v2_43` + `SharedTreeOptions.enableSharedBranches`
120
+
121
+ The values for which there is no supported equivalent `minVersionForCollab` were never given official support.
122
+ [Contact](https://github.com/microsoft/FluidFramework/issues) the Fluid Framework team if you need help migrating away from them.
123
+
3
124
  ## 2.71.0
4
125
 
5
126
  ### Minor Changes
@@ -61,7 +182,6 @@
61
182
  - A minimal set of branching APIs has been promoted to beta. ([#25744](https://github.com/microsoft/FluidFramework/pull/25744)) [32cc2c75d8](https://github.com/microsoft/FluidFramework/commit/32cc2c75d82c35403caa91e67e81f71baee5d092)
62
183
 
63
184
  The following APIs have been promoted to beta in `@fluidframework/tree`:
64
-
65
185
  - `TreeBranch.fork()`
66
186
  - `TreeBranch.merge()`
67
187
  - `TreeBranch.rebaseOnto()`
@@ -186,7 +306,6 @@
186
306
  The `@alpha` API `JsonValidator` has been removed: its replacement `FormatValidator` must now be used.
187
307
 
188
308
  As part of this:
189
-
190
309
  - `typeboxValidator` has been replaced with `FormatValidatorBasic`.
191
310
  - `noopValidator` has been replaced with `FormatValidatorNoOp`.
192
311
 
@@ -342,7 +461,6 @@ Dependency updates only.
342
461
  The APIs that operate on batches should be used instead.
343
462
 
344
463
  Specifically:
345
-
346
464
  - `insertColumn`
347
465
  - Use `insertColumns` instead
348
466
  - `insertRow`
@@ -362,7 +480,6 @@ Dependency updates only.
362
480
  - Remove unnecessary and internal APIs in ISequenceIntervalCollection and related interval types ([#25244](https://github.com/microsoft/FluidFramework/pull/25244)) [15d476ea706](https://github.com/microsoft/FluidFramework/commit/15d476ea7069eb4de317a726733aa8fb9e8486e8)
363
481
 
364
482
  The following APIs are now removed:
365
-
366
483
  - `IInterval.clone`
367
484
  - `IInterval.modify`
368
485
  - `IInterval.union`
@@ -508,7 +625,6 @@ Dependency updates only.
508
625
  - Allow edits in arrays to be concurrent to dependent edits of transactions with violated constraints ([#25191](https://github.com/microsoft/FluidFramework/pull/25191)) [ef64bae6ab2](https://github.com/microsoft/FluidFramework/commit/ef64bae6ab2848c67d778d14ad56ae021f54ac7a)
509
626
 
510
627
  Before this release, making concurrent edits to an array could lead to assertion error `0x8a2` being thrown if the following conditions were met:
511
-
512
628
  - Some edit `e1` was a transaction with a constraint that turned out to be violated by edits concurrent to (and sequenced before) `e1`
513
629
  - Some edit `e2` was dependent on `e1` (from before the violation of its constraint)
514
630
  - Some edit `e3` was concurrent to and sequenced after both `e1` and `e2`
@@ -558,7 +674,6 @@ Dependency updates only.
558
674
  (This is the case when nodes are removed before attaching and there is a local branch that forks from a commit that made such a removal or from an earlier commit. This is also the case when retaining `Revertible` objects for those commits).
559
675
 
560
676
  After this release, the behavior depends on the `CodecWriteOptions.oldestCompatibleClient` value:
561
-
562
677
  - For values < `FluidClientVersion.v2_52`, the behavior is the same.
563
678
  - For values >= `FluidClientVersion.v2_52`, the attach will succeed, but use a newer storage format.
564
679
 
@@ -654,7 +769,6 @@ Dependency updates only.
654
769
  We recommend updating your code to be more tolerant of unknown node kinds going forward.
655
770
 
656
771
  Also see alternative options for schema-agnostic tree traversal if needed:
657
-
658
772
  - [Tree.parent](https://fluidframework.com/docs/api/fluid-framework/treenodeapi-interface#parent-methodsignature)
659
773
  - [TreeAlpha.child](https://fluidframework.com/docs/api/fluid-framework/treealpha-interface#child-methodsignature)
660
774
  - [TreeAlpha.children](https://fluidframework.com/docs/api/fluid-framework/treealpha-interface#children-methodsignature)
@@ -1066,7 +1180,6 @@ Dependency updates only.
1066
1180
 
1067
1181
  Table trees created using `TableSchema` offer various APIs to make working with tabular data easy.
1068
1182
  These include:
1069
-
1070
1183
  - Insertion and removal of columns, rows, and cells.
1071
1184
  - Cell access by column/row.
1072
1185
 
@@ -1212,7 +1325,6 @@ Dependency updates only.
1212
1325
  You can retrieve the long identifier with `TreeAlpha.identifier(node)`, where `node` is a `TreeNode`. The long identifier is a stable, compressible UUID generated by the tree.
1213
1326
  In cases where the node does not yet have an identifier assigned, this will return `undefined`.
1214
1327
  These cases include:
1215
-
1216
1328
  - The node does not contain an identifier field.
1217
1329
  - The node is a non-hydrated node with a user provided identifier. Note that if it is a non-hydrated node without an identifier provided, it will throw an error.
1218
1330
 
@@ -1223,7 +1335,6 @@ Dependency updates only.
1223
1335
  to get the original valid long `identifier` back.
1224
1336
  In the cases where it's not possible to shorten the `identifier`, it will return `undefined`.
1225
1337
  These cases include:
1226
-
1227
1338
  - A compressible long identifier, but it is unrecognized by the tree that the node belongs to. This can occur if the identifier is not generated from the tree.
1228
1339
  - An identifier which is not compressible by the tree. This can occur if the node's identifier was a user provided string.
1229
1340
 
@@ -1233,7 +1344,6 @@ Dependency updates only.
1233
1344
  If the method returns a valid long identifier, this identifier can be passed into `TreeAlpha.identifier.shorten` to get the original `identifier` back.
1234
1345
  In the cases where it's not possible to lengthen the `identifier`, this method will throw an error.
1235
1346
  These cases include:
1236
-
1237
1347
  - An unrecognized short identifier. This can occur if the identifier is not generated from the tree.
1238
1348
 
1239
1349
  #### TreeAlpha.identifier.getShort
@@ -1254,7 +1364,6 @@ Dependency updates only.
1254
1364
 
1255
1365
  In cases where the node provided does not contain an identifier that is recognized or compressible by the tree that the node belongs to, this method will return undefined.
1256
1366
  This will occur in the following cases:
1257
-
1258
1367
  - The node is an non-hydrated node with a user provided identifier. Note that if it is an non-hydrated node without an identifier provided, it will throw an error.
1259
1368
  - The node does not contain an identifier field.
1260
1369
  - The node contains a compressible long identifier, but it is unrecognized by the tree that the node belongs to. This can occur if the identifier is not generated from the tree.
@@ -1389,7 +1498,6 @@ Dependency updates only.
1389
1498
 
1390
1499
  [TreeNodes](https://fluidframework.com/docs/api/fluid-framework/treenode-class) which are [deleted](https://fluidframework.com/docs/api/fluid-framework/treestatus-enum#deleted-enummember) were not handled correctly.
1391
1500
  This has been improved in two ways:
1392
-
1393
1501
  1. Accessing fields of deleted nodes now consistently throws a usage error indicating that doing so is invalid.
1394
1502
  Previously, this would throw an assertion error, which was a bug.
1395
1503
  2. When a `TreeNode` is deleted, but that node still exists within the [`ITree`](https://fluidframework.com/docs/api/driver-definitions/itree-interface), then becomes accessible again later, a new `TreeNode` is now allocated instead of trying to reuse the deleted one.
@@ -1399,7 +1507,6 @@ Dependency updates only.
1399
1507
  - Generic types for IntervalCollections have been replaced with non-generic types ([#24411](https://github.com/microsoft/FluidFramework/pull/24411)) [1c743e825ed](https://github.com/microsoft/FluidFramework/commit/1c743e825ed29a81b0e66775ce3553477361d335)
1400
1508
 
1401
1509
  This change deprecates the following generic types and provides non-generic alternatives where necessary:
1402
-
1403
1510
  - `IIntervalCollection` is replaced by `ISequenceIntervalCollection`
1404
1511
  - `IIntervalCollectionEvent` is replaced by `ISequenceIntervalCollectionEvents`
1405
1512
  - `IntervalIndex` is replaced by `SequenceIntervalIndex`
@@ -1467,7 +1574,6 @@ Dependency updates only.
1467
1574
  As a side effect of this work, some schema which violated the documented allowed patterns specified by [SchemaFactory](https://fluidframework.com/docs/api/fluid-framework/schemafactory-class#schemafactory-remarks) but used to work (as long as they were not package exported) no longer compile.
1468
1575
 
1469
1576
  The specific case known to break is when:
1470
-
1471
1577
  1. An Object node schema is co-recursive with an Array node schema.
1472
1578
  2. The Array does not declare a named subclass.
1473
1579
  3. The schema reference from the Object to the Array is not using the [lazy syntax](https://fluidframework.com/docs/api/fluid-framework/lazyitem-typealias).
@@ -1517,7 +1623,6 @@ Dependency updates only.
1517
1623
  trunk commits and 100 peer commits, the performance increases by 97%.
1518
1624
 
1519
1625
  Some example scenarios where the performance will be improved:
1520
-
1521
1626
  - A client makes some local changes and another client simultaneously makes a large number of changes in a single JavaScript turn.
1522
1627
  For example, a client is typing into a canvas while another client pastes a large amount of content into a table.
1523
1628
  - A client makes a local branch with some changes and rebases it into the trunk. For example, an AI agent makes changes
@@ -1538,7 +1643,6 @@ Dependency updates only.
1538
1643
  Additionally an alpha `ObjectNodeSchema` object is added to enable support for `schema instanceof ObjectNodeSchema` to safely narrow `TreeNodeSchema` to this new type.
1539
1644
 
1540
1645
  In support of this work, several typing details were fixed including:
1541
-
1542
1646
  - `info` field of `[typeSchemaSymbol]` type brand on recursive object schema was specified to match non-recursive variants.
1543
1647
  - Type of field metadata was correctly plumbed through `optionalReclusive` and `requiredRecursive`.
1544
1648
  - When fields object provided to [SchemaFactory.object](https://fluidframework.com/docs/api/fluid-framework/schemafactory-class#object-method) is typed as `RestrictiveStringRecord<ImplicitFieldSchema>` the resulting [TreeObjectNode](https://fluidframework.com/docs/api/fluid-framework/treeobjectnode-typealias) no longer gets a `Record<string, TreeNode | TreeLeafValue>` signature which could incorrectly conflict with custom members added to the object. Instead `{}` is used to provide no information about felids on the type when the schema provides no information about them. Additionally this case is explicitly made non-constructable: the constructor takes in `never` instead of a `Record<string,never>` which could be erroneously satisfied with an empty object due to how TypeScript assignability rules consider records to have all allowed fields, but also allow objects missing those fields to be assigned to them.
@@ -1565,7 +1669,6 @@ Dependency updates only.
1565
1669
  The various import and export [`VerboseTree`](https://fluidframework.com/docs/api/fluid-framework/verbosetree-typealias) and [`ConciseTree`](https://fluidframework.com/docs/api/fluid-framework/concisetree-typealias) APIs no longer include `valueConverter` options.
1566
1670
  Instead the resulting tree can be further processed to do any desired replacements.
1567
1671
  The following `@alpha` APIs have been added to assist with this:
1568
-
1569
1672
  1. `cloneWithReplacements`
1570
1673
  2. `replaceHandles`
1571
1674
  3. `replaceConciseTreeHandles`
@@ -1616,7 +1719,6 @@ Dependency updates only.
1616
1719
  For example, with 10 local ops + 10 incoming ops, the performance increases by 70%; with 100 local ops + 100 incoming ops, the performance increases by 94%.
1617
1720
 
1618
1721
  This will help improve performance in the following scenarios:
1619
-
1620
1722
  - A client makes a large number of changes in a single JS turn. For example, copy pasting large data like a table.
1621
1723
  - A client has a large number of local changes. For example, slow clients whose changes are slow to ack or clients with
1622
1724
  a local branch with large number of changes.
@@ -1693,7 +1795,6 @@ Dependency updates only.
1693
1795
  These properties will not be used by the system by default, but can be used to associate common application-specific properties with Node Schema.
1694
1796
 
1695
1797
  #### `SchemaFactoryAlpha` Updates
1696
-
1697
1798
  - `object` and `objectRecursive`, `arrayRecursive`, and `mapRecursive` now support `metadata` in their `options` parameter.
1698
1799
  - (new) `arrayAlpha` - Variant of `array` that accepts an options parameter which supports `metadata`
1699
1800
  - (new) `mapAlpha` - Variant of `map` that accepts an options parameter which supports `metadata`
@@ -1746,7 +1847,6 @@ Dependency updates only.
1746
1847
  One of these checks verifies that the view schema (defined in application's code) aligns with the document schema (determined by the document data at rest).
1747
1848
  This helps to ensure that clients running incompatible versions of the application's code don't collaborate at the same time on some document, which could cause data loss or disrupt application invariants.
1748
1849
  One general solution application authors can perform is to stage the rollout of a feature which changes document schema into multiple phases:
1749
-
1750
1850
  1. Release an application version which understands documents written with the new format but doesn't attempt to upgrade any documents
1751
1851
  2. Wait for this application version to saturate in the app's ecosystem
1752
1852
  3. Release an application version which upgrades documents to start leveraging the new format.
@@ -1863,7 +1963,6 @@ Dependency updates only.
1863
1963
  As part of ongoing improvements, several internal types and related APIs have been removed. These types are unnecessary for any supported scenarios and could lead to errors if used. Since directly using these types would likely result in errors, these changes are not likely to impact any Fluid Framework consumers.
1864
1964
 
1865
1965
  Removed types:
1866
-
1867
1966
  - IMergeTreeTextHelper
1868
1967
  - MergeNode
1869
1968
  - ObliterateInfo
@@ -1875,12 +1974,10 @@ Dependency updates only.
1875
1974
  In addition to removing the above types, they are no longer exposed through the following interfaces and their implementations: `ISegment`, `ReferencePosition`, and `ISerializableInterval`.
1876
1975
 
1877
1976
  Removed functions:
1878
-
1879
1977
  - addProperties
1880
1978
  - ack
1881
1979
 
1882
1980
  Removed properties:
1883
-
1884
1981
  - propertyManager
1885
1982
  - segmentGroups
1886
1983
 
@@ -1963,7 +2060,6 @@ Dependency updates only.
1963
2060
  An adjustment is a modification applied to a property value within a specified range. Adjustments can be used to increment or decrement property values dynamically. They are particularly useful in scenarios where property values need to be updated based on user interactions or other events. For example, in a rich text editor, adjustments can be used for modifying indentation levels or font sizes, where multiple users could apply differing numerical adjustments.
1964
2061
 
1965
2062
  ### Key Features and Use Cases:
1966
-
1967
2063
  - **Adjustments with Constraints**: Adjustments can include optional minimum and maximum constraints to ensure the final value falls within specified bounds. This is particularly useful for maintaining consistent formatting in rich text editors.
1968
2064
  - **Consistent Property Changes**: The feature ensures that property changes are consistent, managing both local and remote changes effectively. This is essential for collaborative rich text editing where multiple users may be making adjustments simultaneously.
1969
2065
  - **Rich Text Formatting**: Adjustments can be used to modify text properties such as font size, indentation, or other formatting attributes dynamically based on user actions.
@@ -1985,7 +2081,6 @@ Dependency updates only.
1985
2081
  The `Client` class in the merge-tree package has been removed. Types that directly or indirectly expose the merge-tree `Client` class have also been removed.
1986
2082
 
1987
2083
  The removed types were not meant to be used directly, and direct usage was not supported:
1988
-
1989
2084
  - AttributionPolicy
1990
2085
  - IClientEvents
1991
2086
  - IMergeTreeAttributionOptions
@@ -1993,7 +2088,6 @@ Dependency updates only.
1993
2088
  - SharedStringClass
1994
2089
 
1995
2090
  Some classes that referenced the `Client` class have been transitioned to interfaces. Direct instantiation of these classes was not supported or necessary for any supported scenario, so the change to an interface should not impact usage. This applies to the following types:
1996
-
1997
2091
  - SequenceInterval
1998
2092
  - SequenceEvent
1999
2093
  - SequenceDeltaEvent
@@ -2018,7 +2112,6 @@ Dependency updates only.
2018
2112
  `independentView` has also been added, which is similar but handles the case of creating a new view without an existing schema or tree.
2019
2113
 
2020
2114
  Together these APIs address several use-cases:
2021
-
2022
2115
  1. Using SharedTree as an in-memory non-collaborative datastore.
2023
2116
  2. Importing and exporting data from a SharedTree to and from other services or storage locations (such as locally saved files).
2024
2117
  3. Testing various scenarios without relying on a service.
@@ -2513,7 +2606,6 @@ Dependency updates only.
2513
2606
 
2514
2607
  The `PropertyManager` class, along with the `propertyManager` properties and `addProperties` functions on segments and intervals, are not intended for external use.
2515
2608
  These elements will be removed in a future release for the following reasons:
2516
-
2517
2609
  - There are no scenarios where they need to be used directly.
2518
2610
  - Using them directly will cause eventual consistency problems.
2519
2611
  - Upcoming features will require modifications to these mechanisms.
@@ -2616,7 +2708,6 @@ Dependency updates only.
2616
2708
  The runtime behavior is unaffected: any code which worked and still compiles is fine and does not need changes.
2617
2709
 
2618
2710
  `Tree.schema` was changed to mitigate two different issues:
2619
-
2620
2711
  1. It tried to give a more specific type based on the type of the passed in value.
2621
2712
  When the type of the input is not known precisely (for example it is a union of node types like `Foo | Bar`, or `TreeNode` or even `TreeNode | TreeLeafValue`), this was fine since schema are covariant over their node type.
2622
2713
  However when the input was more specific that the schema type, for example the type is simply `0`, this would result in unsound typing, since the create function could actually return values that did not conform with that schema (for example `schema.create(1)` for the number schema typed with `0` would return `1` with type `0`).
@@ -2743,7 +2834,6 @@ Dependency updates only.
2743
2834
  ```
2744
2835
 
2745
2836
  Skipping the constructor causes the following problems:
2746
-
2747
2837
  1. `TreeViewConfiguration` does validation in its constructor, so skipping it also skips the validation which leads to much less friendly error messages for invalid schema.
2748
2838
  2. Skipping the constructor also discards any default values for options like `enableSchemaValidation`.
2749
2839
  This means that code written in that style would break if more options were added. Since such changes are planned,
@@ -2778,7 +2868,6 @@ Dependency updates only.
2778
2868
  already the case, but the documentation was not clear.
2779
2869
 
2780
2870
  Updated APIs:
2781
-
2782
2871
  - [IDirectory](https://fluidframework.com/docs/api/v2/fluid-framework/idirectory-interface) sealed
2783
2872
  - [IDirectoryEvents](https://fluidframework.com/docs/api/v2/fluid-framework/idirectoryevents-interface) sealed
2784
2873
  - [IDirectoryValueChanged](https://fluidframework.com/docs/api/v2/fluid-framework/idirectoryvaluechanged-interface) sealed and path property is readonly
@@ -2803,7 +2892,6 @@ Dependency updates only.
2803
2892
 
2804
2893
  Several cases of invalid usage patterns for tree APIs have gained improved error reporting, as well as improved documentation on the APIs detailing what usage is supported.
2805
2894
  These improvements include:
2806
-
2807
2895
  - Unsupported usages of schema classes: using more than one schema class derived from a single SchemaFactory generated base class. This used to hit internal asserts, but now has a descriptive user-facing UsageError. Most of this work was done in [9fb3dcf](https://github.com/microsoft/FluidFramework/commit/9fb3dcf491a7f0d66f4abbdc64ab97ccabef4707).
2808
2896
  - Improved detection of when prior exception may have left SharedTree in an invalid state.
2809
2897
  These cases now report a UsageError including a reference to the prior exception. This was mainly done in [9fb3dcf](https://github.com/microsoft/FluidFramework/commit/9fb3dcf491a7f0d66f4abbdc64ab97ccabef4707) and [b77d530](https://github.com/microsoft/FluidFramework/commit/b77d530b9252201c40a90d1a2a6315f76f1a4a4b).
@@ -2822,7 +2910,6 @@ Dependency updates only.
2822
2910
 
2823
2911
  Access to these now less public types should not be required for users of the `@public` "declarative API" exposed in the `fluid-framework` package, but can still be accessed for those who need them under the `/legacy` import paths.
2824
2912
  The full list of such types is:
2825
-
2826
2913
  - `SharedTree` as exported from `@fluidframwork/tree`: It is still exported as `@public` from `fluid-framework` as `SharedObjectKind`.
2827
2914
  - `ISharedObjectKind`: See new `SharedObjectKind` type for use in `@public` APIs.
2828
2915
  `ISharedObject`
@@ -2840,7 +2927,6 @@ Dependency updates only.
2840
2927
  - `IProvideFluidHandleContext`
2841
2928
 
2842
2929
  Removed APIs:
2843
-
2844
2930
  - `DataObjectClass`: Usages replaced with `SharedObjectKind`.
2845
2931
  - `LoadableObjectClass`: Replaced with `SharedObjectKind`.
2846
2932
  - `LoadableObjectClassRecord`: Replaced with `Record<string, SharedObjectKind>`.
@@ -2864,7 +2950,6 @@ Dependency updates only.
2864
2950
  - fluid-framework: Remove some types from `@public` that are not needed ([#21326](https://github.com/microsoft/FluidFramework/pull/21326)) [b629cb80b0](https://github.com/microsoft/FluidFramework/commit/b629cb80b0e5ecdc750270807f77a0e30fab4559)
2865
2951
 
2866
2952
  Mark the following APIs `@alpha` instead of `@public`:
2867
-
2868
2953
  - IBranchOrigin
2869
2954
  - ISequencedDocumentMessage
2870
2955
  - ISignalMessage
@@ -2879,7 +2964,6 @@ Dependency updates only.
2879
2964
  - fluid-framework: Remove several types from `@public` scope ([#21142](https://github.com/microsoft/FluidFramework/pull/21142)) [983e9f09f7](https://github.com/microsoft/FluidFramework/commit/983e9f09f7b10fef9ffa1e9af86166f0ccda7e14)
2880
2965
 
2881
2966
  The following types have been moved from `@public` to `@alpha`:
2882
-
2883
2967
  - `IFluidSerializer`
2884
2968
  - `ISharedObjectEvents`
2885
2969
  - `IChannelServices`
@@ -2903,7 +2987,6 @@ Dependency updates only.
2903
2987
 
2904
2988
  The stable public API surface for Tree has been reduced.
2905
2989
  Several types have been moved into InternalTypes, indicating that they are not fully stable nor intended to be referenced by users of Tree.
2906
-
2907
2990
  - NodeBuilderData
2908
2991
  - FieldHasDefault
2909
2992
  - TreeNodeSchemaNonClass
@@ -2930,7 +3013,6 @@ Dependency updates only.
2930
3013
  - TreeApi
2931
3014
 
2932
3015
  Additionally a few more types which could not be moved due to technically limitations have been documented that they should be treated similarly.
2933
-
2934
3016
  - TreeNodeApi
2935
3017
  - TreeNodeSchemaCore
2936
3018
  - All \*Unsafe type (use for construction of recursive schema).
@@ -3006,7 +3088,6 @@ Dependency updates only.
3006
3088
  - Make several driver types no longer public [b7ad7d0b55](https://github.com/microsoft/FluidFramework/commit/b7ad7d0b55884dd8954abf7c398e518838b9bda0)
3007
3089
 
3008
3090
  Move the following types from `@public` to `@alpha`:
3009
-
3010
3091
  - ITokenClaims
3011
3092
  - IDocumentMessage
3012
3093
  - IClientConfiguration
@@ -3017,7 +3098,6 @@ Dependency updates only.
3017
3098
  `DriverErrorTypes` is no longer exported from the `fluid-framework` package.
3018
3099
 
3019
3100
  - Rename `AzureMember.userName` to `AzureMember.name` and `IMember.userId` to `IMember.id` [96872186d0](https://github.com/microsoft/FluidFramework/commit/96872186d0d0f245c1fece7d19b3743e501679b6)
3020
-
3021
3101
  1. Renamed `AzureMember.userName` to `AzureMember.name` to establish uniform naming across odsp-client and azure-client.
3022
3102
  2. Renamed `IMember.userId` to `IMember.id` to align with the properties received from AFR.
3023
3103
 
@@ -3041,7 +3121,6 @@ Dependency updates only.
3041
3121
  TypeScript types and implementation code.
3042
3122
 
3043
3123
  This means that using Fluid Framework packages require the following TypeScript settings in tsconfig.json:
3044
-
3045
3124
  - `"moduleResolution": "Node16"` with `"module": "Node16"`
3046
3125
  - `"moduleResolution": "Bundler"` with `"module": "ESNext"`
3047
3126
 
@@ -3105,7 +3184,7 @@ Dependency updates only.
3105
3184
  become build errors. The fix is to use only public APIs from @fluidframework/foo.
3106
3185
 
3107
3186
  **Coming soon:** Build resolutions (`moduleResolution` in tsconfig compilerOptions) will need to be resolved with
3108
- Node16, NodeNext, or a bundler that supports resolution of named import/export paths. Internally, some FF packages will
3187
+ Node16, NodeNext, or a bundler that supports resolution of named import-x/export paths. Internally, some FF packages will
3109
3188
  use `@fluidframework/foo/internal` import paths that allow packages to talk to each other using non-public APIs.
3110
3189
 
3111
3190
  **Final stage:** APIs that are not tagged @public will be removed from @fluidframework/foo imports.
@@ -3148,7 +3227,6 @@ Dependency updates only.
3148
3227
  Several FluidStatic classes were unnecessarily exposed and were deprecated in an earlier release. They have been replaced with creation functions. This helps us
3149
3228
  keep implementations decoupled from usage which is easier to maintain and extend. It has very minimal impact on the
3150
3229
  public surface area of downstream packages. The removed classes are as follows:
3151
-
3152
3230
  - `AzureAudience` (use `IAzureAudience` instead)
3153
3231
  - `TinyliciousAudience` (use `ITinyliciousAudience` instead)
3154
3232
  - `DOProviderContainerRuntimeFactory`
@@ -3164,7 +3242,6 @@ Dependency updates only.
3164
3242
  Several FluidStatic classes were unnecessarily exposed. They have been replaced with creation functions. This helps us
3165
3243
  keep implementations decoupled from usage which is easier to maintain and extend. It has very minimal impact on the
3166
3244
  public surface area of downstream packages. The deprecated classes are as follows:
3167
-
3168
3245
  - `AzureAudience` (use `IAzureAudience` instead)
3169
3246
  - `TinyliciousAudience` (use `ITinyliciousAudience` instead)
3170
3247
  - `DOProviderContainerRuntimeFactory`