Skip to content

⚡ add structured key detection to optimize flat query decoding#55

Merged
techouse merged 3 commits intomainfrom
chore/optimize-decoder
Mar 5, 2026
Merged

⚡ add structured key detection to optimize flat query decoding#55
techouse merged 3 commits intomainfrom
chore/optimize-decoder

Conversation

@techouse
Copy link
Owner

@techouse techouse commented Mar 5, 2026

This pull request introduces several improvements and fixes to the query string decoding logic and enhances compatibility with .NET Standard 2.0. The most significant changes include a refactor to how query string parts are collected and filtered, improved handling of decoding and edge cases, and the addition of new tests to verify consistent decoding behavior. Additionally, conditional compilation directives are added throughout the codebase to ensure .NET Standard 2.0 compatibility.

Decoder logic improvements

  • Replaced the previous approach of splitting and filtering query string parts with a new set of helper methods (CollectNonEmptyParts, CollectNonEmptyStringParts, CollectNonEmptyEnumerableParts) to efficiently collect only those parts with non-empty raw keys, improving both performance and correctness. (QsNet/Internal/Decoder.cs) [1] [2] [3]
  • Improved handling of list values and decoding: now decodes each item in a list individually and handles special cases for empty or bracketed keys more robustly. (QsNet/Internal/Decoder.cs)
  • Fixed logic for checking parameter limits and handling of raw keys and delimiters, ensuring correct behavior across .NET versions. (QsNet/Internal/Decoder.cs) [1] [2] [3]

.NET Standard 2.0 compatibility

  • Added #if NETSTANDARD2_0 conditional compilation directives and moved certain using statements inside these blocks in multiple files to improve compatibility with .NET Standard 2.0. (QsNet/Enums/Format.cs [1] QsNet/Enums/ListFormat.cs [2] QsNet/Enums/Sentinel.cs [3] QsNet/Extensions.cs [4] QsNet/Internal/Decoder.cs [5] QsNet/Internal/EncodeFrame.cs [6] QsNet/Internal/Encoder.cs [7] QsNet/Internal/MergeFrame.cs [8] QsNet/Internal/SideChannelFrame.cs [9]

Test coverage and reliability

  • Added new tests to ensure consistent decoding between string and map inputs, to verify preservation of key collision semantics, and to check correct handling of flat queries. (QsNet.Tests/DecodeTests.cs)
  • Added tests and a custom TrackingThrowingEncoding to verify that decoding logic does not unnecessarily invoke URL decoding or throw when not required, improving robustness. (QsNet.Tests/UtilsTests.cs)

Miscellaneous fixes and refactoring

  • Refactored several methods to use local variables for compatibility and clarity, and improved handling of edge cases in key parsing and dot/bracket conversion logic. (QsNet/Internal/Decoder.cs) [1] [2] [3] [4] [5] [6]

These changes collectively improve the correctness, performance, and portability of the query string decoder.


Benchmarks

Case Pre (ms) Post (ms) Delta (ms) Change
C1 (Count=100, CommaLists=false, Utf8Sentinel=false, ValueLen=8) 0.026565 0.008683 -0.017882 -67.32%
C2 (Count=1000, CommaLists=false, Utf8Sentinel=false, ValueLen=40) 0.322800 0.104009 -0.218791 -67.78%
C3 (Count=1000, CommaLists=true, Utf8Sentinel=true, ValueLen=40) 0.346666 0.132850 -0.213816 -61.68%

Summary by CodeRabbit

  • Tests

    • Added unit tests for mixed flat/structured inputs, root-collision semantics, list decoding, plus/percent handling, and decode-path tracking.
  • Bug Fixes

    • Improved consistency between flat and structured query decoding and preserved leading-root collision semantics.
    • Ensured plus-sign and percent-escape handling avoids unnecessary decode work.
  • Performance

    • Early-detection optimizations to skip decoding when no special characters present.
  • Refactor

    • Reorganized internal parsing/decoding and added a structured-key scan/cache.
  • Chores

    • Conditional compilation adjustments across build targets.

@techouse techouse self-assigned this Mar 5, 2026
@techouse techouse added the enhancement New feature or request label Mar 5, 2026
@techouse techouse requested a review from Copilot March 5, 2026 19:58
@techouse
Copy link
Owner Author

techouse commented Mar 5, 2026

@codex review

@coderabbitai
Copy link

coderabbitai bot commented Mar 5, 2026

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: b384bf7e-e63b-4939-ab6c-daffb1dca8cc

📥 Commits

Reviewing files that changed from the base of the PR and between 5c218ed and 94787f9.

📒 Files selected for processing (18)
  • QsNet.Tests/DecodeTests.cs
  • QsNet.Tests/UtilsTests.cs
  • QsNet/Enums/Format.cs
  • QsNet/Enums/ListFormat.cs
  • QsNet/Enums/Sentinel.cs
  • QsNet/Extensions.cs
  • QsNet/Internal/Decoder.cs
  • QsNet/Internal/EncodeFrame.cs
  • QsNet/Internal/Encoder.cs
  • QsNet/Internal/MergeFrame.cs
  • QsNet/Internal/SideChannelFrame.cs
  • QsNet/Internal/StructuredKeyScan.cs
  • QsNet/Internal/Utils.cs
  • QsNet/Models/DecodeOptions.cs
  • QsNet/Models/Delimiter.cs
  • QsNet/Models/EncodeOptions.cs
  • QsNet/Models/Filter.cs
  • QsNet/Qs.cs
🚧 Files skipped from review as they are similar to previous changes (8)
  • QsNet/Models/EncodeOptions.cs
  • QsNet/Enums/Sentinel.cs
  • QsNet.Tests/DecodeTests.cs
  • QsNet/Models/Filter.cs
  • QsNet.Tests/UtilsTests.cs
  • QsNet/Models/DecodeOptions.cs
  • QsNet/Models/Delimiter.cs
  • QsNet/Internal/StructuredKeyScan.cs

📝 Walkthrough

Walkthrough

Adds new unit tests and test helpers; refactors decode internals to introduce structured-key scanning fast-path, consolidated token-collection helpers, and percent/plus short-circuits; applies NETSTANDARD2_0 conditional using directives. Public Decode/Encode APIs unchanged.

Changes

Cohort / File(s) Summary
Tests
QsNet.Tests/DecodeTests.cs, QsNet.Tests/UtilsTests.cs
Added 3 decode tests, 2 utils tests and a test-only TrackingThrowingEncoding helper; trailing newline added.
Decoder internals
QsNet/Internal/Decoder.cs, QsNet/Internal/StructuredKeyScan.cs
Added StructuredKeyScan; new CollectNonEmptyParts helpers; unified rawKey extraction; explicit list vs scalar decoding; normalized array-key ("[]") handling; dot/bracket parsing adjustments.
Core decode flow
QsNet/Qs.cs, QsNet/Internal/StructuredKeyScan.cs
Added ScanStructuredKeys, FirstStructuredSplitIndex, LeadingStructuredRoot and NormalizeObjectMap; fast-path to return flattened string-key maps when no structured syntax found.
Utils
QsNet/Internal/Utils.cs
Early detection of '+' and '%' to short-circuit encoding/decoding; preserves CodePage 28591 special-case and applies percent-unescape only when needed.
NETSTANDARD2_0 conditionals
QsNet/Enums/..., QsNet/Extensions.cs, QsNet/Internal/..., QsNet/Models/...
Wrapped many using directives in #if NETSTANDARD2_0 blocks; no public API signature changes.
Misc models
QsNet/Models/*.cs, QsNet/Enums/*.cs
Minor using-directive conditionalization and Regex using repositioning; no signature changes.

Sequence Diagram

sequenceDiagram
    participant Caller as Decode Caller
    participant Qs as Qs.Decode
    participant Scanner as StructuredKeyScan
    participant Parser as Decoder.ParseQueryStringValues
    participant Utils as Utils.Decode/Encode

    Caller->>Qs: Decode(input, options)
    Qs->>Scanner: ScanStructuredKeys(inputKeys, options)
    Scanner-->>Qs: HasAnyStructuredSyntax? (true/false)

    alt structured syntax detected
        Qs->>Parser: ParseQueryStringValues(parts, options)
        Parser->>Utils: CollectNonEmptyParts(rawStr, delimiter)
        Utils-->>Parser: parts
        Parser->>Utils: DecodeValue(value, options)
        Utils-->>Parser: decoded value(s)
        Parser-->>Qs: structured object
        Qs->>Qs: NormalizeObjectMap(parsed)
    else no structured syntax
        Qs->>Qs: Build flattened string-key dictionary and compact
    end

    Qs-->>Caller: return decoded result
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~50 minutes

Possibly related PRs

Poem

I’m a rabbit in the code tonight,
I sniff for plus and percent with delight,
I hop through brackets, dots, and roots,
I flatten maps and mend the parsing routes,
🐇✨

🚥 Pre-merge checks | ✅ 1 | ❌ 2

❌ Failed checks (2 warnings)

Check name Status Explanation Resolution
Description check ⚠️ Warning The description is comprehensive and covers the main changes, but does not follow the provided template structure with required sections like 'Type of change', 'How Has This Been Tested', and 'Checklist'. Add missing template sections: specify the type of change (e.g., 'New feature'), document how changes were tested, and complete the provided checklist items.
Docstring Coverage ⚠️ Warning Docstring coverage is 34.15% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (1 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly summarizes the main change: adding structured key detection to optimize flat query decoding, which aligns with the core objective of the PR.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
  • 📝 Generate docstrings (stacked PR)
  • 📝 Generate docstrings (commit on current branch)
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch chore/optimize-decoder

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Optimizes query string decoding by adding a fast path for flat queries, reducing unnecessary parsing/decoding work, and expanding unit test coverage for tricky decoding cases.

Changes:

  • Added structured-key detection to bypass full key parsing for flat query strings.
  • Refactored query token splitting/filtering to a helper that avoids empty-key tokens and improves delimiter handling.
  • Optimized Utils.Decode to skip work when no + or % exists, plus added tests for new behaviors.

Reviewed changes

Copilot reviewed 5 out of 5 changed files in this pull request and generated 4 comments.

Show a summary per file
File Description
QsNet/Qs.cs Adds structured-key scanning and a fast path for flat query decoding, plus merge normalization helper.
QsNet/Internal/Decoder.cs Introduces CollectNonEmptyParts fast-path splitting and improves list/value decoding logic.
QsNet/Internal/Utils.cs Avoids unnecessary decode work when inputs contain no escapes; improves +/% handling.
QsNet.Tests/DecodeTests.cs Adds tests comparing string vs map input decoding for mixed/flat cases.
QsNet.Tests/UtilsTests.cs Adds tests for Utils.Decode fast paths and + replacement without %.

@codecov
Copy link

codecov bot commented Mar 5, 2026

Codecov Report

❌ Patch coverage is 95.67901% with 7 lines in your changes missing coverage. Please review.
✅ Project coverage is 99.37%. Comparing base (4c3306a) to head (94787f9).
⚠️ Report is 2 commits behind head on main.

Files with missing lines Patch % Lines
QsNet/Qs.cs 92.30% 6 Missing ⚠️
QsNet/Internal/Decoder.cs 98.50% 1 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##             main      #55      +/-   ##
==========================================
- Coverage   99.69%   99.37%   -0.32%     
==========================================
  Files          19       20       +1     
  Lines        1959     2093     +134     
  Branches      493      534      +41     
==========================================
+ Hits         1953     2080     +127     
- Misses          6       13       +7     
Flag Coverage Δ
unittests 99.37% <95.67%> (-0.32%) ⬇️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Sentry.
📢 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.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🧹 Nitpick comments (1)
QsNet/Internal/Decoder.cs (1)

307-339: Consider pre-sizing parts in the string-delimiter fast path.

This method is hot; a small capacity estimate can reduce list growth reallocations on large query strings.

♻️ Optional micro-optimization
-        var parts = new List<string>();
+        var estimated = 1;
+        if (singleCharDelimiter)
+        {
+            for (var i = 0; i < input.Length; i++)
+                if (input[i] == delimiterChar)
+                    estimated++;
+        }
+
+        var parts = new List<string>(estimated);
As per coding guidelines `QsNet/Internal/**/*.cs`: Keep parser/encoder hot paths allocation-light; avoid LINQ in hot paths and prefer explicit loops with pre-sized collections.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@QsNet/Internal/Decoder.cs` around lines 307 - 339, CollectNonEmptyStringParts
is a hot path and currently creates parts with default capacity causing
reallocations; compute a small capacity estimate (e.g., count occurrences of
delimiterChar in input when singleCharDelimiter is true, without LINQ) and
initialize parts with new List<string>(estimatedCount + 1); leave the existing
conditional logic and HasNonEmptyRawKey checks unchanged so only the parts list
creation is replaced with a pre-sized list in the single-char delimiter fast
path.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@QsNet.Tests/UtilsTests.cs`:
- Around line 3010-3021: Two test methods in UtilsTests.cs use the old
"Decode_*" naming; rename
Decode_ReturnsOriginalWhenNoEscapesAndDecoderWouldThrow to
ShouldReturnOriginalWhenNoEscapesAndDecoderWouldThrow and
Decode_ReplacesPlusWithoutInvokingUrlDecodeWhenNoPercent to
ShouldReplacePlusWithoutInvokingUrlDecodeWhenNoPercent so they follow the
"Should..." test naming convention; update any references (e.g., in test
runners) and keep them under the same UtilsTests class (or move into a nested
class grouping if scenarios expand) while leaving the test bodies and assertions
unchanged.

---

Nitpick comments:
In `@QsNet/Internal/Decoder.cs`:
- Around line 307-339: CollectNonEmptyStringParts is a hot path and currently
creates parts with default capacity causing reallocations; compute a small
capacity estimate (e.g., count occurrences of delimiterChar in input when
singleCharDelimiter is true, without LINQ) and initialize parts with new
List<string>(estimatedCount + 1); leave the existing conditional logic and
HasNonEmptyRawKey checks unchanged so only the parts list creation is replaced
with a pre-sized list in the single-char delimiter fast path.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: cf92e978-7051-4c55-8c04-6550f6edf528

📥 Commits

Reviewing files that changed from the base of the PR and between 4c3306a and 892af99.

📒 Files selected for processing (5)
  • QsNet.Tests/DecodeTests.cs
  • QsNet.Tests/UtilsTests.cs
  • QsNet/Internal/Decoder.cs
  • QsNet/Internal/Utils.cs
  • QsNet/Qs.cs

@chatgpt-codex-connector
Copy link

Codex Review: Didn't find any major issues. Chef's kiss.

ℹ️ 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".

@techouse techouse requested a review from Copilot March 5, 2026 20:51
@techouse techouse changed the title ⚡ optimize decoder ⚡ add structured key detection to optimize flat query decoding Mar 5, 2026
Copy link

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 5 out of 5 changed files in this pull request and generated 1 comment.

Comments suppressed due to low confidence (1)

QsNet/Internal/Decoder.cs:1

  • limit is declared as int?, so accepted > limit uses lifted comparison semantics (producing bool?) and won’t compile in an if condition. Keep limit non-nullable (e.g., use int.MaxValue as the sentinel) or revert to an explicit null check (limit != null && accepted > limit.Value).
using System;

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@QsNet.Tests/DecodeTests.cs`:
- Around line 4417-4459: These three tests
(ShouldDecodeMixedStructuredAndFlatLikeMapInputWhenFlatComesFirst,
ShouldPreserveLeadingBracketRootCollisionSemantics,
ShouldDecodeFlatQueriesConsistentlyWithMapInput) currently only use
BeEquivalentTo and need explicit key-order assertions: after calling Qs.Decode
and creating fromString and fromMap, add an assertion that the sequence of root
keys (the iteration order) for fromString matches the sequence for fromMap (e.g.
compare the key lists or use FluentAssertions' order-aware assertions) so any
regression in flat/structured ordering is detected in each test.

In `@QsNet.Tests/UtilsTests.cs`:
- Around line 3017-3021: The test
ShouldReplacePlusWithoutInvokingUrlDecodeWhenNoPercent only asserts output and
can pass even if UrlDecode was invoked and swallowed; update the test to use a
TrackingThrowingEncoding (or similar) that flips a WasDecodePathUsed flag when
any of the decoding paths (GetCharCount/GetChars) are called, call
Utils.Decode("a+b+c", new TrackingThrowingEncoding()), assert the decoded result
equals "a b c" and also assert that TrackingThrowingEncoding.WasDecodePathUsed
is false to ensure UrlDecode was not invoked; reference the existing
Utils.Decode method and replace ThrowingEncoding with the new
TrackingThrowingEncoding class used inside the test.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: e47ecf65-befc-48c6-acc2-60110cff728f

📥 Commits

Reviewing files that changed from the base of the PR and between 892af99 and c43d056.

📒 Files selected for processing (3)
  • QsNet.Tests/DecodeTests.cs
  • QsNet.Tests/UtilsTests.cs
  • QsNet/Internal/Decoder.cs

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🧹 Nitpick comments (2)
QsNet/Qs.cs (2)

144-155: Fallback case may silently discard merge results.

When merged is neither a Dictionary<object, object?> nor IDictionary, the method returns the original fallback unchanged. If Utils.Merge unexpectedly returns a non-dictionary type (e.g., a list or primitive), this would silently ignore the merge result.

Consider whether a defensive log or exception for unexpected types would help catch integration issues during development.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@QsNet/Qs.cs` around lines 144 - 155, NormalizeObjectMap currently returns the
original fallback when merged is neither Dictionary<object, object?> nor
IDictionary, which silently discards unexpected merge results; modify
NormalizeObjectMap to detect unexpected types and throw an informative
InvalidOperationException (or at minimum log an error) that includes the actual
runtime type name of merged and a brief message referencing the caller intent
(e.g., "NormalizeObjectMap expected a dictionary but received {type}"), so
callers (and Utils.Merge) fail fast and surface integration bugs instead of
silently using fallback values.

216-235: Consider documenting the "0" fallback for empty roots.

Line 234 returns "0" when cleanRoot is empty (e.g., for keys starting with "[]"). While this aligns with array index semantics, adding a brief comment would clarify the intent for future maintainers.

📝 Suggested comment
-        return cleanRoot.Length == 0 ? "0" : cleanRoot;
+        // Empty bracket root (e.g., "[]") defaults to array index "0"
+        return cleanRoot.Length == 0 ? "0" : cleanRoot;
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@QsNet/Qs.cs` around lines 216 - 235, Add a short inline comment in
LeadingStructuredRoot explaining why an empty cleaned root falls back to "0" (it
represents an empty array index like "[]", so we treat it as index 0),
referencing the cleanRoot variable and the return of "0" to make intent clear
for future maintainers; place the comment just above the line that returns "0"
(the ternary that checks cleanRoot.Length == 0) so it's obvious which case it
documents.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@QsNet/Qs.cs`:
- Around line 187-214: FirstStructuredSplitIndex incorrectly treats "%2E"/"%2e"
as structural dots whenever allowDots is true, causing keys like "a%2Eb" to be
split even when Decoder.ParseObject/DecodeDotInKeys would leave them encoded;
fix by adding a boolean parameter decodeDotInKeys to FirstStructuredSplitIndex,
pass the Decoder.DecodeDotInKeys value from ScanStructuredKeys, and only perform
the encoded-dot detection block when decodeDotInKeys is true; update all callers
(notably ScanStructuredKeys) to supply the new parameter and adjust related
tests
(EncodedDot_TopLevel_AllowDotsTrue_DecodeDotInKeysFalse_EncodedDotAlsoSplits) to
reflect the corrected behavior.

---

Nitpick comments:
In `@QsNet/Qs.cs`:
- Around line 144-155: NormalizeObjectMap currently returns the original
fallback when merged is neither Dictionary<object, object?> nor IDictionary,
which silently discards unexpected merge results; modify NormalizeObjectMap to
detect unexpected types and throw an informative InvalidOperationException (or
at minimum log an error) that includes the actual runtime type name of merged
and a brief message referencing the caller intent (e.g., "NormalizeObjectMap
expected a dictionary but received {type}"), so callers (and Utils.Merge) fail
fast and surface integration bugs instead of silently using fallback values.
- Around line 216-235: Add a short inline comment in LeadingStructuredRoot
explaining why an empty cleaned root falls back to "0" (it represents an empty
array index like "[]", so we treat it as index 0), referencing the cleanRoot
variable and the return of "0" to make intent clear for future maintainers;
place the comment just above the line that returns "0" (the ternary that checks
cleanRoot.Length == 0) so it's obvious which case it documents.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: eef89789-f584-468a-95e8-d89247a63ce3

📥 Commits

Reviewing files that changed from the base of the PR and between c43d056 and 19c077d.

📒 Files selected for processing (3)
  • QsNet.Tests/DecodeTests.cs
  • QsNet.Tests/UtilsTests.cs
  • QsNet/Qs.cs
🚧 Files skipped from review as they are similar to previous changes (2)
  • QsNet.Tests/DecodeTests.cs
  • QsNet.Tests/UtilsTests.cs

@techouse techouse requested a review from Copilot March 5, 2026 21:48
@techouse
Copy link
Owner Author

techouse commented Mar 5, 2026

@codex review

Copy link

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 18 out of 18 changed files in this pull request and generated no new comments.

@chatgpt-codex-connector
Copy link

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

ℹ️ 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".

@techouse
Copy link
Owner Author

techouse commented Mar 5, 2026

@coderabbitai review

@coderabbitai
Copy link

coderabbitai bot commented Mar 5, 2026

✅ Actions performed

Review triggered.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@techouse techouse force-pushed the chore/optimize-decoder branch from 5c218ed to 94787f9 Compare March 5, 2026 22:18
@techouse
Copy link
Owner Author

techouse commented Mar 5, 2026

@coderabbitai resume

@coderabbitai
Copy link

coderabbitai bot commented Mar 5, 2026

✅ Actions performed

Reviews resumed.

@techouse techouse merged commit 57efde5 into main Mar 5, 2026
13 of 14 checks passed
@techouse techouse deleted the chore/optimize-decoder branch March 5, 2026 22:29
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants