feat(todos): expose board lifecycle for host integrations - #80
Conversation
There was a problem hiding this comment.
senamakel has reached the 50-credit limit for trial accounts. To continue receiving code reviews, upgrade your plan.
|
Warning Review limit reachedYou’ve reached a temporary PR review limit under our Fair Usage Limits Policy. Next review available in: 52 minutes Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available. How can I continue?After more reviews become available, a review can be triggered using the 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 configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (2)
Comment |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: fa96e3138a
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| let existed = store.get(TODOS_NAMESPACE, &board_key).await?.is_some(); | ||
| if existed { | ||
| store.delete(TODOS_NAMESPACE, &board_key).await?; |
There was a problem hiding this comment.
Take the thread lock before deleting the board
When delete overlaps a locked read-modify-write operation—for example, after edit loads the cards but before it saves—this unguarded deletion can complete and return true, after which the mutator writes its stale board back and resurrects the deleted cards. Acquire the same thread_lock around the existence check and deletion so lifecycle deletion is serialized with all board mutations.
Useful? React with 👍 / 👎.
| /// The existence check and write share the normal per-thread lock. Existing | ||
| /// values are left untouched even when they use a newer or undecodable schema, | ||
| /// which makes this suitable for one-time legacy migrations. | ||
| pub async fn import_if_absent(store: &Arc<dyn Store>, board: TaskBoard) -> Result<bool> { |
There was a problem hiding this comment.
Update the task-board lifecycle documentation
The new get, delete, and import_if_absent APIs are absent from both src/graph/todos/README.md and docs/modules/graph/todos.md; those documents still claim every mutation follows the normalizing load → mutate → normalise → put path, which is explicitly untrue for these raw lifecycle operations. Update both module documents so host integrators can discover the APIs and understand their persistence semantics.
AGENTS.md reference: AGENTS.md:L73-L75
Useful? React with 👍 / 👎.
Summary
Expose the raw task-board lifecycle needed by host applications and add a non-destructive legacy import primitive.
API Or Behavior Changes
graph::todos::store::getto preserve absent-vs-empty board semantics.graph::todos::store::deletefor removing a board value outright.graph::todos::store::import_if_absentfor atomic, non-destructive legacy migration.Tests
cargo fmt --checkcargo test graph::todos::test::store_tests --lib(11 passed)Documentation
Public functions include rustdoc; no separate guide changes are needed.