Skip to content

feat(cachekitio)!: 90-day TTL range; bound the writer's L1 copy by the PUT Fresh-For (LAB-12090) - #301

Open
27Bslash6 wants to merge 5 commits into
mainfrom
lab-12090-plan-max-ttl
Open

27Bslash6 wants to merge 5 commits into
mainfrom
lab-12090-plan-max-ttl

Conversation

@27Bslash6

@27Bslash6 27Bslash6 commented Nov 1, 2026 •

Copy link
Copy Markdown
Contributor

What

Brings the CachekitIO backend in line with the protocol's per-plan maximum TTL (spec/saas-api.md, Plan maximum TTL; Remaining Freshness, API-103 and API-104).

TTL range is now 90 days. X-CacheKit-TTL, defaultTtl and the PATCH /ttl body accept 1..7,776,000. staleTtl accepts up to 7,775,999, and ttl + staleTtl up to 7,776,000. A TTL above the tenant's plan maximum but inside the range is sent as is: the SDK does not know the plan, and the server clamps it instead of rejecting it. The X-CacheKit-Fresh-For grammar cap stays 2,592,000 under its own constant (MAX_FRESH_FOR_SECONDS), so 2592001 and 7776000 still read as 0.

The writer's L1 copy follows the bound the store applied (API-103). A clamped write lives shorter than the TTL it stated, so the writing process must not keep serving its L1 copy for the full TTL. Backend.set and setWithStaleTtl may now resolve to a SetResult carrying the PUT 2xx's X-CacheKit-Fresh-For, parsed with the existing GET grammar. The cache caps the L1 copy at min(ttl, fresh_for), counted from receipt of the 2xx:

Path Where the cap is applied
set(), wrap() cold miss fillL1, after the L2 write
wrap() with writeBehind L1Cache.capExpiryAt() once the background PUT lands (L1 is filled before it is sent)
SWR refresh L1Write.freshUntil into completeRefresh, or discardRefresh when the bound is 0

A malformed or 0 header keeps no L1 copy, and also drops the key's older copy that the write superseded. An absent header keeps today's lifetime. X-CacheKit-Stale-TTL never lengthens the bound. A write whose error degradation absorbed got no 2xx and keeps its copy for the TTL, as before (API-36). A non-numeric or negative freshFor from a custom backend fails closed, as 0.

PATCH /ttl never touches an L1 bound (API-104). refreshTTL returns a boolean, and the cache never calls it. A test pins that a PATCH response carrying X-CacheKit-Fresh-For neither extends an existing copy nor creates one.

Type change for custom backends

Backend.set now returns Promise<SetResult | void>. A backend that returns Promise<void> still type-checks unchanged. A delegating wrapper that declares an explicit Promise<void> return type while returning inner.set(...) no longer compiles. A wrapper that does await inner.set(...) and returns nothing still compiles, but it silently drops the bound, so its writer's L1 copy keeps the stated TTL. Either way, a wrapper must return the inner result, as it already forwards getWithTtl. The three built-in wrappers (cachekitioWithLocking, cachekitioWithTTL, cachekitioFull) forward it, and the tests run every factory.

Tests

  • Bounds: TTL 1 / 7,776,000 accepted and 7,776,001 rejected; staleTtl 7,775,999 accepted and 7,776,000 rejected; ttl + staleTtl 7,776,000 accepted and 7,776,001 rejected; PATCH body sends 1, 2,592,001 and 7,776,000 as is.
  • cachekitio-freshness.test.ts: Fresh-For shorter than the TTL, for each factory; header missing; a longer header that must not extend; malformed values (0, abc, -1, 2592001, 8 digits, empty); clock from receipt rather than dispatch; the stale-window write; write-behind cap and drop; SWR refresh cap and discard; the SWR threshold of a capped entry; PATCH /ttl; fail-closed custom backends.
  • The new tests were mutation-checked. Removing any one of these turns a test red: a wrapper's forward, the fillL1 cap, the old-copy drop, the write-behind capExpiryAt(), the refresh freshUntil, discardRefresh and its version check, the separate Fresh-For constant, or the PUT header parse.

Docs

packages/cachekit/README.md (stale-grace limits, backends table, and a new "CachekitIO TTL and the plan maximum" note), and the TSDoc on Backend.set, setWithStaleTtl, validateTtl, CachekitIOBackendConfig.defaultTtl and WrapOptions.staleTtl. This SDK always sends a TTL, so no doc claimed that an omitted TTL never expires on CachekitIO. The note says so explicitly.

BREAKING CHANGE: Backend.set and Backend.setWithStaleTtl now return Promise<SetResult | void>. A custom backend wrapper must return inner.set(...) (and return inner.setWithStaleTtl(...)): a wrapper typed Promise<void> that returns the inner call no longer compiles, and one that awaits it without returning hides the PUT's Fresh-For, so its L1 copy is not bounded by it.

…PUT Fresh-For

The protocol's TTL range is now 1..7,776,000 seconds (90 days), and each
plan has a maximum TTL that the server clamps to rather than rejects. The
SDK does not know the plan, so it sends any TTL in the range as is:
X-CacheKit-TTL and the PATCH /ttl body accept 1..7,776,000, staleTtl
<= 7,775,999 and ttl + staleTtl <= 7,776,000. The X-CacheKit-Fresh-For
grammar cap stays 2,592,000 under its own constant.

A clamped write is stored for less than the TTL it stated, so the writer's
L1 copy must follow the bound the store applied (API-103). Backend.set and
setWithStaleTtl may now resolve to a SetResult carrying the PUT 2xx's
X-CacheKit-Fresh-For, read with the GET grammar. The cache caps the L1
copy at min(ttl, fresh_for) counted from receipt of the 2xx, on direct
writes, on write-behind (once the background PUT lands) and on SWR
refreshes; a malformed or 0 value keeps no copy; an absent header keeps
today's lifetime. A write that degradation absorbed keeps its copy for the
TTL, as before (API-36). PATCH /ttl responses never touch an L1 bound
(API-104).

Delegating Backend wrappers must return the inner set's result, as they
already forward getWithTtl.
@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 d5657af and 0b5a6b6.

Files selected for processing: 4
  • packages/cachekit/src/backends/cachekitio-freshness.test.ts
  • packages/cachekit/src/backends/cachekitio.ts
  • packages/cachekit/src/backends/types.ts
  • packages/cachekit/src/cache-core.ts

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

  • New Features
    • CachekitIO now supports TTLs of up to 90 days, subject to plan limits.
    • Stale-grace windows can now extend to the 90-day TTL limit, within the combined TTL and stale-grace maximum.
    • L1 cache entries now respect the freshness duration applied by the backend, including when it shortens the requested lifetime. Entries are not retained when the applied freshness has expired.
  • Documentation
    • Clarified plan-specific TTL limits and how server-side TTL adjustments affect cache expiry.

Walkthrough

CachekitIO writes now return an optional store-reported freshness bound. CacheImpl uses this bound to limit L1 entry lifetime across foreground writes, write-behind, and refreshes. CachekitIO TTL and stale-TTL limits increase from 30 to 90 days.

Changes

CachekitIO freshness contract and TTL limits

Layer / File(s) Summary
Write result and TTL validation
packages/cachekit/src/backends/types.ts, packages/cachekit/src/backends/cachekitio.ts, packages/cachekit/src/exports-common.ts, packages/cachekit/src/types/cache.ts, packages/cachekit/src/backends/cachekitio-ttl.test.ts, packages/cachekit/src/backends/cachekitio.test.ts, packages/cachekit/src/cache.stale-grace.test.ts, packages/cachekit/README.md, .secrets.baseline
Backend writes can return SetResult with an optional freshFor value. CachekitIO parses successful PUT freshness headers, retains the 30-day header cap, and accepts TTLs up to 90 days. Stale-TTL validation and documentation reflect the expanded limits.
Apply freshness bounds to L1 writes
packages/cachekit/src/cache-core.ts, packages/cachekit/src/cache/background-refresh.ts, packages/cachekit/src/l1/lru-cache.ts, packages/cachekit/src/backends/cachekitio-freshness.test.ts, packages/cachekit/src/cache/background-refresh.test.ts, packages/cachekit/src/l1/lru-cache.test.ts
CacheImpl applies backend freshness bounds to foreground writes and write-behind. Background refreshes use the same bound. L1 expiry capping and refresh-discard operations check entry identity or version.

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

Change: Feature

Sequence Diagram(s)

sequenceDiagram
  participant CacheImpl
  participant CachekitIO
  participant L1Cache
  CacheImpl->>CachekitIO: PUT value and TTL
  CachekitIO-->>CacheImpl: Return SetResult with freshFor
  CacheImpl->>CacheImpl: Convert freshFor to freshUntil
  CacheImpl->>L1Cache: Cap entry expiry at freshUntil
Loading

Possibly related PRs

Suggested reviewers: kodus-27b

Merge Risk: Minimal · up to 0b5a6

The change is mergeable after normal checks. A narrow overlapping-write case may cause an extra L2 fetch, but no material failure was established.

Pre-merge checks: Passed 5
Check name Status Explanation
Title check Passed The title clearly identifies the two primary changes: the 90-day CachekitIO TTL range and writer-side L1 Fresh-For bounding. It is specific and related to the changeset.
Description check Passed The description is detailed and directly explains the TTL changes, L1 Fresh-For behaviour, breaking type changes, tests, and documentation updates.
Docstring Coverage Passed Docstring coverage is 80.00% 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: Docstring Coverage

Explanation

Docstring coverage is 80.00% 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 5 functions across 13 files.

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

@codecov

codecov Bot commented Nov 1, 2026 •

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

@27Bslash6

Copy link
Copy Markdown
Contributor Author

@kody start-review

1 similar comment
@27Bslash6

Copy link
Copy Markdown
Contributor Author

@kody start-review

@github-actions

github-actions Bot commented Nov 1, 2026 •

Copy link
Copy Markdown

Instruction counts: PASS

Head 0b5a6b6 against base 758edc00b233a995b281e8bccf4865450bcf7578, Node v24.22.1, valgrind-3.22.0. Instructions per op on the main thread (bench:ir --compare); median of the repeats, A/A = (max − min) / median. A workload fails above +2.00% and warns above +1.00% (its own threshold: napi-encrypted at +4.00%, plaintext-set-1mb at +10.00%, warning at half); an A/A over 0.40% reads INCONCLUSIVE.

workload base Ir/op head Ir/op delta A/A base / head verdict
plaintext-set-64b 58,314 59,378 +1.82% 0.00% / 0.00% warn
All 36 workloads: 1 warn, 35 ok
workload base Ir/op head Ir/op delta A/A base / head verdict
l1-get-hit 1,334 1,334 0.00% 0.00% / 0.00% ok
l1-set-at-capacity-1k 6,981 6,906 -1.07% 0.00% / 0.00% ok
l1-set-at-capacity-10k 5,118 5,118 0.00% 0.00% / 0.00% ok
l1-set-at-capacity-100k 14,383 14,383 0.00% 0.00% / 0.00% ok
plaintext-set-1kb 224,603 225,620 +0.45% 0.00% / 0.00% ok
plaintext-set-10kb 1,854,975 1,856,623 +0.09% 0.00% / 0.00% ok
plaintext-set-100kb 18,171,800 18,173,394 +0.01% 0.00% / 0.00% ok
plaintext-set-64b 58,314 59,378 +1.82% 0.00% / 0.00% warn
plaintext-set-1mb 176,003,022 176,274,496 +0.15% 0.00% / 0.00% ok
plaintext-set-containers 1,406,492 1,407,171 +0.05% 0.00% / 0.00% ok
keygen 18,694 18,693 -0.01% 0.00% / 0.00% ok
keygen-1kb 277,214 277,224 +0.00% 0.00% / 0.00% ok
keygen-wasm 23,864 23,864 0.00% 0.00% / 0.00% ok
keygen-wasm-1kb 317,431 317,431 0.00% 0.00% / 0.00% ok
serializer-roundtrip 414,235 414,235 0.00% 0.00% / 0.00% ok
napi-envelope 47,017 47,017 0.00% 0.00% / 0.00% ok
napi-envelope-40b 16,163 16,163 0.00% 0.00% / 0.00% ok
napi-envelope-64kb 501,575 501,586 +0.00% 0.00% / 0.00% ok
wasm-envelope 68,074 68,074 0.00% 0.00% / 0.00% ok
wasm-envelope-40b 18,866 18,866 0.00% 0.00% / 0.00% ok
wasm-envelope-64kb 910,471 910,482 +0.00% 0.00% / 0.00% ok
napi-encrypted 47,898 47,898 0.00% 0.00% / 0.00% ok
napi-encrypted-64kb 853,648 853,648 0.00% 0.00% / 0.00% ok
wasm-encrypted 327,040 327,040 0.00% 0.00% / 0.00% ok
wasm-encrypted-64kb 32,113,084 32,113,086 +0.00% 0.00% / 0.00% ok
secure-set-get 542,263 543,116 +0.16% 0.00% / 0.00% ok
get-l1-hit 3,703 3,703 0.00% 0.00% / 0.00% ok
wrap-l1-hit 28,510 28,512 +0.01% 0.00% / 0.00% ok
wrap-l1-hit-metrics 28,691 28,684 -0.02% 0.01% / 0.00% ok
get-l2-hit-metrics 265,081 265,110 +0.01% 0.02% / 0.02% ok
secure-wrap-l1-hit-100b 70,328 70,320 -0.01% 0.00% / 0.00% ok
secure-wrap-l1-hit-10kb 1,535,461 1,535,372 -0.01% 0.00% / 0.00% ok
secure-wrap-l1-hit-1mb 239,287,329 238,605,859 -0.28% 0.02% / 0.03% ok
wrap-l1-hit-cachekitio 28,510 28,508 -0.01% 0.02% / 0.01% ok
wrap-l1-hit-int-cachekitio 4,645 4,656 +0.24% 0.00% / 0.02% ok
wrap-l1-hit-int 4,555 4,570 +0.33% 0.00% / 0.01% ok

Run log

@27Bslash6

Copy link
Copy Markdown
Contributor Author

@kody start-review

@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 — 2 suggested fixes.
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:
- packages/cachekit/src/backends/cachekitio-freshness.test.ts:279
- packages/cachekit/src/l1/lru-cache.test.ts:1381

---

### [1/2] packages/cachekit/src/backends/cachekitio-freshness.test.ts:279
Issue identified during code review:
Unsafe type assertion in `packages/cachekit/src/backends/cachekitio-freshness.test.ts`: `init.body as Uint8Array` casts the request body without a runtime check, which violates the team rule 'Avoid unsafe type assertions'. When `init.body` is a `string`, `Blob`, or `ReadableStream`, `store.set(url, ...)` stores a non-`Uint8Array` value, and later byte-level reads fail at runtime instead of at the cast. Fix: narrow with a type guard such as `if (!(init.body instanceof Uint8Array)) throw new TypeError(...)` before calling `store.set`.

**Also found in:**
- `packages/cachekit/src/backends/cachekitio-freshness.test.ts:379-379`
- `packages/cachekit/src/backends/cachekitio-freshness.test.ts:562-562`
- `packages/cachekit/src/backends/cachekitio.test.ts:381-381`
- `packages/cachekit/src/cache-core.ts:180-180`
- `packages/cachekit/src/l1/lru-cache.ts:307-307`

---

### [2/2] packages/cachekit/src/l1/lru-cache.test.ts:1381
Issue identified during code review:
Nondeterministic test in `packages/cachekit/src/l1/lru-cache.test.ts`: this test calls `c.set('a', 'v', 10_000, 'ns')` and the time-based `getWithSwr` against the real clock, unlike the other tests in this block, which violates the team rule that time must be frozen before exercising the system under test. When a slow CI run lets enough wall-clock time pass between `set` and `getWithSwr`, the SWR threshold and expiry checks flip and the assertion fails intermittently. Fix: call `vi.useFakeTimers({ now: 0 })` at the start of the test, before constructing the `L1Cache`; the existing `afterEach` already restores real timers.

---

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

@27Bslash6 27Bslash6 changed the title fix(cachekitio): 90-day TTL range; bound the writer's L1 copy by the PUT Fresh-For (LAB-12090) feat(cachekitio)!: 90-day TTL range; bound the writer's L1 copy by the PUT Fresh-For (LAB-12090) Nov 1, 2026
…etResult without a cast

capExpiryAt looks the entry up by key and compares identity, so it needs no cast. Its doc says it deletes an entry whose cap has passed. freshUntil narrows the set result by truthiness. Test stubs check the PUT body is bytes, and the discardRefresh test freezes time.
@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
coderabbitai[bot]
coderabbitai Bot previously approved these changes Nov 1, 2026
…c85bb

# Conflicts:
#	packages/cachekit/src/cache-core.ts
@27Bslash6

Copy link
Copy Markdown
Contributor Author

Resolved packages/cachekit/src/cache-core.ts (import-only union: this PR's SetResult plus main's L1LatencyReport import); auto-rebased onto main (merge commit, no history rewrite); CI will re-run.

@27Bslash6

Copy link
Copy Markdown
Contributor Author

@kody review --force

@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.

vi.mocked(fetch).getMockImplementation() is typed as fetch, so the wrapper passes url and init through unchanged with no assertion.
@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.

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