{"success":true,"data":{"note":"Each step is independently testable. Prefer AUTH_ADAPTER=mock + CATALOG_ADAPTER=yaml + LLM_ADAPTER=mock + QUERY_ADAPTER=mock for offline.","steps":[{"id":"auth","status":"ready","summary":"Login / validate bearer — restaurant scope = subject.principalId","endpoints":[{"method":"POST","path":"/api/auth/login"},{"method":"GET","path":"/api/auth/me"}],"mock":"AUTH_ADAPTER=mock — any email/password; token mock.<restaurantId>"},{"id":"catalog","status":"ready","summary":"Load diagnostic playbooks + shared recommendations from diagnostics/*.yaml","endpoints":[{"method":"GET","path":"/api/catalog/playbooks"},{"method":"GET","path":"/api/catalog/playbooks/{id}"},{"method":"GET","path":"/api/catalog/recommendations/{recId}"}],"mock":"CATALOG_ADAPTER=yaml"},{"id":"classify","status":"ready","summary":"Map owner problem text → 1–2 playbook ids","endpoints":[{"method":"POST","path":"/api/classify"}],"mock":"LLM_ADAPTER=mock"},{"id":"query","status":"ready","summary":"Ask restaurant data via QueryCraft NLP or mock","endpoints":[{"method":"POST","path":"/api/query/ask"}],"mock":"QUERY_ADAPTER=mock"},{"id":"agent","status":"ready","summary":"Investigate tool loop (query_data, ask_manager, update_hypothesis, select_playbook, conclude_diagnosis)","endpoints":[],"mock":"Runs inside advisor sessions; LLM_ADAPTER=mock scripts a short conclude path","tweak":["src/application/agent/block-a.ts","src/application/agent/tools.ts","src/application/agent/constants.ts","diagnostics/playbooks/*.yaml"]},{"id":"advisor_sessions","status":"ready","summary":"Start / resume / get diagnosis sessions","endpoints":[{"method":"POST","path":"/api/advisor/sessions"},{"method":"GET","path":"/api/advisor/sessions/{id}"},{"method":"POST","path":"/api/advisor/sessions/{id}/answers"}],"mock":"Full offline path with mock auth/llm/query + yaml catalog"}]}}