save_task / object::update return Result<bool> ("did it write")
object::update was already idempotent — it short-circuits when the
proposed tree equals the current tip's. Surfacing that fact through
the return type lets migrate_property_encoding drop its before/after
ref-OID dance:
let head_before = repo.find_reference(...).target();
self.save_task(&task)?;
let head_after = repo.find_reference(...).target();
if head_before != head_after { rewritten += 1; }
becomes
if self.save_task(&task)? { rewritten += 1; }
The three property-mutation methods (add/set/unset_property) want
unit results, so they now `?;` the bool and return `Ok(())`. Tests
that called `ws.save_task(...).unwrap();` keep compiling unchanged
(the returned bool is discarded as a statement).
Net −4 src lines; 98 tests still green.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>