Developer
Phil Pluckthun
phil@kitten.sh
Performance
YoY:+800%Key patterns and highlights from this developer's activity.
Breakdown of growth, maintenance, and fixes effort over time.
Bugs introduced vs. fixed over time.
No bugs introduced or fixed in this period.
Reclassifies engineering effort based on bug attribution. Commits that introduced bugs are retrospectively counted as poor investments.
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.
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.
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
}
]
}Latest analyzed commits from this developer.
| Hash | Message | Date | Files | Effort |
|---|---|---|---|---|
| 7516d74 | This commit introduces a **performance optimization** within the **React Native Codegen system** by preventing unnecessary file writes and copies. It adds `writeFileSyncIfChanged` and `cpSyncRecursiveIfChanged` utilities to `packages/react-native/scripts/codegen/generate-artifacts-executor/utils.js`, which only perform file operations if the target content has actually changed. All other scripts within the `generate-artifacts-executor` module are updated to utilize these new wrappers, ensuring that codegen outputs are only written or copied when truly modified. This **refactoring** significantly improves **Xcode build performance** for subsequent builds by increasing cache-hit rates and reducing compilation time, as unchanged generated files no longer invalidate the build cache. | Mar 3 | 9 | maint |
| c4ae055 | This commit introduces a significant **refactoring** by extracting the **Jest preset configuration and utilities** from the main `react-native` package into a new, dedicated package named **`@react-native/jest-preset`**. This **breaking change** requires users to install the new package and update their Jest configurations to reference `"@react-native/jest-preset"` instead of the previous `react-native/jest-preset.js` path. The original `jest-preset.js` file in `react-native` is updated to throw an error, providing clear migration instructions to guide existing projects through the transition. This modularization effort enhances the maintainability and allows for independent evolution of the **Jest testing ecosystem** within React Native. | Feb 18 | 77 | maint |
| 9f686f2 | This commit delivers a **bug fix** for a **regression** that prevented `pod install --project-directory` from working as intended. It specifically addresses the **iOS pod installation** process by correcting the calculation of `react_native_path` within the `use_react_native!` function in `packages/react-native/scripts/react_native_pods.rb`. The fix ensures that the absolute path is properly constructed relative to `Pod::Config.instance.installation_root`, restoring functionality for **React Native iOS projects** that utilize the `--project-directory` argument during pod installation. | Jan 19 | 1 | waste |
| 33641f0 | This commit **fixes a bug** in the **React Native Pods integration** (`react_native_pods.rb`) by correctly resolving the `path` argument passed to `use_react_native!`. Previously, absolute paths were incorrectly treated as relative, leading to errors like "Couldn't find the React Native package.json file" when the path was not found. The change now uses `Pathname#join` to ensure proper resolution, allowing developers to safely provide **absolute paths** for the React Native installation. This **maintenance fix** improves flexibility for complex project setups, such as those involving `react-native-macos` or monorepos, by preventing incorrect file lookups. | Jan 14 | 1 | waste |
| 1f23126 | Bump `chromium-edge-launcher` to drop `rimraf` (#54711) | Jan 7 | 2 | – |
| 41eace0 | This commit performs a **security and maintenance refactoring** by replacing the deprecated `glob@^7.0.0` package with `tinyglobby@^0.2.15` for file pattern matching. This change impacts numerous **build and utility scripts** within `react-native-codegen`, the **iOS prebuild process**, C++ and JS API analysis, and general monorepo utilities, ensuring more secure and up-to-date dependency usage. The migration updates functions like `expandDirectoriesIntoFiles`, `computeFrameworkPaths`, and `getPackages` to leverage the new globbing library. This is a stopgap solution to address security concerns until `fs.glob` becomes generally available in Node.js, and it will be backported to `0.81.x` and onwards. | Dec 3 | 17 | maint |
| 7163033 | This commit **fixes a regression** in the **React Native codegen CLI** by **refactoring** the `generate-artifacts-executor` script to correctly handle optional output paths. It introduces a new `computeBaseOutputPath` function in `index.js` to derive the output path, respecting `codegenConfig.outputDir` from `package.json` and `process.env.RCT_SCRIPT_OUTPUT_DIR` overrides. This ensures that `react-native codegen` can be run without the `--outputPath` argument, and that `generateReactCodegenPodspec.js` correctly calculates artifact paths. The `utils.js` module is also updated to properly pass `projectRoot` and utilize an `externalLibrariesCache`. This resolves issues where codegen output was not generated as expected due to incorrect path resolution. | Nov 26 | 3 | waste |
| c029032 | This commit delivers a **bug fix** for **iOS codegen artifacts generation** when executed via **Xcode script phases**. It addresses an issue where the `autolinking.json` file was not correctly located, leading to problems with `react-native-config` output and other autolinked modules. The fix involves two complementary changes: updating `script_phases.sh` to pass the correct, non-temporary output directory to the artifacts generator, and modifying `index.js` to prioritize the `$RCT_SCRIPT_OUTPUT_DIR` environment variable for locating `autolinking.json`. This ensures **correct build outputs** and resolves a critical pathing problem for autolinked modules in React Native iOS projects. | Oct 28 | 2 | waste |
| f6f5ea0 | This commit **fixes a regression** in the **iOS artifacts code generation** process by removing an outdated early return condition. Previously, this condition prevented the `artifacts.podspec` from being generated when a project did not explicitly include any React Native modules, leading to build failures. By eliminating this early exit, the change ensures that the necessary build artifacts are always produced, resolving issues for **iOS projects** that rely on these generated files, such as those created with Expo or the community CLI. | Sep 10 | 2 | – |
| f170db4 | This commit **fixes a critical bug** in the **iOS autolinking process** within CocoaPods, specifically addressing inconsistencies in how `react-native-config` output was handled. Previously, the artifact generation stage would re-calculate autolinking results independently, leading to mismatches with the initial autolinking step and causing build failures. The **fix** ensures that the `react-native-config` output generated by the first autolinking stage (in `autolinking.rb`) is written to a file and then consistently read by the artifact generation executor (`generate-artifacts-executor/index.js` and `utils.js`). This **maintenance** change guarantees that iOS projects correctly link and configure modules, preventing build issues stemming from divergent autolinking results. | Sep 3 | 4 | waste |
| 9731e8e | This commit provides a **bug fix** for **iOS release builds** by replacing `execSync` with `spawnSync` in several Node scripts responsible for prebuilt tarball extraction. Specifically, scripts like `packages/react-native/scripts/replace-rncore-version.js`, `packages/react-native/sdks/hermes-engine/utils/replace_hermes_version.js`, and `packages/react-native/third-party-podspecs/replace_dependencies_version.js` are updated. This change ensures that paths containing whitespaces are correctly handled during tarball extraction, preventing build failures that previously occurred in release configurations. The use of `spawnSync` with its default `shell: false` automatically escapes arguments, making the build process more robust for projects located in directories with spaces. | Sep 1 | 3 | waste |
| b054540 | Mark `@react-native/metro-config` as optional peer to fix warning (#53314) | Aug 24 | 1 | – |
| 94623ca | This commit **fixes a long-standing issue** in **React Native's Xcode build scripts** that caused failures when project paths contained spaces. It addresses incorrect path escaping by **adding proper quoting to variable assignments** like `DEST` and `PROJECT_ROOT` in `packages/react-native/scripts/react-native-xcode.sh`, and ensuring commands are executed with quoted arguments in `packages/react-native/scripts/xcode/with-environment.sh`. Additionally, the `packages/react-native/scripts/codegen/generate-artifacts-executor/generateReactCodegenPodspec.js` script now correctly quotes variables and execution commands in generated Podspecs. This **maintenance fix** significantly **improves the developer experience** by making the **iOS build process more resilient** to common pathing issues, particularly for new users encountering "No such file or directory" errors. | Aug 11 | 4 | waste |
| 705f0f5 | This is an isolated change to the `workerd` API test suite, adding new failing tests for stream requests. It has no production impact and serves to highlight existing issues or prepare for future fixes. | Jun 27 | 1 | maint |
| 480a464 | This commit **fixes** the `TimerManager`'s `setTimeout` and `setInterval` implementations to align with the WHATWG HTML standard, ensuring **timer IDs are always greater than zero**. Specifically, the `timerIndex_` in `TimerManager.h` now initializes to `1`, and `TimerManager.cpp` is updated to return `0` for invalid function arguments instead of throwing an error or returning a valid ID. This **bug fix** resolves potential issues where `clearTimeout(0)` might incorrectly cancel timers or where `if (timeoutId)` checks could fail, significantly improving **compatibility** for applications relying on web-standard timer behavior within the **`ReactCommon`** module. | May 22 | 3 | waste |
| b52f0d8 | This commit performs a **maintenance chore** to **optimize the build output** for the **`react-native-codegen` package**. It updates the build script, specifically `packages/react-native-codegen/scripts/build.js`, to **exclude `__test_fixtures__` directories** from the final artifacts. Additionally, it **removes three outdated Babel transforms** (`babel/plugin-transform-object-rest-spread`, `babel/plugin-transform-async-to-generator`, `babel/plugin-transform-destructuring`) that are no longer necessary. These transforms are redundant because the project's `package.json:engines:node` field is set to `>=18`, which natively supports the features they previously handled, thereby **reducing the size and complexity of the build artifacts**. | Mar 10 | 3 | maint |
| 8f19201 | This commit performs a significant **refactoring** within the **`react-native-codegen`** package, specifically in the `src/generators/components/GenerateViewConfigJs.js` module. It **replaces the `jscodeshift` dependency with `@babel/core`** (including `babel/template` and `babel/types`) for Abstract Syntax Tree (AST) manipulation during the generation of view configurations. This change aims to simplify the codebase, reduce maintenance burden, and streamline dependencies by utilizing a more integrated and lightweight solution for template creation. While the generated JavaScript output remains **functionally identical** in terms of AST, there are minor **formatting changes** due to differing pretty-printing options, which are reflected in updated snapshots for `babel-plugin-codegen` and `react-native-codegen` e2e tests. | Mar 5 | 7 | maint |
| 55acb42 | This commit performs **maintenance** by **removing an extraneous dependency** on `@react-native/metro-babel-transformer` from the **`community-cli-plugin`**. The dependency was found to be unnecessary for the plugin's direct operation, as `metro-babel-transformer` is primarily consumed by `metro-config` or directly by users. This **dependency cleanup** streamlines the `community-cli-plugin`'s dependency graph, ensuring it only declares truly required packages. The change has no functional impact on the plugin or its users, simply optimizing its internal structure. | Feb 21 | 2 | – |
| 28458a0 | This commit **refactors** the **`dev-middleware`** package's dependencies by moving the `selfsigned` package from `dependencies` to `devDependencies`. This **dependency management** change accurately reflects that `selfsigned` is only used within the test suite, specifically in `packages/dev-middleware/src/__tests__/ServerUtils.js`, and not for runtime functionality. The nature of this work is **maintenance**, improving the accuracy of the project's dependency graph. This ensures that `selfsigned` is only installed when development or testing tools are required, reducing the overall footprint for production builds and improving dependency hygiene. | Feb 21 | 2 | – |
| fd3b911 | This commit performs **dependency cleanup** within the **`community-cli-plugin`** by **removing an unused and shadowed `readline` npm package**. The plugin's `attachKeyHandlers.js` module was mistakenly referencing an `npm:readline` package, but Node.js's module resolution always prioritized the **built-in `node:readline` module**, rendering the npm package redundant. This **maintenance refactoring** safely streamlines the project's dependencies, as the removed package was never actually utilized and had no functional impact. | Feb 21 | 3 | – |
This commit introduces a **performance optimization** within the **React Native Codegen system** by preventing unnecessary file writes and copies. It adds `writeFileSyncIfChanged` and `cpSyncRecursiveIfChanged` utilities to `packages/react-native/scripts/codegen/generate-artifacts-executor/utils.js`, which only perform file operations if the target content has actually changed. All other scripts within the `generate-artifacts-executor` module are updated to utilize these new wrappers, ensuring that codegen outputs are only written or copied when truly modified. This **refactoring** significantly improves **Xcode build performance** for subsequent builds by increasing cache-hit rates and reducing compilation time, as unchanged generated files no longer invalidate the build cache.
This commit introduces a significant **refactoring** by extracting the **Jest preset configuration and utilities** from the main `react-native` package into a new, dedicated package named **`@react-native/jest-preset`**. This **breaking change** requires users to install the new package and update their Jest configurations to reference `"@react-native/jest-preset"` instead of the previous `react-native/jest-preset.js` path. The original `jest-preset.js` file in `react-native` is updated to throw an error, providing clear migration instructions to guide existing projects through the transition. This modularization effort enhances the maintainability and allows for independent evolution of the **Jest testing ecosystem** within React Native.
This commit delivers a **bug fix** for a **regression** that prevented `pod install --project-directory` from working as intended. It specifically addresses the **iOS pod installation** process by correcting the calculation of `react_native_path` within the `use_react_native!` function in `packages/react-native/scripts/react_native_pods.rb`. The fix ensures that the absolute path is properly constructed relative to `Pod::Config.instance.installation_root`, restoring functionality for **React Native iOS projects** that utilize the `--project-directory` argument during pod installation.
This commit **fixes a bug** in the **React Native Pods integration** (`react_native_pods.rb`) by correctly resolving the `path` argument passed to `use_react_native!`. Previously, absolute paths were incorrectly treated as relative, leading to errors like "Couldn't find the React Native package.json file" when the path was not found. The change now uses `Pathname#join` to ensure proper resolution, allowing developers to safely provide **absolute paths** for the React Native installation. This **maintenance fix** improves flexibility for complex project setups, such as those involving `react-native-macos` or monorepos, by preventing incorrect file lookups.
Bump `chromium-edge-launcher` to drop `rimraf` (#54711)
This commit performs a **security and maintenance refactoring** by replacing the deprecated `glob@^7.0.0` package with `tinyglobby@^0.2.15` for file pattern matching. This change impacts numerous **build and utility scripts** within `react-native-codegen`, the **iOS prebuild process**, C++ and JS API analysis, and general monorepo utilities, ensuring more secure and up-to-date dependency usage. The migration updates functions like `expandDirectoriesIntoFiles`, `computeFrameworkPaths`, and `getPackages` to leverage the new globbing library. This is a stopgap solution to address security concerns until `fs.glob` becomes generally available in Node.js, and it will be backported to `0.81.x` and onwards.
This commit **fixes a regression** in the **React Native codegen CLI** by **refactoring** the `generate-artifacts-executor` script to correctly handle optional output paths. It introduces a new `computeBaseOutputPath` function in `index.js` to derive the output path, respecting `codegenConfig.outputDir` from `package.json` and `process.env.RCT_SCRIPT_OUTPUT_DIR` overrides. This ensures that `react-native codegen` can be run without the `--outputPath` argument, and that `generateReactCodegenPodspec.js` correctly calculates artifact paths. The `utils.js` module is also updated to properly pass `projectRoot` and utilize an `externalLibrariesCache`. This resolves issues where codegen output was not generated as expected due to incorrect path resolution.
This commit delivers a **bug fix** for **iOS codegen artifacts generation** when executed via **Xcode script phases**. It addresses an issue where the `autolinking.json` file was not correctly located, leading to problems with `react-native-config` output and other autolinked modules. The fix involves two complementary changes: updating `script_phases.sh` to pass the correct, non-temporary output directory to the artifacts generator, and modifying `index.js` to prioritize the `$RCT_SCRIPT_OUTPUT_DIR` environment variable for locating `autolinking.json`. This ensures **correct build outputs** and resolves a critical pathing problem for autolinked modules in React Native iOS projects.
This commit **fixes a regression** in the **iOS artifacts code generation** process by removing an outdated early return condition. Previously, this condition prevented the `artifacts.podspec` from being generated when a project did not explicitly include any React Native modules, leading to build failures. By eliminating this early exit, the change ensures that the necessary build artifacts are always produced, resolving issues for **iOS projects** that rely on these generated files, such as those created with Expo or the community CLI.
This commit **fixes a critical bug** in the **iOS autolinking process** within CocoaPods, specifically addressing inconsistencies in how `react-native-config` output was handled. Previously, the artifact generation stage would re-calculate autolinking results independently, leading to mismatches with the initial autolinking step and causing build failures. The **fix** ensures that the `react-native-config` output generated by the first autolinking stage (in `autolinking.rb`) is written to a file and then consistently read by the artifact generation executor (`generate-artifacts-executor/index.js` and `utils.js`). This **maintenance** change guarantees that iOS projects correctly link and configure modules, preventing build issues stemming from divergent autolinking results.
This commit provides a **bug fix** for **iOS release builds** by replacing `execSync` with `spawnSync` in several Node scripts responsible for prebuilt tarball extraction. Specifically, scripts like `packages/react-native/scripts/replace-rncore-version.js`, `packages/react-native/sdks/hermes-engine/utils/replace_hermes_version.js`, and `packages/react-native/third-party-podspecs/replace_dependencies_version.js` are updated. This change ensures that paths containing whitespaces are correctly handled during tarball extraction, preventing build failures that previously occurred in release configurations. The use of `spawnSync` with its default `shell: false` automatically escapes arguments, making the build process more robust for projects located in directories with spaces.
Mark `@react-native/metro-config` as optional peer to fix warning (#53314)
This commit **fixes a long-standing issue** in **React Native's Xcode build scripts** that caused failures when project paths contained spaces. It addresses incorrect path escaping by **adding proper quoting to variable assignments** like `DEST` and `PROJECT_ROOT` in `packages/react-native/scripts/react-native-xcode.sh`, and ensuring commands are executed with quoted arguments in `packages/react-native/scripts/xcode/with-environment.sh`. Additionally, the `packages/react-native/scripts/codegen/generate-artifacts-executor/generateReactCodegenPodspec.js` script now correctly quotes variables and execution commands in generated Podspecs. This **maintenance fix** significantly **improves the developer experience** by making the **iOS build process more resilient** to common pathing issues, particularly for new users encountering "No such file or directory" errors.
This is an isolated change to the `workerd` API test suite, adding new failing tests for stream requests. It has no production impact and serves to highlight existing issues or prepare for future fixes.
This commit **fixes** the `TimerManager`'s `setTimeout` and `setInterval` implementations to align with the WHATWG HTML standard, ensuring **timer IDs are always greater than zero**. Specifically, the `timerIndex_` in `TimerManager.h` now initializes to `1`, and `TimerManager.cpp` is updated to return `0` for invalid function arguments instead of throwing an error or returning a valid ID. This **bug fix** resolves potential issues where `clearTimeout(0)` might incorrectly cancel timers or where `if (timeoutId)` checks could fail, significantly improving **compatibility** for applications relying on web-standard timer behavior within the **`ReactCommon`** module.
This commit performs a **maintenance chore** to **optimize the build output** for the **`react-native-codegen` package**. It updates the build script, specifically `packages/react-native-codegen/scripts/build.js`, to **exclude `__test_fixtures__` directories** from the final artifacts. Additionally, it **removes three outdated Babel transforms** (`babel/plugin-transform-object-rest-spread`, `babel/plugin-transform-async-to-generator`, `babel/plugin-transform-destructuring`) that are no longer necessary. These transforms are redundant because the project's `package.json:engines:node` field is set to `>=18`, which natively supports the features they previously handled, thereby **reducing the size and complexity of the build artifacts**.
This commit performs a significant **refactoring** within the **`react-native-codegen`** package, specifically in the `src/generators/components/GenerateViewConfigJs.js` module. It **replaces the `jscodeshift` dependency with `@babel/core`** (including `babel/template` and `babel/types`) for Abstract Syntax Tree (AST) manipulation during the generation of view configurations. This change aims to simplify the codebase, reduce maintenance burden, and streamline dependencies by utilizing a more integrated and lightweight solution for template creation. While the generated JavaScript output remains **functionally identical** in terms of AST, there are minor **formatting changes** due to differing pretty-printing options, which are reflected in updated snapshots for `babel-plugin-codegen` and `react-native-codegen` e2e tests.
This commit performs **maintenance** by **removing an extraneous dependency** on `@react-native/metro-babel-transformer` from the **`community-cli-plugin`**. The dependency was found to be unnecessary for the plugin's direct operation, as `metro-babel-transformer` is primarily consumed by `metro-config` or directly by users. This **dependency cleanup** streamlines the `community-cli-plugin`'s dependency graph, ensuring it only declares truly required packages. The change has no functional impact on the plugin or its users, simply optimizing its internal structure.
This commit **refactors** the **`dev-middleware`** package's dependencies by moving the `selfsigned` package from `dependencies` to `devDependencies`. This **dependency management** change accurately reflects that `selfsigned` is only used within the test suite, specifically in `packages/dev-middleware/src/__tests__/ServerUtils.js`, and not for runtime functionality. The nature of this work is **maintenance**, improving the accuracy of the project's dependency graph. This ensures that `selfsigned` is only installed when development or testing tools are required, reducing the overall footprint for production builds and improving dependency hygiene.
This commit performs **dependency cleanup** within the **`community-cli-plugin`** by **removing an unused and shadowed `readline` npm package**. The plugin's `attachKeyHandlers.js` module was mistakenly referencing an `npm:readline` package, but Node.js's module resolution always prioritized the **built-in `node:readline` module**, rendering the npm package redundant. This **maintenance refactoring** safely streamlines the project's dependencies, as the removed package was never actually utilized and had no functional impact.
Commit activity distribution by hour and day of week. Shows when this developer is most active.
Developers who frequently work on the same files and symbols. Higher score means stronger code collaboration.