# ReactiveX/rxjs — codebase unpack

> Canonical page: https://codevetter.com/unpack/rxjs

This is a deterministic Repo Unpack scan of ReactiveX/rxjs — a structural map, not a review, security audit, or maintainer-endorsed description.

- Scanned commit: 54796b38a57e6309f9861e174737479bb3f63f61 (2026-08-05)
- Last upstream commit: docs: Update thisArg pattern documentation
- Generated by codevetter 1.15.0 on 2026-10-02
- 1360 files scanned · 10.6 MB

Source inspection; upstream code and tests were not executed.

## Languages

- TypeScript: 771 files
- JavaScript: 249 files
- Markdown: 97 files
- JSON: 77 files
- Sass: 50 files
- HTML: 47 files
- YAML: 18 files
- Shell: 4 files

## Repository structure

- packages/ — 795 files
- apps/ — 483 files
- scripts/ — 21 files
- .github/ — 17 files
- docs/ — 14 files
- .agents/ — 8 files
- resources/ — 5 files
- patches/ — 1 files

Probable source entrypoint: `packages/` (inferred from the tree, not upstream docs)

## Source layout — packages/

- packages/migrate/ — 108 files
- packages/observable-polyfill/ — 78 files
- packages/rxjs/ — 46 files
- packages/test/ — 22 files

## Package

- package.json: null — 19 declared dependencies

## Structural health signals

Average score 8/10 across 96 files; 11 hotspots. These are deterministic review leads, not proof of a bug.

## Recent history

- 54796b38a57e (2026-08-05) docs: Update thisArg pattern documentation
- be72ebf1a3b0 (2026-08-05) refactor: remove callback thisArg support
- 11d931645c03 (2026-08-04) fix(release): simplify beta publishing
- 87960a11a15f (2026-08-04) test(release): tolerate slow SafariDriver startup
- 8b2c4367c337 (2026-08-04) test(release): audit live staging controls

## Overview

RxJS Next is the platform-based RxJS 9 prerelease foundation for developers composing asynchronous and event-driven programs. It preserves an existing realm Observable, supplies a conditional fallback, and installs reactive capabilities through imported Symbols, with explicit producer-per-subscription APIs where needed. The monorepo also contains virtual-time testing, bounded RxJS 7 migration tooling, release qualification infrastructure, and a separately maintained Angular documentation application.

## System map

The runtime centers on the active realm's Observable rather than an RxJS-owned replacement constructor. Four versioned packages separate fallback acquisition, reactive extensions, testing, and migration. The documentation application remains on an older Angular/RxJS stack, while package distribution and publication follow an ESM and local-release model.
- The workspace uses pnpm 10.34.5, requires Node >=22.13.0 at the root, and includes packages/* plus apps/rxjs.dev. — [package.json#L2-L7](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/package.json#L2-L7) [pnpm-workspace.yaml#L1-L3](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/pnpm-workspace.yaml#L1-L3)
- The architecture separates platform acquisition, Symbol extensions, and migration tooling; migration tooling is not a runtime dependency. — [docs/rxjs-next/ARCHITECTURE.md#L8-L16](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/docs/rxjs-next/ARCHITECTURE.md#L8-L16) [docs/rxjs-next/ARCHITECTURE.md#L89-L91](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/docs/rxjs-next/ARCHITECTURE.md#L89-L91)
- The rxjs root imports the fallback initializer and exports core classes, subject factories, notifications, and errors without exporting the operator catalog. — [packages/rxjs/src/index.ts#L1-L27](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/packages/rxjs/src/index.ts#L1-L27)
- rxjs depends on @rxjs/observable-polyfill; @rxjs/test declares rxjs as a peer; @rxjs/migrate uses TypeScript and Zod for tooling. — [packages/rxjs/package.json#L62-L64](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/packages/rxjs/package.json#L62-L64) [packages/test/package.json#L39-L44](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/packages/test/package.json#L39-L44) [packages/migrate/package.json#L44-L51](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/packages/migrate/package.json#L44-L51)
- The fallback publishes one ESM implementation for browser, webpack, import, and require conditions; package builds use tshy followed by ESM finalization. — [packages/observable-polyfill/package.json#L19-L25](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/packages/observable-polyfill/package.json#L19-L25) [packages/observable-polyfill/package.json#L60-L79](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/packages/observable-polyfill/package.json#L60-L79)
- apps/rxjs.dev uses Angular 13 and RxJS ^7.5.1, with Angular build/test, Dgeni documentation generation, marble generation, and a Firebase deployment script. — [apps/rxjs.dev/package.json#L8-L38](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/apps/rxjs.dev/package.json#L8-L38) [apps/rxjs.dev/package.json#L45-L63](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/apps/rxjs.dev/package.json#L45-L63)
- Observed state owners include fallback WeakRef subscription state, Subject subscriber Sets, document caches, and a worker search index; these are in-memory structures. — [packages/observable-polyfill/src/index.ts#L580-L602](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/packages/observable-polyfill/src/index.ts#L580-L602) [packages/rxjs/src/subject.ts#L19-L36](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/packages/rxjs/src/subject.ts#L19-L36) [apps/rxjs.dev/src/app/documents/document.service.ts#L34-L52](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/apps/rxjs.dev/src/app/documents/document.service.ts#L34-L52) [apps/rxjs.dev/src/app/search/search.worker.ts#L7-L9](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/apps/rxjs.dev/src/app/search/search.worker.ts#L7-L9)
- release:beta packs four packages in supporting-package-first order, performs publication dry runs, requires exact-version confirmation, then verifies registry integrity and tags. — [scripts/release/beta.mjs#L14-L19](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/scripts/release/beta.mjs#L14-L19) [scripts/release/beta.mjs#L45-L109](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/scripts/release/beta.mjs#L45-L109)

## Feature catalog

The inspected public surface covers Observable conversion and cancellation, Symbol operators, mutable producers, replay, and async consumption. Testing and migration are separate developer-facing products with explicit lifecycle choices. The legacy site provides documentation rendering, search, and lazy embedded components; this catalog is bounded rather than an exhaustive API enumeration.
- Observable.from accepts existing Observables, async iterables, sync iterables, and thenables in that precedence order, rejecting unsupported values. — [packages/observable-polyfill/src/index.ts#L544-L577](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/packages/observable-polyfill/src/index.ts#L544-L577)
- source[map](project) projects values with a subscription-local index; importing rxjs/map installs an exact Symbol property on Observable.prototype. — [packages/rxjs/src/map.ts#L4-L26](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/packages/rxjs/src/map.ts#L4-L26)
- source[switchMap](mapper, {concurrent}) defaults to one active inner and aborts the oldest active inner when capacity is reached. — [packages/rxjs/src/switch-map.ts#L12-L49](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/packages/rxjs/src/switch-map.ts#L12-L49)
- ColdObservable creates an independent producer for every direct subscribe; Subject exposes next/error/complete fanout and a read-only Observable view. — [packages/rxjs/src/cold-observable.ts#L97-L114](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/packages/rxjs/src/cold-observable.ts#L97-L114) [packages/rxjs/src/subject.ts#L40-L88](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/packages/rxjs/src/subject.ts#L40-L88)
- replaySubject supports size and maxAge limits, replays buffered values to subscribers, and follows replay with stored completion or error. — [packages/rxjs/src/replay-subject.ts#L18-L45](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/packages/rxjs/src/replay-subject.ts#L18-L45) [packages/rxjs/src/replay-subject.ts#L50-L73](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/packages/rxjs/src/replay-subject.ts#L50-L73) [packages/rxjs/src/replay-subject.ts#L106-L108](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/packages/rxjs/src/replay-subject.ts#L106-L108)
- iterateBufferedValues provides lazy async iteration over accumulated value batches; generator closure aborts its observer, and accepted buffers precede terminal delivery. — [packages/rxjs/src/iterate-buffered-values.ts#L4-L29](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/packages/rxjs/src/iterate-buffered-values.ts#L4-L29) [packages/rxjs/src/iterate-buffered-values.ts#L38-L47](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/packages/rxjs/src/iterate-buffered-values.ts#L38-L47)
- rxTest offers cold, hot, and platform marble sources, message/subscription assertions, scheduling, animation/idle plans, and manual virtual-time advancement. — [packages/test/src/context.ts#L49-L99](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/packages/test/src/context.ts#L49-L99)
- rxjs-migrate supports dry-run or explicit writes with cold/platform and framework options; rxjs-migrate-skill supports check/install/update/remove for Codex, Claude, and Cursor. — [packages/migrate/src/cli.ts#L194-L204](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/packages/migrate/src/cli.ts#L194-L204) [packages/migrate/src/skill-cli.ts#L70-L97](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/packages/migrate/src/skill-cli.ts#L70-L97)

## Data flow

Runtime values enter through producer callbacks or platform conversion and move through derived Subscribers. AbortSignals carry ownership upstream, while construction hooks preserve the selected lifecycle. Tooling transforms source into planned file outputs, and the documentation app moves generated JSON through caches, worker indexing, and DOM rendering.
- subscribe wraps the observer in SafeObserver, joins or creates the weakly referenced Subscriber, attaches cancellation, and invokes the producer only for a new activation. — [packages/observable-polyfill/src/index.ts#L591-L623](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/packages/observable-polyfill/src/index.ts#L591-L623)
- Subscriber.next snapshots observers for fanout; complete closes first, then notifies the snapshot; closure aborts its signal and runs teardowns in reverse order. — [packages/observable-polyfill/src/index.ts#L147-L177](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/packages/observable-polyfill/src/index.ts#L147-L177) [packages/observable-polyfill/src/index.ts#L206-L217](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/packages/observable-polyfill/src/index.ts#L206-L217) [packages/observable-polyfill/src/index.ts#L242-L249](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/packages/observable-polyfill/src/index.ts#L242-L249)
- map constructs through receiver[create]; createImpl selects the receiver's instance constructor or static constructor instead of hardcoding one output type. — [packages/rxjs/src/map.ts#L14-L23](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/packages/rxjs/src/map.ts#L14-L23) [packages/rxjs/src/create.ts#L28-L42](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/packages/rxjs/src/create.ts#L28-L42)
- subscribeToSource forwards unspecified notifications, converts override exceptions into downstream errors, and combines inner cancellation with the downstream signal. — [packages/rxjs/src/util/observable-helpers.ts#L13-L44](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/packages/rxjs/src/util/observable-helpers.ts#L13-L44)
- Migration source passes through semantic rewriting, optional framework adaptation, provenance insertion, sorted diagnostics, and import deduplication into MigrationResult. — [packages/migrate/src/index.ts#L64-L85](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/packages/migrate/src/index.ts#L64-L85) [packages/migrate/src/index.ts#L88-L114](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/packages/migrate/src/index.ts#L88-L114)
- planMigrationFiles reads canonical source paths, chooses output names, attaches repository/SHA/path provenance, and returns transformed files; applyMigrationPlan writes those exact code strings. — [packages/migrate/src/node.ts#L69-L89](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/packages/migrate/src/node.ts#L69-L89) [packages/migrate/src/node.ts#L94-L134](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/packages/migrate/src/node.ts#L94-L134)
- DocumentService maps location.currentPath to cached document streams, fetches generated/docs/<id>.json into AsyncSubject, and deletes failed non-404 cache entries. — [apps/rxjs.dev/src/app/documents/document.service.ts#L38-L73](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/apps/rxjs.dev/src/app/documents/document.service.ts#L38-L73) [apps/rxjs.dev/src/app/documents/document.service.ts#L89-L95](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/apps/rxjs.dev/src/app/documents/document.service.ts#L89-L95)
- Search initialization loads generated search JSON into a Lunr index and pageMap; query-index messages return query results correlated by message type and id. — [apps/rxjs.dev/src/app/search/search.worker.ts#L68-L109](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/apps/rxjs.dev/src/app/search/search.worker.ts#L68-L109) [apps/rxjs.dev/src/app/shared/web-worker.ts#L20-L44](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/apps/rxjs.dev/src/app/shared/web-worker.ts#L20-L44)

## Behavior traces

The source investigation followed initialization, operator execution, cancellation, and migration output end-to-end. Additional traces cover independent producers, virtual-time cleanup, document rendering, and worker search. These are source-derived execution orders, not recorded runtime executions.
- Initialization: importing rxjs reaches the fallback initializer → initializeObservablePolyfill checks globalThis.Observable → prepares fallback/abort properties only when absent → fills missing EventTarget.when → installs prepared properties. — [packages/rxjs/src/index.ts#L1-L1](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/packages/rxjs/src/index.ts#L1-L1) [packages/observable-polyfill/src/index.ts#L1377-L1438](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/packages/observable-polyfill/src/index.ts#L1377-L1438) [packages/observable-polyfill/src/index.ts#L1492-L1492](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/packages/observable-polyfill/src/index.ts#L1492-L1492)
- Projection: importing map loads create and subscription helpers → installs Observable.prototype[map] → mapOperator calls this[create] → subscription starts subscribeToSource → project(value,index++) feeds subscriber.next. — [packages/rxjs/src/map.ts#L1-L26](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/packages/rxjs/src/map.ts#L1-L26) [packages/rxjs/src/create.ts#L25-L30](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/packages/rxjs/src/create.ts#L25-L30) [packages/rxjs/src/util/observable-helpers.ts#L31-L39](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/packages/rxjs/src/util/observable-helpers.ts#L31-L39)
- Cancellation: observer AbortSignal invokes removeObserver → the final observer triggers closeSubscriber → the producer signal aborts → observer state clears → teardown callbacks run last-in-first-out. — [packages/observable-polyfill/src/index.ts#L136-L177](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/packages/observable-polyfill/src/index.ts#L136-L177) [packages/observable-polyfill/src/index.ts#L613-L615](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/packages/observable-polyfill/src/index.ts#L613-L615)
- Independent producer: ColdObservable.subscribe creates ColdSubscriber → invokes its stored init; Symbol composition uses its [create] override, while string map wraps through #asPlatformObservable. — [packages/rxjs/src/cold-observable.ts#L105-L122](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/packages/rxjs/src/cold-observable.ts#L105-L122) [packages/rxjs/src/cold-observable.ts#L202-L205](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/packages/rxjs/src/cold-observable.ts#L202-L205)
- Migration output: runCli parses/validates arguments → createMigrationCliReport plans files → migrateTestSource performs rewrites → any refused result prevents writes → otherwise applyMigrationPlan preflights and writes → CLI emits JSON and an exit code. — [packages/migrate/src/cli.ts#L64-L113](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/packages/migrate/src/cli.ts#L64-L113) [packages/migrate/src/node.ts#L108-L151](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/packages/migrate/src/node.ts#L108-L151) [packages/migrate/src/index.ts#L64-L85](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/packages/migrate/src/index.ts#L64-L85)
- Virtual test: rxTest queues behind a realm lock → executeRxTest verifies Observable and installs virtual time → runs callback until settled → checks expectations/open work → restores the realm → releases the queue. — [packages/test/src/rx-test.ts#L23-L49](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/packages/test/src/rx-test.ts#L23-L49) [packages/test/src/rx-test.ts#L52-L101](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/packages/test/src/rx-test.ts#L52-L101)
- Documentation: currentPath → getDocument → fetchDocument/AsyncSubject → DocViewer doc setter → render → assign contents → prepare title/TOC → load contained elements → swapViews → docRendered. — [apps/rxjs.dev/src/app/documents/document.service.ts#L43-L73](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/apps/rxjs.dev/src/app/documents/document.service.ts#L43-L73) [apps/rxjs.dev/src/app/layout/doc-viewer/doc-viewer.component.ts#L38-L44](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/apps/rxjs.dev/src/app/layout/doc-viewer/doc-viewer.component.ts#L38-L44) [apps/rxjs.dev/src/app/layout/doc-viewer/doc-viewer.component.ts#L141-L149](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/apps/rxjs.dev/src/app/layout/doc-viewer/doc-viewer.component.ts#L141-L149)
- Search: initWorker races delay against first query → creates Worker/WebWorkerClient → sends load-index → worker XHR builds index → search waits on ready → query-index returns a correlated response inside NgZone. — [apps/rxjs.dev/src/app/search/search.service.ts#L27-L54](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/apps/rxjs.dev/src/app/search/search.service.ts#L27-L54) [apps/rxjs.dev/src/app/search/search.worker.ts#L68-L95](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/apps/rxjs.dev/src/app/search/search.worker.ts#L68-L95) [apps/rxjs.dev/src/app/shared/web-worker.ts#L24-L44](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/apps/rxjs.dev/src/app/shared/web-worker.ts#L24-L44)

## Testing signals

Tests and CI were inspected, not executed; no passing result is asserted by this report. Evidence spans Vitest source tests, classified ported suites, Node package/tooling checks, browser contracts, and pinned WPT. The inspected coverage is bounded, and the legacy site's tests and native-mode fallback behavior require separate interpretation.
- Source tests use Vitest; inspected extension-kernel tests assert assignment descriptors, non-global public Symbols, preserved platform methods, and absence of RxJS string additions. — [packages/rxjs/src/extension-kernel.spec.ts#L1-L2](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/packages/rxjs/src/extension-kernel.spec.ts#L1-L2) [packages/rxjs/src/extension-kernel.spec.ts#L38-L70](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/packages/rxjs/src/extension-kernel.spec.ts#L38-L70)
- The fast-check lifecycle property generates subscribe/abort/next/complete/error actions and checks fanout, activation/teardown accounting, and cleanup; RXJS_FUZZ_RUNS defaults to 200. — [packages/observable-polyfill/src/lifecycle.fuzz.spec.ts#L12-L22](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/packages/observable-polyfill/src/lifecycle.fuzz.spec.ts#L12-L22) [packages/observable-polyfill/src/lifecycle.fuzz.spec.ts#L35-L74](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/packages/observable-polyfill/src/lifecycle.fuzz.spec.ts#L35-L74)
- @rxjs/test fixtures distinguish independent cold timelines, shared platform timelines, absolute hot timelines, construction policy, and virtualized timers/clocks. — [packages/test/src/index.spec.ts#L35-L83](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/packages/test/src/index.spec.ts#L35-L83) [packages/test/src/index.spec.ts#L95-L111](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/packages/test/src/index.spec.ts#L95-L111)
- Migration file tests cover exact planned output, omitted lifecycle refusal, lexical traversal, escaping symlinks, duplicate canonical paths, and batch preflight behavior. — [packages/migrate/src/node.spec.ts#L23-L35](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/packages/migrate/src/node.spec.ts#L23-L35) [packages/migrate/src/node.spec.ts#L49-L105](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/packages/migrate/src/node.spec.ts#L49-L105)
- Ported Vitest runs select cold or platform suites and disable file parallelism; native mode without a global Observable selects native-unavailable.spec.ts rather than exercising native behavior. — [packages/rxjs/vitest.ported.config.ts#L4-L29](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/packages/rxjs/vitest.ported.config.ts#L4-L29)
- Main CI runs package gates on Node 22.13.0 and 24, makes Node 26 advisory, and separately checks exact cold/polyfill audit baselines. — [.github/workflows/ci_main.yml#L30-L43](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/.github/workflows/ci_main.yml#L30-L43) [.github/workflows/ci_main.yml#L45-L89](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/.github/workflows/ci_main.yml#L45-L89)
- Observable WPT pins revision 6a009d73f0d315941b90cac13a9523a2a08c631b and Chrome 150; CI verifies imports and runs lifecycle/kernel/conformance checks, with latest Chrome scheduled as advisory. — [.github/workflows/observable-wpt.yml#L27-L35](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/.github/workflows/observable-wpt.yml#L27-L35) [.github/workflows/observable-wpt.yml#L60-L76](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/.github/workflows/observable-wpt.yml#L60-L76) [.github/workflows/observable-wpt.yml#L94-L99](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/.github/workflows/observable-wpt.yml#L94-L99)
- Release readiness defines browser, Webpack, performance, packed adoption, Deno/Bun, and desktop/iOS Safari gates; the documentation app separately configures Jasmine/Karma with Chrome. — [.github/workflows/release-readiness.yml#L46-L61](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/.github/workflows/release-readiness.yml#L46-L61) [.github/workflows/release-readiness.yml#L69-L98](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/.github/workflows/release-readiness.yml#L69-L98) [.github/workflows/release-readiness.yml#L100-L123](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/.github/workflows/release-readiness.yml#L100-L123) [apps/rxjs.dev/src/karma.conf.js#L4-L31](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/apps/rxjs.dev/src/karma.conf.js#L4-L31)

## Risk map

These risks are source observations or explicitly labeled hypotheses, not confirmed vulnerabilities. The broadest runtime effects come from realm patching, construction policy, and unbounded buffering. Security-sensitive tooling includes file writes, npm publication, privileged rebasing, and documentation HTML ingestion; static inspection also found a stale scheduled test command.
- Fallback initialization replaces AbortController.prototype.abort to emulate abort algorithms before public events, so installation has realm-wide effects beyond Observable itself. — [packages/observable-polyfill/src/index.ts#L60-L90](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/packages/observable-polyfill/src/index.ts#L60-L90) [packages/observable-polyfill/src/index.ts#L1381-L1395](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/packages/observable-polyfill/src/index.ts#L1381-L1395)
- Existing Observable values are preserved without conformance probing; public capability installation uses direct assignment with no common preflight or rollback, leaving hardened-realm initialization outside a transactional guarantee. — [docs/rxjs-next/DECISIONS.md#L24-L29](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/docs/rxjs-next/DECISIONS.md#L24-L29) [docs/rxjs-next/OPEN_QUESTIONS.md#L34-L42](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/docs/rxjs-next/OPEN_QUESTIONS.md#L34-L42) [packages/rxjs/src/map.ts#L26-L26](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/packages/rxjs/src/map.ts#L26-L26)
- Buffered async iteration is explicitly unbounded, and replaySubject defaults both size and maxAge to Infinity; consumers must choose retention limits where producer volume requires them. — [packages/rxjs/src/iterate-buffered-values.ts#L8-L12](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/packages/rxjs/src/iterate-buffered-values.ts#L8-L12) [packages/rxjs/src/replay-subject.ts#L18-L23](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/packages/rxjs/src/replay-subject.ts#L18-L23)
- Hypothesis: migration application is vulnerable to partial output on an operational failure or filesystem change after preflight, because files are written sequentially without a batch rollback or atomic per-file replacement. (inferred) — [packages/migrate/src/node.ts#L125-L151](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/packages/migrate/src/node.ts#L125-L151) [packages/migrate/src/node.ts#L155-L163](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/packages/migrate/src/node.ts#L155-L163)
- DocViewer assigns generated contents directly to innerHTML under an explicit documentation-author trust assumption; this is a content trust boundary, not evidence of exploitable injection. — [apps/rxjs.dev/src/app/layout/doc-viewer/doc-viewer.component.ts#L141-L146](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/apps/rxjs.dev/src/app/layout/doc-viewer/doc-viewer.component.ts#L141-L146) [apps/rxjs.dev/src/app/documents/document.service.ts#L55-L69](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/apps/rxjs.dev/src/app/documents/document.service.ts#L55-L69)
- Publication executes npm against local tarballs and verifies integrity after publishing; guards reject CI, NPM_TOKEN/NODE_AUTH_TOKEN, and noninteractive terminals, but the architecture explicitly trusts the maintainer machine and npm account. — [scripts/release/beta.mjs#L79-L109](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/scripts/release/beta.mjs#L79-L109) [scripts/release/beta.mjs#L164-L171](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/scripts/release/beta.mjs#L164-L171) [docs/rxjs-next/ARCHITECTURE.md#L80-L87](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/docs/rxjs-next/ARCHITECTURE.md#L80-L87)
- The scheduled fuzz workflow still invokes removed release-policy test filenames, while the project log records removal of those scripts; its current command is stale despite retaining the lifecycle fuzz step. — [.github/workflows/fuzz.yml#L22-L26](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/.github/workflows/fuzz.yml#L22-L26) [docs/rxjs-next/PROJECT_PLAN.md#L3706-L3709](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/docs/rxjs-next/PROJECT_PLAN.md#L3706-L3709)
- The rebase workflow grants contents:write for issue comments containing /rebase; separately, the documentation vulnerability backlog records time-limited exceptions, so automation authority and dependency exceptions need their own review. — [.github/workflows/rebase.yml#L8-L22](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/.github/workflows/rebase.yml#L8-L22) [docs/security/LEGACY_DOCS_VULNERABILITIES.md#L3-L9](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/docs/security/LEGACY_DOCS_VULNERABILITIES.md#L3-L9)

## Extension points

The central extension mechanism is an imported exact Symbol plus ambient TypeScript augmentation. A shared construction protocol supports subclasses and compatible duplicate installations, while connector factories customize stateful operators. Migration registries/adapters and the documentation element registry provide separate tooling and UI seams.
- A capability module exports a unique Symbol, augments Observable<T>, implements the operator, and assigns its function to Observable.prototype under that Symbol. — [packages/rxjs/src/map.ts#L4-L26](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/packages/rxjs/src/map.ts#L4-L26)
- The create protocol is registered as rxjs.kernel.create.v1, installed on constructor and prototype, accepts an existing callable slot, and rejects an occupied noncallable slot. — [packages/rxjs/src/create.ts#L4-L26](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/packages/rxjs/src/create.ts#L4-L26) [packages/rxjs/src/create.ts#L45-L58](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/packages/rxjs/src/create.ts#L45-L58)
- Subclass construction is customized through an instance [create] override: ColdObservable returns ColdObservable, while Subject intentionally returns the selected platform base. — [packages/rxjs/src/cold-observable.ts#L114-L114](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/packages/rxjs/src/cold-observable.ts#L114-L114) [packages/rxjs/src/subject.ts#L71-L76](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/packages/rxjs/src/subject.ts#L71-L76)
- share accepts a connector factory and independent error, completion, and zero-refcount reset rules, including Observable-valued reset notifiers. — [packages/rxjs/src/share.ts#L7-L26](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/packages/rxjs/src/share.ts#L7-L26) [packages/rxjs/src/share.ts#L55-L85](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/packages/rxjs/src/share.ts#L55-L85)
- groupBy exposes key selection, element projection, duration Observables, and SubjectLike connector factories, with immutable key properties on group views. — [packages/rxjs/src/group-by.ts#L5-L13](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/packages/rxjs/src/group-by.ts#L5-L13) [packages/rxjs/src/group-by.ts#L146-L152](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/packages/rxjs/src/group-by.ts#L146-L152)
- Migration capability mappings encode legacy/Symbol names, modules, argument adapters, arity, preconditions, status, and fixture evidence; semantic rewriting schema-checks the registry and engine version. — [packages/migrate/src/capabilities.ts#L18-L29](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/packages/migrate/src/capabilities.ts#L18-L29) [packages/migrate/src/capabilities.ts#L32-L54](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/packages/migrate/src/capabilities.ts#L32-L54) [packages/migrate/src/semantics.ts#L24-L50](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/packages/migrate/src/semantics.ts#L24-L50)
- Migration supports an optional frameworkAdapter after semantic rewriting and an OutputNamePolicy for planned filenames; these customize transformation and output without replacing batch planning. — [packages/migrate/src/index.ts#L64-L71](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/packages/migrate/src/index.ts#L64-L71) [packages/migrate/src/node.ts#L6-L22](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/packages/migrate/src/node.ts#L6-L22) [packages/migrate/src/node.ts#L94-L98](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/packages/migrate/src/node.ts#L94-L98)
- The documentation site registers lazy embedded components through selector/loadChildren entries, materializes a callback Map, and exposes it through an Angular InjectionToken. — [apps/rxjs.dev/src/app/custom-elements/element-registry.ts#L7-L55](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/apps/rxjs.dev/src/app/custom-elements/element-registry.ts#L7-L55) [apps/rxjs.dev/src/app/custom-elements/element-registry.ts#L75-L82](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/apps/rxjs.dev/src/app/custom-elements/element-registry.ts#L75-L82)

## Contributor handoff

Future work should start from the project charter and accepted decisions, then follow the smallest relevant runtime or tooling boundary. Tests and CI were inspected, not executed, and this bounded inventory does not prove exhaustive coverage or current gate success. The active plan, lifecycle distinctions, and source-pinned migration evidence are essential safeguards against reintroducing legacy assumptions.
- Read the charter, architecture, decisions, plan, and open questions in that order; read compatibility guidance for API or behavior changes. — [AGENTS.md#L7-L15](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/AGENTS.md#L7-L15)
- P6.10 remains NEXT pending actual beta publication/verification, package automation-token restrictions, and an immutable GitHub Release; inspected local preparation is not completion evidence for publication. — [docs/rxjs-next/PROJECT_PLAN.md#L3710-L3720](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/docs/rxjs-next/PROJECT_PLAN.md#L3710-L3720) [docs/rxjs-next/PROJECT_PLAN.md#L3735-L3736](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/docs/rxjs-next/PROJECT_PLAN.md#L3735-L3736)
- Preserve an existing realm Observable and platform string methods; public RxJS capabilities use exact imported Symbols, with accepted internal registry keys documented separately. — [AGENTS.md#L20-L35](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/AGENTS.md#L20-L35) [docs/rxjs-next/OPEN_QUESTIONS.md#L25-L42](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/docs/rxjs-next/OPEN_QUESTIONS.md#L25-L42)
- Do not port RxJS 7 assumptions mechanically: subscribe returns undefined, cancellation uses AbortSignal, producers register teardown explicitly, and platform teardown order is reversed insertion order. — [docs/rxjs-next/COMPATIBILITY.md#L50-L56](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/docs/rxjs-next/COMPATIBILITY.md#L50-L56)
- Use package scripts for later authorized verification: rxjs has source/ported Vitest, public types, installation/import checks, and migration freshness gates; polyfill has dedicated lifecycle and package checks. — [packages/rxjs/package.json#L26-L49](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/packages/rxjs/package.json#L26-L49) [packages/observable-polyfill/package.json#L22-L27](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/packages/observable-polyfill/package.json#L22-L27)
- Treat test definitions and CI wiring as inspected evidence only: native-unavailable mode substitutes a sentinel suite, Node 26 is advisory, and unit success alone cannot establish WPT conformance. — [packages/rxjs/vitest.ported.config.ts#L9-L25](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/packages/rxjs/vitest.ported.config.ts#L9-L25) [.github/workflows/ci_main.yml#L45-L58](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/.github/workflows/ci_main.yml#L45-L58) [AGENTS.md#L74-L78](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/AGENTS.md#L74-L78)
- Update architecture documentation alongside changes to package boundaries, initialization, Symbol identity, lifecycle, realms, compatibility, exports, or test gates; record durable decisions and revise open questions. — [AGENTS.md#L58-L72](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/AGENTS.md#L58-L72)
- Keep apps/rxjs.dev outside the Next plan unless explicitly coordinated, and inspect migration preflight/refusal behavior before enabling project writes rather than treating dry-run output as automatic write authorization. — [docs/rxjs-next/PROJECT_CHARTER.md#L88-L91](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/docs/rxjs-next/PROJECT_CHARTER.md#L88-L91) [packages/migrate/src/cli.ts#L60-L70](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/packages/migrate/src/cli.ts#L60-L70) [packages/migrate/src/node.ts#L138-L163](https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/packages/migrate/src/node.ts#L138-L163)

Source repository: https://github.com/ReactiveX/rxjs
Full evidence corpus: https://github.com/Codevetter/codevetter/tree/main/benchmarks/repo-unpacks/rxjs.json

## Public product links

- [CodeVetter](https://codevetter.com/)
- [Download](https://codevetter.com/download)
- [Documentation](https://codevetter.com/docs/)
- [Source](https://github.com/Codevetter/codevetter)
