Inspiration
The evidence that wins a deposit dispute usually exists. Renters take photos when they move in. But when the deduction letter arrives, those photos are a few among thousands in a phone backup, the reply is due in days, and nobody wants to scroll three years of pictures for the one of the oven. A UGREEN NAS already holds the phone backup, the scanned letter and an assistant that can look at photos, so we built the Skill that does the scrolling, and leaves the judgement to the renter.
How we built it
- The Skill. A Markdown
SKILL.mdwith three reference files (the 13 spot labels, the report format, a user guide), written against UGREEN's capability catalog and checked with the official checker from the Skill Creation Tool 0.7.3: static-pass, 0 errors, 0 warnings. - An emulator, because we had no NAS yet. A Node.js program runs the real
SKILL.mdthe way the assistant is described: a main agent that can only delegate, and expert agents whose tools are named after the catalog actions, working on a sandboxed copy of a staged demo apartment. Every write passes an approval gate, and every run is saved as a trace. - A staged demo apartment. Free-licence stock photos (Wikimedia Commons), "move-out" re-shots made from the same photos, a carpet stain present at move-in, nail holes added at move-out, no move-in photo of the bathroom, one blurry photo, two unrelated photos outside the date windows, assigned camera dates, and a fictional deduction letter for £420.
- Five scenarios and automated checks. The letter; gap mode before moving out; an empty move-in window; a declined approval; a request with no dates. After every run a checker confirms that nothing was written before approval, every date shown equals the photo's capture date, no photo or path was invented, no pair mixes two spots, unclear photos are never paired, nothing was moved, the album and copies hold exactly the approved photos, and the vision model was used only to label photos from the date windows.
- A replay page that plays the saved runs step by step, with no model calls: move-out-proof.vercel.app.
Challenges we ran into
- The checker is stricter than the template. The kit's own template headings don't match what the official checker looks for (it wants
# Generation-time capability evidence, lines in the form`ug-photo` → `photo-agent`, and# Workflow), and aREADME.mdat the package root is rejected. We followed the checker. - Our runs kept finding real problems in our own Skill, and we fixed each one:
- A wide kitchen shot was labelled as the counter, with the oven also in frame. The vision step now reports the main spot plus the other spots in frame, and falls back to a wider shot when a spot has no close-up.
- Instruction text leaked into the saved report. The report now sits between BEGIN and END markers.
- The assistant asked the renter to confirm the search windows, an extra round trip. It now states them and carries on.
- An expert kept searching after an empty move-in window. The Skill now searches that window first and stops.
- A file expert asked only to create the evidence folder tried to move the letter into it. That step now says to create only the folder, and a check fails any run that writes something the renter did not approve.
- An album left out the one approved photo without a pair. The album step now names that case, and a check compares the album with the approved list.
- A photo expert re-ran the vision model on every photo while building the album. The album step now gets the ordered list and runs no vision.
- An expert re-searched the whole library while labelling. The labelling step now gets the explicit list from the search steps.
- Free-tier model limits. The emulator runs on Gemini free-tier models, about 20 requests a day per model, so it falls back between models and caches identical requests.
Accomplishments that we're proud of
- The package passes UGREEN's official checker with zero errors and zero warnings.
- All five scenarios pass every automated check: 66 of 66.
- The letter scenario runs end to end in 37 model calls, about 2.5 minutes. It finds 4 move-in and 6 move-out photos and ignores the two outside the windows. It extracts all four charges and shows the carpet stain in both photos and the wall holes only in the move-out photo. It reports the bathroom charge as "No dated move-in photo of this spot", lists the blurry photo as unclear, and creates the album, folder, copies and report only after approval.
- Spot labels: 11 of 12 on the first pass, then 12 of 12 after the fix above, with no photo placed on a wrong spot (Gemini 3.5 Flash-Lite, 12 live calls; measured on the same 12 photos used to tune the prompt).
What we learned
- Hand experts explicit lists, not references to earlier steps. Most of the problems above came from an expert interpreting "the photos from the search step" on its own. Lists and "do only this" instructions fixed them.
- Keep the model to looking. Dates from metadata, pairing by a fixed rule, and judgement by the renter made the output checkable.
- Checks beat re-runs. Small models vary from run to run. We fixed the Skill whenever a check failed, rather than re-running until it passed.
What's next for Move-out Proof
- The finalist session, if selected. In the first hour: real apartment photos and a real letter, a check that
search-picturefilters by capture time, and a check thatextractreads a scanned letter. Those are the assumptions most likely to be proved wrong first, and the Skill already has a fallback for the second. Then the natural phrase "My landlord is taking £420 off my deposit…" end to end, the failure cases, and a recording on the NAS screen. - Beyond deposits. The same flow fits a rental car's pickup and return photos and a holiday let's guest-damage claim.
Limits, stated plainly
The Skill needs photos with correct capture dates and finds only what was photographed. The emulator is ours, built from UGREEN's public catalog: it rehearses the flow but does not prove device behaviour. The demo apartment is staged, and the twelve-photo label test is small. Vision notes can be wrong, which is why every row shows both photos for the renter to judge.
Built With
- exifr
- gemini-api
- javascript
- markdown
- node.js
- pillow
- preact
- python
- typescript
- ugreen-skill-creation-tool
- ugreen-ugos
- vercel
- vite