See what changed, and why
Aura grafts onto the Git you already use and reads changes at the logic level: not just the red and green lines, but the meaning underneath them, with the reason an agent made each change captured on every commit.
- ~Retry With BackoffchangedWhy: Each retry now sleeps for the delay compute_delay returns instead of a flat 500 ms, and takes the operation by FnMut so callers can retry stateful closures.retry_with_backofffn
- −Sleep FixedremovedWhy: Removed: the constant half-second sleep is replaced by the exponential compute_delay path.sleep_fixedfn
- ~Retry With BackoffchangedWhy: Each retry now sleeps for the delay compute_delay returns instead of a flat 500 ms, and takes the operation by FnMut so callers can retry stateful closures.retry_with_backofffnpub fn retry_with_backoff<T, E>(max_attempts: u32, mut op: impl FnMut() -> Result<T, E>) -> Result<T, E>
- +Compute DelayaddedWhy: New helper that grows the backoff window: starts at 100 ms and doubles after every failed attempt.compute_delayfnfn compute_delay(attempt: u32) -> Duration
| @@ -1,20 +1,21 @@ | |||
| 1 | use std::thread; | 1 | use std::thread; |
| 2 | use std::time::Duration; | 2 | use std::time::Duration; |
| 3 | 3 | ||
| 4 | -const FIXED_DELAY_MS: u64 = 500; | 4 | +const BASE_DELAY_MS: u64 = 100; |
| 5 | 5 | ||
| 6 | /// Retry `op` until it succeeds or `max_attempts` is reached. | 6 | /// Retry `op` until it succeeds or `max_attempts` is reached. |
| 7 | -pub fn retry_with_backoff<T, E>(max_attempts: u32, op: impl Fn() -> Result<T, E>) -> Result<T, E> { | 7 | +pub fn retry_with_backoff<T, E>(max_attempts: u32, mut op: impl FnMut() -> Result<T, E>) -> Result<T, E> { |
| 8 | let mut attempt = 0; | 8 | let mut attempt = 0; |
| 9 | loop { | 9 | loop { |
| 10 | match op() { | 10 | match op() { |
| 11 | Ok(value) => return Ok(value), | 11 | Ok(value) => return Ok(value), |
| 12 | Err(err) => { | 12 | Err(err) => { |
| 13 | attempt += 1; | 13 | attempt += 1; |
| 14 | if attempt >= max_attempts { | 14 | if attempt >= max_attempts { |
| 15 | return Err(err); | 15 | return Err(err); |
| 16 | } | 16 | } |
| 17 | - sleep_fixed(); | 17 | + thread::sleep(compute_delay(attempt)); |
| 18 | } | 18 | } |
| 19 | } | 19 | } |
| 20 | } | 20 | } |
| 21 | } | 21 | } |
| @@ -23,8 +24,10 @@ pub fn retry_with_backoff<T, E>(max_attempts: u32, op: impl Fn() -> Result<T, E>) | |||
| 23 | } | 24 | } |
| 24 | } | 25 | } |
| 25 | 26 | ||
| 26 | -/// Sleep a constant amount between attempts. | 27 | +/// Exponential backoff: the wait doubles after every failed attempt. |
| 27 | -fn sleep_fixed() { | 28 | +fn compute_delay(attempt: u32) -> Duration { |
| 28 | - thread::sleep(Duration::from_millis(FIXED_DELAY_MS)); | 29 | + let factor = 1u64 << (attempt - 1); |
| 30 | + Duration::from_millis(BASE_DELAY_MS * factor) | ||
| 31 | +} | ||
Meaning, not red-and-green
Hover any function to read what it does in plain language, and watch that meaning when an agent touches it, so a quiet behavioral change can never sneak through.
Why & how · A flat delay ignores how overloaded the other side is. Exponential backoff is the standard way to behave under rate limits, and the cap keeps the wait from growing without bound.
- ~Retry With BackoffchangedThis function was reworked.Why: Each retry now sleeps for an exponential delay instead of a flat 500 ms, and takes the operation by FnMut so callers can retry stateful closures.retry_with_backofffn
- −Sleep FixedremovedThis function was removed.Why: Removed: the constant half-second sleep is replaced by the exponential compute_delay path.sleep_fixedfn
- ~Retry With BackoffchangedThis function was reworked.Why: Each retry now sleeps for an exponential delay instead of a flat 500 ms, and takes the operation by FnMut so callers can retry stateful closures.retry_with_backofffn
- +Compute DelayaddedA new function.Why: New helper that computes the backoff window: base 100 ms doubled per attempt, capped at 30 s so the wait can never run away.compute_delayfn
A reason on every commit
Each commit carries the intent behind it, checked against what actually changed. If the words and the code disagree, Aura flags it before it lands.
Make network retries back off exponentially instead of pausing a flat 500 ms every time: cap the wait at 30 s so a rate-limited service gets progressively more room to recover.
The AI changed 3 things across 1 file.
Worth a look: 1 deletion. Nothing else here looks risky.
Asked
Make network retries back off exponentially instead of pausing a flat 500 ms every time: cap the wait at 30 s so a rate-limited service gets
Saidwhat the agent logged
Make network retries back off exponentially instead of pausing a flat 500 ms every time: cap the wait at 30 s so a rate-limited service gets progressively more room to recover.
What changed
3 changes·1 fileReplaced by the exponential compute_delay path.
Each retry now waits the delay compute_delay returns instead of a flat 500 ms, and takes the op by FnMut so stateful closures can be retried.
New helper: starts at 100 ms and doubles after every failed attempt.
Time machine puts one part of this change back the way it was, just that part, nothing else. Aura keeps a copy of every file from before the AI touched it, so you can always undo.
Pull requests with a purpose
Open a PR with an automated safety check, a test plan, and review comments anchored to the logic, not to line numbers that drift on the next edit.
Add task priorities to the app
Every task now carries a priority (low, medium or high) so the most important work floats to the top of the board.
Older tasks default to medium, so nothing is left blank and the highest priorities are obvious at a glance.
- PPriya29d ago
Love this: the little colour tag makes priority obvious at a glance.
- MMo28d ago
One thought: can we default older tasks to medium, so nothing looks urgent by mistake?
- src/model/task.rs+24−2
- src/board/sort.rs+18−5
- src/ui/PriorityBadge.tsx+41
Ship with proof, not hope
Free public beta for macOS and Linux. Point it at a repo and drive every agent you already use.