find-object
Hand-authored decision procedure (SOP). Unlike the generated
SKILL.mddiscovery view, this file is the content the S2 Reasoner reads and follows. It is injected into the reasoner's system prompt when this playbook is installed. Therskill.yamlplaybook.body_uripoints here.
Trigger
The goal names a physical object (e.g. "bring the water bottle", "where is my mug?") whose pose is not given in the request and is not in current view.
Preconditions
- A spatial-memory backend is available (
recall_object/resolve_placetools). - The robot has a mobile base (to reach candidate places) and a gripper (to open
occluding containers). These are declared in
capabilities_required.
Steps
- Recall. Call
recall_object(target). If astatus:currentpose is returned, skip to Verify. - Memory prior. On a miss, call
memory_search(target)over theMEMORY.mdObject-Location Log for the last-seen (possiblystale) location. Use it as the top search prior — a stale sighting still beats a blind sweep. - Rank candidates. Build a ranked candidate list from (a) the scene-graph regions/places and (b) commonsense priors ("a water bottle is usually in the kitchen, then the fridge"). Containers whose contents are occluded come first.
- Search loop (bounded by
playbook.max_steps). For each candidate in rank order:resolve_place(candidate)→execute_rskill(NAVIGATE, goal=place).- If the candidate is an occluding container,
execute_rskill(OPEN, target=container). locate_in_view(target). Stop on a hit.
Verify (done predicate)
locate_in_view confirms the target in view at a known pose. On success,
record it: memory_write(op=supersede, section="object_locations", target=<object>, content=<place>) so the next task recalls it directly.
Fallbacks
- Budget (
max_steps) exhausted with no hit →emit_promptto the operator ("I can't find the water bottle — where should I look?"). This is the terminal human-handoff rung of the replanning ladder. - Never loop past
max_steps. Every candidate tried and its outcome are on the OTel trace, so the search is replayable.
Safety
This playbook only decides and sequences. Every motion it triggers is an
execute_rskill → Action chunk that still crosses the C++ safety kernel; a wrong
recall yields a bad plan the kernel still vetoes, never a relaxed check
(CLAUDE.md §1.1).