Skip to content

docs: content audit remediation and site rework#400

Merged
pratyush618 merged 57 commits into
masterfrom
docs/content-audit-remediation
Jul 10, 2026
Merged

docs: content audit remediation and site rework#400
pratyush618 merged 57 commits into
masterfrom
docs/content-audit-remediation

Conversation

@pratyush618

@pratyush618 pratyush618 commented Jul 10, 2026

Copy link
Copy Markdown
Collaborator

Summary

Content audit and remediation across the Fumadocs site — accuracy fixes to the SDK docs, a landing page rework, and docs UI/theming polish (~46 commits).

Content accuracy fixes

Audited and corrected Python, Node, and Java SDK docs — getting-started, core / reliability / workflows / operations / resources / observability guides, API reference, and examples. Fixed stale examples, incorrect params, and inaccurate behavior descriptions flagged during the audit (serializer defaults, delivery semantics, no-broker architecture, worker startup, CLI, task params/status, dedup/retries/timeouts, mesh, migration, dashboard routes).

Landing page rework

  • Reworked hero copy and CTAs; fixed the hero code panel to a consistent size.
  • Added the no-broker story and a worker-first onboarding path.
  • Consolidated capabilities messaging; moved HowItWorks above ScenarioFinder.

Docs UI / theming

  • Mermaid diagrams: theme-aware colors, theme-aware sequence numbers, full-size rendering with scroll for wide diagrams, and click-to-enlarge overlay.
  • On-this-page TOC: nested subsection markers and active-SDK filtering.
  • Large tables: frozen header row and first column, with long labels wrapped in the frozen column.
  • Restored numbering on ordered lists; aligned list bullets with wrapped text.
  • Turquoise color token for info callouts; auto-numbered FAQ questions; SDK-specific FAQ content; hid SDK selector on landing nav; hid sidebar search on desktop.

Test plan

  • `pnpm --dir docs types:check`
  • `pnpm --dir docs lint`
  • `pnpm --dir docs build`
  • Manual review of landing hero, diagram overlay/enlarge, and TOC nesting/filtering

Summary by CodeRabbit

  • New Features
    • Added zoomable Mermaid diagrams with an overlay interaction.
    • Tables now support sticky headers/first column on larger content.
    • TOC navigation is now SDK-aware, and FAQ headings are auto-numbered.
    • Improved site navigation/landing layout (including optional SDK selector).
  • Bug Fixes
    • Restored/adjusted ordered-list and diagram/table styling, plus refined docs examples and status terminology.
    • Updated scroll-spy to respect SDK-specific visible headings.
  • Documentation
    • Major refresh to “no broker” messaging, reliability/lifecycle guarantees, serializer defaults (SmartSerializer), metrics/CLI/API references, and multi-SDK migration guidance (e.g., Celery/BullMQ/JMS/RabbitMQ).

@github-actions github-actions Bot added the docs label Jul 10, 2026
@coderabbitai

coderabbitai Bot commented Jul 10, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

You’ve reached a temporary PR review limit under our Fair Usage Limits Policy.

Your recent review volume is higher than typical usage, so adaptive limits are currently applied.

Next review available in: 18 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: e15dba5b-ed89-477e-b2eb-fa2f87fbf6aa

📥 Commits

Reviewing files that changed from the base of the PR and between bc63104 and 3d3a077.

📒 Files selected for processing (1)
  • docs/app/components/mermaid.tsx
📝 Walkthrough

Walkthrough

The PR updates the documentation site across shared UI, styling, architecture, and Python, Node, and Java content. It adds SDK-aware TOC behavior, interactive diagrams, sticky tables, revised landing content, expanded API references, workflow guidance, operational documentation, and SDK-scoped FAQ examples.

Changes

Docs-site experience

Layer / File(s) Summary
Navigation and interactive components
docs/app/components/docs/toc.tsx, docs/app/components/mdx/table.tsx, docs/app/components/mermaid.tsx, docs/app/components/ui/site-nav.tsx
TOC entries now follow the active SDK, large tables receive sticky behavior, Mermaid diagrams can open in an overlay, and site navigation can hide the SDK selector.
Landing page and styling
docs/app/components/landing/*, docs/app/routes/*, docs/app/styles/*
Landing copy, metadata, section ordering, responsive search, FAQ numbering, Mermaid styling, table styling, TOC sub-links, color tokens, and code-panel sizing are updated.
Architecture and shared docs
docs/content/docs/architecture/*, docs/content/docs/resources/comparison.mdx
Documentation now describes brokerless storage, dispatch versus execution guarantees, lifecycle transitions, status naming, serializer defaults, and deployment comparisons.

Java documentation

Layer / File(s) Summary
Java references, guides, and examples
docs/content/docs/java/**
Java navigation adds guide entries, while batching, worker startup, brokerless operation, reliability, resources, workflows, integrations, and examples are clarified or expanded.

Node documentation

Layer / File(s) Summary
Node API references and guides
docs/content/docs/node/**
Node references and guides document payload codecs, queue controls, CLI updates, new error types, task chaining, workflow submission, metrics, cancellation, result errors, operations, reliability, migrations, and examples.

Python documentation

Layer / File(s) Summary
Python onboarding and API references
docs/content/docs/python/api-reference/*, docs/content/docs/python/getting-started/*
Python onboarding adds capability cards, revised installation and quickstart flows, and updated API references for task options, CLI commands, canvas behavior, serializers, statuses, and sagas.
Python guides, examples, and FAQ
docs/content/docs/python/guides/*, docs/content/docs/python/more/examples/*, docs/content/docs/resources/faq.mdx
Guides and examples clarify execution models, batching, retries, idempotency, locking, deployment, dashboards, integrations, resources, workflows, monitoring, testing, and SDK-specific FAQ content.

Estimated code review effort: 5 (Critical) | ~120 minutes

Possibly related PRs

Suggested labels: docs, ci

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately reflects the main changes: a broad documentation audit/remediation plus site rework.
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.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch docs/content-audit-remediation

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

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

Actionable comments posted: 11

Note

Due to the large number of review comments, Critical, Major severity comments were prioritized as inline comments.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (4)
docs/app/components/docs/toc.tsx (1)

53-64: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Clear stale headings on an initially empty SDK scan.

When the newly selected SDK has no visible h2/h3 headings, both key and the initial lastKey are ""; the function returns before setHeadings([]), leaving the previous SDK’s TOC visible.

Proposed fix
-    let lastKey = "";
+    let lastKey: string | null = null;

       const key = next.map((h) => h.id).join("|");
-      if (key === lastKey) {
+      if (lastKey !== null && key === lastKey) {
         return;
       }
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/app/components/docs/toc.tsx` around lines 53 - 64, Update the scan
function in the TOC component so an initially empty heading scan still clears
stale state: do not return solely because key equals lastKey when next is empty,
or otherwise ensure setHeadings([]) runs for the empty SDK result before
returning. Preserve the existing deduplication behavior for non-empty scans and
continue disconnecting the spy when no headings exist.
docs/content/docs/resources/faq.mdx (1)

514-544: 🗄️ Data Integrity & Integration | 🟡 Minor | ⚡ Quick win

Remove the 0 = all wording. These purge APIs take an older-than cutoff (seconds in Python, ms in Node/Java), so purgeCompleted(0) / purgeDead(0) won’t delete normal jobs. Use a real cutoff or rephrase the examples.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/content/docs/resources/faq.mdx` around lines 514 - 544, Update the FAQ
purge examples for the Python, Node, and Java SDK sections to remove the
inaccurate “0 = all” wording and avoid implying that zero purges normal jobs;
use a valid older-than cutoff that represents the intended retention period, and
ensure the comments describe the units correctly for each SDK.
docs/content/docs/python/guides/integrations/django.mdx (1)

87-95: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

Make the example use the same storage configuration as Django.

The full example creates Queue(db_path="taskito.db"), but get_queue() uses TASKITO_* settings. Without explicitly aligning these values, the worker and admin can operate on different databases, producing empty or inconsistent admin views.

Also applies to: 110-118

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/content/docs/python/guides/integrations/django.mdx` around lines 87 -
95, Update the Django integration example’s queue initialization and get_queue()
configuration to use the same TASKITO_* settings and database path, ensuring the
worker CLI, tasks, and admin all share one storage configuration.
docs/content/docs/python/more/examples/batch-emails.mdx (1)

93-101: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Keep the chunks() API consistent throughout the example.

The prose says canvas.chunks(), while the code imports and calls chunks() directly from taskito. Update the prose or change the code so readers receive one canonical API.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/content/docs/python/more/examples/batch-emails.mdx` around lines 93 -
101, The example uses inconsistent `chunks()` APIs: prose references
`canvas.chunks()` while the code imports and calls `chunks()` directly. Update
the “When to use chunks() instead” prose to describe the direct `chunks()` API,
or revise the import and invocation to consistently use `canvas.chunks()`
throughout.
🟡 Minor comments (29)
docs/content/docs/resources/comparison.mdx-142-142 (1)

142-142: 🚀 Performance & Scalability | 🟡 Minor | ⚡ Quick win

Clarify the GIL row The Rust side only avoids GIL contention during scheduling and dispatch; worker threads still acquire the GIL to run Python task code, so this row should say that explicitly.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/content/docs/resources/comparison.mdx` at line 142, Update the GIL row
in the comparison table to clarify that Rust avoids GIL contention only during
scheduling and dispatch, while worker threads still acquire the GIL when
executing Python task code; revise the Rust-side wording accordingly without
changing the Python-side comparison.
docs/content/docs/architecture/job-lifecycle.mdx-12-17 (1)

12-17: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Add the Failed step to the lifecycle text. The status table and diagram already define Failed, but this paragraph skips it and jumps from Running to Pending/Dead. Update it to show the retry/dead-letter path through Failed.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/content/docs/architecture/job-lifecycle.mdx` around lines 12 - 17,
Update the job lifecycle paragraph to include the Failed status between Running
and the retry outcome: when the task raises, transition to Failed, then return
to Pending during retry backoff if attempts remain, or move to Dead and the
dead-letter queue when max_retries is exhausted. Preserve the existing
Pending-to-Cancelled path.
docs/content/docs/architecture/failure-model.mdx-8-12 (1)

8-12: 🗄️ Data Integrity & Integration | 🟡 Minor | ⚡ Quick win

Qualify the dispatch guarantee. claim_execution prevents duplicate dispatch, but it doesn’t rule out overlap across timeout-based retries. Call this exactly-once dispatch, not no-overlap execution.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/content/docs/architecture/failure-model.mdx` around lines 8 - 12,
Qualify the guarantee described in the failure-model documentation: update the
`claim_execution` explanation to state that it prevents duplicate dispatch under
normal claiming, but timeout-based retries may overlap, so it does not guarantee
no-overlap execution. Retain the distinction between exactly-once dispatch and
at-least-once task execution.
docs/app/routes/home.tsx-55-59 (1)

55-59: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Match the rendered section order to the landing-page objective.

The current JSX renders HowItWorks before ScenarioFinder, while the stated change requires ScenarioFinder to appear first. Swap these two elements if that ordering is intentional.

Proposed fix
-        <HowItWorks />
         <ScenarioFinder />
+        <HowItWorks />
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/app/routes/home.tsx` around lines 55 - 59, Swap the JSX order of the
HowItWorks and ScenarioFinder components in the page render so ScenarioFinder
appears immediately after Hero, followed by HowItWorks.
docs/content/docs/java/more/examples/saga-checkout.mdx-69-72 (1)

69-72: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Avoid implying that pending jobs are permanently stalled.

An unclaimed job remains pending until a worker claims it; it can still progress if the worker starts later. Replace “an unclaimed job never progresses” with wording such as “does not progress until a worker claims it,” and explain that the worker must start before the await timeout expires.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/content/docs/java/more/examples/saga-checkout.mdx` around lines 69 - 72,
Update the saga checkout documentation near the worker startup guidance to avoid
stating that unclaimed jobs never progress; explain that a job remains pending
until a worker claims it and that the worker must start before the await timeout
expires. Preserve the references to the worker registration and run.await
behavior.
docs/content/docs/java/guides/workflows/conditions.mdx-28-33 (1)

28-33: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Clarify the timeout behavior of run.await(...).

WorkflowRun.await(...) polls until a terminal state and throws when its timeout expires. Without a tracking worker, the run remains PENDING during that period; it does not wait forever from the caller’s perspective. Say that await eventually times out unless a tracking worker starts.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/content/docs/java/guides/workflows/conditions.mdx` around lines 28 - 33,
Update the warning callout describing WorkflowRun.await(...) to clarify that it
polls until a terminal state and throws when its timeout expires; without a
tracking worker, the run remains PENDING only until that timeout, rather than
waiting forever from the caller’s perspective. State that await eventually times
out unless a tracking worker starts.
docs/content/docs/java/more/examples/saga-checkout.mdx-81-100 (1)

81-100: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Make the Running it example self-contained docs/content/docs/java/more/examples/saga-checkout.mdx:81-100
Wrap this in a main/method or mark it as an application fragment; the top-level try and undeclared order, inventory, payments, and shipping symbols make it non-compilable as shown.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/content/docs/java/more/examples/saga-checkout.mdx` around lines 81 -
100, Make the “Running it” example explicitly self-contained by wrapping the
existing Taskito/Worker try-with-resources block in a compilable main method or
clearly labeling it as an application fragment. Ensure the example declares or
initializes order, inventory, payments, and shipping before calling
Checkout.submit, and include any required imports or surrounding class context.
docs/content/docs/java/guides/integrations/spring.mdx-94-94 (1)

94-94: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Clarify the dashboard-port wording.

The documented default is correct, but “defaults off Spring Boot’s own 8080” is awkward and may obscure that 8080 remains a valid explicit override.

Proposed wording
-| `taskito.dashboard.port` | `int` | `8081` | Bind port (`0` for ephemeral); defaults off Spring Boot's own `8080` |
+| `taskito.dashboard.port` | `int` | `8081` | Bind port (`0` for ephemeral); defaults to `8081` rather than Spring Boot's own `8080` |
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/content/docs/java/guides/integrations/spring.mdx` at line 94, Clarify
the description for `taskito.dashboard.port` in the configuration table: state
that its default is `8081`, while `8080` remains available as an explicit
override, using clear wording instead of “defaults off Spring Boot’s own
`8080`.”
docs/content/docs/java/guides/core/workers.mdx-24-31 (1)

24-31: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Describe @Async as asynchronous dispatch, not inline execution.

@Async does not run the method inline on the caller’s thread; it submits execution to a Spring-managed executor. Clarify this distinction to avoid misleading users about call and scheduling behavior.

Proposed wording
-  `@Async` runs the call inline on a Spring-managed thread pool the moment
-  it's invoked — there's no separate producer/consumer step, and queued calls
+  `@Async` dispatches the call to a Spring-managed thread pool when it's
+  invoked — there's no separate durable producer/consumer step, and queued calls
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/content/docs/java/guides/core/workers.mdx` around lines 24 - 31, Update
the “Coming from Spring `@Async`?” callout to accurately state that `@Async` submits
the method to a Spring-managed executor and returns without running it on the
caller’s thread; contrast this asynchronous dispatch with a Worker’s separately
started process or thread and durable polling behavior.
docs/content/docs/node/api-reference/workflows.mdx-37-40 (1)

37-40: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Define runId in the example.

The standalone snippet references an undeclared identifier, so it cannot be copied into TypeScript as shown.

Proposed fix
+const runId = "nightly-etl";
 const workflow = queue.workflows.define("etl").step("extract", "extract");
 const run = queue.workflows.submit(workflow, { queueDefault: "io", params: { runId } });
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/content/docs/node/api-reference/workflows.mdx` around lines 37 - 40,
Define `runId` before it is used in the workflow submission example, using a
representative string or generated identifier so the standalone TypeScript
snippet is valid and copyable.
docs/content/docs/node/getting-started/concepts.mdx-18-19 (1)

18-19: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Qualify SQLite as the default backend.

The following callout supports Postgres and Redis via a DSN, so “all live in one embedded SQLite file” is not true for every deployment.

Proposed fix
- The queue, job results, and cron schedules all live in one embedded
- SQLite file — nothing extra to install or operate.
+ By default, the queue, job results, and cron schedules live in one embedded
+ SQLite file — nothing extra to install or operate.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/content/docs/node/getting-started/concepts.mdx` around lines 18 - 19,
Update the documentation near the embedded SQLite description to qualify SQLite
as the default backend, and note that deployments can instead use Postgres or
Redis configured through a DSN. Avoid stating that all queues, results, and
schedules always live in SQLite.
docs/content/docs/node/guides/workflows/fan-out.mdx-44-48 (1)

44-48: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Scope the BullMQ comparison to a single FlowProducer.add(...) call. children is fixed per flow submission, but BullMQ can still add child jobs later from a worker with queue.add(..., { parent }).

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/content/docs/node/guides/workflows/fan-out.mdx` around lines 44 - 48,
Clarify the BullMQ comparison in the fan-out documentation by scoping the fixed
`children` limitation to a single `FlowProducer.add(...)` submission.
Acknowledge that BullMQ workers can add additional child jobs later via
`queue.add(..., { parent })`, while preserving the distinction that taskito
derives child count dynamically from `list` at runtime.
docs/content/docs/node/guides/reliability/locks.mdx-50-54 (1)

50-54: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Qualify the BullMQ lock comparison.

BullMQ’s normal worker lock is internal and job-scoped, but the public Job.extendLock(token, duration) API is callable by application code during manual processing. Keep the distinction that BullMQ does not provide a general-purpose application lock, rather than saying its lock cannot be called from application code. (docs.bullmq.io)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/content/docs/node/guides/reliability/locks.mdx` around lines 50 - 54,
Update the “Coming from BullMQ?” comparison to acknowledge BullMQ’s public
Job.extendLock(token, duration) API for manually processed jobs, while
clarifying that its normal lock is internal and job-scoped and BullMQ does not
offer a general-purpose application-level lock.
docs/content/docs/node/guides/reliability/retries.mdx-6-8 (1)

6-8: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Mention non-retryable failures.

The supplied crates/taskito-core/src/scheduler/result_handler.rs:52-120 path sends failures with should_retry === false directly to the DLQ before checking the retry budget. Change “A task that throws” to “A retryable task failure” and mention exception filtering.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/content/docs/node/guides/reliability/retries.mdx` around lines 6 - 8,
Update the retry behavior description to say “A retryable task failure” instead
of “A task that throws,” and mention that exception filtering can mark failures
as non-retryable. Clarify that failures with should_retry === false are sent
directly to the dead-letter queue without checking maxRetries, while retryable
failures follow the retry budget and exponential backoff.
docs/content/docs/node/guides/reliability/idempotency.mdx-19-23 (1)

19-23: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Qualify “permanent reservation.”

A BullMQ jobId suppresses duplicates while an existing job record remains; removeOnComplete, removeOnFail, or explicit removal allows the same ID later. Reword this as record-lifetime deduplication rather than a permanent reservation. (docs.bullmq.io)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/content/docs/node/guides/reliability/idempotency.mdx` around lines 19 -
23, Update the BullMQ comparison in the idempotency guide to describe custom
jobId deduplication as lasting only while the existing job record remains, since
removeOnComplete, removeOnFail, or explicit removal permits reuse. Replace
“permanent reservation” with wording that contrasts BullMQ’s record-lifetime
behavior against taskito’s pending/running uniqueKey scope.
docs/content/docs/python/api-reference/queue/index.mdx-93-93 (1)

93-93: 🗄️ Data Integrity & Integration | 🟡 Minor | ⚡ Quick win

Include BatchConfig in the documented batch type.

docs/content/docs/python/api-reference/batching.mdx:18-25 says BatchConfig is accepted, but this signature and parameter table only advertise bool | dict | None. Align these API references, or explicitly state that BatchConfig is not valid for @queue.task(batch=...).

Proposed documentation fix
-    batch: bool | dict | None = None,
+    batch: bool | dict | BatchConfig | None = None,

Also applies to: 120-120

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/content/docs/python/api-reference/queue/index.mdx` at line 93, Update
the documented batch type in the queue API reference signature and corresponding
parameter table to include BatchConfig alongside bool, dict, and None. Keep both
occurrences consistent with the batching documentation, unless BatchConfig is
explicitly documented as unsupported for `@queue.task`(batch=...).
docs/content/docs/python/api-reference/result.mdx-41-45 (1)

41-45: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Fix the broken queue API link.

The supplied API index links the queue reference at /python/api-reference/queue, while this link targets /python/api-reference/queue/queues, for which no corresponding page is present in the supplied Python API files.

-> aggregate count bucket from [`queue.stats()`](/python/api-reference/queue/queues)
+> aggregate count bucket from [`queue.stats()`](/python/api-reference/queue)
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/content/docs/python/api-reference/result.mdx` around lines 41 - 45, Fix
the queue API reference link in the naming note by changing its target from
`/python/api-reference/queue/queues` to the existing
`/python/api-reference/queue` route, without altering the surrounding status
terminology.
docs/content/docs/python/api-reference/queue/index.mdx-124-129 (1)

124-129: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Document predicate_extras and default_defer_seconds in the @queue.task() API reference
docs/content/docs/python/api-reference/queue/index.mdx:72-129 omits these decorator kwargs from the canonical signature and parameter table even though @queue.task() accepts them. Add them alongside predicate/on_false in the main reference.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/content/docs/python/api-reference/queue/index.mdx` around lines 124 -
129, Update the `@queue.task`() canonical signature and parameter table in the
queue API reference to include predicate_extras and default_defer_seconds
alongside predicate and on_false, documenting their purpose and accepted values
consistently with the existing task options.
docs/content/docs/python/guides/reliability/rate-limiting.mdx-8-9 (1)

8-9: 🗄️ Data Integrity & Integration | 🟡 Minor | ⚡ Quick win

Mention Redis here too. Rate-limit state is persisted in Redis as well as SQLite and Postgres, so the backend list is incomplete.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/content/docs/python/guides/reliability/rate-limiting.mdx` around lines 8
- 9, Update the rate-limiting documentation near the description of persisted
rate limits to include Redis alongside SQLite and Postgres. Ensure the backend
list accurately states that rate-limit state is persisted in SQLite, Postgres,
or Redis.
docs/content/docs/python/guides/reliability/retries.mdx-152-164 (1)

152-164: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Wait for completion before reading job.errors.

delay() returns immediately, so this loop can run before any attempt is recorded. Block on job.result() and catch the final task exception before iterating over the error history.

Proposed fix
 job = unreliable.delay()
 
-# After the job exhausts all retries...
+try:
+    job.result(timeout=30)
+except ConnectionError:
+    pass
+
 for error in job.errors:
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/content/docs/python/guides/reliability/retries.mdx` around lines 152 -
164, Update the retry example to wait for task completion by calling
job.result() and catching its final exception before iterating over job.errors;
retain the existing attempt-printing logic and clarify that errors are read only
after completion.
docs/content/docs/python/getting-started/concepts.mdx-16-23 (1)

16-23: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Qualify the queue architecture claim. Celery, RQ, Dramatiq, and Huey don’t all require separate broker and result-backend services; some share storage, and Huey can run on SQLite without an extra service. Reword this as “often need an external broker and may use a separate result backend.”

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/content/docs/python/getting-started/concepts.mdx` around lines 16 - 23,
Revise the introductory architecture description in the concepts documentation
to avoid claiming that all listed Python task queues require separate broker and
result-backend services. Reword it to state that they often need an external
broker and may use a separate result backend, while acknowledging shared storage
and Huey’s SQLite option; update the accompanying bullets to match this
qualified wording.
docs/content/docs/python/guides/advanced-execution/unique-tasks.mdx-21-22 (1)

21-22: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Describe key release as leaving pending/running, not just completion/DLQ. docs/content/docs/python/guides/advanced-execution/unique-tasks.mdx:21-22 should say the key is freed once the job is no longer pending or running, so it also covers terminal states like cancelled.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/content/docs/python/guides/advanced-execution/unique-tasks.mdx` around
lines 21 - 22, Update the unique-task explanation near the statement about the
original job completing or reaching DLQ: describe the key as being released once
the job is no longer pending or running, allowing a new job with the same key
after any terminal state, including cancellation.
docs/content/docs/python/guides/resources/testing.mdx-12-14 (1)

12-14: 🩺 Stability & Availability | 🟡 Minor | ⚡ Quick win

Qualify the parallel-safety claim.

sdks/python/taskito/testing.py:111-182 mutates queue-level state and patches that queue’s enqueue method. Overlapping contexts that share one Queue can interfere, so this is safe for parallel tests only when each test uses a separate queue instance.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/content/docs/python/guides/resources/testing.mdx` around lines 12 - 14,
Qualify the parallel-safety statement for test_mode(): explain that parallel use
is safe only when tests use separate Queue instances, since overlapping contexts
sharing a queue can interfere through queue-level state and enqueue patching.
Update the surrounding documentation accordingly.
docs/content/docs/python/guides/core/scheduling.mdx-65-68 (1)

65-68: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Update the remaining five-field cron example.

This callout correctly establishes taskito’s six-field format, but Line 153 still uses cron="0 9 * * *" with only five fields. Change it to a six-field expression such as cron="0 0 9 * * *" so the page is internally consistent.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/content/docs/python/guides/core/scheduling.mdx` around lines 65 - 68,
Update the remaining five-field cron example in the scheduling guide: change the
cron argument from "0 9 * * *" to a six-field expression such as "0 0 9 * * *",
keeping it consistent with the documented taskito format.
docs/content/docs/python/guides/dashboard/rest-api.mdx-13-17 (1)

13-17: 🔒 Security & Privacy | 🟡 Minor | ⚡ Quick win

Qualify readiness and metrics as session-auth-exempt, not unconditionally public.

The server still checks _metrics_token_ok() for /readiness and /metrics; when metrics-token protection is configured, a sessionless request alone is insufficient. Document that distinction to avoid misleading operators and failing health checks.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/content/docs/python/guides/dashboard/rest-api.mdx` around lines 13 - 17,
Update the route authentication documentation to qualify `/readiness` and
`/metrics` as exempt from session authentication only when their configured
metrics-token requirements are satisfied; clarify that sessionless requests
alone may be rejected when metrics-token protection is enabled.
docs/content/docs/python/guides/dashboard/task-overrides.mdx-59-78 (1)

59-78: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Clarify the persistence wording for paused.

The table at Line 51 calls Paused “runtime-only,” but this section says set_task_override(..., paused=True) is recorded and exposed through the dashboard/API. Rename that table text to clarify that it has no decorator equivalent and is currently metadata-only/non-enforced.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/content/docs/python/guides/dashboard/task-overrides.mdx` around lines 59
- 78, Update the table’s “Paused” description to clarify that task pause has no
decorator equivalent and is persisted or exposed as metadata, but is not
enforced by the scheduler. Align the wording with the
`queue.set_task_override(..., paused=True)` behavior described in the
task-overrides section, avoiding the inaccurate “runtime-only” label.
docs/content/docs/python/guides/integrations/fastapi.mdx-64-67 (1)

64-67: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Document the wire header name as x-api-key. Header(...) turns x_api_key into x-api-key by default; use convert_underscores=False only if the underscore form is intended.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/content/docs/python/guides/integrations/fastapi.mdx` around lines 64 -
67, Update the FastAPI integration documentation around require_api_key to
explicitly state that the x_api_key parameter maps to the wire header name
x-api-key by default; mention convert_underscores=False only if documenting the
underscore-form header instead.
docs/content/docs/python/more/examples/workflows.mdx-64-65 (1)

64-65: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Wire accuracy_gate into the workflow. accuracy_gate is defined but never used; wf.gate("review", ...) is still a manual gate, so deploy is not actually gated on evaluate’s passed result as the example claims.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/content/docs/python/more/examples/workflows.mdx` around lines 64 - 65,
The example defines accuracy_gate but does not use it, leaving deploy behind a
manual review gate instead of evaluate’s passed result. Update the workflow
construction to register accuracy_gate through wf.gate("review", ...) and ensure
deploy depends on that gate, removing the manual gate configuration while
preserving the ctx.results-based evaluation flow.
docs/content/docs/python/guides/operations/testing.mdx-158-176 (1)

158-176: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Make the chord example self-contained — it relies on double from the later Chains example, so this block can’t be copied on its own. Define double here or inline a minimal task.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/content/docs/python/guides/operations/testing.mdx` around lines 158 -
176, Make the test_chord example self-contained by defining a local double task
before it is used, or replacing double with an inline minimal task, while
preserving the expected group results and callback assertion.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@docs/app/components/mermaid.tsx`:
- Around line 83-104: Update the mermaid component’s zoom state and portal modal
to implement a focus-managed dialog: add dialog semantics, retain a ref to the
trigger, focus the modal or close control when zoom opens, trap Tab navigation
within the modal, and restore focus to the trigger when zoom closes. Use the
existing zoom click handlers and portal rendering around the mermaid figure to
integrate the focus lifecycle and keyboard handling.

In `@docs/content/docs/java/guides/operations/backends.mdx`:
- Around line 10-14: Update the backend description near the brokerless setup
explanation to clarify that Redis remains required when the Redis backend is
selected. State that Redis serves as the queue’s storage backend and replaces a
separate broker, rather than being optional or unnecessary.

In `@docs/content/docs/node/guides/operations/migration.mdx`:
- Line 20: Update the migration comparison table and surrounding guidance for
`queue.result(id)` to document its default 30-second timeout and that it throws
when the job has not reached a terminal state; clarify that it is not a drop-in
replacement for long-running BullMQ jobs and mention configuring an appropriate
timeout where applicable.

In `@docs/content/docs/node/guides/operations/security.mdx`:
- Around line 44-46: Update the security guidance near the deliverer URL warning
to explicitly require an enforceable egress allowlist for user-controlled
webhook URLs. Document validation and DNS/IP revalidation immediately before
delivery, blocking private, loopback, link-local, metadata, and equivalent
IPv4/IPv6 targets, and restricting or validating redirects so they cannot bypass
these protections.

In `@docs/content/docs/node/guides/reliability/guarantees.mdx`:
- Around line 49-54: Correct the BullMQ comparison text by replacing the
description of QueueEvents as a Redis pub/sub subscriber with a dedicated Redis
Streams consumer, while preserving the explanation that taskito’s queue event
handlers run in the worker process and are not cross-process subscriptions.

In `@docs/content/docs/python/api-reference/saga.mdx`:
- Line 107: Update the terminal-state documentation near
WorkflowState.is_terminal() and WorkflowRun.wait() to include
CompletedWithFailures alongside Completed, Failed, Cancelled, Compensated, and
CompensationFailed, and change the count from five to six.

In `@docs/content/docs/python/getting-started/concepts.mdx`:
- Around line 25-29: Update the documentation paragraph to distinguish SQLite as
the embedded default from Postgres as an externally operated database server,
while preserving that both serve as the broker and result backend without
requiring a separate message broker.

In `@docs/content/docs/python/guides/reliability/guarantees.mdx`:
- Around line 18-20: Revise the exactly-once delivery explanation near the
reliability guarantees content: remove the claim that two-phase commit is
required, and instead describe the acknowledgement/side-effect atomicity gap.
Mention transactional outbox/inbox patterns or idempotency as ways to address
duplicate side effects, while preserving Taskito’s at-least-once delivery
guarantee and guidance to make tasks duplicate-safe.

In `@docs/content/docs/python/guides/resources/dependency-injection.mdx`:
- Around line 145-148: Update both resource factory examples, including
create_db and the corresponding factory near the second referenced example, to
retain the created Engine alongside the sessionmaker and define resource
teardown that calls engine.dispose(). Preserve the injected callable
sessionmaker behavior while wiring explicit cleanup for graceful worker
shutdown.
- Around line 167-174: Move create_engine(...) from module scope into
create_db() so engine construction occurs within the resource lifecycle, then
return sessionmaker(engine) and ensure the teardown for the "db" resource
disposes that created engine instance rather than relying on a module-level
variable.

In `@docs/content/docs/python/guides/resources/proxies.mdx`:
- Around line 158-159: The NoProxy(session) example must not serialize a live
session containing bearer credentials. Replace it with a credential-free session
example or demonstrate a worker-owned injected resource, and remove the
Authorization header before passing any value through process.delay.

---

Outside diff comments:
In `@docs/app/components/docs/toc.tsx`:
- Around line 53-64: Update the scan function in the TOC component so an
initially empty heading scan still clears stale state: do not return solely
because key equals lastKey when next is empty, or otherwise ensure
setHeadings([]) runs for the empty SDK result before returning. Preserve the
existing deduplication behavior for non-empty scans and continue disconnecting
the spy when no headings exist.

In `@docs/content/docs/python/guides/integrations/django.mdx`:
- Around line 87-95: Update the Django integration example’s queue
initialization and get_queue() configuration to use the same TASKITO_* settings
and database path, ensuring the worker CLI, tasks, and admin all share one
storage configuration.

In `@docs/content/docs/python/more/examples/batch-emails.mdx`:
- Around line 93-101: The example uses inconsistent `chunks()` APIs: prose
references `canvas.chunks()` while the code imports and calls `chunks()`
directly. Update the “When to use chunks() instead” prose to describe the direct
`chunks()` API, or revise the import and invocation to consistently use
`canvas.chunks()` throughout.

In `@docs/content/docs/resources/faq.mdx`:
- Around line 514-544: Update the FAQ purge examples for the Python, Node, and
Java SDK sections to remove the inaccurate “0 = all” wording and avoid implying
that zero purges normal jobs; use a valid older-than cutoff that represents the
intended retention period, and ensure the comments describe the units correctly
for each SDK.

---

Minor comments:
In `@docs/app/routes/home.tsx`:
- Around line 55-59: Swap the JSX order of the HowItWorks and ScenarioFinder
components in the page render so ScenarioFinder appears immediately after Hero,
followed by HowItWorks.

In `@docs/content/docs/architecture/failure-model.mdx`:
- Around line 8-12: Qualify the guarantee described in the failure-model
documentation: update the `claim_execution` explanation to state that it
prevents duplicate dispatch under normal claiming, but timeout-based retries may
overlap, so it does not guarantee no-overlap execution. Retain the distinction
between exactly-once dispatch and at-least-once task execution.

In `@docs/content/docs/architecture/job-lifecycle.mdx`:
- Around line 12-17: Update the job lifecycle paragraph to include the Failed
status between Running and the retry outcome: when the task raises, transition
to Failed, then return to Pending during retry backoff if attempts remain, or
move to Dead and the dead-letter queue when max_retries is exhausted. Preserve
the existing Pending-to-Cancelled path.

In `@docs/content/docs/java/guides/core/workers.mdx`:
- Around line 24-31: Update the “Coming from Spring `@Async`?” callout to
accurately state that `@Async` submits the method to a Spring-managed executor and
returns without running it on the caller’s thread; contrast this asynchronous
dispatch with a Worker’s separately started process or thread and durable
polling behavior.

In `@docs/content/docs/java/guides/integrations/spring.mdx`:
- Line 94: Clarify the description for `taskito.dashboard.port` in the
configuration table: state that its default is `8081`, while `8080` remains
available as an explicit override, using clear wording instead of “defaults off
Spring Boot’s own `8080`.”

In `@docs/content/docs/java/guides/workflows/conditions.mdx`:
- Around line 28-33: Update the warning callout describing
WorkflowRun.await(...) to clarify that it polls until a terminal state and
throws when its timeout expires; without a tracking worker, the run remains
PENDING only until that timeout, rather than waiting forever from the caller’s
perspective. State that await eventually times out unless a tracking worker
starts.

In `@docs/content/docs/java/more/examples/saga-checkout.mdx`:
- Around line 69-72: Update the saga checkout documentation near the worker
startup guidance to avoid stating that unclaimed jobs never progress; explain
that a job remains pending until a worker claims it and that the worker must
start before the await timeout expires. Preserve the references to the worker
registration and run.await behavior.
- Around line 81-100: Make the “Running it” example explicitly self-contained by
wrapping the existing Taskito/Worker try-with-resources block in a compilable
main method or clearly labeling it as an application fragment. Ensure the
example declares or initializes order, inventory, payments, and shipping before
calling Checkout.submit, and include any required imports or surrounding class
context.

In `@docs/content/docs/node/api-reference/workflows.mdx`:
- Around line 37-40: Define `runId` before it is used in the workflow submission
example, using a representative string or generated identifier so the standalone
TypeScript snippet is valid and copyable.

In `@docs/content/docs/node/getting-started/concepts.mdx`:
- Around line 18-19: Update the documentation near the embedded SQLite
description to qualify SQLite as the default backend, and note that deployments
can instead use Postgres or Redis configured through a DSN. Avoid stating that
all queues, results, and schedules always live in SQLite.

In `@docs/content/docs/node/guides/reliability/idempotency.mdx`:
- Around line 19-23: Update the BullMQ comparison in the idempotency guide to
describe custom jobId deduplication as lasting only while the existing job
record remains, since removeOnComplete, removeOnFail, or explicit removal
permits reuse. Replace “permanent reservation” with wording that contrasts
BullMQ’s record-lifetime behavior against taskito’s pending/running uniqueKey
scope.

In `@docs/content/docs/node/guides/reliability/locks.mdx`:
- Around line 50-54: Update the “Coming from BullMQ?” comparison to acknowledge
BullMQ’s public Job.extendLock(token, duration) API for manually processed jobs,
while clarifying that its normal lock is internal and job-scoped and BullMQ does
not offer a general-purpose application-level lock.

In `@docs/content/docs/node/guides/reliability/retries.mdx`:
- Around line 6-8: Update the retry behavior description to say “A retryable
task failure” instead of “A task that throws,” and mention that exception
filtering can mark failures as non-retryable. Clarify that failures with
should_retry === false are sent directly to the dead-letter queue without
checking maxRetries, while retryable failures follow the retry budget and
exponential backoff.

In `@docs/content/docs/node/guides/workflows/fan-out.mdx`:
- Around line 44-48: Clarify the BullMQ comparison in the fan-out documentation
by scoping the fixed `children` limitation to a single `FlowProducer.add(...)`
submission. Acknowledge that BullMQ workers can add additional child jobs later
via `queue.add(..., { parent })`, while preserving the distinction that taskito
derives child count dynamically from `list` at runtime.

In `@docs/content/docs/python/api-reference/queue/index.mdx`:
- Line 93: Update the documented batch type in the queue API reference signature
and corresponding parameter table to include BatchConfig alongside bool, dict,
and None. Keep both occurrences consistent with the batching documentation,
unless BatchConfig is explicitly documented as unsupported for
`@queue.task`(batch=...).
- Around line 124-129: Update the `@queue.task`() canonical signature and
parameter table in the queue API reference to include predicate_extras and
default_defer_seconds alongside predicate and on_false, documenting their
purpose and accepted values consistently with the existing task options.

In `@docs/content/docs/python/api-reference/result.mdx`:
- Around line 41-45: Fix the queue API reference link in the naming note by
changing its target from `/python/api-reference/queue/queues` to the existing
`/python/api-reference/queue` route, without altering the surrounding status
terminology.

In `@docs/content/docs/python/getting-started/concepts.mdx`:
- Around line 16-23: Revise the introductory architecture description in the
concepts documentation to avoid claiming that all listed Python task queues
require separate broker and result-backend services. Reword it to state that
they often need an external broker and may use a separate result backend, while
acknowledging shared storage and Huey’s SQLite option; update the accompanying
bullets to match this qualified wording.

In `@docs/content/docs/python/guides/advanced-execution/unique-tasks.mdx`:
- Around line 21-22: Update the unique-task explanation near the statement about
the original job completing or reaching DLQ: describe the key as being released
once the job is no longer pending or running, allowing a new job with the same
key after any terminal state, including cancellation.

In `@docs/content/docs/python/guides/core/scheduling.mdx`:
- Around line 65-68: Update the remaining five-field cron example in the
scheduling guide: change the cron argument from "0 9 * * *" to a six-field
expression such as "0 0 9 * * *", keeping it consistent with the documented
taskito format.

In `@docs/content/docs/python/guides/dashboard/rest-api.mdx`:
- Around line 13-17: Update the route authentication documentation to qualify
`/readiness` and `/metrics` as exempt from session authentication only when
their configured metrics-token requirements are satisfied; clarify that
sessionless requests alone may be rejected when metrics-token protection is
enabled.

In `@docs/content/docs/python/guides/dashboard/task-overrides.mdx`:
- Around line 59-78: Update the table’s “Paused” description to clarify that
task pause has no decorator equivalent and is persisted or exposed as metadata,
but is not enforced by the scheduler. Align the wording with the
`queue.set_task_override(..., paused=True)` behavior described in the
task-overrides section, avoiding the inaccurate “runtime-only” label.

In `@docs/content/docs/python/guides/integrations/fastapi.mdx`:
- Around line 64-67: Update the FastAPI integration documentation around
require_api_key to explicitly state that the x_api_key parameter maps to the
wire header name x-api-key by default; mention convert_underscores=False only if
documenting the underscore-form header instead.

In `@docs/content/docs/python/guides/operations/testing.mdx`:
- Around line 158-176: Make the test_chord example self-contained by defining a
local double task before it is used, or replacing double with an inline minimal
task, while preserving the expected group results and callback assertion.

In `@docs/content/docs/python/guides/reliability/rate-limiting.mdx`:
- Around line 8-9: Update the rate-limiting documentation near the description
of persisted rate limits to include Redis alongside SQLite and Postgres. Ensure
the backend list accurately states that rate-limit state is persisted in SQLite,
Postgres, or Redis.

In `@docs/content/docs/python/guides/reliability/retries.mdx`:
- Around line 152-164: Update the retry example to wait for task completion by
calling job.result() and catching its final exception before iterating over
job.errors; retain the existing attempt-printing logic and clarify that errors
are read only after completion.

In `@docs/content/docs/python/guides/resources/testing.mdx`:
- Around line 12-14: Qualify the parallel-safety statement for test_mode():
explain that parallel use is safe only when tests use separate Queue instances,
since overlapping contexts sharing a queue can interfere through queue-level
state and enqueue patching. Update the surrounding documentation accordingly.

In `@docs/content/docs/python/more/examples/workflows.mdx`:
- Around line 64-65: The example defines accuracy_gate but does not use it,
leaving deploy behind a manual review gate instead of evaluate’s passed result.
Update the workflow construction to register accuracy_gate through
wf.gate("review", ...) and ensure deploy depends on that gate, removing the
manual gate configuration while preserving the ctx.results-based evaluation
flow.

In `@docs/content/docs/resources/comparison.mdx`:
- Line 142: Update the GIL row in the comparison table to clarify that Rust
avoids GIL contention only during scheduling and dispatch, while worker threads
still acquire the GIL when executing Python task code; revise the Rust-side
wording accordingly without changing the Python-side comparison.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

Comment thread docs/app/components/mermaid.tsx
Comment thread docs/content/docs/java/guides/operations/backends.mdx Outdated
Comment thread docs/content/docs/node/guides/operations/migration.mdx Outdated
Comment thread docs/content/docs/node/guides/operations/security.mdx Outdated
Comment thread docs/content/docs/node/guides/reliability/guarantees.mdx Outdated
Comment thread docs/content/docs/python/getting-started/concepts.mdx Outdated
Comment thread docs/content/docs/python/guides/reliability/guarantees.mdx Outdated
Comment thread docs/content/docs/python/guides/resources/dependency-injection.mdx
Comment thread docs/content/docs/python/guides/resources/dependency-injection.mdx Outdated
Comment thread docs/content/docs/python/guides/resources/proxies.mdx

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

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
docs/content/docs/python/guides/resources/dependency-injection.mdx (1)

212-219: 🩺 Stability & Availability | 🟠 Major | ⚡ Quick win

Health-check example still creates an engine with no disposal path.

create_db() here returns sessionmaker(create_engine(...)) with no teardown parameter, unlike the "Teardown" section above it. This is exactly the pattern the earlier review flagged ("Also applies to: 209-216") — and it's arguably more important here, since max_recreation_attempts implies this factory can be invoked multiple times to recreate the resource after health-check failures. Without a teardown, each recreation leaks the previous engine's connection pool. Add the same teardown=lambda db: db.kw["bind"].dispose() wiring used in the Teardown section (or the engine-reference alternative suggested above) so copy-pasting this example doesn't leak connections.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/content/docs/python/guides/resources/dependency-injection.mdx` around
lines 212 - 219, Add a teardown handler to the create_db resource example,
passing teardown=lambda db: db.kw["bind"].dispose() to queue.worker_resource so
each recreated sessionmaker disposes its bound engine; keep the existing
health-check and recreation settings unchanged.
🧹 Nitpick comments (1)
docs/content/docs/python/guides/resources/dependency-injection.mdx (1)

172-173: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win

Avoid sessionmaker.kw["bind"] in the teardown example
kw is an internal implementation detail, so keep the engine reference explicit and dispose that instead.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/content/docs/python/guides/resources/dependency-injection.mdx` around
lines 172 - 173, Update the dependency-injection teardown example to avoid
accessing the sessionmaker’s internal db.kw["bind"] in the teardown lambda. Keep
the engine reference explicit when configuring the resource and use that
reference in the teardown callback to call dispose().
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@docs/app/components/mermaid.tsx`:
- Around line 17-19: Focus restoration in the zoom overlay uses
triggerRef.current after it has been cleared, so closing cannot restore focus.
Update the zoom/open click handler to capture the triggering button element
before setting zoomed, store it in a stable ref, and have the zoomed effect
cleanup focus that saved element instead of relying on triggerRef.current.

---

Outside diff comments:
In `@docs/content/docs/python/guides/resources/dependency-injection.mdx`:
- Around line 212-219: Add a teardown handler to the create_db resource example,
passing teardown=lambda db: db.kw["bind"].dispose() to queue.worker_resource so
each recreated sessionmaker disposes its bound engine; keep the existing
health-check and recreation settings unchanged.

---

Nitpick comments:
In `@docs/content/docs/python/guides/resources/dependency-injection.mdx`:
- Around line 172-173: Update the dependency-injection teardown example to avoid
accessing the sessionmaker’s internal db.kw["bind"] in the teardown lambda. Keep
the engine reference explicit when configuring the resource and use that
reference in the teardown callback to call dispose().
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 62e147a0-62d9-49f5-8cf1-edb31383d76f

📥 Commits

Reviewing files that changed from the base of the PR and between 70af692 and bc63104.

📒 Files selected for processing (10)
  • docs/app/components/mermaid.tsx
  • docs/content/docs/java/guides/operations/backends.mdx
  • docs/content/docs/node/guides/operations/migration.mdx
  • docs/content/docs/node/guides/operations/security.mdx
  • docs/content/docs/node/guides/reliability/guarantees.mdx
  • docs/content/docs/python/api-reference/saga.mdx
  • docs/content/docs/python/getting-started/concepts.mdx
  • docs/content/docs/python/guides/reliability/guarantees.mdx
  • docs/content/docs/python/guides/resources/dependency-injection.mdx
  • docs/content/docs/python/guides/resources/proxies.mdx
✅ Files skipped from review due to trivial changes (6)
  • docs/content/docs/java/guides/operations/backends.mdx
  • docs/content/docs/node/guides/operations/migration.mdx
  • docs/content/docs/python/api-reference/saga.mdx
  • docs/content/docs/node/guides/operations/security.mdx
  • docs/content/docs/python/guides/reliability/guarantees.mdx
  • docs/content/docs/python/getting-started/concepts.mdx
🚧 Files skipped from review as they are similar to previous changes (2)
  • docs/content/docs/python/guides/resources/proxies.mdx
  • docs/content/docs/node/guides/reliability/guarantees.mdx

Comment thread docs/app/components/mermaid.tsx
@pratyush618
pratyush618 merged commit 013a1ab into master Jul 10, 2026
14 checks passed
@pratyush618
pratyush618 deleted the docs/content-audit-remediation branch July 10, 2026 11:05
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant