Skip to content

feat(core): Log recent actions on __DC_ACTIONS__ and give same-named stores unique keys - #4393

Merged
ntucker merged 17 commits into
masterfrom
claude/project-thread-oeku77
Oct 17, 2026
Merged

ntucker merged 17 commits into
masterfrom
claude/project-thread-oeku77

Conversation

@ntucker

@ntucker ntucker commented Oct 15, 2026 •

Copy link
Copy Markdown
Collaborator

Requested by Nathaniel · project thread

Stacked on #4391.

Motivation

Before: a coding agent (or anyone in the console) could only see dispatched actions by wrapping Controller._dispatch after the page loaded, so the fetches made during page load were never visible unless the Redux DevTools extension was installed. Two stores on the default devtools name also replaced each other in __DC_CONTROLLERS__, so only one could be found, though the docs said multiple providers were fully supported.

After: in development, DevToolsManager keeps each store's recent actions from startup on globalThis.__DC_ACTIONS__, keyed like __DC_CONTROLLERS__, with or without the extension. A store whose name is taken registers as 'Data Client: My App (2)'.

__DC_ACTIONS__.get('Data Client: My App').slice(-10);

Solution

  • The log is part of the dev-only middleware. It respects skipLogging like the extension does, keeps up to maxBufferLength actions (twice maxAge, 100 by default), and trims in place so the array on the global stays current. Production builds keep the pass-through middleware.
  • init() picks the first free key (name, name (2), ...) and cleanup() removes that key from both maps. Where there is no window (server rendering), a same-named store replaces the previous one instead, because per-request stores are never cleaned up and unique keys would keep every request's store alive. The check is window, not document, so React Native (which has a window but no document) still gets unique keys.
  • The debugging skill now uses the built-in log and returns actionLog: 'built-in'. On older versions it falls back to wrapping dispatch ('shim'), because skills aren't pinned to the user's package version. Both paths store raw actions, and the Step 3 snippets return only the useful fields.
  • Docs: DevToolsManager "Programmatic store access", the coding-agents draft post, and two changesets.

Tests: packages/core/src/manager/__tests__/devtoolsManager.ts covers pre-init logging without the extension, the cap, skipLogging, duplicate names, re-init and cleanup; devtoolsManager.node.ts covers server rendering (no window: replace) and React Native (window only: unique keys). I also ran the skill's Step 1 shim and Step 3 snippets, extracted from the doc, against a real Controller with DevToolsManager and NetworkManager, in both built-in and fallback modes (temporary test, not committed).

Open questions

The Redux extension still shows two same-named stores under one name. Only the registry key is made unique, because the extension connection is opened in the constructor, before it's known which names are taken.

🤖 Generated with Claude Code

https://claude.ai/code/session_01U7fXTuhewgyp2SGAqY6LgJ


Generated by Claude Code


Note

Low Risk
Changes are dev-only middleware and documentation; production builds keep pass-through behavior. Registry key logic is covered by new unit tests for SSR, RN, polling, and duplicate names.

Overview
Dev-only programmatic debugging now exposes each store’s dispatch history on globalThis.__DC_ACTIONS__ (same keys as __DC_CONTROLLERS__), including page-load fetches, without requiring the Redux DevTools extension. The log is capped and summarized (newest 20 full payloads; polling keys limited via configurable maxPollingActions).

Multi-store registration no longer overwrites same default devtools names: browsers/React Native get suffixed keys ((2), (3)…); SSR without window replaces the prior entry to avoid leaking per-request stores.

Docs and agent skills add a symptom → “check first” table, wire the debug shim to the built-in log (actionLog: 'built-in') with a legacy dispatch-wrap fallback, and refresh Step 3 snippets (meta + action errors, safe serialization). DevToolsManager API docs and the coding-agents post document __DC_ACTIONS__.

Reviewed by Cursor Bugbot for commit af22339. Bugbot is set up for automated code reviews on this repo. Configure here.

@changeset-bot

changeset-bot Bot commented Oct 15, 2026 •

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: af22339

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 7 packages
Name Type
@data-client/core Patch
@data-client/react Patch
@data-client/vue Patch
example-benchmark Patch
example-benchmark-react Patch
test-bundlesize Patch
coinbase-lite Patch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@ntucker ntucker self-assigned this Oct 15, 2026
@codecov

codecov Bot commented Oct 15, 2026 •

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 98.37%. Comparing base (2a73c61) to head (af22339).
⚠️ Report is 7 commits behind head on master.

Additional details and impacted files
@@           Coverage Diff           @@
##           master    #4393   +/-   ##
=======================================
  Coverage   98.37%   98.37%           
=======================================
  Files         161      161           
  Lines        3072     3072           
  Branches      604      604           
=======================================
  Hits         3022     3022           
  Misses         10       10           
  Partials       40       40           

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@ntucker
ntucker marked this pull request as ready for review October 15, 2026 20:23
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 15, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-17T19:25:26.902013Z af22339 New commits
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@ntucker

ntucker commented Oct 15, 2026

Copy link
Copy Markdown
Collaborator Author

Staff engineer (Cursor agent): Re-review of 4cb6039..725d1f6 (summarize old actions, cap polling keys). One small change requested. Everything else in the delta looks right.

Requested change: the polling cap only holds on the first subscribe

In logAction, the scan removes the maxPollingActions-th newest entry for the key and then breaks. The comment says this works because "the log already holds at most maxPollingActions for this key". That's true on the first subscribe, since the SUBSCRIBE push trims the mount fetch/response itself. It stops being true once a polling key unsubscribes and later resubscribes (navigate away and back, or remount). While the key isn't polling, its entries go in uncapped: the UNSUBSCRIBE, the remount fetch and the remount setResponse. After it resubscribes, each push removes one entry and adds one, so the key's count never drops back to the cap. Older entries for that key stay until pushCapped halves the log, and each away/back cycle adds about 3 more. Memory is still bounded by maxBufferLength, but the code comment and the docs ("keeps only its last maxPollingActions actions") are wrong in that case.

Suggested fix (makes the code simpler and drops the invariant): don't break, and remove every match past the cap:

for (let i = log.length - 1, seen = 0; i >= 0; i--) {
  if ((log[i] as { key?: string }).key === key && ++seen >= this.maxPollingActions)
    log.splice(i, 1);
}

This scans the whole log (≤ maxBufferLength) once per action on a polling key, which costs nothing at poll intervals. Also please add a test for subscribe → polls → unsubscribe → fetch/response → subscribe → polls, checking the key ends at maxPollingActions.

What I validated, and how

  • I ported logAction/summarize/pushCapped from 725d1f6 to a standalone Node script and ran it. With default settings, 5 cycles of mount (fetch, response, subscribe) → 10 polls → unsubscribe → 3 unrelated actions left key a at 5, 8, 11, 14, 17 entries. After resubscribing and 10 more polls it was still at 17, and they were mostly stale fetch/setresponse. With the break removed, the same run stays at 4 to 5 and ends at 4 (fetch, setresponse, fetch, setresponse). The first-subscribe case with maxPollingActions: 2 capped correctly (2 entries) in both versions.
  • In the same port I checked summarization by object identity over 20,000 random actions (polling removals, subscribes/unsubscribes, pushCapped halving). Exactly the newest 20 entries were the original objects every time, all older ones were summaries, and the length never went over 100: 0 violations.
  • I read gh pr checks at 725d1f6: all CircleCI jobs pass (typecheck, lint, unit tests incl. native, esmodule-types, browser build). Cursor Bugbot was still pending.

Only read in code, not run

  • summarize drops the FETCH promise/resolve/reject and the payloads, and keeps error responses. Skill docs moving from meta.date to meta.fetchedAt matches what FETCH summaries keep.
  • NetworkManager.skipLogging only skips duplicate FETCH, so SUBSCRIBE/UNSUBSCRIBE always reach the refcount. DevToolsManager is unshifted ahead of SubscriptionManager, so it sees them first.
  • Not blocking: logAction, summarize and the polling field sit outside the NODE_ENV guard, so they ship wherever the class survives in prod, like init/handleAction already do. They're never called there.

ntucker commented Oct 15, 2026

Copy link
Copy Markdown
Collaborator Author

Agreed, and fixed in this PR. a569c84 drops the break, so every match past the cap is removed (the post-push review caught the same thing). It also renames the count map to pollingSubscribers and says "per key (endpoint and args)" in the docs. b3a44a2 adds the test you asked for: three subscribe → polls → unsubscribe → fetch/response cycles, then a resubscribe, and the key ends at maxPollingActions. There's also a test for entries logged before the first subscribe.

On the non-blocking note: leaving it as is. The class already ships init/handleAction the same way, and production never calls these.


Generated by Claude Code

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: b3a44a2f2b

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread packages/core/src/manager/DevtoolsManager.ts Outdated
Comment thread packages/core/src/manager/DevtoolsManager.ts Outdated

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 74d740e3f0

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread packages/core/src/manager/DevtoolsManager.ts

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 2206128056

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread packages/core/src/manager/DevtoolsManager.ts Outdated
Comment thread packages/core/src/manager/DevtoolsManager.ts Outdated
Base automatically changed from cursor/devtools-debug-shim-alias-a1e0 to master October 16, 2026 03:30
claude added 13 commits October 16, 2026 03:31
…stores unique keys

DevToolsManager now records each store's recent actions in development,
from startup and with or without the Redux DevTools extension, on
globalThis.__DC_ACTIONS__ (keyed like __DC_CONTROLLERS__). A store whose
devtools name is taken registers as 'name (2)' instead of replacing the
first. The debugging skill uses the built-in log and falls back to
wrapping dispatch on older versions.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01U7fXTuhewgyp2SGAqY6LgJ
Per-request SSR stores (e.g. Vue's DataClientPlugin with default managers)
never run cleanup, so suffixing their keys would keep every request's
store alive in development. Unique keys now apply only on a page.

Also covers the third-collision key and the cleanup guard in tests.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01U7fXTuhewgyp2SGAqY6LgJ
… keys on React Native

React Native has no document but does define window, so the document
check made same-named React Native stores replace each other.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01U7fXTuhewgyp2SGAqY6LgJ
Pins the React Native case, and words the docs and comment as the
condition the code checks.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01U7fXTuhewgyp2SGAqY6LgJ
…ling keys

Only the newest 20 actions keep args and response; older ones keep type,
key, endpoint, meta and error responses. While an endpoint polls, the log
keeps only its last maxPollingActions (default 4) actions.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01U7fXTuhewgyp2SGAqY6LgJ
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01U7fXTuhewgyp2SGAqY6LgJ
Also say the polling cap is per key (endpoint and args), and rename the
subscriber count map.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01U7fXTuhewgyp2SGAqY6LgJ
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01U7fXTuhewgyp2SGAqY6LgJ
… key on re-init

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01U7fXTuhewgyp2SGAqY6LgJ
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01U7fXTuhewgyp2SGAqY6LgJ
… 0 as polling

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01U7fXTuhewgyp2SGAqY6LgJ
…ed sections

Skill evals (with and without the skill on three bugs) showed agents never
used the polling pattern, checklist or network-correlation sections, and
asked for a symptom-to-first-check hint.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01U7fXTuhewgyp2SGAqY6LgJ
…ation loops in devtools debugging

Harder evals (refetch loop, wrapped mutation response, stale list cache) on
Sonnet and Haiku showed: normalization errors live only in meta, so the
errors snippet missed them; agents sliced the trimmed log by index; and one
run never opened the reference.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01U7fXTuhewgyp2SGAqY6LgJ
@ntucker
ntucker force-pushed the claude/project-thread-oeku77 branch from 6452b16 to 13c3de3 Compare October 16, 2026 03:31
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.
To continue using code reviews, you can upgrade your account or add credits to your account and enable them for code reviews in your settings.

@github-actions

github-actions Bot commented Oct 16, 2026 •

Copy link
Copy Markdown
Contributor

Size Change: 0 B

Total Size: 112 kB

ℹ️ View Unchanged
Filename Size Change
examples/test-bundlesize/dist/App.js 1.45 kB 0 B
examples/test-bundlesize/dist/polyfill.js 301 B 0 B
examples/test-bundlesize/dist/rdcClient.js 10.8 kB +3 B (+0.03%)
examples/test-bundlesize/dist/rdcEndpoint.js 8.04 kB 0 B
examples/test-bundlesize/dist/rdcNextjs.js 12.4 kB +1 B (+0.01%)
examples/test-bundlesize/dist/rdcPipeableStream.js 9.65 kB 0 B
examples/test-bundlesize/dist/react.js 68.6 kB 0 B
examples/test-bundlesize/dist/webpack-runtime.js 698 B 0 B

compressed-size-action

@github-actions github-actions Bot left a comment •

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Benchmark React

Details
Benchmark suite Current: af22339 Previous: 7c55890 Ratio
data-client: getlist-100 149.29 ops/s (± 7.8%) 157.49 ops/s (± 8.3%) 1.05
data-client: getlist-500 47.2 ops/s (± 9.5%) 49.38 ops/s (± 7.4%) 1.05
data-client: update-entity 322.58 ops/s (± 6.9%) 357.14 ops/s (± 8.5%) 1.11
data-client: update-user 327.96 ops/s (± 9.4%) 357.14 ops/s (± 6.6%) 1.09
data-client: getlist-500-sorted 51.55 ops/s (± 8.6%) 53.63 ops/s (± 7.4%) 1.04
data-client: update-entity-sorted 303.03 ops/s (± 6.6%) 318.18 ops/s (± 8.9%) 1.05
data-client: update-entity-multi-view 303.03 ops/s (± 7.6%) 322.58 ops/s (± 6.4%) 1.06
data-client: list-detail-switch-10 9.66 ops/s (± 9.6%) 9.07 ops/s (± 9.3%) 0.94
data-client: update-user-10000 81.63 ops/s (± 9.1%) 76.05 ops/s (± 10.4%) 0.93
data-client: invalidate-and-resolve 37.81 ops/s (± 6.8%) 41.84 ops/s (± 5.3%) 1.11
data-client: unshift-item 227.27 ops/s (± 2.1%) 274.02 ops/s (± 1.7%) 1.21
data-client: delete-item 312.5 ops/s (± 8.6%) 298.57 ops/s (± 9.4%) 0.96
data-client: move-item 181.88 ops/s (± 6.6%) 185.19 ops/s (± 6.8%) 1.02

This comment was automatically generated by workflow using github-action-benchmark.

@github-actions

github-actions Bot commented Oct 16, 2026 •

Copy link
Copy Markdown
Contributor

Docs preview: https://docs-site-pr-4393-data-client.vercel.app

Built from af22339 merged into master (this build). English only: this PR doesn't touch translations.

@github-actions github-actions Bot left a comment •

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Benchmark

Details
Benchmark suite Current: af22339 Previous: 7c55890 Ratio
normalizeLong 584 ops/sec (±2.81%) 514 ops/sec (±2.92%) 0.88
normalizeLong Values 526 ops/sec (±0.29%) 461 ops/sec (±0.36%) 0.88
normalizeLong Scalar 514 ops/sec (±2.11%) 451 ops/sec (±2.88%) 0.88
normalizeLong Scalar update 1054 ops/sec (±0.10%) 940 ops/sec (±0.85%) 0.89
denormalizeLong 364 ops/sec (±5.83%) 308 ops/sec (±6.55%) 0.85
denormalizeLong Values 326 ops/sec (±4.53%) 283 ops/sec (±4.69%) 0.87
denormalizeLong donotcache 1425 ops/sec (±0.78%) 1313 ops/sec (±0.97%) 0.92
denormalizeLong Values donotcache 980 ops/sec (±0.13%) 872 ops/sec (±1.07%) 0.89
denormalizeLong Scalar donotcache 1439 ops/sec (±0.09%) 1261 ops/sec (±0.86%) 0.88
denormalizeShort donotcache 500x 2020 ops/sec (±0.10%) 1754 ops/sec (±0.87%) 0.87
denormalizeShort 500x 916 ops/sec (±7.34%) 770 ops/sec (±6.56%) 0.84
denormalizeShort 500x withCache 9105 ops/sec (±0.11%) 8798 ops/sec (±0.42%) 0.97
queryShort 500x withCache 4840 ops/sec (±0.13%) 4590 ops/sec (±0.60%) 0.95
buildQueryKey All 78139 ops/sec (±1.01%) 72518 ops/sec (±0.57%) 0.93
query All withCache 7450 ops/sec (±3.96%) 7243 ops/sec (±6.06%) 0.97
denormalizeLong with mixin Entity 338 ops/sec (±6.52%) 280 ops/sec (±8.60%) 0.83
denormalizeLong withCache 7403 ops/sec (±0.18%) 7241 ops/sec (±0.37%) 0.98
denormalizeLong withCache (Scalar churn) 7368 ops/sec (±0.67%) 7142 ops/sec (±1.18%) 0.97
denormalizeLong Values withCache 6539 ops/sec (±1.10%) 6328 ops/sec (±1.87%) 0.97
denormalizeLong Scalar withCache 8982 ops/sec (±0.27%) 8343 ops/sec (±1.05%) 0.93
denormalizeLong Scalar update withCache 3617 ops/sec (±0.18%) 3509 ops/sec (±0.41%) 0.97
denormalizeLong All withCache 6120 ops/sec (±0.24%) 6458 ops/sec (±0.30%) 1.06
denormalizeLong Query-sorted withCache 7652 ops/sec (±4.73%) 7408 ops/sec (±5.81%) 0.97
denormalizeLongAndShort withEntityCacheOnly 2150 ops/sec (±0.21%) 1845 ops/sec (±0.64%) 0.86
denormalize bidirectional 50 7042 ops/sec (±9.81%) 6284 ops/sec (±11.56%) 0.89
denormalize bidirectional 50 donotcache 60240 ops/sec (±0.48%) 53624 ops/sec (±0.83%) 0.89
getResponse 5618 ops/sec (±2.68%) 4915 ops/sec (±5.74%) 0.87
getResponse (null) 15114528 ops/sec (±0.44%) 13533430 ops/sec (±1.34%) 0.90
getResponse (clear cache) 303 ops/sec (±7.48%) 259 ops/sec (±7.83%) 0.85
getSmallResponse 5218 ops/sec (±0.21%) 4735 ops/sec (±1.05%) 0.91
getSmallInferredResponse 4227 ops/sec (±4.82%) 4049 ops/sec (±0.96%) 0.96
getResponse Collection 4808 ops/sec (±2.75%) 5296 ops/sec (±4.78%) 1.10
get Collection 2718 ops/sec (±0.32%) 3986 ops/sec (±0.58%) 1.47
get Query-sorted 5791 ops/sec (±3.15%) 5414 ops/sec (±5.78%) 0.93
setLong 586 ops/sec (±0.20%) 519 ops/sec (±0.16%) 0.89
setLongWithMerge 325 ops/sec (±0.14%) 294 ops/sec (±1.13%) 0.90
setLongWithSimpleMerge 353 ops/sec (±0.07%) 310 ops/sec (±1.09%) 0.88
setSmallResponse 500x 1275 ops/sec (±1.00%) 1056 ops/sec (±1.11%) 0.83
setMany 50x one-per-row 285 ops/sec (±0.33%) 257 ops/sec (±1.01%) 0.90
setMany 50 batch 5417 ops/sec (±0.53%) 4599 ops/sec (±1.07%) 0.85
setMany 500x one-per-row 31.26 ops/sec (±0.42%) 29.39 ops/sec (±0.92%) 0.94
setMany 500 batch 1707 ops/sec (±0.10%) 1540 ops/sec (±0.91%) 0.90

This comment was automatically generated by workflow using github-action-benchmark.

… builds

Move trackPolling and logAction into the development-only prototype block and
create their state in a development-only constructor branch, so production
bundles drop them (DevToolsManager's minified gzip size goes from +381 B over
master to +35 B). Share one polling test setup.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01U7fXTuhewgyp2SGAqY6LgJ
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.
To continue using code reviews, you can upgrade your account or add credits to your account and enable them for code reviews in your settings.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01U7fXTuhewgyp2SGAqY6LgJ
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.
To continue using code reviews, you can upgrade your account or add credits to your account and enable them for code reviews in your settings.

ntucker commented Oct 16, 2026

Copy link
Copy Markdown
Collaborator Author

@codex review the changes since your last completed review at commit 2206128056, through the current head ad1d9e2e96b6a15d3a4abfe69fd551946e2e6240. Subsequent automatic review attempts were blocked by code review usage limits. Focus on the changes in that range and verify the fixes for previous findings, using the surrounding code as needed.

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. Breezy!

Reviewed commit: ad1d9e2e96

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

…eware

trackPolling and logAction are only called from the middleware, so they
become local functions there instead of protected prototype members,
dropping them from the published types. Comments in init() now sit by
the statements they explain.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01U7fXTuhewgyp2SGAqY6LgJ
Split the request-rate row so a request that never fires points at
meta.expiresAt and a missing rdc/subscribe, point meta errors at the
snippet that reads them, and cover a created item missing from a list.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01U7fXTuhewgyp2SGAqY6LgJ
@ntucker
ntucker added this pull request to the merge queue Oct 17, 2026
Merged via the queue into master with commit a32740d Oct 17, 2026
38 checks passed
@ntucker
ntucker deleted the claude/project-thread-oeku77 branch October 17, 2026 19:29

This branch was successfully deployed

1 active deployment
docs-preview — af223396 Deployed Oct 17, 2026 by ntucker via docs deploy #3345
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants