AGENTS BUILT INTO THE WORKFLOW
Built-in AI agents pick up work when needed, so you rely less on expensive Claude usage.


First, Claude and Cursor made every developer faster. Now, Trundle does it for entire engineering teams.
No card required · Simple signup · No gotchas


First, Claude and Cursor made every developer faster. Now, Trundle does it for entire engineering teams.
No card required · Simple signup · No gotchas
First, Claude and Cursor made every developer faster. Now, Trundle does it for entire engineering teams.
No card required · Simple signup · No gotchas


Built-in AI agents pick up work when needed, so you rely less on expensive Claude usage.


Connect Slack, GitHub and the tools your team already uses.


Easy to set up and flexible enough to fit your team.
Mention Trundle in any thread and the ticket writes itself into the backlog, with the conversation attached as context.
session_refresh_spec — the one that asserts the token rotates before the old one expires.Time.now directly instead of the injected clock, so under load the two drift apart and the assertion lands on the wrong side of the boundary.

Auth, CI and the things nobody owns.
7 tickets · Last updated 14 minutes ago
Drop Node 18 from the CI matrix now that 22 is the default
Settings page takes ~4s to first paint for orgs over 500 seats
Add a health endpoint the load balancer can actually read
Bulk import silently skips rows with a trailing comma
Replace the deprecated crypto.createCipher calls before the Node bump
Search returns archived projects when the filter is left empty
Split the 900-line UserService into something reviewable
Attach what the team already wrote and every ticket in the project is written against it, so the agents build from your rules rather than their guesses.
Components, tokens and the front end that uses them.
Attaching uploaded documents to projects and tickets means agents are held to your expected implementation, brand, coding standards, design or roadmap.
Replace the legacy button across Settings
Focus states on every form input
Fix contrast on the muted text token
and 9 more tickets in Design system — every agent that picks one up reads these files.
Dev, review and QA are three separate agents, and the board shows every handover between them. Your team stays in the loop and keeps the final say on what merges.
Saved cards live, and main green again.
Rewrite the pricing page copy for the new tiers
Show saved cards in the account area
Import Jira epics as projects
Cache repo setup between dev runs
Stop retrying a Stripe webhook after the fourth failure
Trim stale branches after a pull request merges
Fix the crash on tablet rotation
Rate-limit the public search endpoint
Let customers save a card at checkout
Deep links into a single ticket
Board filters remember your last view
Onboarding checklist for new workspaces
A/B test subject lines from the campaign editor
Trundle keeps dev, review and QA recaps on the ticket, so decisions, progress and next steps are easier to find.
For the record: the 500 in staging was a stale env var, not this change.
Didn’t add the success metric, it’s blocked on the analytics pipeline accepting custom counters.
Only exercised GBP and USD. EUR takes a different rounding path, someone needs to check it.
Flag is billing.reconcile_v2, defaulted off. Ops flip it after the backfill, not before.
Leaving the legacy status column in place, the finance export still reads it.
Skipped the down migration — invoice_events is ~40M rows and the rollback would lock it for minutes.
We tried a queued job first. The follow-up webhook can land before the job runs, so it’s synchronous now.
Shared cache gets evicted every ~5 min in prod, so reconciliation state went into Redis with its own TTL.
Retry count is 3 on purpose, it matches Stripe’s idempotency window. Please don’t lower it.
Deliberately not touching BillingService in here. That refactor is PROJ-501, keep them apart.
Going with optimistic locking on invoices rather than a row lock — we can’t hold a lock across the Stripe call.
What we did
Added a reconciliation path that claims an invoice with an optimistic version check, calls Stripe, then commits the outcome. Run state lives in Redis under its own TTL, so a shared-cache eviction can’t drop a run mid-flight. The whole path sits behind billing.reconcile_v2, defaulted off.
Changes
app/Billing/InvoiceReconciler.phpNew service. Claims an invoice with a version check, calls Stripe, writes the outcome back in a single transaction.app/Repositories/InvoiceRepository.phpAdded claimForReconciliation() — the only place the version check is issued.database/migrations/2026_07_14_101122_add_version_to_invoices.phpAdds invoices.version. No down migration: invoice_events is ~40M rows and the rollback would lock it.config/billing.phpRegisters the billing.reconcile_v2 flag, off by default.Considerations
Implications
Not done
Benefits

Your repository is cloned into an isolated environment for the length of a job, then destroyed when the job ends. Nothing persists on Trundle's servers, nothing is used to train models, and no one on our team can read it. Every change lands on a feature branch in your repository, where your team decides what merges.
Can someone write this up somewhere? I’ve lost the thread on why we’re not using the queue.