---
name: "maison-quality"
description: "Measure answer quality: run and read golden-FAQ test runs and chat test runs for a hotel, list the golden questions and chat tests, and (Maison staff) work the Guest Agent quality review queue (`chat-feedback`) — list items, run the classifier, resolve, dismiss or reopen. Use after knowledge changes to prove nothing regressed, or to triage conversations the classifier flagged as poor. Tools: dismiss_chat_feedback, get_test_report, list_chat_feedback, list_chat_tests, list_golden_questions, list_test_runs, reopen_chat_feedback, resolve_chat_feedback, run_chat_feedback, run_chat_tests, run_golden_faq_test."
license: "Proprietary. Use with a Maison API key under the Maison terms of service."
metadata:
  author: "maison-labs"
  version: "1.0.0"
  category: "quality"
  api-base: "https://maison-labs.com"
  openapi: "https://maison-labs.com/api/v1/openapi.json"
  docs: "https://docs.maison-labs.com/skills/maison-quality/"
---

# Maison — Quality: tests and Guest Agent quality review

Measure answer quality: run and read golden-FAQ test runs and chat test runs for a hotel, list the golden questions and chat tests, and (Maison staff) work the Guest Agent quality review queue (`chat-feedback`) — list items, run the classifier, resolve, dismiss or reopen. Use after knowledge changes to prove nothing regressed, or to triage conversations the classifier flagged as poor.

Part of the Maison public API. Read the `maison-public-api` skill first for authentication, discovery and transport details (`https://docs.maison-labs.com/skills/maison-public-api/SKILL.md`).

## When to use

- Regression-test a hotel after content changes — `run_golden_faq_test`, then `get_test_report`.
- Triage flagged conversations — `list_chat_feedback` with `status: "OPEN"`.

## Before you start

1. Send `x-api-key: <key>` on every call; the key only reaches `/api/v1`.
2. `GET /api/v1/tools` (or MCP `tools/list`) returns the tools THIS key may run — if a tool below is missing there, you lack a grant; do not retry it.
3. Client-scoped tools take `clientId` (a hotel id). `whoami` lists the ids you can act on.

## Tools

| Tool | What it does | REST | Needs |
| --- | --- | --- | --- |
| `dismiss_chat_feedback` | Flip an OPEN Guest Agent quality review item to DISMISSED, recording an optional note. | `POST /api/v1/chatfeedback/{feedbackId}/dismiss` | chat-feedback WRITE (global) |
| `get_test_report` | Retrieve the full per-question results for a test session: test id, client id, status (SUCCESS / FAIL / ERROR / QUEUED / IN_PROGRESS) and the raw report data. | `GET /api/v1/client/{clientId}/testrun/{sessionId}` | test-session READ (client); plan: `test-session`; read-only |
| `list_chat_feedback` | Page through the Maison-global Guest Agent quality review queue (feature `chat-feedback`). | `GET /api/v1/chatfeedback` | chat-feedback READ (global); read-only |
| `list_chat_tests` | Return all authored chat-test cases for a hotel. | `GET /api/v1/client/{clientId}/chattests` | test-session READ (client); plan: `test-session`; read-only |
| `list_golden_questions` | Return all golden test questions for a hotel with their recent pass/fail history. | `GET /api/v1/client/{clientId}/goldenfaq` | test-session READ (client); plan: `test-session`; read-only |
| `list_test_runs` | Page through test session runs for a hotel ordered newest first. | `GET /api/v1/client/{clientId}/testruns` | test-session READ (client); plan: `test-session`; read-only |
| `reopen_chat_feedback` | Flip a RESOLVED or DISMISSED Guest Agent quality review item back to OPEN. | `POST /api/v1/chatfeedback/{feedbackId}/reopen` | chat-feedback WRITE (global) |
| `resolve_chat_feedback` | Flip an OPEN Guest Agent quality review item to RESOLVED, recording an optional note. | `POST /api/v1/chatfeedback/{feedbackId}/resolve` | chat-feedback WRITE (global) |
| `run_chat_feedback` | Trigger an asynchronous Guest Agent quality review scoring run. | `POST /api/v1/chatfeedback/run` | chat-feedback EXECUTE (global) |
| `run_chat_tests` | Enqueue an ad-hoc test session from a set of test cases and client ids. | `POST /api/v1/client/{clientId}/testrun` | test-session EXECUTE (client); plan: `test-session` |
| `run_golden_faq_test` | Enqueue a golden FAQ test run for a hotel. | `POST /api/v1/client/{clientId}/testrun/goldenfaq` | test-session EXECUTE (client); plan: `test-session` |

Full input fields for every tool: [references/tools.md](references/tools.md).

## Recommended workflows

### Golden FAQ run

1. `list_golden_questions` (optional, to pick `questionIds`).
2. `run_golden_faq_test` (202) → returns the session id.
3. Poll `list_test_runs`; when complete, `get_test_report` for per-question scores.

## Tips

- Test tools need the hotel's plan to include `test-session` and the caller's `test-session` grant.

## Pitfalls

- Guest Agent quality review tools are Maison-wide (`chat-feedback` global grant) — they are not per-hotel permissions.
- A 409 on a status change means the item is already in that state.

## Calling conventions

Same tool, three transports — pick whichever your runtime already speaks. Always send `x-api-key`.

```bash
# REST
curl -X POST "https://maison-labs.com/api/v1/chatfeedback/<feedbackId>/dismiss" -H "x-api-key: $MAISON_API_KEY" -H "content-type: application/json" -d '{}'
```

```json
// MCP (https://maison-labs.com/mcp, Streamable HTTP): tools/call
{ "jsonrpc": "2.0", "id": 1, "method": "tools/call", "params": { "name": "dismiss_chat_feedback", "arguments": {} } }
```

```json
// A2A (https://maison-labs.com/a2a): tasks/send with a data part
{ "jsonrpc": "2.0", "id": 1, "method": "tasks/send", "params": { "message": { "role": "user", "parts": [{ "type": "data", "data": { "tool": "dismiss_chat_feedback", "input": {} } }] } } }
```

Errors are the same everywhere: `401` no/invalid key; `403 forbidden` with `details.missing` (the grants you lack — fall back to the composite's parts or stop); `403 not_entitled` (the hotel's plan lacks the feature); `404`, `409`, `413 too_large`, `503`. Inputs that fail validation return `400 invalid_input` with the Zod issues — fix and retry once.
