The Hub forwards `person` equal to the asker (`PersonOrDefault`), so the spoken
question "what does Harry have on today at school?" arrives with person "sam"
and returned "no data for that person" (found by the Hub agent on AUD-116).
resolveChild now falls back to the question text when the requested person is
not one of this project's children: whole-word, case-insensitive match against
the child names this service already publishes in /capabilities. An explicit
person still wins, two named children still return answer:null, and the
permission check still runs on the resolved child. No model, no free text.
Live end-to-end through the Hub, with no person field:
POST http://192.168.20.13:8788/ask
{"text":"what does Harry have on today at school?","asker":"sam","source":"console"}
200
{"status":"ok",
"answer":"Harry has 8 school events today from 8:55am to 6:00pm and 6 overdue tasks.",
"route":{"kind":"project","project":"compass_nhs"}}
Image 0.6.1-phase8; docs/phase-8-hub-notes.md records the fallback and the
end-to-end transcript.
Co-Authored-By: Paperclip <noreply@paperclip.ing>