Skip to content

feat(todos): expose board lifecycle for host integrations - #80

Merged
senamakel merged 3 commits into
tinyhumansai:mainfrom
senamakel:refactor/todos-board-lifecycle
Jul 28, 2026
Merged

feat(todos): expose board lifecycle for host integrations#80
senamakel merged 3 commits into
tinyhumansai:mainfrom
senamakel:refactor/todos-board-lifecycle

Conversation

@senamakel

Copy link
Copy Markdown
Member

Summary

Expose the raw task-board lifecycle needed by host applications and add a non-destructive legacy import primitive.

API Or Behavior Changes

  • Add graph::todos::store::get to preserve absent-vs-empty board semantics.
  • Add graph::todos::store::delete for removing a board value outright.
  • Add graph::todos::store::import_if_absent for atomic, non-destructive legacy migration.

Tests

  • cargo fmt --check
  • N/A: full clippy is covered by CI; focused change was validated with the todo store suite.
  • N/A: all-features clippy is covered by CI; no feature-gated code changed.
  • N/A: full build is covered by CI; focused test build completed locally.
  • N/A: all-features build is covered by CI; no feature-gated code changed.
  • cargo test graph::todos::test::store_tests --lib (11 passed)
  • N/A: all-features test is covered by CI; no feature-gated code changed.

Documentation

Public functions include rustdoc; no separate guide changes are needed.

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

senamakel has reached the 50-credit limit for trial accounts. To continue receiving code reviews, upgrade your plan.

@coderabbitai

coderabbitai Bot commented Jul 28, 2026

Copy link
Copy Markdown

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: 52 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: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 5d4f1e54-0de4-4a7c-98dc-f06343bffc32

📥 Commits

Reviewing files that changed from the base of the PR and between 29769ad and fa96e31.

📒 Files selected for processing (2)
  • src/graph/todos/store.rs
  • src/graph/todos/test.rs

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

@chatgpt-codex-connector chatgpt-codex-connector 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.

💡 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".

Comment thread src/graph/todos/store.rs
Comment on lines +83 to +85
let existed = store.get(TODOS_NAMESPACE, &board_key).await?.is_some();
if existed {
store.delete(TODOS_NAMESPACE, &board_key).await?;

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge 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 👍 / 👎.

Comment thread src/graph/todos/store.rs
/// 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> {

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge 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 👍 / 👎.

@senamakel
senamakel merged commit ff76d76 into tinyhumansai:main Jul 28, 2026
2 checks passed
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