Skip to content

perf(l1): auto and orjson L1 hits skip re-verification and the per-read copy (LAB-12119) - #696

Open
27Bslash6 wants to merge 7 commits into
mainfrom
lab-12119-auto-orjson-l1-keep
Open

27Bslash6 wants to merge 7 commits into
mainfrom
lab-12119-auto-orjson-l1-keep

Conversation

@27Bslash6

@27Bslash6 27Bslash6 commented Nov 1, 2026 •

Copy link
Copy Markdown
Contributor

A backed L1 hit through the auto or orjson serializer now verifies an entry once, on its first hit, and then skips the integrity check, as the default serializer has since #662. It also no longer copies the payload on every read.

What changed

  • One kept-entry type for three serializers. VerifiedMsgpack is renamed VerifiedPayload and moves to serializers/base.py. It now records the serializer class that verified it (owner). deserialize_l1 decodes a kept entry only when its owner is this handler's serializer; any other owner goes to deserialize_data, which refuses it as a corrupt frame. Before this change only the default serializer kept entries, so the type alone was enough.
  • Each serializer decides what it keeps. _deserialize_keeping(payload, metadata) returns None for an entry it does not keep, and the handler decodes that entry through deserialize_data exactly as before.
    • Default serializer: unchanged. It keeps an entry only when the header says compressed.
    • Auto serializer: it keeps only plain MessagePack envelopes, after the same retrieve() and format-agreement checks that deserialize runs. Those checks are factored into _decode_verified_envelope, which both paths call. NumPy, Arrow, DataFrame and Series entries, and bytes holding NUMPY_RAW at offset 0 or 8, keep their envelope and are verified on every hit.
    • Orjson serializer: it keeps the JSON under a matching xxHash3-64. That JSON is always shorter than the envelope, and it is copied once, on the first hit.
  • No per-read copy. Auto replaced bytes(data) with immutable_buffer, so unwrap's zero-copy view stays a view. Orjson checksums and decodes a slice of the view, where it used to make two copies. A bytes argument skips the coercion: on small values the function call costs more than the copy it saves, and the round-trip budgets caught that (serializer_orjson +8.4% before the fix).
  • make perf-ir gates l1_hit_backed_auto, which is l1_hit_backed with serializer="auto".

Unchanged: a hit still runs its serializer's bounded decode. Encrypted handlers still keep ciphertext, and L2 reads still verify. A kept entry is still swapped in only when it is no longer than the envelope, so compressible auto values keep their envelope; for them this change removes only the copy.

Measurements

Instruction counts are main-thread Ir per call from ir_budget.py --base, measured against the merge-base 4b2c65c on CPython 3.14.3 with both checkouts in one run:

Path Base This PR Change
l1_hit_backed_auto (new) 115,138 92,950 −19.3%
serializer_auto 66,616 66,601 −0.02%
serializer_orjson 22,800 22,415 −1.7%
l1_hit_backed 80,709 80,964 +0.32% (WARN, under the 1% gate)

The full gate's other 14 paths sat between −0.18% and +0.36%. I skipped the two real-data paths (*_usgs) locally; CI's gate measures them.

Thread CPU and minor page faults per backed L1 hit come from fresh processes, 10 randomised base/candidate pairs per shape, mean paired delta with a bootstrap 95% CI. The table is under glibc's default malloc. A second run with MALLOC_MMAP_THRESHOLD_=4194304 MALLOC_TRIM_THRESHOLD_=16777216 agreed in sign on every row.

Shape CPU base → PR Change (95% CI excludes 0?) Faults/op base → PR
auto, 1 MB random bytes (kept) 160.4 → 33.6 µs −79.1% (yes) 0.03 → 0.03
auto, 1 MB text (envelope kept, copy removed) 522.2 → 519.4 µs −0.5% (no) 0.03 → 0.02
auto, 1 MB NumPy array (copy removed) 109.6 → 96.6 µs −11.8% (yes) 0.03 → 0.02
auto, 64 KiB random bytes 22.6 → 10.0 µs −55.8% (yes) 0 → 0
orjson, 1 MB of one long string 329.6 → 264.9 µs −19.6% (yes) 0.03 → 0.03
orjson, 1 MB of small records 4,270 → 4,232 µs −0.9% (no) 1.28 → 0.85 (CI spans 0)
orjson, 64 KiB of small records 240.0 → 232.0 µs −3.3% (yes) 0 → 0

At 1 MB, page faults were already near zero for these hits under both malloc settings, so the saving is CPU, not faults. An orjson hit on record-heavy JSON is dominated by building the objects, so neither the copy nor the checksum shows there.

l1_hit_backed_auto's committed budgets (91,986 on 3.12, 92,950 on 3.14) were measured on a different machine from the other rows. On that machine the untouched paths read 3% to 30% below their committed budgets (l1_hit_backed 3.4% below), so I did not re-record them. A non---base make perf-ir on the machine that recorded the other rows may therefore fail l1_hit_backed_auto with no code change; --base runs, which CI uses, report the new path as new. Re-recording every row on one machine is tracked separately.

Docs

docs/data-flow-architecture.md, docs/features/prometheus-metrics.md (the L1 get size after the first hit, per serializer) and docs/performance.md now describe the auto and orjson kept entries, and the budgets table has the new row.

Sibling paths

  • Auto's NumPy and Arrow entries are still verified on every hit, at one xxHash3-64 pass over the body; only their copy was removed.
  • Auto's integrity-off reads and orjson's integrity-off reads have no check to skip.
  • Async hits go through the same deserialize_l1, so they are covered.

Closes LAB-12119

…ad payload copy

A backed L1 hit through AutoSerializer or OrjsonSerializer re-ran its integrity
check on every hit and copied the payload: Auto's bytes(data) copied unwrap's
zero-copy view, and orjson copied twice (bytes(data), data[8:]).

- The kept L1 entry generalises: VerifiedMsgpack becomes VerifiedPayload (in
  serializers.base), and records the serializer class that verified it, so
  only that serializer decodes it. A keeping handler hands any other owner's
  entry to deserialize_data, which refuses it as a corrupt frame.
- Each keeping serializer decides what it keeps (_deserialize_keeping returns
  None for anything else, which goes to deserialize_data unchanged):
  StandardSerializer as before; AutoSerializer only plain MessagePack
  envelopes, through the same retrieve and agreement checks deserialize runs
  (NumPy, Arrow, DataFrame and Series entries keep the envelope); orjson the
  JSON under its checksum, copied once on the first hit.
- Auto and orjson read unwrap's view through immutable_buffer instead of
  copying it; orjson checksums and decodes a view of the JSON.
- make perf-ir gates l1_hit_backed_auto, the Auto variant of l1_hit_backed.
…cord l1_hit_backed_auto budgets

A direct deserialize() of bytes (the round-trip budgets) paid for the immutable_buffer
call and, for orjson, a memoryview, where the bytes() it replaced was free: serializer_orjson
+8.4%, serializer_auto +1.1%. bytes now skips the call and orjson slices what it was given, so
unwrap's view stays a view and direct bytes callers cost what they did.
@coderabbitai

coderabbitai Bot commented Nov 1, 2026 •

Copy link
Copy Markdown

Review in Change Stack →

No actionable comments were generated in the recent review.

Recent review info
Run configuration
Commits

Reviewing files that changed from the base of the PR and between 1858882 and 32dd755.

Files selected for processing: 17
  • .secrets.baseline
  • docs/data-flow-architecture.md
  • docs/features/prometheus-metrics.md
  • docs/performance.md
  • src/cachekit/cache_handler.py
  • src/cachekit/decorators/wrapper.py
  • src/cachekit/l1_cache.py
  • src/cachekit/serializers/auto_serializer.py
  • src/cachekit/serializers/base.py
  • src/cachekit/serializers/orjson_serializer.py
  • src/cachekit/serializers/standard_serializer.py
  • tests/performance/ir_baselines.json
  • tests/performance/ir_budget.py
  • tests/performance/ir_workload.py
  • tests/unit/test_ir_budget.py
  • tests/unit/test_l1_verified_msgpack.py
  • tests/unit/test_single_flight.py

Included review availability: This review used your included allowance. Your plan provides up to 1 included review per hour; 0 remain after this review.

Summary by CodeRabbit

  • Performance
    • Repeated cache hits can be faster for eligible plaintext entries using the default, automatic or orjson serializers. Verified payloads may be retained in the in-memory cache, avoiding repeated integrity checks; some entries also avoid repeated envelope decompression.
    • Automatic serialization continues to verify NumPy, Arrow, DataFrame and Series entries on each hit. Encrypted entries and other ineligible entries retain their existing behaviour.
  • Documentation
    • Updated guidance to explain cache-hit behaviour and payload-size metrics across supported serializers.

Walkthrough

The change generalises verified L1 payload retention from MessagePack to serializer-owned payloads. Eligible plaintext entries from AutoSerializer and OrjsonSerializer can now be retained after verification. Tests, performance budgets, and documentation cover the updated behaviour.

Changes

Verified L1 payload flow

Layer / File(s) Summary
Verified payloads and serializer decode paths
src/cachekit/serializers/base.py, src/cachekit/serializers/standard_serializer.py, src/cachekit/serializers/auto_serializer.py, src/cachekit/serializers/orjson_serializer.py
A shared VerifiedPayload stores payload bytes and the serializer class that verified them. Serializer decode paths create and decode these payloads. Auto serialization retains eligible MessagePack payloads, while OrjsonSerializer retains verified JSON.
L1 retention and decode integration
src/cachekit/cache_handler.py, src/cachekit/decorators/wrapper.py, src/cachekit/l1_cache.py, tests/unit/test_l1_verified_msgpack.py, tests/unit/test_single_flight.py, docs/data-flow-architecture.md, docs/features/prometheus-metrics.md
The L1 path retains eligible plaintext payloads and decodes them only through their owning serializer. Tests cover ownership, corrupt entries, serializer decode parity, and sync and async hits. Documentation describes retention and payload-size metrics.
Performance coverage and behavior documentation
tests/performance/*, tests/unit/test_ir_budget.py, docs/performance.md, .secrets.baseline
A backed L1-hit workload and instruction budgets cover AutoSerializer. The performance guide describes the serializer-specific hit paths. The secrets baseline updates the finding line and generation timestamp.

Estimated code review effort: 3 (Moderate) | ~25 minutes

Change: Other

Sequence Diagram(s)

sequenceDiagram
  participant Wrapper
  participant CacheSerializationHandler
  participant AutoSerializer
  participant L1Cache
  Wrapper->>CacheSerializationHandler: Deserialize L1 entry
  CacheSerializationHandler->>AutoSerializer: Verify envelope and decode eligible payload
  AutoSerializer-->>CacheSerializationHandler: Decoded value and owned VerifiedPayload
  CacheSerializationHandler-->>Wrapper: Return decoded value and retained payload
  Wrapper->>L1Cache: Retain eligible payload
Loading

Possibly related PRs

  • cachekit-io/cachekit-py#662: Introduced verified MessagePack retention and the deserialize_l1 path that this change generalises.
  • cachekit-io/cachekit-py#671: Extended the retained L1-entry implementation and deserialize_l1 types, which this change reworks around serializer-owned payloads.
  • cachekit-io/cachekit-py#685: Added the backed L1-hit budget and tests that this change extends to AutoSerializer.
Merge Risk: Minimal · up to 32dd7

No actionable issue remains from this review; the long docstring line does not block the configured checks.

Pre-merge checks: Passed 5
Check name Status Explanation
Title check Passed The title clearly identifies the main performance change: AutoSerializer and OrjsonSerializer L1 hits skip repeated verification and per-read copying.
Description check Passed The description is detailed and covers the change, motivation, implementation, measurements, documentation, testing scope, and backward compatibility. It does not use every template heading or include…
Docstring Coverage Passed Docstring coverage is 87.50% which is sufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff with cyclomatic complexity of at least 2. Documentati…
Linked Issues check Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check Passed Check skipped because no linked issues were found for this pull request.
Full details: Description check

Explanation

The description is detailed and covers the change, motivation, implementation, measurements, documentation, testing scope, and backward compatibility. It does not use every template heading or include the explicit security and checklist confirmations, but it is mostly complete and directly related to the pull request.

Full details: Docstring Coverage

Explanation

Docstring coverage is 87.50% which is sufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff with cyclomatic complexity of at least 2. Documentation-only edits and deletions within surviving functions are included; unchanged diff context and fully deleted functions are excluded. Analyzed 40 functions across 12 files. (5 skipped: 5 unsupported.)

Finishing Touches
Generate docstrings
  • Commit to this branch
  • Create a new PR
Generate unit tests (beta)
  • Commit to this branch
  • Create a new PR
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

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

@kodus-27b

kodus-27b Bot commented Nov 1, 2026 •

Copy link
Copy Markdown

Code Review Completed! 🔥

The code review was successfully completed based on your current configurations.

Kody Guide: Usage and Configuration
Interacting with Kody
  • Request a Review: Ask Kody to review your PR manually by adding a comment with the `@kody start-review` command at the root of your PR.

  • Provide Feedback: Help Kody learn and improve by reacting to its comments with a 👍 for helpful suggestions or a 👎 if improvements are needed.

Providing Context (Files & MCPs)

Add these hints in your PR description (or a comment) to unlock deeper checks:

  • Ticket / Acceptance Criteria: `Refs: ABC-123` (Linear/Jira/Asana/ClickUp/Trello) or a direct ticket link.
  • Bugfix Validation: a Sentry/Datadog/Bugsnag event link (or paste the stack trace/error message).
  • Endpoint Risk: mention the route (e.g., `POST /api/payments`) or controller/action name.
  • Attach a repo file as context: use an explicit marker like `@file:docs/guide.mdx#L10-L50` (replace with your real path).
  • API Contract Docs: include `@file:openapi.yaml` or `@file:swagger.json` when changing routes/schemas.
  • Definition of Done / Standards: include `@file:DOD.md` or `@file:CONTRIBUTING.md` if your repo has them.
  • Design System Source of Truth: include `@file:ui/index.ts` (replace with your DS entrypoint path).
  • Feature Flags: include the flag key/name and `@file:flags.ts` / `@file:config.json` (and optionally the PostHog flag name).
  • Edge/CDN Rules: link the Cloudflare rule/zone or describe the intended redirect/header behavior.
  • Attach an MCP tool output: use `@mcp<provider|tool>` (replace with an installed MCP provider + tool, e.g., `@mcp<sentry|events.search>`).
Current Kody Configuration
Review Options

The following review options are enabled or disabled:

Options Enabled
Bug ✅
Performance ✅
Security ✅
Business Logic ✅

Access your configuration settings here.

Kody Code Review — 1 suggested fix.
Paste the prompt below to your agent and all review fixed at once!

🛠️ Open Agent Prompt
A code review identified the following issues in this pull request.
Each section describes what was found and includes a reference implementation where available.

Files involved:
- src/cachekit/serializers/auto_serializer.py:1006

---

### [1/1] src/cachekit/serializers/auto_serializer.py:1006
Issue identified during code review:
Overbroad exception handler around `self._byte_storage.retrieve(data)` in `src/cachekit/serializers/auto_serializer.py`: `except Exception` converts every exception into `self._envelope_failure(e)`. When `retrieve()` raises an `AttributeError` or `TypeError` from a programming bug, or a `MemoryError`, the error surfaces as cache-entry corruption and the real defect is hidden. Fix: catch only the exceptions `retrieve()` raises for bad or forged envelopes (e.g. `except (ValueError, ...) as e:`), or keep the broad catch and re-raise anything outside that set with a bare `raise`.

---

Review each issue in context, use the reference implementations as guidance, and apply fixes that are consistent with the surrounding codebase.

@codecov

codecov Bot commented Nov 1, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 96.87500% with 3 lines in your changes missing coverage. Please review.
✅ All tests successful. No failed tests found.

Files with missing lines Patch % Lines
src/cachekit/serializers/auto_serializer.py 93.75% 2 Missing ⚠️
src/cachekit/serializers/orjson_serializer.py 95.23% 1 Missing ⚠️

📢 Thoughts on this report? Let us know!

@github-actions

github-actions Bot commented Nov 1, 2026 •

Copy link
Copy Markdown
Contributor

Instruction budget: PASS

Head 32dd7552626b3f8ad07e56bce98091936942a3ea measured against base 185888252dd0c002b3c81ba6789882b494d4c800 on the same runner, on cpython-3.12-x86_64 (3.12.3). Workflow run

Verdict Path Head Ir/op Base Ir/op Delta
WARN l1_hit_backed 88,308 88,019 +0.33%
WARN l2_hit 185,028 184,551 +0.26%
new l1_hit_backed_auto – – –
ok byte_storage_store_40b 2,756 2,757 -0.04%
ok byte_storage_store_64k 724,752 724,752 +0.00%
ok file_set 86,658 86,692 -0.04%
ok l1_hit 2,882 2,880 +0.07%
ok l2_hit_async_metrics 184,759 184,643 +0.06%
ok minimal_l1_hit 2,889 2,887 +0.07%
ok miss 242,485 242,309 +0.07%
ok object_cache_put_full 198,707 198,684 +0.01%
ok secure_l1_hit 138,121 138,056 +0.05%
ok serializer_arrow 2,211,947 2,213,218 -0.06%
ok serializer_auto 71,785 72,486 -0.97%
ok serializer_default 52,776 52,770 +0.01%
ok serializer_default_records 1,042,228 1,042,048 +0.02%
ok serializer_encrypted 97,538 97,529 +0.01%
ok serializer_orjson 24,346 24,840 -1.99%

A path fails at +1% or more against the base (+2% for serializer_orjson). This check is not required: a deliberate cost increase is accepted at merge. Method: docs/performance.md, Instruction budgets.

The metrics page said only the default serializer swaps an L1 envelope
for its verified payload; auto (plain MessagePack) and orjson do too.
Orjson keeps its JSON, which has no decompress step to skip, and auto
never keeps NumPy, Arrow, DataFrame or Series entries. The auto keeping
docstring now says its NUMPY_RAW test is broader than deserialize's on
purpose.
@kodus-27b

kodus-27b Bot commented Nov 1, 2026

Copy link
Copy Markdown

Code Review Completed! 🔥

The code review was successfully completed based on your current configurations.

Kody Guide: Usage and Configuration
Interacting with Kody
  • Request a Review: Ask Kody to review your PR manually by adding a comment with the `@kody start-review` command at the root of your PR.

  • Provide Feedback: Help Kody learn and improve by reacting to its comments with a 👍 for helpful suggestions or a 👎 if improvements are needed.

Providing Context (Files & MCPs)

Add these hints in your PR description (or a comment) to unlock deeper checks:

  • Ticket / Acceptance Criteria: `Refs: ABC-123` (Linear/Jira/Asana/ClickUp/Trello) or a direct ticket link.
  • Bugfix Validation: a Sentry/Datadog/Bugsnag event link (or paste the stack trace/error message).
  • Endpoint Risk: mention the route (e.g., `POST /api/payments`) or controller/action name.
  • Attach a repo file as context: use an explicit marker like `@file:docs/guide.mdx#L10-L50` (replace with your real path).
  • API Contract Docs: include `@file:openapi.yaml` or `@file:swagger.json` when changing routes/schemas.
  • Definition of Done / Standards: include `@file:DOD.md` or `@file:CONTRIBUTING.md` if your repo has them.
  • Design System Source of Truth: include `@file:ui/index.ts` (replace with your DS entrypoint path).
  • Feature Flags: include the flag key/name and `@file:flags.ts` / `@file:config.json` (and optionally the PostHog flag name).
  • Edge/CDN Rules: link the Cloudflare rule/zone or describe the intended redirect/header behavior.
  • Attach an MCP tool output: use `@mcp<provider|tool>` (replace with an installed MCP provider + tool, e.g., `@mcp<sentry|events.search>`).
Current Kody Configuration
Review Options

The following review options are enabled or disabled:

Options Enabled
Bug ✅
Performance ✅
Security ✅
Business Logic ✅

Access your configuration settings here.

kodus-27b[bot]
kodus-27b Bot previously approved these changes Nov 1, 2026
The 8-byte figure compared the kept JSON against the serializer's own
envelope, but the L1 entry is the full frame, which also carries the
frame header.
@kodus-27b

kodus-27b Bot commented Nov 1, 2026

Copy link
Copy Markdown

Code Review Completed! 🔥

The code review was successfully completed based on your current configurations.

Kody Guide: Usage and Configuration
Interacting with Kody
  • Request a Review: Ask Kody to review your PR manually by adding a comment with the `@kody start-review` command at the root of your PR.

  • Provide Feedback: Help Kody learn and improve by reacting to its comments with a 👍 for helpful suggestions or a 👎 if improvements are needed.

Providing Context (Files & MCPs)

Add these hints in your PR description (or a comment) to unlock deeper checks:

  • Ticket / Acceptance Criteria: `Refs: ABC-123` (Linear/Jira/Asana/ClickUp/Trello) or a direct ticket link.
  • Bugfix Validation: a Sentry/Datadog/Bugsnag event link (or paste the stack trace/error message).
  • Endpoint Risk: mention the route (e.g., `POST /api/payments`) or controller/action name.
  • Attach a repo file as context: use an explicit marker like `@file:docs/guide.mdx#L10-L50` (replace with your real path).
  • API Contract Docs: include `@file:openapi.yaml` or `@file:swagger.json` when changing routes/schemas.
  • Definition of Done / Standards: include `@file:DOD.md` or `@file:CONTRIBUTING.md` if your repo has them.
  • Design System Source of Truth: include `@file:ui/index.ts` (replace with your DS entrypoint path).
  • Feature Flags: include the flag key/name and `@file:flags.ts` / `@file:config.json` (and optionally the PostHog flag name).
  • Edge/CDN Rules: link the Cloudflare rule/zone or describe the intended redirect/header behavior.
  • Attach an MCP tool output: use `@mcp<provider|tool>` (replace with an installed MCP provider + tool, e.g., `@mcp<sentry|events.search>`).
Current Kody Configuration
Review Options

The following review options are enabled or disabled:

Options Enabled
Bug ✅
Performance ✅
Security ✅
Business Logic ✅

Access your configuration settings here.

kodus-27b[bot]
kodus-27b Bot previously approved these changes Nov 1, 2026
The free-threaded CI lanes install the test group only, so orjson is absent
there and every orjson-parametrised case raised ImportError. Those parameter
sets now carry the suite's usual "requires the [json] extra" skip.

The checks fixture imported orjson_serializer only to reach the xxhash module,
so the auto case errored too. It now patches xxhash directly: both serializers
call xxh3_64_digest through that module, so the count is unchanged, and the
auto case runs on the free-threaded build.
@27Bslash6

Copy link
Copy Markdown
Contributor Author

Resolved docs/performance.md (kept the new l1_hit_backed_auto row and took main's re-measured minimal_l1_hit budgets); auto-rebased onto main; CI will re-run. 32dd755 also skips the orjson cases in tests/unit/test_l1_verified_msgpack.py when the [json] extra is absent, which the free-threaded test jobs don't install.

@kodus-27b

kodus-27b Bot commented Nov 1, 2026

Copy link
Copy Markdown

Code Review Completed! 🔥

The code review was successfully completed based on your current configurations.

Kody Guide: Usage and Configuration
Interacting with Kody
  • Request a Review: Ask Kody to review your PR manually by adding a comment with the `@kody start-review` command at the root of your PR.

  • Provide Feedback: Help Kody learn and improve by reacting to its comments with a 👍 for helpful suggestions or a 👎 if improvements are needed.

Providing Context (Files & MCPs)

Add these hints in your PR description (or a comment) to unlock deeper checks:

  • Ticket / Acceptance Criteria: `Refs: ABC-123` (Linear/Jira/Asana/ClickUp/Trello) or a direct ticket link.
  • Bugfix Validation: a Sentry/Datadog/Bugsnag event link (or paste the stack trace/error message).
  • Endpoint Risk: mention the route (e.g., `POST /api/payments`) or controller/action name.
  • Attach a repo file as context: use an explicit marker like `@file:docs/guide.mdx#L10-L50` (replace with your real path).
  • API Contract Docs: include `@file:openapi.yaml` or `@file:swagger.json` when changing routes/schemas.
  • Definition of Done / Standards: include `@file:DOD.md` or `@file:CONTRIBUTING.md` if your repo has them.
  • Design System Source of Truth: include `@file:ui/index.ts` (replace with your DS entrypoint path).
  • Feature Flags: include the flag key/name and `@file:flags.ts` / `@file:config.json` (and optionally the PostHog flag name).
  • Edge/CDN Rules: link the Cloudflare rule/zone or describe the intended redirect/header behavior.
  • Attach an MCP tool output: use `@mcp<provider|tool>` (replace with an installed MCP provider + tool, e.g., `@mcp<sentry|events.search>`).
Current Kody Configuration
Review Options

The following review options are enabled or disabled:

Options Enabled
Bug ✅
Performance ✅
Security ✅
Business Logic ✅

Access your configuration settings here.

@27Bslash6

Copy link
Copy Markdown
Contributor Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Nov 1, 2026 •

Copy link
Copy Markdown
Action performed

Review finished.

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.

This branch has not been deployed

No deployments
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.

1 participant