platform-main — code-review audit pipeline

270 source files, reviewed one at a time, each with its own paper trail.

Every module gets a full pass — one file reviewed, one GitHub sub-issue documenting the finding (even when the finding is "none"), one PR, one merge by the repo owner, before the next file starts. Tried opening several PRs in parallel once; every PR after the first needed a rebase because they all touched the same tracking table, so the process stayed sequential on purpose.

Per-File Pipeline

01 todo.md row File path + the exact commit SHA that last touched it, added once review starts Claude
02 Sub-issue Findings written up after the file is actually read, never an empty placeholder created upfront Claude
03 Pull Request One PR per file — a real fix, or a docs-only "reviewed, no findings" record Claude
04 Review & merge Every PR read and merged by hand — nothing self-merges Repo owner
05 Board sync Project-board status flipped to Done as the closing step, not a separate cleanup pass later Claude
The recurring bug pattern this process actually found: in store, all 3 real bugs shared one shape — a function's top-level entry point was missing a null/undefined guard that its own recursive or nested-value handling already had (freeze(), getUnserializable(), combineReducers()). Once that pattern was named, every later module got checked specifically for the same asymmetry — not found again yet, but worth checking every time rather than assuming it was a one-off.

Module Status

Module
Files
Result
done store
27/27
3 real bugs found and fixed, 1 test-coverage gap closed, 23 files clean
done entity
9/9
0 real bugs — 2 structural observations recorded, not defects
done effects
18/18
0 real bugs — one file's constructor ordering turned out to be correctness-critical, confirmed correct as written
done router-store
12/12
7 real bugs found and fixed — mostly declared-type-vs-actual mismatches, plus one incorrect doc comment and one field silently sourced from the wrong object
done store-devtools
11/11
6 real bugs found and fixed plus 1 minor cleanup — including a crash reachable from a public API method that could have taken down an app's entire reactive state stream, not just its devtools panel
done component-store
4/4
1 real gap found and fixed — selectSignal()'s public overloads used two types that were never exported, so the barrel never re-exported them despite the public method needing them
done component
10/10
1 real bug found and fixed (a shared render-event dedup layer silently swallowing a second, genuinely new error notification) plus 2 barrel-export gaps fixed — 7 files clean
done operators
4/4
0 real bugs found, 2 barrel-export gaps fixed — MapResponseObserver/TapResponseObserver were never exported from their own files
done schematics-core
16/16
9 real bugs found and fixed (a stale prerelease version floor; a missing-project ng add error surfacing a raw TypeError instead of a clear message; a findModuleFromOptions auto-detect path that could never run because every caller guarded the call itself; a missing-workspace-file error surfacing a confusing Could not find (undefined) instead of a clear message; addReducerToActionReducerMap crashing on a reducers/index.ts with any typed declaration ordered before the ActionReducerMap-typed one; visitDecorator handing callers a ClassExpression typed as a ClassDeclaration; a cross-file config path built with OS-native separators, breaking on Windows; and replaceImport leaving a dangling comma) plus 2 test-coverage gaps closed, 13 barrel-export gaps closed across 6 files (the largest barrel-gap finding of any module in this audit), and 2 dead-code/vestigial-comment cleanups
done signals
18/18
14 defects found and fixed across 11 files, 2 of them high severity: deep-signal.ts a state property named set/update/asReadonly silently and permanently broke patchState, fixed via a side WeakMap cache instead of writing the deep-signal cache directly onto the underlying writable signal, and with-linked-state.ts a linked slice aliased its source slice, so writing it silently wrote the source; state-source.ts a quadratic getState and three watchState registration bugs; with-hooks.ts hooks called without their receiver; with-props.ts and with-state.ts a class instance passed in now warns; with-computed.ts a quadratic build; ts-helpers.ts and signal-store-models.ts type-level gaps; signal-store-assertions.ts a false-positive dev-mode warning; signal-store-feature.ts a parameter-name typo in a public overload; plus index.ts three types missing from the barrel, 2 test-coverage gaps closed (signal-store.ts, with-feature.ts), and 4 files with no findings of their own
done schematics
25/25
action/index.ts the default output had an unused props import and two whitespace-only lines, and a missing name crashed with a raw TypeError because schema.json did not require it; both fixed, plus a coverage gap closed; action/schema.ts prefix was declared required although it has a default, plus three wrong doc comments, all fixed; component-store/index.ts --component also set module through a shared -m alias, so a file holding both a component and its NgModule got the store twice, a missing name crashed, and the generated store had a stray semicolon, all fixed; component-store/schema.ts two wrong doc comments fixed; container/index.ts the generated spec did not compile with default options, plus three schema defects, all fixed; container/schema.ts the declared stateInterface did nothing, now types the store; data/index.ts the generated service spec failed when run, fixed; data/schema.ts four wrong doc comments fixed; effect/index.ts a broken NgModule import, nameless files from a missing name and unclean output, all fixed; effect/schema.ts name typed required though optional by design, fixed; entity/index.ts failed in a standalone app, fixed; entity/schema.ts seven doc comments fixed; feature/index.ts entity-mode effects that did not compile, fixed; feature/schema.ts doc comments fixed; ng-add/index.ts a duplicate collection entry on re-run, fixed; ng-add/schema.ts a standing lint warning fixed; ngrx-push-migration/index.ts a migration that broke every app it touched, fixed; ngrx-push-migration/schema.ts a standing lint warning fixed; reducer/index.ts uncompilable default output, broken nested registrations and the standalone-app failure, fixed; reducer/schema.ts nine doc comments fixed; selector/index.ts unused-import-only output and an empty test, fixed; selector/schema.ts a missing name prompt, fixed; store/index.ts the standalone-app failure and unused imports, fixed; store/schema.ts an optional-by-design name typed required, fixed; src/index.ts the empty entry point documented, its dangling types field tracked in #478
done data
61/61
actions/entity-action-factory.ts a throw test that never reached the check it named, fixed; actions/entity-action-guard.ts a garbled and two context-free error messages, and TypeError crashes on malformed payloads, fixed; actions/entity-action-operators.ts ofEntityType(undefined) selected the non-entity actions instead of the entity ones, fixed; actions/entity-action.ts types only, one undocumented option documented; actions/entity-cache-action.ts SaveEntities wrote the tag onto the caller's change set, fixed; actions/entity-cache-change-set.ts a delete of key 0 silently dropped from a save, fixed; actions/entity-op.ts no defect, its op pairing now checked by a spec; actions/merge-strategy.ts no findings; actions/update-response-data.ts no defects; dataservices/data-service-error.ts a missing error crashed it, and object-body HTTP errors lost their message, fixed; dataservices/default-data-service-config.ts no defects; dataservices/default-data.service.ts queryParams dropped when httpParams given, fixed; dataservices/entity-cache-data.service.ts a timeout escaped the error handler, fixed; dataservices/entity-data.service.ts an entity named constructor got a built-in function, fixed; dataservices/http-url-generator.ts the root was lowercased, fixed; dataservices/interfaces.ts no defects; dataservices/persistence-result-handler.service.ts no defects; dispatchers/entity-cache-dispatcher.ts a correlation id of 0 could not be canceled, fixed; dispatchers/entity-commands.ts no defects; dispatchers/entity-dispatcher-base.ts loadWithQuery merged instead of replacing, fixed; dispatchers/entity-dispatcher-default-options.ts no defects; dispatchers/entity-dispatcher-factory.ts a subscription outlived ngOnDestroy, fixed; dispatchers/entity-dispatcher.ts PersistenceCanceled now an Error; effects/entity-cache-effects.ts an optimistic save answered with no content never reported success, fixed; effects/entity-effects-scheduler.ts no defects; effects/entity-effects.ts no defects; entity-data-config.ts initialEntityCacheState was ignored, fixed; entity-data-without-effects.module.ts no defects; entity-data.module.ts no code defect, the effects requirement documented; entity-metadata/entity-definition.service.ts an entity named constructor got a built-in function, fixed; entity-metadata/entity-definition.ts it modified the caller's metadata, fixed; entity-metadata/entity-filters.ts a global RegExp skipped matches, fixed; entity-metadata/entity-metadata.ts reserved state names now rejected, fixed; entity-services/entity-collection-service-base.ts four commands dropped their options, fixed; entity-services/entity-collection-service-elements-factory.ts no defects, coverage gap closed; entity-services/entity-collection-service-factory.ts custom selectors$ typed, fixed; entity-services/entity-collection-service.ts custom selectors$ now on the service, fixed; entity-services/entity-services-base.ts prototype-free, trimmed service registry, fixed; entity-services/entity-services-elements.ts root-store docs fixed, spec added; entity-services/entity-services.ts register-by-name in the contract, fixed; index.ts ENTITY_EFFECTS_SCHEDULER now exported, fixed; provide-entity-data.ts directly provided meta-reducers kept, fixed; reducers/constants.ts custom cache name in any provider order, fixed; reducers/entity-cache-reducer.ts reducer errors no longer stop the store, fixed; reducers/entity-cache.ts no defects, docs added; reducers/entity-change-tracker-base.ts preserve-changes merges fixed; reducers/entity-change-tracker.ts no defects, docs fixed; reducers/entity-collection-creator.ts no defects, tests tightened; reducers/entity-collection-reducer-methods.ts batch deletes reach the server, fixed; reducers/entity-collection-reducer-registry.ts trimmed, prototype-free registry, fixed; reducers/entity-collection-reducer.ts own methods only, fixed; reducers/entity-collection.ts no defects, docs fixed; selectors/entity-cache-selector.ts no defects, coverage gap closed; selectors/entity-selectors$.ts no stale error replay, fixed; selectors/entity-selectors.ts selector-name clashes rejected, fixed; utils/correlation-id-generator.ts no defects, docs fixed; utils/default-logger.ts falsy values logged, fixed; utils/default-pluralizer.ts "-es" rule fixed; utils/guid-fns.ts time part always 12 digits, fixed; utils/interfaces.ts plural names token typed, fixed; utils/utilities.ts no defects, coverage gap closed
done eslint-plugin
55/55
configs/all-type-checked.ts no defects, type-information requirement documented; configs/all.ts no defects, exact-rules test added; configs/component-store.ts no defects, exact-rules test added; configs/effects-type-checked.ts no defects, exact-rules test added; configs/effects.ts no defects, exact-rules test added; configs/operators.ts no defects, exact-rules test added; configs/signals-type-checked.ts no defects, exact-rules test added; configs/signals.ts no defects, exact-rules test added; configs/store.ts no defects, exact-rules test added; index.ts 1 bug fixed (default export vs preset plugin); rule-creator.ts no defects, docs-URL test added; avoid-combining-component-store-selectors.ts 2 bugs fixed; avoid-mapping-component-store-selectors.ts 2 bugs fixed; require-super-ondestroy.ts 3 bugs fixed; updater-explicit-return-type.ts message fixed, follow-up #649; avoid-cyclic-effects.ts 3 bugs fixed (functional effects); no-dispatch-in-effects.ts 1 bug fixed (functional effects); no-effects-in-providers.ts 2 bugs fixed (broken auto-fix, provideEffects); no-multiple-actions-in-effects.ts 2 bugs fixed; prefer-action-creator-in-of-type.ts 2 bugs fixed; prefer-effect-callback-in-block-statement.ts 1 bug fixed (auto-fix); use-effects-lifecycle-interface.ts 3 bugs fixed; rules/index.ts no defects; prefer-concat-latest-from.ts 2 bugs fixed (functional effects, fix); enforce-type-call.ts 1 bug fixed; prefer-protected-state.ts 1 bug fixed (suggestion); signal-state-no-arrays-at-root-level.ts 2 bugs fixed; signal-store-feature-should-use-generic-type.ts 3 bugs fixed; with-state-no-arrays-at-root-level.ts 2 bugs fixed; avoid-combining-selectors.ts 2 bugs fixed; avoid-dispatching-multiple-actions-sequentially.ts 2 bugs fixed; avoid-duplicate-actions-in-reducer.ts 3 bugs fixed; avoid-mapping-selectors.ts 2 bugs fixed; good-action-hygiene.ts 2 bugs fixed; no-multiple-global-stores.ts 2 bugs fixed (inject()); no-reducer-in-key-names.ts 2 bugs fixed; no-store-subscription.ts 2 bugs fixed; no-typed-global-store.ts 1 bug fixed; on-function-explicit-return-type.ts 1 bug fixed (suggestion); prefer-action-creator-in-dispatch.ts 2 bugs fixed; prefer-action-creator.ts 1 bug fixed; prefer-inline-action-props.ts 1 bug fixed (action groups); prefer-one-generic-in-create-for-feature-selector.ts no code defects, namespace import; prefer-selector-in-select.ts 1 bug fixed; prefix-selectors-with-select.ts 2 bugs fixed (suggestion); select-style.ts 6 defects fixed (fixes, stores in variables); use-consistent-global-store-name.ts 4 defects fixed (rename, stores missed); folder.ts no defects (spec added); guards.ts 1 latent bug fixed, dead code removed; helper-functions/index.ts no defects; ngrx-modules.ts no defects (module test added); rules.ts no defects, dead code removed; utils.ts 5 defects fixed (aliased imports), helper consolidated; utils/index.ts no defects; selectors/index.ts no defects, dead code removed

Helpdesk Status

The same pipeline, run again on the Helpdesk app (#1001): 123 files across its five projects, bottom-up through the dependency chain, each file with its own sub-issue and PR, merged by hand. A bug fix came with a test that failed without it; where a unit test could not show it, the fix was shown on the real Docker stack or in the browser first.

Project
Files
Result
done helpdesk-contract
11/11
4 bugs fixed, about 10 doc fixes, 1 missing spec added, dead code removed (#1002)
done helpdesk-server
23/23
7 bugs and gaps fixed in their own PRs, among them the password hashing cost, an assign/take race and a CI check for missing migrations, 3 more in the files' own PRs; the SQL migrations reviewed (#1003)
done helpdesk-api
24/24
7 bugs and gaps fixed, among them the published development sign-in secret usable in production, no sign-in limit, a crash on a database restart and an image whose packages were not the tested versions (#1004)
done helpdesk
63/63
15 files clean; fixes include a landing-page section that had dropped off screen, a catch-all route, phone layouts, one popup per click, the in-browser demo built by CI before a merge, and nginx security headers and compression (#1005)
done helpdesk-e2e
2/2
2 bugs fixed, each shown on the Docker stack first: a run cut short no longer leaves the next one testing stale data, and an empty seed password setting means the default (#1006)