NavigaraNavigara
OrganizationsDistributionCompareResearch
NavigaraNavigara
OrganizationsDistributionCompareResearch
All developers

daesunp

Developer

daesunp

138815173+daesunp@users.noreply.github.com

24 commits~9 files/commit

Performance

YoY:+975%
2026Previous year

Insights

Key patterns and highlights from this developer's activity.

Peak MonthFeb'2697 performance
Growth Trend↑491%vs prior period
Avg Files/Commit9files per commit
Active Days22of 455 days
Top RepoFluidFramework24 commits

Effort Over Time

Breakdown of growth, maintenance, and fixes effort over time.

Bug Behavior

Beta

Bugs introduced vs. fixed over time.

No bugs introduced or fixed in this period.

Investment Quality

Beta

Reclassifies engineering effort based on bug attribution. Commits that introduced bugs are retrospectively counted as poor investments.

62%Productive TimeGrowth 92% + Fixes 8%
38%Maintenance Time
0%Wasted Time
How it works

Methodology

Investment Quality reclassifies engineering effort based on bug attribution data. Commits identified as buggy origins (those that introduced bugs later fixed by someone) have their grow and maintenance time moved into the Wasted Time category. Their waste (fix commits) remains counted as productive. All other commits retain their standard classification: grow is productive, maintenance is maintenance, and waste (fixes) is productive.

Relationship to Growth / Maintenance / Fixes

The standard model classifies commits as Growth, Maintenance, or Fixes. Investment Quality adds a quality lens: a commit that introduced a bug is retrospectively counted as a poor investment — the engineering time spent on it was wasted because it ultimately required additional fix work. Fix commits (Fixes in the standard model) are reframed as productive, because fixing bugs is valuable work.

Proposed API Endpoint

Currently computed client-side from commit and bug attribution data. Ideal server-side endpoint:

POST /v1/organizations/{orgId}/investment-quality
Content-Type: application/json

Request:
{
  "startTime": "2025-01-01T00:00:00Z",
  "endTime": "2025-12-31T23:59:59Z",
  "bucketSize": "BUCKET_SIZE_MONTH",
  "groupBy": ["repository_id" | "deliverer_email"]
}

Response:
{
  "productivePct": 74,
  "maintenancePct": 18,
  "wastedPct": 8,
  "buckets": [
    {
      "bucketStart": "2025-01-01T00:00:00Z",
      "productive": 4.2,
      "maintenance": 1.8,
      "wasted": 0.6
    }
  ]
}

Recent Activity

Latest analyzed commits from this developer.

HashMessageDateFilesEffort
bf02e33This commit introduces **Quill.js-style delta payloads** for **array node events** within the **`packages/dds/tree`** eventing system. This **new capability** enhances the `AnchorSet`, `DeltaVisitor`, and `KernelEventBuffer` to capture and emit detailed `fieldMarks` for array changes, allowing consumers of both **`SharedTree`** and **`SimpleTree`** to subscribe to richer `nodeChanged` events. By providing granular `ArrayNodeDeltaOp` information, this change enables more efficient and accurate synchronization or UI rendering for array modifications. The implementation includes new `ArrayNodeDeltaOp` related types and `NodeChangedDataAlpha` interfaces, and is validated with new fuzz tests to ensure consistency across clients.Mar 2522grow
924c17eThis commit introduces a **new capability** to the `packages/dds/tree` module by adding **composable labels for transactions**. It defines new types, `LabelTree` and `TransactionLabels`, which allow for tracking and associating metadata with **nested transactions**. The core logic for managing these labels, including `pushLabelFrame` and `popLabelFrame` methods, is integrated into the `SharedTree`'s transaction processing within `treeCheckout.ts` and `schematizingTreeView.ts`. This enhancement provides richer context for `LocalChangeMetadata` and `RemoteChangeMetadata`, significantly improving the ability to identify and process changes within complex, multi-level operations.Feb 279grow
f868393This commit introduces a **new capability** to the **SharedTreeCore**'s **transaction management** system. It adds a `size()` method to the `Transactor` interface and its `TransactionStack` implementation, allowing consumers to query the number of currently active transactions. This enhancement provides better visibility into the transaction state within the `shared-tree-core` package. New test cases have been added to verify the correct functionality and behavior of the `size()` method, including scenarios involving disposal.Feb 242grow
d9742afThis commit introduces a **new capability** to the **`tree-agent` framework** by implementing an `IdentifierCollisionResolver` to gracefully handle short name collisions during schema processing. This resolver automatically disambiguates identical short names (e.g., `foo` becomes `foo_1`, `foo_2`) to ensure uniqueness. The new logic is integrated into the **prompt generation**, **TypeScript schema rendering**, and **type generation** subsystems, affecting files such as `prompt.ts`, `renderSchemaTypeScript.ts`, and `typeGeneration.ts`. This enhancement prevents potential conflicts and improves the reliability of generated outputs by guaranteeing unique and unambiguous identifiers for schemas.Feb 117grow
cfd2a7cThis commit introduces **native move operations for unhydrated nodes** within the **`simple-tree` DDS**, enhancing its core capabilities. It adds a `move` method to the `UnhydratedTreeSequenceFieldEditBuilder` and implements it in `UnhydratedSequenceField`, allowing for direct manipulation of unhydrated tree structures. This change also enables a **refactoring** of the `arrayNode`'s move implementation, eliminating the `withBufferedTreeEvents` workaround and improving event handling efficiency. New tests confirm correct event emission for both within-array and cross-field moves, ensuring the robustness of this **new feature**.Feb 63grow
cca4db2This commit introduces a **new capability** to the **SharedTree** and **SimpleTree** APIs, allowing users to associate an optional `label` object with transactions. This label is propagated through the system and can be accessed via `SchematizingSimpleTreeView.currentTransactionLabel` or within the `commitApplied` event callback. The primary purpose is to facilitate **transaction grouping**, particularly for advanced **undo/redo functionality**, by providing custom metadata for each commit. This change impacts `LocalChangeMetadata`, `RemoteChangeMetadata`, and `RunTransactionParams` interfaces, enhancing the extensibility of transaction management within the `packages/dds/tree` package.Jan 2811grow
748c857This commit **increases the timeout** for the **state-based rebaser axioms stress test** within the `dds/tree` package. Specifically, the timeout for the `sequenceChangeRebaser.test.ts` file is extended from 80,000ms to 120,000ms. This **maintenance** change addresses recurring timeouts observed in the stress test pipeline, which were causing test failures due to insufficient execution time. By adjusting the timeout, the commit ensures the **reliability and stability of test execution** for the rebaser functionality, allowing comprehensive performance testing to complete successfully.Jan 271maint
19b7eb0This commit introduces a **fix** within the **`tree-agent` package** to **sanitize friendly names for schema identifiers**, ensuring they conform to valid TypeScript naming conventions. The `unqualifySchema` function in `packages/framework/tree-agent/src/utils.ts` was modified to replace invalid characters with underscores and to prefix names starting with invalid characters with an underscore. This **maintenance** work prevents potential syntax errors when these identifiers are used in TypeScript code, such as `"com.fluidframework.foo!"` becoming `"foo_"`. New test cases were added to `prompt.spec.ts` and `schemaUtils.spec.ts` to verify the correct sanitization logic for various invalid schema names.Dec 33waste
3ec9ea1This commit introduces an **API usability improvement** by making the `options` parameter in the **`independentView`** function optional within the **`@fluidframework/tree`** package. This **refactoring** eliminates the need to explicitly pass an empty `{}` object when calling `independentView`, simplifying its usage. The change primarily affects the **`shared-tree`** module and its consumers, including various test files across the **`@fluidframework`** ecosystem. This enhancement streamlines development by reducing boilerplate and making the API more intuitive, with updated API reports reflecting the new signature.Dec 210maint
22f82b3This commit introduces a **new capability** for the **`tree-agent`** by implementing **property binding**, allowing it to **expose properties of schema classes directly to the Large Language Model (LLM)**. This enhancement significantly broadens the LLM's contextual understanding and interaction possibilities, as it can now access and interpret schema properties in addition to methods. The work involves defining new API types and mechanisms in `packages/framework/tree-agent/src/propertyBinding.ts`, integrating this into the `typeGeneration.ts` and `prompt.ts` logic to include properties in generated TypeScript schemas, and updating the `getZodSchemaAsTypeScript` utility for correct formatting. This ensures that the LLM's prompt accurately reflects the full state of bindable objects, improving the agent's ability to reason and operate on complex data structures.Nov 1810grow
9a76dc1This commit **updates the documentation** for **schema evolution** within the `data-structures/tree` section. It specifically **revises code examples** in `docs/docs/data-structures/tree/schema-evolution/allowed-types-rollout.mdx` to reflect the progression of the API. The change involves migrating from the deprecated `SchemaFactoryAlpha` to the current **beta API**, `SchemaFactoryBeta`. This **documentation update** ensures users are guided to implement schema evolution using the most up-to-date and supported interfaces, improving the accuracy and relevance of the provided examples.Nov 171maint
75d7f11This commit **promotes core schema definition APIs** within the **`@fluidframework/tree`** package from alpha to beta stability. The `staged`, `types`, `stagedRecursive`, and `typesRecursive` methods are now exposed on `SchemaFactoryBeta` and `SchemaStaticsBeta`, making them officially available for use in **beta applications**. This **API evolution** enables developers to define and manage **staged and recursive schema types** with increased confidence and stability. The change involves updating API reports for both `@fluidframework/tree` and `@fluidframework/fluid-framework`, adjusting module exports, and revising documentation to reflect the transition from alpha to beta interfaces for schema evolution.Nov 519grow
31dca54This commit introduces a **new feature** to the **`simple-tree` DDS**, enabling the use of the `delete` keyword on properties of **`ObjectNode`** instances. This allows for the semantic removal of properties from these object nodes, enhancing their mutability. The core implementation modifies the `createProxyHandler` and adds a new `applyFieldChange` function within `objectNode.ts` to correctly process these deletions. This change improves the flexibility of `ObjectNode` manipulation, with updated tests ensuring proper behavior, especially for optional fields.Oct 293grow
84c2e95This commit introduces a **behavior change** to the **Simple Tree's record nodes**, where setting a value to `undefined` via the `set` function now explicitly behaves like a **delete operation**. This update ensures consistency in how `undefined` values are handled within **`recordNode`** structures, effectively removing the entry rather than storing an `undefined` value. The change is accompanied by **updated documentation** in `packages/dds/tree/src/simple-tree/node-kinds/record/recordNodeTypes.ts` and a **new test case** in `packages/dds/tree/src/test/simple-tree/node-kinds/recordNode.spec.ts` to verify this intended behavior. This **clarifies and standardizes** the interaction with record node properties, improving the predictability of the **`simple-tree`** API.Oct 282maint
d86cd10This commit **fixes a critical bug** in the **`DetachedFieldIndex`** module within the `dds/tree` package, where the `createEntry` method incorrectly generated only one `rootId` when attempting to create multiple entries (`count > 1`). The fix ensures proper incrementation of root and minor IDs, preventing data integrity issues for detached tree nodes. Additionally, **comprehensive unit tests** have been added for `DetachedFieldIndex` methods, including `createEntry`, `deleteEntry`, `loadData`, and `clone`. This work is a **bug fix** and **test enhancement**, significantly improving the **reliability and validation** of this core tree data structure responsible for managing detached tree data.Oct 212maint
e5b2882This commit introduces a **new capability** by adding comprehensive **identifier API methods** to the **TreeAlpha** interface within the `packages/dds/tree` package. These new utilities, exposed via `TreeAlpha.identifier` and `TreeIdentifierUtils`, enable **creating, retrieving, shortening, and lengthening node identifiers** across both **SharedTree** and **SimpleTree** contexts. Specifically, functions like `getIdentifierFromNode`, `shorten`, `lengthen`, and `create` provide flexible ways to manage node references, alongside a **bug fix** for `mockNodeIdentifierManager.ts` to handle out-of-bounds local ID offsets. This enhancement significantly improves the ability to **programmatically manage and interact with node identifiers**, ensuring more robust and flexible tree data structure manipulation.May 1612grow
b03aa44Dropdown to change column type in table example app (#24637)May 162–
0ddd6b0This commit introduces a **new capability** by adding the `TreeAlpha.key2` method within the **`@fluidframework/tree` DDS package**. This method provides a refined way to retrieve a node's key, specifically returning `undefined` for root nodes, and is intended to eventually replace the existing `Tree.key` method. The work also includes **refactoring** of `simple-tree` APIs to export key-related utility functions like `getStoredKey` and `getPropertyKeyFromStoredKey`. This change lays the groundwork for a more consistent and robust tree node keying mechanism, with updated API reports in both `tree` and `fluid-framework` packages reflecting the new public API.May 168grow
4449d0aTable example app using TableSchema (#24337)May 625–
24b4ba0This commit significantly **enhances the unit test coverage** for the **`tableSchema` module** within `packages/dds/tree`, adding comprehensive tests for various table operations like insertion, removal, and cell manipulation in `tableSchema.spec.ts`. It also **refactors** the `tableSchema` API by renaming `delete` methods to `remove` (e.g., `removeCell`, `removeRows`) for improved **API consistency** across `IRow`, `Row`, `ITable`, and `Table` interfaces. Furthermore, the `createTable` method gains new overloads, allowing it to be called without explicitly providing `Row` or `Column` schemas, simplifying its usage. Some new tests are intentionally skipped, marking areas where future policy decisions are required for specific edge cases. This work improves the **robustness and usability** of the `tableSchema` component.Apr 152maint
bf02e33Mar 25

This commit introduces **Quill.js-style delta payloads** for **array node events** within the **`packages/dds/tree`** eventing system. This **new capability** enhances the `AnchorSet`, `DeltaVisitor`, and `KernelEventBuffer` to capture and emit detailed `fieldMarks` for array changes, allowing consumers of both **`SharedTree`** and **`SimpleTree`** to subscribe to richer `nodeChanged` events. By providing granular `ArrayNodeDeltaOp` information, this change enables more efficient and accurate synchronization or UI rendering for array modifications. The implementation includes new `ArrayNodeDeltaOp` related types and `NodeChangedDataAlpha` interfaces, and is validated with new fuzz tests to ensure consistency across clients.

22 filesgrow
924c17eFeb 27

This commit introduces a **new capability** to the `packages/dds/tree` module by adding **composable labels for transactions**. It defines new types, `LabelTree` and `TransactionLabels`, which allow for tracking and associating metadata with **nested transactions**. The core logic for managing these labels, including `pushLabelFrame` and `popLabelFrame` methods, is integrated into the `SharedTree`'s transaction processing within `treeCheckout.ts` and `schematizingTreeView.ts`. This enhancement provides richer context for `LocalChangeMetadata` and `RemoteChangeMetadata`, significantly improving the ability to identify and process changes within complex, multi-level operations.

9 filesgrow
f868393Feb 24

This commit introduces a **new capability** to the **SharedTreeCore**'s **transaction management** system. It adds a `size()` method to the `Transactor` interface and its `TransactionStack` implementation, allowing consumers to query the number of currently active transactions. This enhancement provides better visibility into the transaction state within the `shared-tree-core` package. New test cases have been added to verify the correct functionality and behavior of the `size()` method, including scenarios involving disposal.

2 filesgrow
d9742afFeb 11

This commit introduces a **new capability** to the **`tree-agent` framework** by implementing an `IdentifierCollisionResolver` to gracefully handle short name collisions during schema processing. This resolver automatically disambiguates identical short names (e.g., `foo` becomes `foo_1`, `foo_2`) to ensure uniqueness. The new logic is integrated into the **prompt generation**, **TypeScript schema rendering**, and **type generation** subsystems, affecting files such as `prompt.ts`, `renderSchemaTypeScript.ts`, and `typeGeneration.ts`. This enhancement prevents potential conflicts and improves the reliability of generated outputs by guaranteeing unique and unambiguous identifiers for schemas.

7 filesgrow
cfd2a7cFeb 6

This commit introduces **native move operations for unhydrated nodes** within the **`simple-tree` DDS**, enhancing its core capabilities. It adds a `move` method to the `UnhydratedTreeSequenceFieldEditBuilder` and implements it in `UnhydratedSequenceField`, allowing for direct manipulation of unhydrated tree structures. This change also enables a **refactoring** of the `arrayNode`'s move implementation, eliminating the `withBufferedTreeEvents` workaround and improving event handling efficiency. New tests confirm correct event emission for both within-array and cross-field moves, ensuring the robustness of this **new feature**.

3 filesgrow
cca4db2Jan 28

This commit introduces a **new capability** to the **SharedTree** and **SimpleTree** APIs, allowing users to associate an optional `label` object with transactions. This label is propagated through the system and can be accessed via `SchematizingSimpleTreeView.currentTransactionLabel` or within the `commitApplied` event callback. The primary purpose is to facilitate **transaction grouping**, particularly for advanced **undo/redo functionality**, by providing custom metadata for each commit. This change impacts `LocalChangeMetadata`, `RemoteChangeMetadata`, and `RunTransactionParams` interfaces, enhancing the extensibility of transaction management within the `packages/dds/tree` package.

11 filesgrow
748c857Jan 27

This commit **increases the timeout** for the **state-based rebaser axioms stress test** within the `dds/tree` package. Specifically, the timeout for the `sequenceChangeRebaser.test.ts` file is extended from 80,000ms to 120,000ms. This **maintenance** change addresses recurring timeouts observed in the stress test pipeline, which were causing test failures due to insufficient execution time. By adjusting the timeout, the commit ensures the **reliability and stability of test execution** for the rebaser functionality, allowing comprehensive performance testing to complete successfully.

1 filesmaint
19b7eb0Dec 3

This commit introduces a **fix** within the **`tree-agent` package** to **sanitize friendly names for schema identifiers**, ensuring they conform to valid TypeScript naming conventions. The `unqualifySchema` function in `packages/framework/tree-agent/src/utils.ts` was modified to replace invalid characters with underscores and to prefix names starting with invalid characters with an underscore. This **maintenance** work prevents potential syntax errors when these identifiers are used in TypeScript code, such as `"com.fluidframework.foo!"` becoming `"foo_"`. New test cases were added to `prompt.spec.ts` and `schemaUtils.spec.ts` to verify the correct sanitization logic for various invalid schema names.

3 fileswaste
3ec9ea1Dec 2

This commit introduces an **API usability improvement** by making the `options` parameter in the **`independentView`** function optional within the **`@fluidframework/tree`** package. This **refactoring** eliminates the need to explicitly pass an empty `{}` object when calling `independentView`, simplifying its usage. The change primarily affects the **`shared-tree`** module and its consumers, including various test files across the **`@fluidframework`** ecosystem. This enhancement streamlines development by reducing boilerplate and making the API more intuitive, with updated API reports reflecting the new signature.

10 filesmaint
22f82b3Nov 18

This commit introduces a **new capability** for the **`tree-agent`** by implementing **property binding**, allowing it to **expose properties of schema classes directly to the Large Language Model (LLM)**. This enhancement significantly broadens the LLM's contextual understanding and interaction possibilities, as it can now access and interpret schema properties in addition to methods. The work involves defining new API types and mechanisms in `packages/framework/tree-agent/src/propertyBinding.ts`, integrating this into the `typeGeneration.ts` and `prompt.ts` logic to include properties in generated TypeScript schemas, and updating the `getZodSchemaAsTypeScript` utility for correct formatting. This ensures that the LLM's prompt accurately reflects the full state of bindable objects, improving the agent's ability to reason and operate on complex data structures.

10 filesgrow
9a76dc1Nov 17

This commit **updates the documentation** for **schema evolution** within the `data-structures/tree` section. It specifically **revises code examples** in `docs/docs/data-structures/tree/schema-evolution/allowed-types-rollout.mdx` to reflect the progression of the API. The change involves migrating from the deprecated `SchemaFactoryAlpha` to the current **beta API**, `SchemaFactoryBeta`. This **documentation update** ensures users are guided to implement schema evolution using the most up-to-date and supported interfaces, improving the accuracy and relevance of the provided examples.

1 filesmaint
75d7f11Nov 5

This commit **promotes core schema definition APIs** within the **`@fluidframework/tree`** package from alpha to beta stability. The `staged`, `types`, `stagedRecursive`, and `typesRecursive` methods are now exposed on `SchemaFactoryBeta` and `SchemaStaticsBeta`, making them officially available for use in **beta applications**. This **API evolution** enables developers to define and manage **staged and recursive schema types** with increased confidence and stability. The change involves updating API reports for both `@fluidframework/tree` and `@fluidframework/fluid-framework`, adjusting module exports, and revising documentation to reflect the transition from alpha to beta interfaces for schema evolution.

19 filesgrow
31dca54Oct 29

This commit introduces a **new feature** to the **`simple-tree` DDS**, enabling the use of the `delete` keyword on properties of **`ObjectNode`** instances. This allows for the semantic removal of properties from these object nodes, enhancing their mutability. The core implementation modifies the `createProxyHandler` and adds a new `applyFieldChange` function within `objectNode.ts` to correctly process these deletions. This change improves the flexibility of `ObjectNode` manipulation, with updated tests ensuring proper behavior, especially for optional fields.

3 filesgrow
84c2e95Oct 28

This commit introduces a **behavior change** to the **Simple Tree's record nodes**, where setting a value to `undefined` via the `set` function now explicitly behaves like a **delete operation**. This update ensures consistency in how `undefined` values are handled within **`recordNode`** structures, effectively removing the entry rather than storing an `undefined` value. The change is accompanied by **updated documentation** in `packages/dds/tree/src/simple-tree/node-kinds/record/recordNodeTypes.ts` and a **new test case** in `packages/dds/tree/src/test/simple-tree/node-kinds/recordNode.spec.ts` to verify this intended behavior. This **clarifies and standardizes** the interaction with record node properties, improving the predictability of the **`simple-tree`** API.

2 filesmaint
d86cd10Oct 21

This commit **fixes a critical bug** in the **`DetachedFieldIndex`** module within the `dds/tree` package, where the `createEntry` method incorrectly generated only one `rootId` when attempting to create multiple entries (`count > 1`). The fix ensures proper incrementation of root and minor IDs, preventing data integrity issues for detached tree nodes. Additionally, **comprehensive unit tests** have been added for `DetachedFieldIndex` methods, including `createEntry`, `deleteEntry`, `loadData`, and `clone`. This work is a **bug fix** and **test enhancement**, significantly improving the **reliability and validation** of this core tree data structure responsible for managing detached tree data.

2 filesmaint
e5b2882May 16

This commit introduces a **new capability** by adding comprehensive **identifier API methods** to the **TreeAlpha** interface within the `packages/dds/tree` package. These new utilities, exposed via `TreeAlpha.identifier` and `TreeIdentifierUtils`, enable **creating, retrieving, shortening, and lengthening node identifiers** across both **SharedTree** and **SimpleTree** contexts. Specifically, functions like `getIdentifierFromNode`, `shorten`, `lengthen`, and `create` provide flexible ways to manage node references, alongside a **bug fix** for `mockNodeIdentifierManager.ts` to handle out-of-bounds local ID offsets. This enhancement significantly improves the ability to **programmatically manage and interact with node identifiers**, ensuring more robust and flexible tree data structure manipulation.

12 filesgrow
b03aa44May 16

Dropdown to change column type in table example app (#24637)

2 files–
0ddd6b0May 16

This commit introduces a **new capability** by adding the `TreeAlpha.key2` method within the **`@fluidframework/tree` DDS package**. This method provides a refined way to retrieve a node's key, specifically returning `undefined` for root nodes, and is intended to eventually replace the existing `Tree.key` method. The work also includes **refactoring** of `simple-tree` APIs to export key-related utility functions like `getStoredKey` and `getPropertyKeyFromStoredKey`. This change lays the groundwork for a more consistent and robust tree node keying mechanism, with updated API reports in both `tree` and `fluid-framework` packages reflecting the new public API.

8 filesgrow
4449d0aMay 6

Table example app using TableSchema (#24337)

25 files–
24b4ba0Apr 15

This commit significantly **enhances the unit test coverage** for the **`tableSchema` module** within `packages/dds/tree`, adding comprehensive tests for various table operations like insertion, removal, and cell manipulation in `tableSchema.spec.ts`. It also **refactors** the `tableSchema` API by renaming `delete` methods to `remove` (e.g., `removeCell`, `removeRows`) for improved **API consistency** across `IRow`, `Row`, `ITable`, and `Table` interfaces. Furthermore, the `createTable` method gains new overloads, allowing it to be called without explicitly providing `Row` or `Column` schemas, simplifying its usage. Some new tests are intentionally skipped, marking areas where future policy decisions are required for specific edge cases. This work improves the **robustness and usability** of the `tableSchema` component.

2 filesmaint

Work Patterns

Beta

Commit activity distribution by hour and day of week. Shows when this developer is most active.

Collaboration

Beta

Developers who frequently work on the same files and symbols. Higher score means stronger code collaboration.

NavigaraNavigara
OrganizationsDistributionCompareResearch