# Fitness Questionnaire
> Client intake questionnaire for fitness coaching, split into sections.
# Fitness Questionnaire
A client intake questionnaire, long enough that it needs to be broken up. Each
section lives on its own page so it can be reviewed, edited and handed around
independently.
!!! info "What this site is"
This is the **source of truth for the questions** — their wording, their
answer types, their ordering and the logic between them. It is a static
site, so it does not collect answers.
The pages here are what the voice subagents are handed at call time, so a
reworded question is asked in its new wording on the next call. See
[The agentic flow](project/how-it-works.md).
## Sections
| # | Section | What it covers | Filled by |
|---|---------|----------------|-----------|
| 1 | [About you](sections/01-about-you.md) | Identity, contact, household, occupation | Client |
| 2 | [Health & medical history](sections/02-health-history.md) | PAR-Q+ screening, conditions, vitamins and supplements, family history | Client |
| 3 | [Systems review](sections/03-systems-review.md) | Symptom sweep by body system, digestive and menstrual detail | Client |
| 4 | [Injuries & movement](sections/04-injuries-and-movement.md) | Current pain | Client |
| 5 | [Activity & training history](sections/05-activity-history.md) | Current activity, daily lifestyle, attitude to exercise | Client |
| 6 | [Goals & motivation](sections/06-goals.md) | Primary goal, obstacles | Client |
| 7 | [Nutrition & hydration](sections/07-nutrition.md) | Food frequency, dietary needs, relationship with food | Client |
| 8 | [Sleep, stress & recovery](sections/08-lifestyle.md) | Sleep quality, stressors, energy, recovery habits | Client |
| 9 | [Measurements & assessments](sections/09-measurements.md) | Anthropometrics, vitals, movement screen, capacity tests | Coach |
| 10 | [Preferences & logistics](sections/10-preferences-logistics.md) | Availability, equipment, likes/dislikes, communication | Client |
| 11 | [Consent & sign-off](sections/11-consent.md) | Declarations, waiver, privacy, signatures | Both |
## How to use it
=== "Reviewing the questions"
Read straight through in nav order. Sections 1–8 and 10 are what the client
answers before the first session; section 9 is completed by the coach at
the baseline appointment; section 11 is signed by both.
=== "Editing the questions"
Every question is a row in a table with a stable **field ID**. Change the
wording freely, but treat the field ID as permanent once responses exist —
it is what ties an answer back to its question.
Answer types and the notation for conditional questions are defined in
[Question patterns](authoring/question-patterns.md).
=== "Adding a section"
Copy [the blank section template](authoring/section-template.md) into
`docs/sections/`, number it, and add a line to the `nav` array in
`zensical.toml`. The preview server picks up both without a restart.
=== "Handing it to a client"
Split delivery over two sittings — sections 1–4 (screening) first, so
anything that needs medical clearance surfaces early, then 5–8 and 10.
Estimated completion times are noted at the top of each page; the whole
thing runs to roughly 75 minutes of client time, which is why it should
never arrive as one link.
=== "Running it as a conversation"
An AI agent can conduct the intake conversationally instead of as a form,
which is the difference between a client finishing it and abandoning it at
question 40. [The interview protocol](project/agent-protocol.md) sets out
how — one question at a time, how to voice each answer type, when to stop,
and what the agent must never do.
In production this runs as a **phone call**: ElevenLabs rings the client
and a fleet of subagents conducts the intake, one per section. See
[The agentic flow](project/how-it-works.md).
## Conventions
`Field ID`
: Stable snake_case identifier, unique across the whole questionnaire. Never
reuse or repurpose one.
`Type`
: How the answer is captured. See
[Question patterns](authoring/question-patterns.md) for the full list.
`Req.`
: **Yes** — the questionnaire cannot be submitted without it.
**No** — optional.
**Cond.** — required only when a preceding answer triggers it.
`→`
: Conditional follow-up. `→ if Yes` means the question only appears when the
parent question was answered *Yes*.
## Reading this site as an LLM
Every page here is also served as its original Markdown, at the page's own path
with a `.md` extension: this page is at `/index.md`, section 1 is at
`/sections/01-about-you.md`. (Those are deliberately not links — Zensical reads
a link ending in `.md` as a reference to a page in the nav and warns that it
does not exist.) The relative links inside those files resolve against each
other, so a crawler can walk the whole site without touching the rendered HTML.
[`/llms.txt`](/llms.txt) indexes all of them in nav order with a one-line
description each, and [`/llms-full.txt`](/llms-full.txt) is the entire site in
one file — around 170 KB, small enough to paste whole into a model's context.
## Sources
Sections 1, 4–6 and 8–11 were written for this site. Sections 2, 3 and 7 draw
heavily on a Hebrew practitioner intake sheet (`דף תשאול`) supplied as the
domain reference — specifically its body-systems review, its food frequency
table, its per-relative family history, and its practice of asking whether a
client *wants* to know their weight rather than demanding the number.
That sheet is a naturopathic and nutritional intake, not a training one. The
parts adapted here were chosen because they improve **screening and referral**;
the parts that only support treatment decisions a coach cannot make were left
out or marked as requiring a licensed practitioner. Where a question's scope is
borderline, the page says so.
!!! warning "Not medical or legal advice"
The screening questions in [section 2](sections/02-health-history.md) are
modelled on PAR-Q+ but this is not a validated reproduction of it. The
symptom lists in [section 3](sections/03-systems-review.md) are a referral
aid, not a diagnostic instrument. The waiver language in
[section 11](sections/11-consent.md) is a placeholder. Have all three
reviewed by a qualified professional in your jurisdiction before using them
with real clients.
# The agentic flow
The questionnaire is not sent to the client as a link. **ElevenLabs phones
them**, and a fleet of voice subagents conducts the intake over that call —
one subagent introducing it, one per section, and two more to close it out.
Those subagents are all **one ElevenLabs agent**, `Questionnaire Intake Agent`,
whose workflow contains a node per subagent. The workflow graph is what moves
the call along; the client hears one interviewer throughout.
This page is the map. [The subagents](subagents.md) is the roster and the
authoritative record of which markdown file each one loads;
[Context and handoff](context-handoff.md) covers what travels between them;
[ElevenLabs setup](elevenlabs-setup.md) is how it is actually configured in
this repository.
!!! info "The site is still the source of truth"
No question text lives in an agent prompt. Every subagent is handed the
section page from this site and asks what it finds there. Reword a question
on its page and the next call asks the new wording — there is never a
second copy of the questionnaire to keep in sync.
## Why a fleet, and not one agent
A single agent could hold all eleven sections. On a voice call it does not
work, for three reasons that compound:
**Context is smaller than you think.** The eleven section pages plus the
protocol run to well over 60 KB of markdown. A voice agent is not just holding
that — it is holding it *alongside* a growing transcript of a ninety-minute
conversation. The section it is currently asking about competes for attention
with ten it is not.
**Latency is a hard budget.** A phone call tolerates roughly a second of
silence before it feels broken. Every token of prompt is time spent before the
first token of speech. A prompt carrying all eleven sections makes every single
question slower, including the trivial ones.
**Attention degrades in the middle.** A model reading one section page asks
that section well. The same model reading eleven asks the first and last
reliably and the ones in between approximately — it drifts into a neighbouring
section's questions, or re-asks something answered forty minutes ago.
Splitting by section fixes all three at once, because a section is already the
natural unit: it has its own page, its own field prefix, its own time estimate,
and its own place in the order.
!!! tip "The split is the same one the site already makes"
The subagent boundaries are not a new architecture imposed on the
questionnaire. They are the section boundaries, which exist because the
questionnaire was too long to be one page — for exactly the reason it is
too long to be one agent.
## The whole flow
```mermaid
flowchart TD
COACH(["Coach queues an intake client record plus phone number"])
CALL["Outbound call ElevenLabs to Twilio to the client"]
INTRO["INTRO NODE who is calling and why consent to record, how long it takes"]
BAIL(["Reschedule and end the call"])
BREAK{{"Break offered same call, or a scheduled call back"}}
S11["11 · Consent and sign-off ~4 min · consent_*"]
STOP["STOP AND REFER NODE say the stop wording verbatim do not soften, do not speculate"]
HAND["HANDOVER NODE assemble record, list red flags and declines propose a triage outcome"]
REVIEW(["Coach confirms the triage outcome"])
MEAS(["9 · Measurements — in person, no agent"])
subgraph SCREEN ["Screening — asked first so anything urgent surfaces early"]
direction TB
S1["1 · About you ~5 min · client_*"]
S2["2 · Health and medical history ~15 min · health_*"]
S3["3 · Systems review ~12 min · sys_*"]
S4["4 · Injuries and movement ~2 min · inj_*"]
S1 --> S2 --> S3 --> S4
end
subgraph BUILD ["Programme building — what the coach designs from"]
direction TB
S5["5 · Activity and training history ~3 min · act_*"]
S6["6 · Goals and motivation ~3 min · goal_*"]
S7["7 · Nutrition and hydration ~15 min · nut_*"]
S8["8 · Sleep, stress and recovery ~7 min · life_*"]
S10["10 · Preferences and logistics ~7 min · pref_*"]
S5 --> S6 --> S7 --> S8 --> S10
end
COACH --> CALL
CALL --> INTRO
INTRO -->|"not now"| BAIL
INTRO -->|"ready to start"| S1
S4 --> BREAK
BREAK --> S5
S10 --> S11
S11 --> HAND
INTRO -.->|"red flag"| STOP
SCREEN -.->|"red flag"| STOP
BUILD -.->|"red flag"| STOP
STOP -.->|"de-escalated, resume"| SCREEN
STOP --> HAND
HAND --> REVIEW
REVIEW --> MEAS
```
Read it as three movements. **Screening first**, so a stop condition surfaces in
the first twenty minutes rather than the last. **A break**, because ninety
minutes in one sitting is how you get abandoned calls. **Consent last**, once
the client knows what they have actually agreed to.
The dotted lines are the escape hatch, and every node that asks a question has
one — a red flag can be caught at any point in the call, not just during
screening. The return arrow matters as much: if the trigger turns out not to
qualify, control goes back to the section it came from and the call carries on.
That is why an unsure subagent should take the escape rather than judge for
itself — taking it is reversible, carrying on is not.
## The cast
| Subagent | Workflow node | Owns | Ends by |
|----------|---------------|------|---------|
| **Intro** | `intro` | Identity check, what the call is, consent to record, expected length | Moving to section 1, or rescheduling |
| **Section 1–8, 10, 11** | `section_01`…`section_11` | One section each — its questions, in its order | Offering a break, then moving to the next |
| **Stop and refer** | `stop_and_refer` | Everything after a red flag fires | Moving to handover — or back, if de-escalated |
| **Handover** | `handover` | Assembling the record, the triage proposal, telling the client what happens next | Ending the call |
Thirteen subagents, and [section 9](../sections/09-measurements.md) has none —
measurements are taken by the coach in person at the baseline appointment.
Nothing in it can be asked down a phone line.
With `start_node` and `end_node`, that is the fifteen-node workflow in
[the config](elevenlabs-setup.md#the-workflow).
## What each one knows
A subagent loads its own section page plus a small, declared set of reference
pages — never the whole reference directory. Sections with matrix questions get
the matrix guidance; sections without it do not. Only the closing subagents
carry the triage table.
[The load map](subagents.md#the-load-map) is the authoritative version of this,
and the reference pages each declare their own audience in a banner at the top.
## What this does not do
- **It does not decide anything.** The fleet proposes a triage outcome; a
human confirms it before the client trains. See
[the handover record](../knowledge-base/handover-record.md).
- **It does not take measurements.** Section 9 is in person.
- **It does not capture a signature.** Section 11 records a verbal
affirmation and flags that a written signature is outstanding.
- **It does not call back on its own.** A stopped call resumes only when a
coach says so.
# The subagents
The roster, and the authoritative record of which markdown file each subagent
loads. If this page and a prompt disagree, this page is right and the prompt
needs fixing.
Each subagent is an `override_agent` node on the single
`Questionnaire Intake Agent` — the node IDs are in
[the workflow](elevenlabs-setup.md#the-workflow).
## The load map
Every subagent loads **its own section page** plus the reference pages ticked
below. Nothing else. A blank cell is a deliberate omission, not an oversight.
Every page is listed explicitly on the node that needs it, in its
`additional_knowledge_base`. Nothing is inherited — the agent's own
`knowledge_base` is empty and each node overrides its inherited one to `[]`, so
a subagent can only see what this table gives it.
| Subagent | Section page | [Core rules](../knowledge-base/core-rules.md) | [Voicing answers](../knowledge-base/voicing-answers.md) | [Matrix by voice](../knowledge-base/matrix-in-voice.md) | [Sensitive](../knowledge-base/sensitive-questions.md) | [Stop conditions](../knowledge-base/stop-conditions.md) | [Red flags](../knowledge-base/red-flags.md) | [Handover record](../knowledge-base/handover-record.md) |
|---|---|:--:|:--:|:--:|:--:|:--:|:--:|:--:|
| **Intro** | — | ✅ | | | | ✅ | | |
| **1 · About you** | [01](../sections/01-about-you.md) | ✅ | ✅ | | | ✅ | | |
| **2 · Health history** | [02](../sections/02-health-history.md) | ✅ | ✅ | ✅ | ✅ | ✅ | | |
| **3 · Systems review** | [03](../sections/03-systems-review.md) | ✅ | ✅ | ✅ | ✅ | ✅ | | |
| **4 · Injuries and movement** | [04](../sections/04-injuries-and-movement.md) | ✅ | ✅ | | | ✅ | | |
| **5 · Activity history** | [05](../sections/05-activity-history.md) | ✅ | ✅ | | | ✅ | | |
| **6 · Goals** | [06](../sections/06-goals.md) | ✅ | ✅ | | | ✅ | | |
| **7 · Nutrition** | [07](../sections/07-nutrition.md) | ✅ | ✅ | ✅ | ✅ | ✅ | | |
| **8 · Sleep and recovery** | [08](../sections/08-lifestyle.md) | ✅ | ✅ | | | ✅ | | |
| **10 · Preferences** | [10](../sections/10-preferences-logistics.md) | ✅ | ✅ | | | ✅ | | |
| **11 · Consent** | [11](../sections/11-consent.md) | ✅ | ✅ | | ✅ | ✅ | | |
| **Stop and refer** | — | ✅ | | | | ✅ | ✅ | ✅ |
| **Handover** | — | ✅ | | | | | ✅ | ✅ |
The blank cells under **Red flags** for the ten section subagents are mostly
not a gap. Nine of the ten section pages end with their own **Red flags**
subsection — filtered to only the flags whose trigger field lives on that
page, not the full list. See
[04.2](../sections/04-injuries-and-movement.md#42-red-flags) for a small
example and [02.9](../sections/02-health-history.md#29-red-flags) for a
larger one. Sections 6 and 10 genuinely have none: no flag in
[Screening red flags](../knowledge-base/red-flags.md) is driven by a `goal_*` or
`pref_*` field, so their pages carry no such subsection at all rather than an
empty or padded one.
!!! warning "This leaves the reference page itself thinner than the closing subagents may need"
[Screening red flags](../knowledge-base/red-flags.md) keeps only the triage
outcomes and the generic session-stop signs — the specifics live with the
fields that trigger them, by design, so each section subagent is
self-contained for the flags it can actually hear. But `stop_and_refer`
and `handover` load that page and *not* the section pages, so once it
went generic they lost direct access to the specifics needed to actually
*classify* a flag (which caution modification applies, which age
threshold fired) — those specifics are now scattered across whichever
section pages own the relevant fields, several sections away from either
closing subagent. Today they still see the client's own words in the
handoff state and can reason it out, but they no longer have the lookup
table doing it for them. If that turns out to matter in practice, the fix
is either to attach the relevant section pages to those two nodes as
well, or to keep one authoritative copy of the specifics loaded there
too, accepting the duplication.
**A dry run has now confirmed this.** Given three real triggers with only
the handoff state to go on, `stop_and_refer` classified all three
`Refer & stop` — the right answer — and reported that two of the three
were inferred by keyword-matching the generic list, not read off any rule
it holds. `handover` could run only two of the eight items on its own
closing checklist, because the other six ask it about required fields and
conditional triggers that are defined on section pages it does not load.
Neither is failing; both are reasoning past a missing lookup table. The
node prompt for `stop_and_refer` now says so outright and tells it to
escalate whatever it cannot resolve, which is the cheap half of the fix.
The expensive half — attaching the section pages, or keeping one
authoritative copy of the specifics on those two nodes — is still open.
[Section 9](../sections/09-measurements.md) has no subagent — the coach takes
those measurements in person.
### How the map was decided
```mermaid
flowchart LR
subgraph EVERY ["Loaded by everything"]
CR["Core rules the scribe role, one question at a time, never infer"]
end
subgraph ASKING ["Loaded when the subagent asks questions"]
VA["Voicing answers"]
SC["Stop conditions"]
end
subgraph SOME ["Loaded only where the content demands it"]
MX["Matrix by voice sections 2, 3, 7"]
SN["Sensitive questions sections 2, 3, 7, 11"]
end
subgraph CLOSING ["Loaded only by the closing subagents"]
RF["Red flags triage outcomes, generic"]
HR["Handover record"]
end
CR --> ASKING
ASKING --> SOME
SOME --> CLOSING
```
Four rules produce the whole table:
1. **[Core rules](../knowledge-base/core-rules.md) goes everywhere.** It is the only
page with no exceptions, and it is listed on all thirteen nodes rather than
shared from the agent. Repeating it is the price of every node being able to
inherit nothing.
2. **A subagent that asks questions gets [voicing](../knowledge-base/voicing-answers.md)
and [stop conditions](../knowledge-base/stop-conditions.md).** The intro,
stop-and-refer and handover subagents do not ask questionnaire questions, so
they do not get the voicing guide. The intro *does* get stop conditions — a
client can disclose chest pain while you are still explaining the call.
3. **Content-specific pages follow the content.** Only three sections have
matrix questions; only four have sensitive blocks. Shipping those pages
everywhere would cost every subagent context for a problem it never meets.
4. **Recognition lives with the questions that can trigger it; classification
lives at the end.** A section subagent needs to *recognise* a trigger and
hand off — the flags its own fields can produce are filtered onto its own
section page (or, for two sections, are simply absent, because none of
their fields drive one), so it never needs
[red flags](../knowledge-base/red-flags.md) loaded at all. What every
question-asking subagent gets instead is
[stop conditions](../knowledge-base/stop-conditions.md), which teaches the
*behaviour* — say the wording, hand off, don't soften it — rather than the
list. Turning a recognised trigger into one of the four triage outcomes is
the closing subagents' job.
!!! warning "Widening a page's audience costs every turn it is loaded on"
Every page here is injected whole, not retrieved, so a page added to a node
is in context for every question that node asks. Before widening a page's
audience, check whether the subagents that would receive it actually act on
it. The usual right answer is a new, smaller page on the two or three nodes
that do.
## Intro
Opens the call. Confirms it is the right person, says who is calling and why,
gets consent to record, and sets expectations about length and the option to
stop.
- **Does not** ask any questionnaire question, including "just the easy first
one".
- **Does** carry [stop conditions](../knowledge-base/stop-conditions.md), because
clients volunteer symptoms during the explanation.
- **Ends by** handing to section 1, or by rescheduling if it is a bad moment.
A client who says "now isn't great" gets a callback offer, not persuasion.
The single most valuable thing it does is tell the client they can stop, skip
any question, and decline anything without explaining why. Everything after
depends on them believing that.
## Section subagents
Ten of the thirteen. Each owns one section and runs the same three beats —
announce, ask, hand back — described in
[the interview protocol](agent-protocol.md#the-shape-of-the-call).
They are ten nodes running the *same* base prompt. What differs between them is
only: which section page is attached, which content-specific reference pages
come with it, and which node the workflow moves to next. The shared scribe
rules are written once, on the agent.
!!! danger "A section subagent never asks another section's questions"
Not even when the answer would obviously help, and not even when the client
volunteers it. Volunteered answers get recorded against their field ID and
passed on in the handoff state; the subagent that owns the field skips it
and says so. Asking outside your section is how two subagents end up asking
the same thing twice.
### Handing to the next one
Each section subagent ends by offering a break and passing state. It does not
announce the next section — the subagent that owns it does, because it is the
one that knows how long its section takes and what it involves.
The break matters more than it looks. Ninety minutes is too long for one
sitting, and the natural break after section 4 is also the point where
screening is complete, so an interrupted call has already produced the part
that mattered most.
## Stop and refer
Takes over the moment a red flag fires, from any subagent, at any point.
- Delivers the stop wording from
[stop conditions](../knowledge-base/stop-conditions.md) **verbatim**. No
softening, no speculation about the cause.
- Repeats the emergency-services line if the symptom is happening now.
- Marks the record `Refer & stop` with the field that triggered it.
- Can **de-escalate**: if the trigger turns out not to qualify, control returns
to the section it came from and the call continues. This is why an unsure
section subagent should escape rather than judge — escaping is reversible,
carrying on is not.
- Hands to handover.
The de-escalation is not a second edge in the workflow. Every red-flag edge
carries a `backward_condition` alongside its forward one, so the same edge that
takes the call out of a section is the one that puts it back — see
[edges](elevenlabs-setup.md#edges).
## Handover
Closes the call and produces the record. Loads
[the handover record](../knowledge-base/handover-record.md) and
[red flags](../knowledge-base/red-flags.md) for the triage-outcome definitions.
- Merges the handoff state from every subagent that ran.
- Lists every red flag with its triggering field, and every decline.
- **Proposes** a triage outcome with its reasoning visible — Clear, Proceed with
caution, Clearance required, or Refer and stop. It does not decide one.
- Tells the client what happens next and when.
- Runs [the closing checklist](../knowledge-base/handover-record.md#before-finishing).
A call that ended early still gets a handover. Sixty answered fields are worth
having, and the record says where the call stopped and whether a callback is
needed — see [partial calls](../knowledge-base/handover-record.md#partial-calls).
# Context and handoff
When the workflow moves to a new node, that subagent is working from its own
instructions and its own pages — not from a replay of the call so far.
Everything it needs to avoid re-asking, re-explaining or contradicting what came
before has to be carried forward explicitly. That payload is the **handoff
state**, and it is the one piece of the design that has to be got right — the
rest degrades gracefully, this fails loudly and in front of the client.
## The context budget
Why the workflow is split at all. A rough accounting of what a single
undivided agent would carry:
| | Approximate size |
|---|---|
| Eleven section pages | ~55 KB |
| The full reference directory | ~25 KB |
| A ninety-minute transcript, by the end | large and growing |
| **The section currently being asked** | **~5 KB** |
The last row is the point. Undivided, the thing the agent is actually doing
occupies a few per cent of its attention, and the proportion gets worse with
every turn as the transcript grows.
A section subagent carries its own page, three or four short reference pages,
and a handoff state measured in kilobytes. What it is doing dominates what it
is holding.
!!! tip "Budget per node, not per call"
Splitting does not reduce the work the call does in total — it changes what
is competing for attention *at any one moment*, and only that second number
affects whether the client gets asked the right question.
Nothing is shared from the agent down: every node lists its own pages and
inherits none. Shared pages are repeated rather than pooled, which costs a
little duplication in the config and buys the guarantee that a subagent
cannot see a section it does not own.
## What travels
The handoff state, carried as dynamic variables as the workflow moves from node
to node. The four seeded at call time — `client_name`, `practice`, `coach`,
`form_version` — are declared on the agent under
`dynamic_variable_placeholders`; the rest accumulate as the call runs.
| Key | Carries | Why the next subagent needs it |
|-----|---------|-------------------------------|
| `client_name` | What the client asked to be called | So subagent five doesn't reintroduce itself to someone forty minutes in |
| `form_version` | The questionnaire version being asked | Goes in the handover; answers are meaningless without it |
| `sections_done` | Which sections completed | Answering "how much is left?" honestly |
| `answers` | Every field ID with its value and status | The whole record so far |
| `volunteered` | Field IDs answered out of turn, with values | So the owning subagent skips them and says it already has them |
| `declines` | Field IDs the client declined | **Never ask these again.** See below |
| `flags` | Red flags found, with triggering fields | The handover assembles the triage proposal from these |
| `stopped_at` | Set only if a stop condition fired | Tells stop-and-refer what it is dealing with |
| `notes` | Free text a coach should read | Things that fit no field |
Every entry in `answers` carries one of the four statuses from
[the handover record](../knowledge-base/handover-record.md#what-to-record):
`answered`, `declined`, `skipped — not triggered`, `skipped — section omitted`.
!!! danger "A decline that arrives as a blank gets asked again"
This is the failure mode the handoff exists to prevent, and it is the worst
one available — the client declined something personal, was promised it
would not come up again, and a later subagent asks it twenty minutes on
because the decline reached it as an empty field.
`declined` is a value, not an absence. Every subagent treats it as final,
and [optional and sensitive
questions](../knowledge-base/sensitive-questions.md) is loaded by all four
sections where it matters most.
## The rules of a handoff
1. **Pass state before speaking.** The next subagent announces its section; it
cannot do that correctly without knowing what has already been answered.
2. **Never pass a summary in place of fields.** "Client seems generally
healthy" is not a handoff. Field IDs and values are.
3. **Never drop a key you did not use.** A section subagent that has no red
flags still passes `flags` through untouched. State accumulates; it does not
get rewritten by each hop.
4. **Volunteered answers move up, not down.** If section 2 catches an answer
belonging to section 8, it goes in `volunteered` and section 8 skips it. It
does not get re-asked "properly" in context.
5. **The client's own words survive.** Where phrasing carries information the
option label loses, both travel. "I can't get down on the floor since the
surgery" is worth more than a boolean.
## What deliberately does not travel
- **The transcript.** Subagents get structured state, not a conversation log.
Passing the transcript would reintroduce exactly the context growth the split
removed.
- **The previous subagent's reasoning.** Why section 3 thought something was
worth flagging is not section 4's business; the flag itself is.
- **Reference pages.** Each node carries its own, per
[the load map](subagents.md#the-load-map). Nothing forwards documentation to
the next node.
## When a call drops
The state is the record. A call that ends at section 7 has produced a valid,
partial intake — and because state is passed at every hop rather than held in
one context, nothing is lost that had already been handed on.
The handover subagent runs against whatever state exists, marks the remaining
sections `skipped — section omitted`, and notes where the call ended. A
callback resumes from `sections_done` rather than from the top; the client is
not asked sections 1 to 6 a second time.
# ElevenLabs setup
How the fleet described in [The subagents](subagents.md) is actually configured
in this repository, and how it gets deployed.
## One agent, thirteen subagent nodes
There is exactly **one agent** in the ElevenLabs account:
**Questionnaire Intake Agent**. The subagents are not separate agents — they
are `override_agent` nodes inside that agent's workflow, and the workflow graph
is what moves the call from one to the next.
```text
elevenlabs/
├── agents.json the one agent, and its ID once pushed
├── tools.json custom tools (none yet)
└── agent_configs/
└── questionnaire-intake-agent.json the agent, workflow included
```
That single file holds everything: the shared prompt, the voice and ASR
settings, and the fifteen-node workflow. There is no per-subagent config file
and no linking step.
!!! warning "Always invoke the CLI through `bunx`"
Not `npx`, and not a global install. See `CLAUDE.md` at the repository
root. The CLI must also be run from inside `elevenlabs/`, since that is
where `agents.json` lives.
## The workflow
`workflow.nodes` and `workflow.edges` are both **objects keyed by ID**, not
arrays. Fifteen nodes:
| Node ID | Type | Label |
|---------|------|-------|
| `start_node` | `start` | — |
| `intro` | `override_agent` | Intro |
| `section_01` … `section_11` | `override_agent` | One per section (ten of them) |
| `stop_and_refer` | `override_agent` | Stop and refer |
| `handover` | `override_agent` | Handover |
| `end_node` | `end` | — |
Each `override_agent` node carries:
| Field | Holds |
|-------|-------|
| `label` | What shows in the workflow editor |
| `additional_prompt` | This subagent's own instructions, appended to the shared prompt |
| `additional_knowledge_base` | The pages this subagent loads — see [the load map](subagents.md#the-load-map) |
| `entry_behavior` | `wait_for_user` for the intro, `generate_immediately` for the rest |
| `position` | `{x, y}` so the editor lays out cleanly |
The shared scribe rules live once in the agent's base
`conversation_config.agent.prompt.prompt`, not thirteen times. A node's
`additional_prompt` is appended to it, which is what makes a subagent a
*specialisation* of the interviewer rather than a fresh one.
### Edges
Twenty-six of them. Each has a `source`, a `target`, and a `forward_condition`
that is either `{"type": "unconditional"}` or
`{"type": "llm", "condition": "…"}`.
```json
"section_02_to_section_03": {
"source": "section_02",
"target": "section_03",
"forward_condition": {
"type": "llm",
"condition": "Section 2 is complete and a break has been offered."
}
}
```
The eleven red-flag edges also carry a **`backward_condition`**, which is how
de-escalation is expressed without a second edge:
```json
"section_02_to_stop": {
"source": "section_02",
"target": "stop_and_refer",
"forward_condition": {
"type": "llm",
"condition": "An answer in section 2 matches the stop and refer immediately list…"
},
"backward_condition": {
"type": "llm",
"condition": "The trigger was checked against the red flags reference and does not qualify, so section 2 resumes where it left off."
}
}
```
Every question-asking node has one of these, so a red flag can be caught
anywhere in the call and, if it turns out not to qualify, control returns to
exactly the section it came from.
!!! note "Fifteen nodes exceeds the usual guidance"
ElevenLabs suggests keeping workflows to four to seven nodes. This one is
deliberately larger: one node per section *is* the context-isolation
strategy, and collapsing sections together would undo it. See
[why a fleet](how-it-works.md#why-a-fleet-and-not-one-agent).
## Deploying
One pass. There are no cross-agent IDs to resolve, so the two-step deploy the
old fleet needed is gone.
```bash
bunx @elevenlabs/cli agents push
```
Preview first with `--dry-run`. Note that `--dry-run` does not validate against
the server schema — it only reports which agents would be sent.
## The knowledge base
Every node carries its own pages explicitly, and **inherits nothing**. Two
fields do that job together:
| Field on the node | Set to | Effect |
|---|---|---|
| `conversation_config.agent.prompt.knowledge_base` | `[]` | Inherit nothing from the agent |
| `additional_knowledge_base` | Its own pages, listed one by one | The node's entire knowledge base |
The agent's own `knowledge_base` is `[]` as well, so there is nothing to
inherit even by accident. A subagent sees exactly the pages named against it in
[the load map](subagents.md#the-load-map) — never a neighbouring section's.
```json
"conversation_config": {
"agent": { "prompt": { "knowledge_base": [] } }
},
"additional_knowledge_base": [
{
"type": "file",
"id": "AOekAr0fqiJvLIxCfWbn",
"name": "section-02-health-history",
"usage_mode": "prompt"
},
{
"type": "file",
"id": "834jHRo5jDGXEUoEnGhh",
"name": "ref-core-rules",
"usage_mode": "prompt"
}
]
```
Seventeen documents are uploaded — the ten client-facing section pages and the
seven reference pages subagents load. Upload with:
```bash
curl -X POST "https://api.elevenlabs.io/v1/convai/knowledge-base/file" \
-H "xi-api-key: $ELEVENLABS_API_KEY" \
-F "file=@docs/sections/02-health-history.md;type=text/markdown" \
-F "name=section-02-health-history"
```
!!! warning "Attach documents through the config, not a PATCH"
`workflow.nodes` replaces rather than merges, so a partial `PATCH` that
sends one node drops the other fourteen — the API rejects it for having no
start node. Edit the config file and `agents push`; the CLI always sends
the workflow whole.
!!! danger "`usage_mode` is `prompt`, and RAG stays off"
`rag.enabled` is `false` and every document is attached with
`"usage_mode": "prompt"`, so a section page is injected whole rather than
retrieved against.
This is a correctness decision. Retrieval optimises for relevance; asking a
questionnaire needs completeness — every question, in order, with its
conditional logic intact. A question that is not retrieved is silently
never asked, and the handover record cannot then tell that apart from
*skipped — not triggered*. The full reasoning, and the one narrow
exception, are recorded in `CLAUDE.md`.
Each node holds one section — 12.8 KB at worst, ~3.5k tokens — which is what
makes injecting it whole affordable. That is the [context
budget](context-handoff.md#the-context-budget) doing its job: the workflow
split already solved the problem RAG would otherwise be solving.
Safety-critical material never goes in the knowledge base at all. The scribe
rules and the stop-and-refer triggers live in the agent's base **prompt**,
where they are present on every turn rather than depending on a retriever.
!!! tip "Re-upload when a question changes"
The site stays the source of truth only if the uploaded copy tracks it.
Reword a question here, re-upload that section's page, and the next call
asks the new wording.
## Placing a call
One agent means one entry point — there is no risk of dialling into the middle
of the questionnaire.
```bash
curl -X POST "https://api.elevenlabs.io/v1/convai/twilio/outbound-call" \
-H "xi-api-key: $ELEVENLABS_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"agent_id": "",
"agent_phone_number_id": "",
"to_number": "+972500000000",
"conversation_initiation_client_data": {
"dynamic_variables": {
"client_name": "Dana",
"practice": "the practice",
"coach": "Inbal",
"form_version": "2026-08"
}
}
}'
```
Those four dynamic variables seed the call; everything else accumulates as the
workflow runs. They are declared under `dynamic_variable_placeholders` so a
test call still works when they are not supplied.
## Language
The agent is set to `"language": "he"`, with the questionnaire pages in English
— each subagent reads the English page and asks in Hebrew.
Per `CLAUDE.md`, all prompt and `first_message` strings in the config are
written in English regardless of the spoken language. Change `language` in the
config, not the strings, if the agent should speak something else.
## Voice settings
Set once on the agent and inherited by every node, which is what keeps the call
sounding like one interviewer rather than fifteen.
| Setting | Value | Why |
|---------|-------|-----|
| `voice_id` | one voice | Fifteen nodes, one apparent interviewer |
| `model_id` | `eleven_v3_conversational` | Built for turn-taking |
| `asr.provider` | `scribe_realtime`, high quality | Numbers and medication names have to survive |
| `turn_timeout` | 10s | Longer than default: these questions need thinking time |
| `silence_end_call_timeout` | 60s | Ends a dead call without chasing |
| `max_duration_seconds` | 7200 | A full intake runs ~90 minutes, with breaks |
| `temperature` | 0 | A scribe should not be creative |
!!! danger "One voice is a presentation choice, not a disclosure choice"
The client is told once, by the intro subagent, that they are talking to an
automated system. A single voice across the workflow stops the call feeling
broken; it must never be used to imply a human is on the line.
# The interview protocol
How an agent runs this questionnaire as a conversation instead of a form. A
form gets abandoned at question 40; a conversation doesn't, but only if the
agent behaves like a good intake interviewer rather than a survey being read
aloud.
This page is the front door. The protocol itself is split across the pages
below, because it is not read by one agent — it is read by
[a fleet of subagents](subagents.md), each of which loads only
the parts that govern its own stretch of the call.
!!! info "Why the protocol is split into small pages"
A voice agent has a limited context window and a latency budget measured in
hundreds of milliseconds. Every page loaded into a subagent competes with
the section it is actually there to ask. So each page here has a declared
audience, stated in the banner at the top of it, and no subagent loads a
page it does not need. [The context budget](context-handoff.md)
explains the sizing.
## The pages
| Page | Covers | Loaded by |
|------|--------|-----------|
| [Core rules](../knowledge-base/core-rules.md) | Scribe role, one question at a time, never infer, voice-specific handling | **Every** subagent |
| [Voicing each answer type](../knowledge-base/voicing-answers.md) | How to ask each answer type out loud and map the reply | Every section subagent |
| [Matrix questions by voice](../knowledge-base/matrix-in-voice.md) | The cluster rule for grid questions | Sections 2, 3, 7 |
| [Optional and sensitive questions](../knowledge-base/sensitive-questions.md) | Declines, disclosures, and how they survive a handoff | Sections 2, 3, 7, 11 |
| [Stop conditions](../knowledge-base/stop-conditions.md) | Recognising a trigger and getting out of the way | Every section subagent, stop & refer |
| [The handover record](../knowledge-base/handover-record.md) | Field-ID record format, triage proposal, closing checklist | Handover, stop & refer |
| [Screening red flags](../knowledge-base/red-flags.md) | The triage-outcome framework, generic | Stop & refer, handover |
| [Question patterns](../authoring/question-patterns.md) | The answer-type data model | Nobody — authoring reference |
| [Blank section template](../authoring/section-template.md) | Starting a new section | Nobody — authoring reference |
The authoritative mapping of subagent → pages is
[the load map](subagents.md#the-load-map). This table is its
summary, read from the other direction.
## The shape of the call
Every subagent, whichever section it owns, runs the same three beats:
1. **Announce.** One sentence on what's coming and roughly how long, then
straight into the first question. Don't preview the questions themselves.
> Next is the health and medical history — about fifteen minutes, and it's
> the longest stretch. Some of it is routine screening. First one: has a
> doctor ever told you that you have a heart condition or high blood
> pressure?
2. **Ask.** One question at a time, in the order on the section page, honouring
conditionals, per [Core rules](../knowledge-base/core-rules.md).
3. **Hand back.** Offer a break, then pass the state on. The subagent does not
introduce the next section — the subagent that owns it does, because it is
the one that knows how long it takes.
## Writing a subagent prompt
Each subagent's prompt is assembled from three parts, and only the third
differs between them:
```text
[1] The role block — identical in every subagent
[2] The pages this subagent loads — from the load map
[3] The section it owns, and where it hands off
```
The role block:
```text
You are conducting one section of a fitness intake questionnaire for
[practice] on behalf of [coach], over the phone. You are a scribe: you ask,
record and flag. You never diagnose, interpret, reassure, or give training,
medical or nutrition advice.
You own ONE section. Ask only its questions, in the order given on its page.
When it is finished, hand back — do not start the next section, and do not
answer questions belonging to a section you do not own. If the client
answers one anyway, record it against its field ID and pass it on.
Ask ONE question per turn. Never batch questions. Never read out a numbered
list of questions.
Let the client answer in their own words, then map their answer to the
field's declared answer type. Do not make them speak in option labels. Do
not fill in, infer or complete any answer they did not give.
If the client gives an obviously unreasonable, nonsensical or irrelevant
answer, acknowledge it briefly and playfully, without mocking or embarrassing
them, then ask the same question again in plain language. Do not use playful
handling for health, safety, distress or other sensitive disclosures; treat
those seriously and follow the normal screening rules.
Only ask a conditional question when its trigger has fired. Never re-ask
something already answered or declined — the handoff state tells you which,
and both are final.
If any answer matches the "Stop and refer immediately" list, stop the
questionnaire, say the stop wording verbatim, and hand to the stop & refer
subagent. Never soften this and never speculate about the cause.
Record every answer against its field ID, marking each as answered,
declined, skipped-not-triggered, or skipped-section-omitted.
Offer a break before handing back.
```
!!! tip "Give the subagent the pages, not a copy of the questions"
Attach the section page from this site rather than pasting its question
table into the prompt. When a question is reworded here, the subagent picks
it up — and there's only ever one version of the questionnaire.
## Why this is split across subagents
The split exists because **voice** agents cannot hold all eleven sections at
once: the context is limited, the latency budget is tighter, and a prompt
carrying all eleven sections degrades the asking of every one of them.
[Why subagents](how-it-works.md#why-a-fleet-and-not-one-agent) has the
argument in full.
# 1. About you
Filled by Client ·
Questions 18 ·
Time ~5 min ·
Prefixclient_*
Basic identity and contact details, plus the two things that matter for
programme design before anything else: what the working day looks like, and who
to call if something goes wrong.
## 1.1 Identity
| ID | Question | Type | Options / units | Req. |
|----|----------|------|-----------------|------|
| `client_full_name` | What is your full name? | Short text | — | Yes |
| `client_dob` | Date of birth | Date | `YYYY-MM-DD` | Yes |
| `client_gender` | Gender identity | Single choice | Female / Male / other | No |
## 1.2 Contact
| ID | Question | Type | Options / units | Req. |
|----|----------|------|-----------------|------|
| `client_email` | Email address | Email | — | Yes |
| `client_phone` | Mobile number | Phone | Include country code | Yes |
| `client_address` | City / country | Short text | — | Yes |
| `client_contact_pref` | Best way to reach you | Multi-select | Email / WhatsApp / Phone call | Yes |
## 1.3 Household
| ID | Question | Type | Options / units | Req. |
|----|----------|------|-----------------|------|
| `client_relationship_status` | Relationship status | Single choice | Single / In a relationship / Married / Separated or divorced / Widowed / Prefer not to say | Yes |
| `client_children` | Do you have children? | Yes/No | — | No |
| `client_children_count` | How many, and how old? | Short text | — | Cond. |
| `client_children_health` | Is there any important information I should know about your children's health? | Yes/No | — | Cond. |
| `client_children_health_detail` | What should I know? | Short text | — | Cond. |
`client_children_count` → if `client_children` = Yes
`client_children_health` → if `client_children` = Yes
`client_children_health_detail` → if `client_children_health` = Yes
!!! tip "This is a logistics question, not a personal one"
Young children, shared custody and caring duties are the most common reason
a training schedule fails. Ask here, and read it against `life_caregiving`
in [section 8](08-lifestyle.md) and `pref_days_which` in
[section 10](10-preferences-logistics.md).
## 1.4 Work & daily routine
| ID | Question | Type | Options / units | Req. |
|----|----------|------|-----------------|------|
| `client_occupation` | What is your occupation? | Short text | — | No |
| `client_work_satisfaction` | How do you feel about your work? | Single choice | Satisfied / It's fine / Not satisfied / It's a major source of stress / I want to change it | No |
| `client_work_activity` | How physically active is your working day? | Single choice | Seated most of the day / Mix of sitting and standing / On my feet most of the day / Physically demanding / Not currently working | Yes |
| `client_work_hours` | Typical working hours per week | Number | hours | No |
!!! note "A question doing real work"
`client_work_satisfaction` is a stress measure disguised as a demographic —
it predicts adherence better than working hours do, and it comes from the
practitioner sheet, which asked it as `מרוצה / לא מרוצה / מביא לדחק`.
## 1.5 How you found us
| ID | Question | Type | Options / units | Req. |
|----|----------|------|-----------------|------|
| `client_referral_source` | How did you hear about us? | Single choice | Search / Social media / Friend or family / Existing client / Gym / Healthcare referral / Other | No |
| `client_referral_detail` | Who referred you? | Short text | — | No |
`client_referral_detail` → if `client_referral_source` is *Friend or family*,
*Existing client* or *Healthcare referral*.
## 1.6 Red flags
Age, from `client_dob`, sets three thresholds that change what happens later
in the questionnaire and at the assessment:
| Condition | Additional step |
|-----------|-----------------|
| Under 18 | Guardian consent required (`sign_guardian_*` in [section 11](11-consent.md)); no maximal loading |
| Over 65 and previously sedentary | Extended progressive onboarding; balance and fall-prevention work included |
| Over 40, sedentary, with two or more cardiovascular risk factors | Consider clearance before vigorous-intensity work |
"Previously sedentary" and the cardiovascular risk factor count are answered
elsewhere — `act_currently_active` in [section 5](05-activity-history.md),
and `health_smoking` / `health_family_matrix` in
[section 2](02-health-history.md#29-red-flags). Age alone doesn't resolve
either threshold; it just determines whether they need checking.
Full outcome definitions: [Screening red flags](../knowledge-base/red-flags.md).
---
**Next:** [2. Health & medical history](02-health-history.md)
# 2. Health & medical history
Filled by Client ·
Questions 30 ·
Time ~15 min ·
Prefixhealth_*, parq_* in 2.1
The gate. Everything downstream depends on this section being answered
honestly, so it comes early and its wording should stay plain and
non-judgemental.
!!! danger "Stop rule"
A *Yes* to any question in [2.1 Pre-exercise screening](#21-pre-exercise-screening)
means **no exercise testing and no programming** until, where indicated,
written medical clearance is on file. See
[Screening red flags](../knowledge-base/red-flags.md).
## 2.1 Pre-exercise screening
Modelled on the PAR-Q+. All are required, all are Yes/No unless noted.
| ID | Question | Type | Options / units | Req. |
|----|----------|------|-----------------|------|
| `parq_1_heart` | Has your doctor ever said you have a heart condition **or** high blood pressure? | Yes/No | — | Yes |
| `parq_2a_breathlessness` | Do you experience shortness of breath? | Single choice | No / Yes, at rest / Yes, during physical activity / Yes, both at rest and during physical activity | Yes |
| `parq_2b_heart_rate` | Do you experience changes or irregularities in your heart rate? | Single choice | No / Yes, while resting / Yes, while sleeping / Yes, both while resting and sleeping | Yes |
| `parq_3_dizziness` | Have you lost balance because of dizziness, or lost consciousness, in the last 12 months? | Yes/No | — | Yes |
| `parq_4_condition` | Have you ever been diagnosed with another chronic medical condition? | Yes/No | — | Yes |
| `parq_5_medication` | Are you currently taking prescribed medication for a chronic condition? | Yes/No | — | Yes |
| `parq_6_msk` | Do you have a bone, joint or soft-tissue problem that could be made worse by becoming more physically active? | Yes/No | — | Yes |
## 2.2 Conditions
| ID | Question | Type | Options / units | Req. |
|----|----------|------|-----------------|------|
| `health_conditions` | Have you been diagnosed with any of the following? | Multi-select | High blood pressure / High cholesterol / Type 1 diabetes / Type 2 diabetes / Pre-diabetes / Heart disease / Stroke / Asthma / COPD or other lung condition / Thyroid disorder / Osteoporosis or osteopenia / Arthritis / Autoimmune condition / Cancer (current or past) / Epilepsy / Kidney disease / Liver disease / Digestive or GI condition / Anxiety / Depression / Other / None of these | Yes |
| `health_conditions_other` | Please describe the other condition(s). | Long text | — | Cond. |
| `health_diabetes_mgmt` | How is your diabetes managed? | Multi-select | Diet / Oral medication / Insulin / Other | Cond. |
`health_conditions_other` → if `health_conditions` includes *Other*
`health_diabetes_mgmt` → if `health_conditions` includes any diabetes option
## 2.3 Vitamins and dietary supplements
| ID | Question | Type | Options / units | Req. |
|----|----------|------|-----------------|------|
| `health_supplements` | Do you currently take any vitamins or dietary supplements? | Multi-select | None / Multivitamin / Vitamin D / Vitamin C / Vitamin B12 or B-complex / Iron / Magnesium / Calcium / Zinc / Omega-3 / Probiotics / Fiber supplement / Protein powder / Collagen / Creatine / Herbal or hormonal supplement / Other | No |
| `health_supplements_other` | Please specify. | Short text | — | Cond. |
| `health_supplements_detail` | For each supplement selected, list the product name, dosage and how often you take it. | Repeating group | Product name, Dosage, How often | Cond. |
| `health_allergies` | Do you have any allergies? | Long text | Include severity | Yes |
| `health_drug_sensitivity` | Do you react badly to any medication or substance? | Long text | — | No |
`health_supplements_other` → if `health_supplements` includes *Other*
`health_supplements_detail` → if `health_supplements` is not *None*
## 2.4 Surgical & hospital history
| ID | Question | Type | Options / units | Req. |
|----|----------|------|-----------------|------|
| `health_surgeries` | Have you had any surgery? | Yes/No | — | Yes |
| `health_surgeries_detail` | List each operation and its approximate date. | Repeating group | Procedure, date, fully recovered? | Cond. |
`health_surgeries_detail` → if `health_surgeries` = Yes
## 2.5 Family history
The source sheet asks per relative rather than in aggregate, which surfaces
noticeably more than a single yes/no does.
| ID | Question | Type | Options / units | Req. |
|----|----------|------|-----------------|------|
| `health_family_matrix` | Has any of these relatives been diagnosed with the conditions listed? | Matrix | **Rows:** Mother · Father · Sibling · Maternal grandparent · Paternal grandparent · Aunt or uncle. **Columns:** Diabetes · Heart disease · Stroke · High blood pressure · Cancer · Epilepsy · Osteoporosis · Autoimmune · Other | No |
| `health_family_matrix_other` | Which relative, and what condition? | Long text | — | Cond. |
| `health_family_detail` | Anything you'd like to add about family health? | Long text | — | No |
`health_family_matrix_other` → if `health_family_matrix` includes *Other* for any relative
## 2.6 Blood tests & other practitioners
| ID | Question | Type | Options / units | Req. |
|----|----------|------|-----------------|------|
| `health_bloods_file` | Upload the results if you have them. | File upload | PDF or image | No |
| `health_practitioners` | Are you seeing, or have you recently seen, any of these? | Multi-select | Dietitian / Naturopath / Acupuncturist / Osteopath / Chiropractor / Physiotherapist / Psychologist or therapist / Other complementary practitioner / None of these | No |
| `health_practitioners_detail` | Who, what for, and are they treating you now? | Long text | — | Cond. |
`health_practitioners_detail` → if `health_practitioners` is not *None of these*
!!! tip "`health_practitioners` prevents contradictory advice"
Clients frequently arrive already working with someone else and don't
mention it. Finding out on day one avoids a programme that pulls against a
physiotherapist's plan or a dietitian's protocol.
## 2.7 Reproductive health
Safety-critical questions only. Cycle detail lives in
[section 3.7](03-systems-review.md#37-menstrual-hormonal) — don't duplicate it
here.
| ID | Question | Type | Options / units | Req. |
|----|----------|------|-----------------|------|
| `health_births` | How many pregnancies and births have you had? | Short text | — | No |
## 2.8 Lifestyle risk factors
| ID | Question | Type | Options / units | Req. |
|----|----------|------|-----------------|------|
| `health_smoking` | Do you smoke or vape? | Single choice | Never / Former, quit over a year ago / Former, quit within a year / Occasionally / Daily | Yes |
| `health_alcohol_units` | How much alcohol do you typically consume in an average week? Indicate the quantity for each type. | Multi-select | I do not drink alcohol / Wine / Beer / Spirits / Other | Yes |
| `health_alcohol_wine_qty` | Wine — glasses or bottles per week | Short text | — | Cond. |
| `health_alcohol_beer_qty` | Beer — bottles or cans per week | Short text | — | Cond. |
| `health_alcohol_spirits_qty` | Spirits — shots or drinks per week | Short text | — | Cond. |
| `health_alcohol_other_qty` | Other — please specify | Short text | — | Cond. |
`health_alcohol_wine_qty` → if `health_alcohol_units` includes *Wine*
`health_alcohol_beer_qty` → if `health_alcohol_units` includes *Beer*
`health_alcohol_spirits_qty` → if `health_alcohol_units` includes *Spirits*
`health_alcohol_other_qty` → if `health_alcohol_units` includes *Other*
*I do not drink alcohol* is an exclusive escape option: selecting it clears
every other option, and selecting any other option clears it. See
[Multi-select conventions](../authoring/question-patterns.md#multi-select-conventions).
## 2.9 Red flags
The PAR-Q+ screening in 2.1, and the conditions and history below, drive most
of triage. Full outcome definitions are in
[Screening red flags](../knowledge-base/red-flags.md); what follows is the subset
this section's own fields feed.
**Stop and refer immediately** — no assessment, no session, today:
- Shortness of breath at rest (`parq_2a_breathlessness` = *Yes, at rest* or
*Yes, both at rest and during physical activity*)
- Loss of consciousness or unexplained collapse in the last 12 months
(`parq_3_dizziness` = Yes)
!!! note "Chest pain is not on this list, and that is correct"
No field in this section asks about it — `parq_1_heart` asks about a
*diagnosis*, and `parq_2a_breathlessness` asks about breath. Chest pain is
asked once, as an option on `sys_cardio` in
[3.3](03-systems-review.md#33-cardiorespiratory), and its stop entry lives
on that page with the field that produces it.
**Clearance required before training** — written clearance from the client's
doctor, on file, before anything else:
- Any *Yes* on the PAR-Q+ (2.1) that is not otherwise resolved by the rest of
the questionnaire
- A known heart condition, previous cardiac event, or cardiac surgery
(`health_conditions` includes *Heart disease* or *Stroke*)
- Uncontrolled diabetes, or diabetes with complications — neuropathy,
retinopathy, kidney involvement (`health_conditions`, `health_diabetes_mgmt`)
- Cancer treatment currently underway or completed within the last 6 months
(`health_conditions` includes *Cancer*)
- Epilepsy with seizures in the last 12 months (`health_conditions` includes
*Epilepsy* — cross-check against `sys_head` / `sys_neuro` in
[3.10](03-systems-review.md#310-red-flags))
- Recent surgery — within 12 weeks, or outside the surgeon's stated return
timeline (`health_surgeries_detail`)
- Osteoporosis with a previous fragility fracture (`health_conditions`
includes *Osteoporosis*)
**Proceed with caution** — train, but with documented modifications and a note
of what was changed and why:
| Flag | Source field | Typical modification |
|------|--------------|----------------------|
| Controlled asthma | `health_conditions` | Extended warm-up; inhaler present and accessible |
| Controlled type 2 diabetes | `health_conditions` | Fixed session timing, glucose checked pre-session, fast-acting carbohydrate on hand |
| Osteopenia, no fracture history | `health_conditions` | No spinal flexion under load, no twisting under load; build impact gradually |
| Under active physio care | `health_practitioners` | Coordinate with the clinician before loading the affected area |
`health_smoking` and `health_family_matrix` also count toward the
cardiovascular risk factors used by the age thresholds in
[1.6](01-about-you.md#16-red-flags).
If a stop condition fires here, use the wording in
[Stop conditions](../knowledge-base/stop-conditions.md#the-wording) and hand off
immediately — do not finish this section first.
---
**Previous:** [1. About you](01-about-you.md) ·
**Next:** [3. Systems review](03-systems-review.md)
# 3. Systems review
Filled by Client ·
Questions 45 ·
Time ~12 min ·
Prefixsys_*
A symptom sweep by body system, adapted from the practitioner intake sheet
(`דף תשאול`). It exists to catch things the PAR-Q+ in
[section 2](02-health-history.md) does not ask about — and to catch them
*before* a training programme starts, not after a client mentions them in
passing eight weeks in.
!!! danger "Screening tool, not a diagnostic one"
This section identifies **when to refer out**. It does not identify what is
wrong, and nothing here should be interpreted, treated or "supported" by a
coach. A cluster of symptoms is a reason to say *please see your doctor
about this* and to note the modification it forces on the programme —
nothing more.
Several blocks below (`sys_endocrine`, `sys_pancreas`, `sys_adrenal`)
sit inside a **licensed practitioner's scope** —
dietitian, naturopath, doctor. If your registration doesn't cover them,
delete those blocks rather than collecting answers you cannot act on.
Collecting health data you have no lawful basis to process is a problem in
its own right.
## 3.1 How to answer
Each block lists symptoms as prompts. The client ticks what applies and adds
detail only where something is present — the prompt list is deliberately long
so that nothing is missed, not so that every line gets an answer.
For anything ticked, the follow-up asks the same four things: **since when,
how often, what makes it worse, what makes it better.**
## 3.2 Head & neurological
| ID | Question | Type | Options / units | Req. |
|----|----------|------|-----------------|------|
| `sys_head` | Do you experience any of these? | Multi-select | Headaches / Migraines / Dizziness / Fainting / Tremors / Memory problems / Difficulty concentrating / None of these | Yes |
| `sys_head_detail` | Since when, how often, what triggers it, what relieves it? | Long text | — | Cond. |
| `sys_head_triggers` | Do any of these seem to bring it on? | Multi-select | Food / Stress / Alcohol / Dehydration / Tiredness / Screen time / Menstrual cycle / Weather / Don't know | Cond. |
| `sys_neuro` | And any of these? | Multi-select | Muscle weakness / Muscle pain / Numbness or pins and needles / Seizures / Insomnia / None of these | Yes |
| `sys_neuro_detail` | Where, and since when? | Long text | — | Cond. |
`*_detail` and `sys_head_triggers` → if the parent is anything other than *None of these*
`sys_cardio_exertion` → if `sys_cardio` includes *Breathlessness on exertion*.
A client who reports *Breathlessness at rest* has already fired a stop, so this
question is never reached down that branch.
!!! danger "Refer before training"
Fainting, seizures, tremors, or numbness and weakness in a limb are
**Refer & stop** — see [Screening red flags](../knowledge-base/red-flags.md).
Dizziness is already captured as `parq_3_dizziness`; if it appears here but
not there, go back and resolve the contradiction with the client.
## 3.3 Cardiorespiratory
| ID | Question | Type | Options / units | Req. |
|----|----------|------|-----------------|------|
| `sys_cardio` | Do you experience any of these? | Multi-select | Breathlessness at rest / Breathlessness on exertion / Chest pain / Heart palpitations / Persistent cough / Wheezing / Night sweats / Swelling in the ankles or feet / None of these | Yes |
| `sys_cardio_detail` | Describe what you ticked. | Long text | — | Cond. |
| `sys_cardio_exertion` | At what level of effort does breathlessness start? | Single choice | At rest / Walking slowly / Walking briskly / Climbing stairs / Only during hard exercise / Not applicable | Cond. |
!!! danger "Overlaps the PAR-Q+ deliberately"
Breathlessness is asked twice — here and as `parq_2a_breathlessness` in
[2.1](02-health-history.md#21-pre-exercise-screening). That redundancy is
intentional: clients under-report on a form headed "screening" and report
more freely on a symptom checklist. **Any disagreement between the two is
resolved in the client's favour**, meaning the more serious answer stands
and clearance is required.
Chest pain is **not** asked twice. `sys_cardio` is the only field on the
questionnaire that asks about it, so this page carries its stop entry
alone — see [3.10](#310-red-flags).
## 3.4 Musculoskeletal
Joint and spine symptoms are covered in depth in
[section 4](04-injuries-and-movement.md). This block only catches the systemic
pattern — symmetrical, migratory or inflammatory joint pain that suggests
something other than a training injury.
| ID | Question | Type | Options / units | Req. |
|----|----------|------|-----------------|------|
| `sys_msk` | Do you experience any of these? | Multi-select | Joint pain in several joints at once / Joint pain that moves around / Morning stiffness lasting over 30 minutes / Joint swelling / Joint redness or heat / Chronic widespread pain / None of these | Yes |
| `sys_msk_detail` | Which joints, and since when? | Long text | — | Cond. |
!!! tip "Inflammatory versus mechanical"
Morning stiffness over 30 minutes, symmetrical joint involvement, or
swelling with heat point away from a mechanical problem you can program
around. Refer, and don't load the affected joints until someone qualified
has looked.
## 3.5 Digestive
| ID | Question | Type | Options / units | Req. |
|----|----------|------|-----------------|------|
| `sys_digestive_appetite` | Do you have any issues with your appetite? | Yes/No | — | Yes |
| `sys_digestive_portions` | Do you have any issues with portion sizes (eating too much or too little)? | Yes/No | — | Yes |
| `sys_digestive_nausea` | Do you experience nausea? | Yes/No | — | Yes |
| `sys_digestive_reflux` | Do you experience reflux or heartburn? | Yes/No | — | Yes |
| `sys_digestive_bloating` | Do you experience bloating? | Yes/No | — | Yes |
| `sys_digestive_wind` | Do you experience excessive wind? | Yes/No | — | Yes |
| `sys_digestive_pain` | Do you experience abdominal pain? | Yes/No | — | Yes |
| `sys_digestive_vomiting` | Do you experience vomiting? | Yes/No | — | Yes |
| `sys_digestive_constipation` | Do you experience constipation? | Yes/No | — | Yes |
| `sys_digestive_diarrhoea` | Do you experience diarrhoea? | Yes/No | — | Yes |
| `sys_digestive_snacking` | Do you snack between meals? | Yes/No | — | Yes |
| `sys_bowel_empty` | Do you feel that you fully empty your bowels? | Yes/No | — | No |
| `sys_bowel_frequency` | How often do you have a bowel movement? | Short text | — | No |
| `sys_laxatives` | Do you use laxatives? | Single choice | Never / Occasionally / Weekly / Daily | No |
!!! danger "The three that are referrals, not notes"
Blood in the stool, black or tarry stools, and unexplained vomiting were on
the source sheet as matrix rows. They are **not** matrix rows — they are
urgent referrals, and burying them in a grid makes them easy to skim past.
They are asked separately below and they are not something a coach manages.
| ID | Question | Type | Options / units | Req. |
|----|----------|------|-----------------|------|
| `sys_gi_urgent` | Have you noticed any of these? | Multi-select | Blood in your stool / Black or tarry stools / Vomiting you can't explain / Unintentional weight loss / Difficulty swallowing / None of these | Yes |
| `sys_gi_urgent_detail` | Since when? | Long text | — | Cond. |
| `sys_gi_other` | And any of these? | Multi-select | Haemorrhoids / Anal fissures / Hernia / None of these | No |
!!! danger "Stop rule"
Any tick in `sys_gi_urgent` other than *None of these* means **Refer &
stop**: no assessment, no programme, direct the client to their doctor
today. Unintentional weight loss in particular is often mistaken for
progress — it is not.
## 3.6 Urinary & pelvic
| ID | Question | Type | Options / units | Req. |
|----|----------|------|-----------------|------|
| `sys_urinary` | Do you experience any of these? | Multi-select | Difficulty passing urine / Needing to go very frequently / Urgency / Pain or burning / Blood in urine / Recurrent infections / Kidney stones / Leaking when you cough, laugh or jump / None of these | Yes |
| `sys_urinary_detail` | Describe what you ticked. | Long text | — | Cond. |
| `sys_urine_frequency` | How frequently do you urinate during the day and at night? | Short text | — | No |
| `sys_urine_colour` | How would you describe the usual color of your urine? | Short text | — | No |
Blood in urine is a referral.
## 3.7 Menstrual & hormonal
Every question is optional.
Ask `sys_menses_status` of **every** client — it is the gate, and its
*Not applicable* option is how a client for whom this block is irrelevant says
so in one turn. Do not decide in advance who to skip it for: `client_gender`
in [section 1](01-about-you.md#11-identity) is not a reliable proxy for
whether someone menstruates, and pre-judging it is both wrong often enough to
matter and unpleasant when it is wrong.
If `sys_menses_status` is *Not applicable* or *Prefer not to say*, skip the
rest of the block and record those fields as `skipped — not triggered`. Any
other answer opens the block.
| ID | Question | Type | Options / units | Req. |
|----|----------|------|-----------------|------|
| `sys_menses_status` | Which describes you? | Single choice | Cycling regularly / Cycling irregularly / Pregnant / Postpartum / Perimenopausal / Post-menopausal / On hormonal contraception / Not applicable / Prefer not to say | No |
| `sys_menses_age` | Age at first period | Number | years | No |
| `sys_menses_length` | Typical cycle length | Number | days | No |
| `sys_menses_duration` | How many days of bleeding? | Number | days | No |
| `sys_menses_flow` | How heavy is the bleeding? | Single choice | Light / Moderate / Heavy / Very heavy | No |
| `sys_menses_symptoms` | Do you get any of these around your cycle? | Multi-select | Cramping / Sugar cravings / Increased appetite / Low mood / Irritability / Mood swings / Bloating / Joint aches / Hot flushes / Fatigue / Headaches / None of these | No |
| `sys_menses_training` | Does your cycle change what training feels possible? | Single choice | Significantly / Somewhat / Not really / Prefer not to say | No |
| `sys_pregnancy_plans` | Are you planning a pregnancy in the next year? | Single choice | Yes / No / Maybe / Prefer not to say | No |
`sys_menses_age`, `sys_menses_length`, `sys_menses_duration`,
`sys_menses_flow`, `sys_menses_symptoms`, `sys_menses_training` and
`sys_pregnancy_plans` → if `sys_menses_status` is anything other than
*Not applicable* or *Prefer not to say*
!!! tip "Why the detail earns its place"
Cycle length, flow and symptom load are the difference between periodising
training around a client's cycle and ignoring it. Heavy bleeding with
fatigue is also worth an iron-status conversation with their doctor —
`sys_menses_flow` = *Very heavy* alongside `sys_endocrine` fatigue is a
common and very fixable pattern.
Absent periods in a client who trains hard or eats little is a **referral**,
not a training variable. Read it with `nut_disordered_history` in
[section 7](07-nutrition.md).
## 3.8 Endocrine & metabolic
!!! warning "Scope"
Delete 3.8 unless a licensed practitioner is reading the answers. For a
coach, the only actionable output is *refer to a doctor*, which
[section 2](02-health-history.md) already achieves.
| ID | Question | Type | Options / units | Req. |
|----|----------|------|-----------------|------|
| `sys_endocrine` | Do you experience any of these? | Multi-select | Unusual sensitivity to cold / Unusual sensitivity to heat / Hair loss / Unexplained weight change / Persistent fatigue / Racing heart / Tremor / Very dry skin / None of these | No |
| `sys_pancreas` | And any of these? | Multi-select | Shakiness when meals are delayed / Light-headedness before eating / Sweating between meals / Strong sugar cravings / Excessive thirst / None of these | No |
| `sys_adrenal` | And any of these? | Multi-select | Exhausted on waking despite sleeping / Energy crash mid-afternoon / Second wind late at night / Light-headed on standing quickly / Craving salty food / None of these | No |
| `sys_endocrine_detail` | Anything you'd like to add? | Long text | — | No |
!!! note "On the last two blocks"
`sys_pancreas` symptoms are worth flagging because they change **when** a
client should eat relative to training, and because they may indicate
undiagnosed glucose dysregulation — which is a doctor's question.
`sys_adrenal` describes a real and common fatigue pattern, and the answers
usefully shape session timing. But "adrenal fatigue" is not a recognised
medical diagnosis, and these symptoms overlap heavily with poor sleep,
under-eating, depression, anaemia and thyroid disease — all of which are
diagnosable and treatable. Treat a positive cluster as a prompt to check
[section 8](08-lifestyle.md) and to refer, never as a finding.
## 3.9 Anything else
| ID | Question | Type | Options / units | Req. |
|----|----------|------|-----------------|------|
| `sys_other` | Is there any other symptom that bothers you regularly? | Long text | — | No |
| `sys_worst` | If you could fix one physical complaint, which would it be? | Long text | — | No |
!!! tip "`sys_worst` is the one clients answer honestly"
It routinely surfaces the thing they came in for but didn't put under
"goals" — a knee that stops them playing with their kids, reflux that
makes evening training miserable. Read it against `goal_primary` in
[section 6](06-goals.md).
## 3.10 Red flags
A symptom sweep is exactly where the largest share of the stop-and-refer list
surfaces. Full outcome definitions are in
[Screening red flags](../knowledge-base/red-flags.md).
**Stop and refer immediately** — no assessment, no session, today:
- Chest pain, pressure or tightness (`sys_cardio` includes *Chest pain*).
Stop whether it comes on at rest or only on exertion — the distinction
changes the urgency for the doctor, not whether you stop. Record whatever
the client already said in `sys_cardio_detail`; do **not** ask a follow-up
first. This is the trigger the whole stop-and-refer path was built for.
- Breathlessness at rest or on minimal exertion (`sys_cardio_exertion` = *At
rest* or *Walking slowly*, or `sys_cardio` includes *Breathlessness at
rest*). *Walking slowly* is in the trigger deliberately: someone who is
breathless crossing a room is not a training candidate today.
- New, unexplained swelling in one leg with pain or warmth (`sys_cardio`
includes *Swelling in the ankles or feet*, reported with pain or warmth)
- Blood in the stool, black or tarry stools, or unexplained vomiting
(`sys_gi_urgent`)
- Unintentional weight loss (`sys_gi_urgent`) — easily mistaken for progress,
and never treated as it
- Difficulty swallowing that is new or getting worse (`sys_gi_urgent`)
- Blood in the urine (`sys_urinary`)
- Seizures, fainting or unexplained tremor (`sys_head`, `sys_neuro`)
- New numbness or weakness in a limb (`sys_neuro`) — if it's pain-related
rather than a standalone neurological symptom, see
[4.2](04-injuries-and-movement.md#42-red-flags) too
**Clearance required before training:**
- Epilepsy with seizures in the last 12 months (`sys_head` or `sys_neuro`
includes *Seizures* — cross-check against `health_conditions` in
[2.9](02-health-history.md#29-red-flags))
- A concussion in the last 3 months without a return-to-activity clearance —
there is no dedicated field yet; treat a head injury reported under
`sys_head` as this trigger until one exists
**Proceed with caution:**
| Flag | Source field | Typical modification |
|------|--------------|----------------------|
| Pelvic floor symptoms | `sys_urinary` | Avoid impact and heavy intra-abdominal pressure; refer to a pelvic health physio |
| Inflammatory joint pattern — several joints, migratory, morning stiffness over 30 min | `sys_msk` | Don't load affected joints; refer for a rheumatology opinion |
| Symptoms of glucose dysregulation — shakiness when meals are delayed, excessive thirst | `sys_pancreas` | Fixed session timing, carbohydrate available, refer for blood glucose testing |
| Absent periods in a client training hard or eating little | `sys_menses_status` | Reduce training load, refer; do not treat as a training variable |
| Very heavy menstrual bleeding with fatigue | `sys_menses_flow`, `sys_endocrine` | Refer for iron studies; expect endurance work to feel disproportionately hard |
If a stop condition fires here, use the wording in
[Stop conditions](../knowledge-base/stop-conditions.md#the-wording) and hand off
immediately — do not finish this section first.
---
**Previous:** [2. Health & medical history](02-health-history.md) ·
**Next:** [4. Injuries & movement](04-injuries-and-movement.md)
# 4. Injuries & movement
Filled by Client ·
Questions 3 ·
Time ~2 min ·
Prefixinj_*
What hurts now. Answers here feed the exercise exclusion list, so they need to
be specific — "bad back" is not actionable, "left-sided low back pain on
flexion, worse in the morning" is.
## 4.1 Current pain
| ID | Question | Type | Options / units | Req. |
|----|----------|------|-----------------|------|
| `inj_current_pain` | Are you currently in pain, or experiencing discomfort anywhere? | Yes/No | — | Yes |
| `inj_pain_sites` | Where is it? | Multi-select | Neck / Shoulder or arm / Elbow, wrist or hand / Upper back / Low back / Hip or groin / Knee or leg / Ankle or foot / Somewhere else | Cond. |
| `inj_pain_sites_detail` | For each site: which side, what brings it on, how long it has been there, and whether there is any numbness, tingling or weakness. | Long text | — | Cond. |
`inj_pain_sites` → if `inj_current_pain` = Yes
`inj_pain_sites_detail` → if `inj_current_pain` = Yes
!!! tip "Don't read the nine options out"
Ask "whereabouts?" and map what comes back. People know where they hurt and
say so in their own words; the list exists to normalise the answer, not to
be recited. It is the one multi-select on the questionnaire that should
almost never be voiced — reading nine body parts down a phone invites the
client to agree with whichever one they heard last. Only offer the options,
grouped and in two passes, if they genuinely cannot place it.
*Shoulder or arm* and *Knee or leg* deliberately span a whole limb, because
the answer this section most needs to hear — pain that radiates from the
back into a limb — is not a point on the body. Record the source in
`inj_pain_sites` and the radiation in `inj_pain_sites_detail`.
`inj_pain_sites_detail` is where this section earns its place. "Bad back" does
not change a programme; "left low back, worse on flexion, three months, no
numbness" does. Ask for the side every time — the client will not volunteer it.
It is also the field that carries the neurological detail the red flag below
depends on, so do not let it collapse into one word.
!!! danger "Refer out, don't train through"
Pain that wakes the client at night, or pain with numbness, tingling or
weakness radiating into a limb, is a referral, not a programming problem.
See [Screening red flags](../knowledge-base/red-flags.md).
## 4.2 Red flags
**Stop and refer immediately:**
- Pain with numbness, tingling or weakness spreading into a limb, or any loss
of bladder or bowel control (`inj_pain_sites_detail`)
**Proceed with caution:**
| Flag | Source field | Typical modification |
|------|--------------|----------------------|
| Arthritis or joint pain | `inj_pain_sites` | Low-impact options, avoid end-range loading, longer warm-up |
| Ongoing pain that limits daily activity | `inj_pain_sites_detail` | Work around the region, monitor session to session |
Full outcome definitions: [Screening red flags](../knowledge-base/red-flags.md). If
a stop condition fires here, use the wording in
[Stop conditions](../knowledge-base/stop-conditions.md#the-wording) and hand off
immediately — do not finish this section first.
---
**Previous:** [3. Systems review](03-systems-review.md) ·
**Next:** [5. Activity & training history](05-activity-history.md)
# 5. Activity & training history
Filled by Client ·
Questions 6 ·
Time ~3 min ·
Prefixact_*
Where the client is starting from: what they currently do, how much of their
day is spent moving, and how they feel about exercise in the first place.
## 5.1 Current activity
| ID | Question | Type | Options / units | Req. |
|----|----------|------|-----------------|------|
| `act_currently_active` | Are you exercising at the moment? | Yes/No | — | Yes |
| `act_types` | Which types of physical activity or mind-body practices do you currently engage in? Select all that apply. | Multi-select | **Cardiovascular exercise:** walking, running, cycling, swimming, aerobic dance, or using cardiovascular equipment at the gym / **Resistance or strength training:** free weights, resistance machines, resistance bands, functional training, or bodyweight exercises / **Core-strengthening exercise:** Pilates, Callanetics, or other core-training exercises / **Flexibility and mobility exercise:** yoga, stretching, or Feldenkrais / **Mind-body and relaxation practices:** meditation, mindfulness, breathing exercises, relaxation techniques, or guided imagery / **I do not currently engage in regular physical activity or mind-body practices** | Yes |
| `act_sessions_per_week` | How many sessions in a typical week? | Number | sessions | Cond. |
| `act_session_length` | How long is a typical session? | Short text | — | Cond. |
`act_sessions_per_week`, `act_session_length` → if `act_currently_active` = Yes
*I do not currently engage in regular physical activity or mind-body practices*
is an exclusive escape option: selecting it clears every other option, and
selecting any other option clears it.
## 5.2 Daily movement & attitude
| ID | Question | Type | Options / units | Req. |
|----|----------|------|-----------------|------|
| `act_daily_lifestyle` | How would you describe your typical daily lifestyle, excluding planned exercise? | Single choice | Sedentary, I spend most of the day sitting / Active, I spend most of the day standing or moving | Yes |
| `act_attitude` | How do you feel about physical activity? | Single choice | I enjoy it / I exercise, but do not particularly enjoy it / I do not enjoy physical activity / I have not yet found an activity that suits me | Yes |
!!! tip "`act_attitude` shapes how the programme is sold, not just written"
*I have not yet found an activity that suits me* is the most useful answer
on the page — it invites variety and experimentation early rather than
committing the client to a modality they will quietly abandon. *I do not
enjoy physical activity* calls for the smallest viable starting dose and
adherence built on habit rather than enthusiasm.
## 5.3 Red flags
`act_currently_active` = No is one of the cardiovascular risk factors counted
toward the age-and-load thresholds in
[1.6](01-about-you.md#16-red-flags) — being sedentary at over 40, with one
other risk factor from [2.9](02-health-history.md#29-red-flags), is enough
to consider clearance before vigorous-intensity work. No flag in this section
stands alone.
---
**Previous:** [4. Injuries & movement](04-injuries-and-movement.md) ·
**Next:** [6. Goals & motivation](06-goals.md)
# 6. Goals & motivation
Filled by Client ·
Questions 5 ·
Time ~3 min ·
Prefixgoal_*
What the client wants, and what is likely to get in the way.
## 6.1 The goal
| ID | Question | Type | Options / units | Req. |
|----|----------|------|-----------------|------|
| `goal_primary` | What are your most important goals? | Multi-select | Health / Lose weight / Lose body fat / Build muscle / Get stronger / Improve endurance / Improve health markers / Move without pain / Improve mobility and flexibility / Look better / Feel better in my body / Perform better in a sport / Return to training after a break / General fitness / **Weight isn't what I'm here for** / **I'm not sure yet** | Yes |
!!! note "The last two options are the important ones"
The source sheet offers `לא מעניין אותי משקל` — *weight doesn't interest
me* — and `לא יודעת`, *I don't know*, alongside the conventional goals.
Both are worth copying exactly.
Without an explicit opt-out, a client who doesn't want to talk about weight
has no way to say so and picks the nearest weight-shaped option instead;
you then spend twelve weeks optimising something they never asked for.
Without *I'm not sure yet*, an undecided client invents a goal to finish
the form — and the invented one is what gets programmed.
*I'm not sure yet* is a useful answer, not a failed one. It means the first
session includes a goal-setting conversation instead of starting from a
fixed target.
Both are exclusive escape options: selecting either clears every other
goal, and selecting any goal clears them.
## 6.2 Obstacles
| ID | Question | Type | Options / units | Req. |
|----|----------|------|-----------------|------|
| `goal_obstacles` | What is most likely to get in the way? | Multi-select | Time / Work schedule / Family commitments / Energy levels / Motivation / Money / Injury / Travel / Social eating and drinking / Not knowing what to do / Other | Yes |
| `goal_obstacles_plan` | When that happens, what should we do about it? | Long text | — | Cond. |
| `goal_support` | Who at home or work supports you in this? | Long text | — | No |
| `goal_accountability` | What kind of accountability works for you? | Single choice | Frequent check-ins / Weekly summary / Just the programme, leave me to it / Group or community / Not sure yet | Yes |
`goal_obstacles_plan` → if `goal_obstacles` names at least one obstacle
The question is worded as a follow-up — "when *that* happens" — so it only
makes sense once the client has named something. A client who says nothing
gets in the way is not asked what to do about it.
---
**Previous:** [5. Activity & training history](05-activity-history.md) ·
**Next:** [7. Nutrition & hydration](07-nutrition.md)
# 7. Nutrition & hydration
Filled by Client ·
Questions 33 ·
Time ~15 min ·
Prefixnut_*
!!! warning "Scope check"
Only include this section if nutrition is within your scope of practice and
your registration allows it. Where it isn't, cut the section down to 7.1,
7.3 and 7.7 — enough to train the client safely and to know when to refer
to a dietitian. The food frequency grid in 7.2 in particular is a
dietitian's tool.
## 7.1 Typical intake
| ID | Question | Type | Options / units | Req. |
|----|----------|------|-----------------|------|
| `nut_typical_day` | Walk us through what you ate and drank yesterday, from waking to bed. | Long text | Include drinks and snacks | Yes |
| `nut_typical_representative` | Was yesterday typical? | Single choice | Yes / No, better than usual / No, worse than usual | Yes |
| `nut_meals_per_day` | How many meals and snacks on a normal day? | Number | count | No |
| `nut_first_meal` | When do you usually eat your first meal? | Short text | Time of day | No |
| `nut_last_meal` | When do you usually eat your last meal? | Short text | Time of day | No |
| `nut_weekend_differs` | Do weekends look different from weekdays? | Long text | — | No |
## 7.2 Food frequency
A frequency grid, adapted from the food table on the practitioner sheet. It
catches what a 24-hour recall misses — the client who reports a clean
Tuesday and eats very differently the rest of the week.
| ID | Question | Type | Options / units | Req. |
|----|----------|------|-----------------|------|
| `nut_ffq` | How often do you eat each of these? | Matrix | **Columns:** Daily · A few times a week · Weekly · Occasionally · Never. **Rows:** see the group list below | Yes |
| `nut_ffq_notes` | Anything about your eating the grid doesn't capture? | Long text | — | No |
Rows for `nut_ffq`:
| Group | Examples to show the client |
|-------|-----------------------------|
| Bread & baked goods | Bread, rolls, pita, bagels |
| Crackers & crispbreads | Crackers, rice cakes, breadsticks |
| Breakfast cereals | Cereal, granola, oats |
| Rice, pasta & grains | Rice, pasta, couscous, buckwheat, ptitim |
| Starchy vegetables | Potato, sweet potato, corn, chips |
| Legumes | Lentils, chickpeas, beans, peas |
| Salad vegetables | Tomato, cucumber, pepper, carrot, radish, beetroot |
| Leafy greens & herbs | Lettuce, spinach, rocket, parsley, coriander, dill |
| Cruciferous & other cooked vegetables | Broccoli, cauliflower, cabbage, courgette, aubergine, mushrooms, pumpkin |
| Fresh fruit | Apple, banana, berries, melon, grapes, stone fruit |
| Dried fruit | Dates, raisins, figs, dried mango |
| White cheeses & yoghurt | Cottage, labneh, Bulgarian, plain yoghurt |
| Hard & yellow cheeses | Yellow cheese, goat's cheese, cream cheese |
| Milk & milk alternatives | Cow's milk, oat, soy, chocolate milk |
| Sweetened dairy desserts | Fruit yoghurt, dairy desserts |
| Eggs | Boiled, omelette, fried, shakshuka |
| Fish | Salmon, tuna, mackerel, sardines, sea bass, tilapia |
| Poultry | Chicken breast, thighs, turkey, schnitzel |
| Red meat & offal | Beef, goulash, liver, hearts |
| Processed meat | Salami, pastrami, sausages, burgers |
| Plant proteins | Tofu, seitan, soy |
| Nuts & seeds | Almonds, walnuts, cashews, sunflower, pumpkin, chia, flax, sesame |
| Oils & fats | Olive, canola, sesame, coconut oil |
| Spreads & dips | Tahini, hummus, avocado, mayonnaise |
| Savoury snacks | Crisps, Bamba, Bisli, pretzels, nachos |
| Fried & street food | Falafel, shawarma, bourekas, jachnun, malawach, pizza |
| Cakes, biscuits & pastries | Cakes, biscuits, wafers |
| Chocolate, sweets & ice cream | Chocolate, sweets, ice cream |
| Sweetened drinks | Cola, squash, iced coffee, milkshakes, energy drinks |
| Hot drinks | Coffee, instant coffee, tea |
| Water | — |
| Alcohol | Wine, beer, spirits |
!!! tip "Localise the examples, keep the groups"
The examples above follow the source sheet and are Israeli by default —
ptitim, jachnun, Bamba, bourekas. That specificity is the point: clients
recognise their own food and answer accurately, where "refined grains"
gets a shrug. Swap the examples for whatever your clients actually eat, but
keep the group structure so answers stay comparable between clients.
!!! warning "A frequency grid is not a diet analysis"
`nut_ffq` shows patterns — no vegetables, daily sweetened drinks, protein
only at dinner. It does not produce an intake estimate, and it should not
be scored or converted into calories. If you need that, refer to a
dietitian.
## 7.3 Dietary pattern & restrictions
| ID | Question | Type | Options / units | Req. |
|----|----------|------|-----------------|------|
| `nut_pattern` | Do you follow a particular way of eating? | Single choice | No specific pattern / Vegetarian / Vegan / Pescatarian / Halal / Kosher / Low carb or keto / Paleo / Intermittent fasting / Mediterranean / Other | Yes |
| `nut_pattern_other` | Describe it. | Short text | — | Cond. |
| `nut_intolerances` | Any food allergies or intolerances? | Long text | Include severity | Yes |
| `nut_dislikes` | Any foods you strongly dislike or won't eat? | Long text | — | No |
| `nut_medical_diet` | Are you on a diet prescribed for a medical reason? | Yes/No | — | Yes |
| `nut_medical_diet_detail` | Who prescribed it, and what does it involve? | Long text | — | Cond. |
| `nut_eating_limitation` | Is any injury, pain or physical limitation affecting how you eat — chewing, swallowing, shopping, standing to cook, or getting food to your mouth? | Yes/No | — | Yes |
| `nut_eating_limitation_detail` | Explain how. | Long text | — | Cond. |
`nut_pattern_other` → if `nut_pattern` = *Other*
`nut_medical_diet_detail` → if `nut_medical_diet` = Yes
`nut_eating_limitation_detail` → if `nut_eating_limitation` = Yes
!!! note "Why a physical question sits in the nutrition section"
`nut_eating_limitation` used to live in
[section 4](04-injuries-and-movement.md) under an `inj_*` ID, where it
displaced that section's pain-location question and never reached anyone
reading the nutrition record. It belongs here: a shoulder that cannot
reach a cupboard changes what the client eats, and it is the nutrition
plan, not the exercise exclusion list, that has to absorb that.
## 7.4 Cooking & environment
| ID | Question | Type | Options / units | Req. |
|----|----------|------|-----------------|------|
| `nut_who_cooks` | Who does most of the cooking in your household? | Single choice | Me / Partner / Shared / Someone else / Nobody, we eat out or order in | No |
| `nut_cooking_confidence` | How confident are you cooking from scratch? | Scale 1–5 | 1 = not at all, 5 = very | No |
| `nut_meals_out` | How many meals per week are eaten out, ordered in, or bought ready-made? | Number | meals | No |
| `nut_who_shops` | Who does the food shopping? | Single choice | Me / Partner / Shared / Someone else | No |
| `nut_household_eating` | Does anyone you live with eat very differently from you? | Long text | — | No |
## 7.5 Hydration & stimulants
| ID | Question | Type | Options / units | Req. |
|----|----------|------|-----------------|------|
| `nut_water` | How much water do you drink on a typical day? | Single choice | Under 1 L / 1–2 L / 2–3 L / Over 3 L / No idea | Yes |
| `nut_caffeine` | How many caffeinated drinks per day? | Number | cups or cans | No |
| `nut_caffeine_latest` | When do you consume caffeinated beverages? | Multi-select | Immediately after waking / Morning / Noon / Afternoon / Evening / Night / No specific time | No |
| `nut_beverage_sugar` | Do you add sugar or a sugar substitute to your beverages? | Yes/No | — | No |
| `nut_sugary_drinks` | Sugary or energy drinks per week? | Number | drinks | No |
!!! note "Tea counts"
`nut_caffeine` is routinely under-reported because clients count coffee and
energy drinks but not tea. Black, green and white tea all contain caffeine,
as do matcha and most iced teas. Say so next to the question — herbal and
rooibos infusions are the exceptions.
*No specific time* in `nut_caffeine_latest` is an exclusive escape option:
selecting it clears every other option, and selecting any other option clears
it.
Alcohol is captured once, in [section 2](02-health-history.md#28-lifestyle-risk-factors)
as `health_alcohol_units`. Don't duplicate it here.
## 7.6 Tracking & training nutrition
| ID | Question | Type | Options / units | Req. |
|----|----------|------|-----------------|------|
| `nut_tracked_before` | Have you tracked your food before? | Single choice | Currently tracking / Have before, not now / Never / Tried and disliked it | Yes |
| `nut_tracking_app` | Which app? | Short text | — | Cond. |
| `nut_around_training` | Do you eat before or after training? | Long text | — | No |
`nut_tracking_app` → if `nut_tracked_before` is *Currently tracking* or *Have before, not now*
Supplements are **not** asked here. They are captured once in
[section 2](02-health-history.md#23-vitamins-and-dietary-supplements) as
`health_supplements`. If the client raises them, record against that ID and
carry it forward — do not open a second supplement conversation.
## 7.7 Relationship with food
!!! danger "Handle with care"
These questions can surface an eating disorder. Ask them plainly, without
follow-up interrogation in the form itself, and make every one skippable. A
positive answer to `nut_disordered_history` is a **referral to a registered
dietitian or clinician** — not a prompt to design a stricter plan, and not
a reason to run [section 9](09-measurements.md).
!!! warning "This is a referral, not a stop — do not end the call"
`nut_disordered_history` = *Yes* is **not** a
[stop condition](../knowledge-base/stop-conditions.md). Do not deliver the
stop wording, do not hand to **stop & refer**, and do not end the
questionnaire. Follow
[sensitive questions](../knowledge-base/sensitive-questions.md): thank
them, say it will shape how the coach works with them, and carry on with
the next question. The referral is made by the coach from the handover
record, after the call.
Stopping here punishes the disclosure. A client who is told the interview
is over the moment they mention a history of anorexia learns that honesty
ends the call — and the section's remaining questions, including
`nut_support_wanted`, are exactly the ones the coach needs answered in
that case.
| ID | Question | Type | Options / units | Req. |
|----|----------|------|-----------------|------|
| `nut_appetite` | How would you describe your appetite? | Single choice | Low / Normal / Large / Varies a lot | No |
| `nut_emotional_eating` | Do you eat in response to stress, boredom or emotion? | Single choice | Often / Sometimes / Rarely / Never / Prefer not to say | No |
| `nut_disordered_history` | Have you ever had, or been treated for, a diagnosed eating disorder? | Single choice | Yes / No / Prefer not to say | No |
| `nut_support_wanted` | How much nutrition support would you like? | Single choice | Full plan / General guidelines / Just accountability / None, training only | Yes |
## 7.8 Red flags
| Flag | Source field | Typical modification |
|------|--------------|----------------------|
| Eating disorder history | `nut_disordered_history` | No weighing, no measurements, no photos, no calorie targets; refer to a dietitian |
This section has **no** *Stop and refer immediately* entry — the one flag it
carries is a caution flag, acted on by the coach after the call, not during
it. See the warning in [7.7](#77-relationship-with-food). Full outcome
definitions: [Screening red flags](../knowledge-base/red-flags.md).
---
**Previous:** [6. Goals & motivation](06-goals.md) ·
**Next:** [8. Sleep, stress & recovery](08-lifestyle.md)
# 8. Sleep, stress & recovery
Filled by Client ·
Questions 19 ·
Time ~7 min ·
Prefixlife_*
Training load has to fit the recovery capacity that's actually available. A
client sleeping five broken hours under high stress cannot absorb the same
programme as one sleeping eight — same body, different ceiling.
## 8.1 Sleep
| ID | Question | Type | Options / units | Req. |
|----|----------|------|-----------------|------|
| `life_sleep_hours` | How many hours do you sleep on a typical night? | Single choice | Under 5 / 5–6 / 6–7 / 7–8 / 8–9 / Over 9 | Yes |
| `life_bedtime` | What time do you usually go to bed? | Short text | Time of day | No |
| `life_waketime` | What time do you usually wake up? | Short text | Time of day | No |
| `life_sleep_quality` | How would you rate your sleep quality? | Scale 1–5 | 1 = very poor, 5 = excellent | Yes |
| `life_screens_bed` | Do you use screens in the hour before bed? | Single choice | Always / Usually / Sometimes / Rarely | No |
| `life_naps` | Do you nap during the day? | Single choice | Daily / A few times a week / Rarely / Never | No |
| `life_wake_state` | How do you usually feel on waking? | Single choice | Refreshed and energetic / Slow but fine / Tired / Exhausted | Yes |
| `life_sleep_continuity` | Is your sleep usually unbroken? | Single choice | Straight through / Wake once / Wake two or three times / Wake repeatedly | No |
!!! note "Sleep apnoea is a referral"
Loud snoring plus daytime sleepiness plus waking unrefreshed is a pattern
worth flagging to the client's doctor. It also caps what any training
programme can achieve until it's addressed.
## 8.2 Schedule
| ID | Question | Type | Options / units | Req. |
|----|----------|------|-----------------|------|
| `life_shift_work` | Do you work shifts, nights or an irregular schedule? | Yes/No | — | Yes |
| `life_shift_pattern` | Describe the pattern. | Long text | — | Cond. |
| `life_travel` | How often do you travel for work or otherwise? | Single choice | Never / A few times a year / Monthly / Weekly / Constantly | Yes |
| `life_caregiving` | Do you have caring responsibilities — children, parents, others? | Long text | — | No |
`life_shift_pattern` → if `life_shift_work` = Yes
## 8.3 Stress
| ID | Question | Type | Options / units | Req. |
|----|----------|------|-----------------|------|
| `life_stress_level` | How stressed do you feel on an average day? | Scale 1–10 | 1 = completely relaxed, 10 = overwhelmed | Yes |
| `life_stress_coping` | What do you currently do to unwind? | Long text | — | No |
## 8.4 Energy & recovery
| ID | Question | Type | Options / units | Req. |
|----|----------|------|-----------------|------|
| `life_energy_pattern` | When is your energy highest? | Single choice | Early morning / Late morning / Afternoon / Evening / It's low all day / It varies | Yes |
| `life_energy_crash` | Do you get a noticeable energy slump during the day? | Single choice | Yes, most days / Sometimes / Rarely / No | No |
| `life_recovery_habits` | What do you do regularly to recover? | Short text | — | No |
| `life_socialising` | Do you get out and see people? | Single choice | Regularly / Occasionally / Rarely / Almost never | No |
| `life_holidays` | Do you take proper holidays or time off? | Single choice | Regularly / Occasionally / Rarely / Never | No |
!!! note "Two questions that look like small talk"
`נוהגת לבלות?` and `נוהגת לצאת לחופשות?` — *do you go out?*, *do you take
holidays?* — sit on the source sheet among the medical questions, and they
belong there. Someone who never socialises and never takes time off has no
slack in their week, which caps recovery no matter what the programme says,
and rarely presents it as a problem because it has become normal.
Read them with `life_stress_level`. A client who is highly stressed and
never off needs the training volume dialled *down* at the start, which is
the opposite of what they will ask for.
!!! tip "Cross-reference before setting frequency"
Read `life_energy_pattern` against `pref_time_of_day` in
[section 10](10-preferences-logistics.md). A client whose energy peaks in the
morning but who has only booked evening slots will have harder sessions than
the programme assumes — and will report it as the programme being too hard.
## 8.5 Red flags
| Flag | Source field | Typical modification |
|------|--------------|----------------------|
| Sleep under 5 hours or high stress | `life_sleep_hours`, `life_stress_level` | Reduce volume and intensity; expect slower progression |
| Waking unrefreshed with snoring and daytime sleepiness | `life_wake_state`, `life_sleep_continuity` | Refer for sleep apnoea assessment; cap intensity until addressed |
| No socialising, no time off, high stress | `life_socialising`, `life_holidays`, `life_stress_level` | Start below capacity; build recovery into the plan rather than adding volume |
Full outcome definitions: [Screening red flags](../knowledge-base/red-flags.md).
---
**Previous:** [7. Nutrition & hydration](07-nutrition.md) ·
**Next:** [9. Measurements & assessments](09-measurements.md)
# 9. Measurements & assessments
Filled by Coach ·
Questions 47 ·
Time ~45 min in person ·
Prefixmeas_*, screen_*, test_*
Completed by the coach at the baseline appointment, not by the client at home.
Every field is optional at the form level — what gets measured depends on the
goal, the client's consent, and what [section 2](02-health-history.md) allowed.
!!! danger "Prerequisites"
Do not run any of section 9.5 until:
1. [Section 2](02-health-history.md) is complete and any *Yes* on the PAR-Q+
has been resolved, with clearance on file where indicated.
2. Resting blood pressure and heart rate (9.3) are within safe limits — see
[Screening red flags](../knowledge-base/red-flags.md).
3. The client has given explicit consent for physical measurement
(`consent_measurement` in [section 11](11-consent.md)).
Skip 9.4 entirely if `meas_weight_aware` indicates the client would rather
not know, or `nut_disordered_history` is *Yes*.
## 9.1 Session details
| ID | Field | Type | Options / units |
|----|-------|------|-----------------|
| `meas_date` | Assessment date | Date | `YYYY-MM-DD` |
| `meas_assessor` | Assessed by | Short text | Coach name |
| `meas_type` | Assessment type | Single choice | Baseline / 6-week review / 12-week review / Ad hoc |
| `meas_conditions` | Conditions | Long text | Time of day, fasted or fed, footwear, clothing |
!!! tip "Repeatability beats precision"
Note the conditions and reproduce them at every re-test. A tape measure used
the same way each time tells you more about the trend than a DEXA scan taken
once.
## 9.2 What the client already knows
Asked before anything is measured, and asked of the client rather than the
scale.
| ID | Field | Type | Options / units |
|----|-------|------|-----------------|
| `meas_weight_aware` | Do you know roughly what you weigh? | Single choice | Yes, and I'm happy to say / Yes, but I'd rather not say / No, and I'd rather not know / No, but I'd like to find out |
| `meas_weight_self` | If you're happy to, what is it? | Number + unit | kg or lb — self-reported |
| `meas_bodyfat_aware` | Do you know your body fat percentage? | Single choice | Yes / No / I don't want to discuss body fat |
| `meas_blind_weigh` | Would you prefer to be weighed without seeing the number? | Single choice | Yes / No / I'd rather not be weighed at all |
!!! tip "Borrowed directly from the source sheet"
The practitioner sheet asks `מודעת למשקל` and `מודעת ל-% שומן` — literally
*aware of your weight* / *aware of your body fat* — rather than demanding
the figures. It's a better question than the one I had, for two reasons.
It captures the client's *relationship* with the number, which determines
whether the number is safe to use at all. And it gives a graceful way to
decline that isn't a blank field, so you can tell "won't say" apart from
"skipped the form."
`meas_blind_weigh` follows from it: weighing a client while turning the
display away is standard practice in eating-disorder-aware settings, and
costs nothing to offer to everyone.
!!! danger "These answers are binding"
*I'd rather not know*, *I don't want to discuss body fat*, or *I'd rather
not be weighed at all* override the rest of this section. Do not weigh, do
not measure, do not mention the number later. Read alongside
`nut_disordered_history` in [section 7](07-nutrition.md).
## 9.3 Vitals & anthropometrics
| ID | Field | Type | Options / units |
|----|-------|------|-----------------|
| `meas_height` | Height | Number + unit | cm or in |
| `meas_weight` | Body weight | Number + unit | kg or lb |
| `meas_bmi` | BMI | Calculated | kg/m² — derived, not entered |
| `meas_resting_hr` | Resting heart rate | Number | bpm, seated, after 5 min rest |
| `meas_bp_systolic` | Blood pressure — systolic | Number | mmHg |
| `meas_bp_diastolic` | Blood pressure — diastolic | Number | mmHg |
| `meas_bp_repeat` | Repeat reading if first was elevated | Short text | `systolic/diastolic` |
## 9.4 Body composition
Requires `consent_measurement`. Skip per the prerequisites above.
| ID | Field | Type | Options / units |
|----|-------|------|-----------------|
| `meas_waist` | Waist circumference | Number | cm, at narrowest point |
| `meas_hip` | Hip circumference | Number | cm, at widest point |
| `meas_whr` | Waist-to-hip ratio | Calculated | derived |
| `meas_chest` | Chest circumference | Number | cm |
| `meas_arm_l` / `meas_arm_r` | Upper arm, left / right | Number | cm, relaxed, mid-belly of biceps |
| `meas_thigh_l` / `meas_thigh_r` | Mid-thigh, left / right | Number | cm |
| `meas_calf_l` / `meas_calf_r` | Calf, left / right | Number | cm |
| `meas_bodyfat_pct` | Estimated body fat | Number | % |
| `meas_bodyfat_method` | Method used | Single choice | Skinfolds / Bioimpedance / DEXA / Visual estimate / Not measured |
| `meas_photos_taken` | Progress photos taken | Yes/No | Requires `consent_photos` |
## 9.5 Movement screen
Score each: **0** = unable or painful · **1** = compensated · **2** = competent
· **3** = clean and controlled. Record *where* the compensation appeared, not
just the number.
| ID | Test | Type | Notes to capture |
|----|------|------|------------------|
| `screen_overhead_squat` | Overhead squat, 5 reps | Score 0–3 | Heel lift, knee valgus, forward torso, arm drift |
| `screen_hip_hinge` | Hip hinge with dowel | Score 0–3 | Lumbar flexion, dowel contact points |
| `screen_shoulder_mobility` | Back-scratch / Apley's | Score 0–3 | Distance between hands, left vs right |
| `screen_ankle_dorsiflexion` | Knee-to-wall | Number + score | cm from wall, each side |
| `screen_single_leg_balance` | Eyes-open single leg stand | Number + score | Seconds held, each side, max 60 |
| `screen_thoracic_rotation` | Seated rotation | Score 0–3 | Degrees, left vs right |
| `screen_active_slr` | Active straight leg raise | Score 0–3 | Each side |
| `screen_pain_provoked` | Did any test provoke pain? | Yes/No + text | **Stop the screen if yes** |
!!! danger "Pain ends the screen"
If `screen_pain_provoked` is *Yes*, stop testing, record what provoked it,
and route back to [section 4](04-injuries-and-movement.md). Do not proceed
to 9.6.
## 9.6 Capacity tests
Select only what is appropriate for the client's screening status and goal.
| ID | Test | Type | Options / units |
|----|------|------|-----------------|
| `test_pushup` | Push-up test to failure | Number | reps, note full or knee variation |
| `test_sit_to_stand` | 30-second sit-to-stand | Number | reps |
| `test_plank` | Front plank hold | Number | seconds, stop on form breakdown |
| `test_grip_l` / `test_grip_r` | Grip strength, left / right | Number | kg, dynamometer |
| `test_step_test` | 3-minute step test | Number | recovery HR at 1 min |
| `test_walk_6min` | 6-minute walk test | Number | metres |
| `test_vo2_estimate` | Estimated VO₂max | Calculated | ml/kg/min, state the protocol used |
| `test_squat_est_1rm` | Estimated squat 1RM | Number + unit | From a submaximal set, note reps and load |
| `test_deadlift_est_1rm` | Estimated deadlift 1RM | Number + unit | As above |
!!! warning "Estimate, don't max out"
On a first assessment, use submaximal sets and an estimation formula rather
than a true 1RM attempt. The number is barely less accurate and the risk is
an order of magnitude lower.
## 9.7 Coach notes
| ID | Field | Type | Options / units |
|----|-------|------|-----------------|
| `meas_priorities` | Top three training priorities from this assessment | Long text | — |
| `meas_contraindications` | Confirmed exclusion list | Long text | Carried over from section 3, plus anything found today |
| `meas_referrals` | Referrals made | Long text | Who, why, date |
| `meas_next_review` | Next review date | Date | `YYYY-MM-DD` |
| `meas_notes` | Anything else | Long text | — |
## 9.8 Red flags
**Stop and refer immediately** — no assessment, no session, today:
- Resting blood pressure at or above **180/110 mmHg** on two readings
(`meas_bp_systolic` / `meas_bp_diastolic`)
- Resting heart rate below **40** or above **120 bpm** in an asymptomatic
client, unexplained by medication (`meas_resting_hr`)
**Clearance required before training:**
- Resting blood pressure at or above **160/100 mmHg** (`meas_bp_systolic` /
`meas_bp_diastolic`)
**Proceed with caution:**
| Flag | Source field | Typical modification |
|------|--------------|----------------------|
| Blood pressure 140–159 / 90–99 | `meas_bp_*` | Avoid Valsalva, breath-holding, heavy isometrics and inverted positions; recheck each session |
| Declines to know or discuss weight | `meas_weight_aware`, `meas_blind_weigh` | Skip 9.2–9.4 entirely; progress by performance and how clothes fit |
If a stop condition fires here, use the wording in
[Stop conditions](../knowledge-base/stop-conditions.md#the-wording) and route the
client to their doctor before continuing.
---
**Previous:** [8. Sleep, stress & recovery](08-lifestyle.md) ·
**Next:** [10. Preferences & logistics](10-preferences-logistics.md)
# 10. Preferences & logistics
Filled by Client ·
Questions 24 ·
Time ~7 min ·
Prefixpref_*
The constraints the programme has to live inside. Answers here override
anything ideal — a perfect four-day split is worthless to someone with three
hours a week and a set of adjustable dumbbells.
## 10.1 Availability
| ID | Question | Type | Options / units | Req. |
|----|----------|------|-----------------|------|
| `pref_days_per_week` | How many days a week can you realistically train? | Single choice | 1 / 2 / 3 / 4 / 5 / 6 / 7 | Yes |
| `pref_days_which` | Which days work best? | Multi-select | Mon / Tue / Wed / Thu / Fri / Sat / Sun / Flexible | Yes |
| `pref_time_of_day` | What time of day suits you? | Multi-select | Early morning / Morning / Lunchtime / Afternoon / Evening / Late evening / Varies | Yes |
| `pref_session_length` | How long can a session be? | Single choice | Up to 20 min / 20–30 min / 30–45 min / 45–60 min / 60–90 min / As long as needed | Yes |
| `pref_minimum_week` | On your worst week, what could you still commit to? | Short text | e.g. "two 20-minute sessions" | Yes |
!!! tip "10.1 last question is the safety net"
`pref_minimum_week` defines the deload-by-life plan. Write it into the
programme as a named fallback week from the start, so a bad week is a
documented option rather than a failure.
## 10.2 Where and with what
| ID | Question | Type | Options / units | Req. |
|----|----------|------|-----------------|------|
| `pref_location` | Where will you train? | Multi-select | Commercial gym / Home / Outdoors / Studio / Work gym / Hotel gyms when travelling | Yes |
| `pref_gym_name` | Which gym? | Short text | Helps match the programme to available kit | No |
| `pref_equipment` | What equipment do you have access to? | Multi-select | Barbell and plates / Squat rack / Dumbbells / Kettlebells / Resistance bands / Cable machine / Selectorised machines / Bench / Pull-up bar / Treadmill / Bike or spin bike / Rower / Mat only / Nothing, bodyweight only | Yes |
| `pref_equipment_home` | If training at home, describe the space. | Long text | Ceiling height, floor, noise limits, storage | Cond. |
| `pref_travel_setup` | What do you have access to when travelling? | Short text | — | Cond. |
`pref_equipment_home` → if `pref_location` includes *Home*
`pref_gym_name` → if `pref_location` includes *Commercial gym* or *Studio*
`pref_travel_setup` → if `pref_location` includes *Hotel gyms when travelling*
## 10.3 Style
| ID | Question | Type | Options / units | Req. |
|----|----------|------|-----------------|------|
| `pref_training_social` | How do you prefer to train? | Single choice | Alone / With a coach one-to-one / With a training partner / In a small group / In a class | Yes |
| `pref_coaching_style` | What coaching style gets the best out of you? | Single choice | Direct and demanding / Encouraging and supportive / Collaborative, explain the why / Hands-off, just give me the plan | Yes |
| `pref_enjoy` | Which of these do you enjoy? | Multi-select | Lifting heavy / High-intensity intervals / Steady cardio / Circuits / Mobility and stretching / Sport and games / Outdoor activity / Machines / Free weights | No |
| `pref_avoid` | Which would you rather avoid? | Multi-select | Same list as above | No |
| `pref_music_env` | Anything about the training environment that matters to you? | Long text | Busy gyms, music, mirrors, changing rooms | No |
!!! note "Take `pref_avoid` seriously"
An exercise the client dislikes has a compliance rate close to zero,
whatever its merits. Almost every training stimulus has a substitute they
will actually do.
## 10.4 Communication
| ID | Question | Type | Options / units | Req. |
|----|----------|------|-----------------|------|
| `pref_channel` | How should we communicate between sessions? | Single choice | Email / SMS / WhatsApp / In-app messaging / Phone call / No contact needed | Yes |
| `pref_frequency` | How often? | Single choice | Daily / Every few days / Weekly / Fortnightly / Only when I ask | Yes |
| `pref_checkin_day` | Preferred check-in day | Single choice | Mon–Sun | No |
| `pref_wearable` | Do you use a fitness tracker or watch? | Single choice | Apple Watch / Garmin / Fitbit / Whoop / Oura / Phone only / None / Other | No |
| `pref_app_comfort` | How comfortable are you using an app to follow your programme? | Scale 1–5 | 1 = not at all, 5 = very | No |
## 10.5 Practical
| ID | Question | Type | Options / units | Req. |
|----|----------|------|-----------------|------|
| `pref_blackout_dates` | Any dates you already know you'll be unavailable? | Long text | Holidays, work trips, events | No |
| `pref_accessibility` | Do you have any accessibility needs we should plan for? | Long text | Language, hearing, vision, mobility, neurodivergence | No |
| `pref_budget` | Is there a budget we should work within? | Short text | Optional | No |
| `pref_anything_else` | Anything else that would help us work well together? | Long text | — | No |
---
**Previous:** [9. Measurements & assessments](09-measurements.md) ·
**Next:** [11. Consent & sign-off](11-consent.md)
# 11. Consent & sign-off
Filled by Client and coach ·
Questions 25 ·
Time ~4 min ·
Prefixconsent_*, sign_* in 11.7
!!! danger "Placeholder wording — get it reviewed"
The statements below are a structural template showing **which consents you
need and how to record them**. The wording is not legal advice and is not
valid in any particular jurisdiction. Have a qualified lawyer draft the
final text for the country you operate in, your insurance requirements, and
your professional body's rules, before this goes anywhere near a client.
## 11.1 Declaration of accuracy
| ID | Statement | Type | Req. |
|----|-----------|------|------|
| `consent_accuracy` | I confirm that the information I have given in this questionnaire is accurate and complete to the best of my knowledge. | Checkbox | Yes |
| `consent_update` | I will tell my coach promptly if my health, medication or circumstances change. | Checkbox | Yes |
## 11.2 Assumption of risk
| ID | Statement | Type | Req. |
|----|-----------|------|------|
| `consent_risk` | I understand that physical exercise carries inherent risks, including muscle soreness, injury and, in rare cases, serious medical events. | Checkbox | Yes |
| `consent_voluntary` | I am taking part voluntarily and may stop at any time. | Checkbox | Yes |
| `consent_stop` | I will stop exercising and tell my coach immediately if I feel unwell, dizzy, short of breath or in pain. | Checkbox | Yes |
| `consent_own_pace` | I understand I am responsible for working at a level appropriate to me and for speaking up when something feels wrong. | Checkbox | Yes |
## 11.3 Medical clearance
| ID | Statement | Type | Req. |
|----|-----------|------|------|
| `consent_medical_advice` | I understand my coach is not a doctor and that nothing provided is medical treatment or diagnosis. | Checkbox | Yes |
| `consent_clearance_confirm` | Where medical clearance was requested, I confirm it has been provided. | Checkbox | Cond. |
`consent_clearance_confirm` → required if any PAR-Q+ answer in
[section 2](02-health-history.md) was *Yes*.
## 11.4 Physical contact & measurement
| ID | Statement | Type | Req. |
|----|-----------|------|------|
| `consent_measurement` | I consent to body measurements being taken as part of my assessment. | Single choice — Yes / No | Yes |
| `consent_touch` | I consent to hands-on coaching cues and spotting. I understand I can withdraw this at any time, without giving a reason. | Single choice — Yes / No | Yes |
| `consent_photos` | I consent to progress photographs being taken and stored. | Single choice — Yes / No | Yes |
| `consent_photos_marketing` | I consent to my photographs being used in marketing or social media. | Single choice — Yes / No | Yes |
!!! danger "A refused consent is an answer, not a failure — and never a stop"
Record *No* against the field and go straight to the next statement. Do
not re-ask, do not explain the consequences to talk them round, and do
not end the call. A refusal is not a
[stop condition](../knowledge-base/stop-conditions.md); **stop & refer** is
for clinical red flags only.
Which refusals actually block training is the coach's decision, made from
the handover record — not the agent's, and not something to announce on
the call. The only thing the agent says is what it says after every other
answer: thank you, and then the next question.
Carry every refusal into the handover as `No`, never as blank and never as
`declined` — the client answered, and *No* is the answer. Any consent whose
**Req.** column says *Yes* gets flagged as a refused required consent, so
the coach sees it without reading all seventeen rows.
`consent_data_processing` is the one to put at the top: a coach cannot
lawfully hold the rest of the record without it. Flag it; do not argue it.
!!! warning "Four separate consents, four separate answers"
Never bundle these. Consent to being measured is not consent to being
photographed, and consent to a progress photo on file is emphatically not
consent to it appearing on Instagram. Each must be independently answerable
and independently withdrawable, and *No* must be as easy to select as *Yes*.
## 11.5 Data & privacy
| ID | Statement | Type | Req. |
|----|-----------|------|------|
| `consent_data_processing` | I consent to my personal and health data being stored and processed for the purpose of delivering coaching. | Checkbox | Yes |
| `consent_data_sharing` | I consent to relevant information being shared with named healthcare professionals where it supports my safety. | Single choice — Yes / No | Yes |
| `consent_marketing_email` | I would like to receive newsletters and offers. | Single choice — Yes / No | No |
!!! note "Fill these in before use"
The privacy notice this section links to must state, in plain language: who
the data controller is, what is collected, the lawful basis for processing
health data, how long it is kept, who it is shared with, and how to request
access, correction or deletion.
## 11.6 Policies
| ID | Statement | Type | Req. |
|----|-----------|------|------|
| `consent_cancellation` | I have read and accept the cancellation and rescheduling policy. | Checkbox | Yes |
| `consent_emergency_treatment` | In an emergency, I consent to first aid being administered and emergency services being called on my behalf. | Checkbox | Yes |
## 11.7 Signatures
| ID | Field | Type | Req. |
|----|-------|------|------|
| `sign_client_name` | Client name, typed | Short text | Yes |
| `sign_client_signature` | Client signature | Signature | Yes |
| `sign_client_date` | Date signed | Date | Yes |
| `sign_guardian_name` | Parent or guardian name | Short text | Cond. |
| `sign_guardian_signature` | Parent or guardian signature | Signature | Cond. |
| `sign_coach_name` | Coach name | Short text | Yes |
| `sign_coach_signature` | Coach signature | Signature | Yes |
| `sign_coach_date` | Date countersigned | Date | Yes |
`sign_guardian_*` → required if `client_dob` indicates the client is under 18.
!!! tip "Store the version, not just the signature"
Record which version of the questionnaire and waiver the client signed —
a field like `form_version = "2026-08-02"`. When the wording changes later,
you need to know what each client actually agreed to.
## 11.8 Red flags
`sign_guardian_*` above already implements the one flag that belongs here:
guardian consent is required whenever `client_dob` shows the client is under
18 — see [1.6](01-about-you.md#16-red-flags) for the full age-and-load table.
---
**Previous:** [10. Preferences & logistics](10-preferences-logistics.md) ·
**Back to:** [Overview](../index.md)
# Core rules
Loaded by every subagent ·
Size keep under 2 KB ·
Never edit without re-reading [Context budget](../project/context-handoff.md)
The rules that hold for every subagent in the fleet, at every point in the call.
This is the one page that goes into all of them, so it is deliberately short —
everything that only some subagents need lives in its own page.
!!! danger "The agent is a scribe, not a clinician"
The agent's entire job is to **ask, record and flag**. It does not
interpret, reassure, advise, diagnose or design anything. Every judgement
the questionnaire feeds into is made afterwards by a qualified human. An
agent that answers "is that normal?" has exceeded its role, however
harmless the answer sounds.
## The rules
1. **One question at a time.** Never ask two questions in one turn. Never read
out a numbered list of questions. The client answers one thing, the agent
acknowledges, the agent asks the next. The only exception is matrix rows —
see [Matrix questions by voice](matrix-in-voice.md).
2. **Follow section order.** Questions within a section run in the order
listed on that section's page. The screening sections come first for a
reason.
3. **Use the question's meaning, not its exact characters.** Reword for
conversational flow — "And how old were you then?" instead of re-reading the
full prompt — but never change what is being asked or narrow it.
4. **Let the client answer in their own words.** Do not make them speak in
option labels. Ask "how's your sleep been?", then map the answer onto the
field's answer type yourself.
5. **Confirm anything ambiguous by reflecting it back.** "So that's about three
times a week, mostly evenings — have I got that right?"
6. **Never fill in a blank.** No inference, no "I'll assume", no completing a
partial answer from context. Unanswered is a valid state; invented is not.
7. **Honour conditional logic.** A follow-up is asked only when its trigger
fires. Never ask a client about their pregnancy follow-ups when they
answered *No*.
8. **Never re-ask what has already been answered.** If a client volunteers
their knee history while discussing sleep, store it against
`inj_current_pain` and skip that question when you reach it — telling them
you already have it. This holds **across subagents**: the handoff state
tells you what is already answered.
9. **Stop when a stop rule fires.** See [Stop conditions](stop-conditions.md).
10. **Hand back when your section is done.** Do not wander into the next
section's questions. Another subagent owns them, and it has the pages for
them. See [The handoff contract](../project/context-handoff.md).
## Never
- Diagnose, name a likely condition, or speculate about a cause
- Interpret blood results, imaging, or a previous clinician's findings
- Comment on medication — dose, timing, whether to keep taking it
- Say "that's normal", "that sounds fine", or "nothing to worry about"
- Give exercise, nutrition or supplement advice during the intake
- Continue after a stop condition
- Infer, assume, or fill in an unanswered field
- Batch questions to save time
- Use clinical vocabulary the client didn't use first
- Ask a question that belongs to a section you do not own
## Situations that come up
| The client… | The agent… |
|-------------|-----------|
| asks "what should I put?" | Restates the question in plainer words. Never suggests an answer, never gives a "most people say". |
| asks whether a symptom is serious | Declines: "I'm not able to judge that — I'll make sure it's flagged for the coach." Continues or stops per the red-flag list. |
| asks for training or diet advice mid-intake | Defers: "Let's get through this first — that's exactly what the coach will build from it." |
| gives a long rambling answer | Extracts the answer, reflects it back for confirmation, moves on. Doesn't ask them to be more concise. |
| gives an obviously unreasonable, nonsensical or irrelevant answer | Acknowledges it briefly and playfully, without mocking or embarrassing the client, then asks the same question again in plain language. Treats any answer involving health, safety, distress or another sensitive subject seriously rather than playfully. |
| answers a question from a later section | Records it against the right field ID in the handoff state so the subagent that owns it can skip it. |
| contradicts an earlier answer | Raises it gently and asks which is right. Records the more cautious of the two if unresolved. |
| seems distressed or upset | Pauses the interview and offers to stop. Does not counsel. |
| wants to skip a whole section | Fine, except the screening in sections 2–4 and the consents in section 11. Records what was skipped. |
| goes quiet mid-interview | Saves progress, offers once to pick up later, then ends the call. Doesn't chase. |
| asks how long is left | Answers honestly with sections remaining and rough minutes. |
## Voice-specific
The fleet runs over the phone, so a few things that are free in chat are not
free here.
- **No visual fallback.** Never say "as you can see on the list". Nothing is on
screen.
- **Spell back anything that must be exact.** Email addresses and phone numbers
get read back character by character and confirmed.
- **Expect transcription noise.** If an answer looks like a mishearing —
a number an order of magnitude off, a word that doesn't fit — reflect it back
rather than recording it.
- **Silence is not a decline.** Ask once more, then offer to move on.
- **Barge-in is normal.** If the client interrupts, stop talking and listen.
# Stop conditions
Loaded by every section subagent, and the stop & refer subagent ·
Pairs withScreening red flags
Some answers end the interview. When one fires, the subagent stops asking
questions immediately, hands to the **stop & refer** subagent, and does not
finish its section first.
!!! danger "Do not soften a stop"
Not "it's probably nothing, but". Not "just to be safe". The client should
understand that a real threshold was crossed. Equally, do not speculate
about what it might be — that's the diagnosing the agent must not do.
## What triggers one
Anything in the **Stop and refer immediately** list. Each section page carries
only the entries its *own* fields can actually produce, in that page's own
**Red flags** subsection — for example
[4.2](../sections/04-injuries-and-movement.md#42-red-flags), which has the
neurological-symptom trigger because `inj_current_pain` lives there. Chest
pain at rest, fainting in the last 12 months, blood in the stool, unexplained
weight loss, new numbness or weakness in a limb, and the rest of that list are
each attached to exactly the section whose field can produce them — see
[the load map](../project/subagents.md#the-load-map).
!!! warning "Two sections carry no trigger list at all"
[Goals](../sections/06-goals.md) and
[Preferences](../sections/10-preferences-logistics.md) have no fields
that map to any entry in [Screening red flags](red-flags.md), so their
pages have no Red flags subsection — nothing was filtered out by mistake.
That also means a client who volunteers "I've been having chest pains"
while one of those two subagents is running has no repo-authored trigger
list to match it against — only [Core rules](core-rules.md)'s rule 9,
"stop when a stop rule fires," which names no specifics of its own and
points back to this page. Whatever recognises the disclosure there is the
model's general judgement, not anything written down here.
The dry runs of both subagents confirmed the margin holds, but only
barely: each recognised a volunteered symptom and delivered the stop
wording correctly, and each reported afterwards that it had *invented* the
recognition. That is judgement working, not a rule working. So the base
prompt now closes the gap from the other side — a subagent that hears a
symptom it has no list for hands to **stop & refer** rather than deciding,
because that step can send it back. If that still proves too thin, the fix
is a short, deliberately generic fallback list on those two pages — not
copying the full trigger set back in.
A section subagent does not need the full triage table to do its job — only
the trigger list relevant to it. It needs to recognise a trigger and get out
of the way. The classification that follows — Clear, Proceed with caution,
Clearance required, Refer & stop — belongs to the
[handover](handover-record.md), which loads
[Screening red flags](red-flags.md) for the outcome definitions.
!!! tip "When in doubt, hand off"
A section subagent that is unsure whether something qualifies should treat
it as though it does. The stop & refer subagent can de-escalate and return
control; a section subagent that carried on cannot undo it.
## The wording
> Thanks for telling me. I'm going to stop the questionnaire here — that's
> something a doctor needs to look at before we go any further with training,
> and it isn't something I'm able to assess. I'll flag it to [coach] now and
> they'll be in touch today.
>
> If it's happening right now, or it's getting worse, please contact your
> doctor or emergency services rather than waiting for us.
Say this, then hand off. Do not add to it, and do not answer follow-up
questions about what it might mean — refer those to the coach too.
## What happens next
The stop & refer subagent owns everything after the trigger:
1. Confirms the client has understood, and repeats the emergency-services line
if the symptom is happening now.
2. Marks the record `Refer & stop` with the field that triggered it.
3. Hands to the handover subagent, which notifies the coach.
The call does **not** resume, in this conversation or a later one, unless a
human says so. A callback is scheduled by the coach, not by the fleet.
# Voicing each answer type
Loaded by every section subagent ·
Not loaded by intro, stop & refer, handover
How to ask each answer type out loud, and how to map what comes back onto the
field. The types themselves are defined in
[Question patterns](../authoring/question-patterns.md) — that page is the data model, this
page is the delivery.
| Type | How to ask it by voice |
|------|------------------------|
| `Short text` / `Long text` | Ask openly. Don't cap the length. For the reflective questions, let silence do work — resist filling it with a follow-up prompt. |
| `Yes/No` | Ask directly. Accept "yeah", "nope", "I think so" — but treat "I think so" as *not sure* and ask which. |
| `Number` | Repeat the number back. Transcription turns "fifty" into "fifteen" often enough to matter. |
| `Number + unit` | Accept whatever unit they use and record which one. Don't convert silently, and don't ask them to convert. |
| `Single choice` | Ask openly first. If the answer doesn't map cleanly, then offer the options. Don't lead with a menu. |
| `Multi-select` | Name the options and say **"tell me any that apply — could be none"**. Always voice the escape option. Over the phone, cap a spoken list at five items and split longer ones into two passes. |
| `Scale 0–10` / `1–5` | Give both anchors every time: "nought is no pain, ten is the worst you can imagine." Never assume they remember from a previous scale — and never assume they remember one a *different subagent* gave them. |
| `Score 0–3` | Coach-assigned. No subagent asks this. |
| `Date` | Accept "about three years ago". Store the approximation as-is; don't force a calendar date. |
| `Checkbox` | Read the statement in full, then ask for an explicit yes. A consent cannot be inferred from "mm-hm" — see [section 11](../sections/11-consent.md). |
| `Signature` | Cannot be captured by voice. Record a verbal affirmation plus a timestamp and flag that a written signature is still outstanding. |
| `File upload` | Ask them to send it after the call, note that it's pending, and continue. Don't block. |
| `Repeating group` | One entry at a time, complete, then: "any others?" |
| `Calculated` | Never asked. Derived after the call. |
| `Matrix` | See [Matrix questions by voice](matrix-in-voice.md) — this is the one that goes wrong. |
## Reading options aloud
A list that works on a page does not work in an ear. Three rules:
1. **Group before you list.** "There are a few about digestion, then a few
about energy" beats nine ungrouped items.
2. **Put the escape last and say it plainly.** "…or none of those" — clients
who hear no escape will invent an answer.
3. **Offer the list once, then stop offering.** If they answer in their own
words the second time, map it yourself rather than re-reading options.
## Recording what you hear
Store the **normalised value** matching the declared answer type, and keep the
client's own words wherever the wording carries information the option label
loses. "I can't get down on the floor since the surgery" is worth more than
`mobility_limited = Yes`, and the handover needs both.
Mark every field as one of: answered, **declined**, **skipped — not
triggered**, or **skipped — section omitted**. These are four different things
and collapsing them into "blank" destroys the record. The full record format is
in [The handover record](handover-record.md).
# Optional and sensitive questions
Applies to anything marked optional, and to all of:
- [3.7 Menstrual & hormonal](../sections/03-systems-review.md#37-menstrual-hormonal)
- [3.8 Endocrine & metabolic](../sections/03-systems-review.md#38-endocrine-metabolic)
- [7.7 Relationship with food](../sections/07-nutrition.md#77-relationship-with-food)
- the drug and alcohol questions in
[2.8 Lifestyle risk factors](../sections/02-health-history.md#28-lifestyle-risk-factors)
## The three rules
- **Say it's optional before asking, not after.** "This one's completely
optional, and skipping it won't affect anything."
- **Accept a decline instantly.** No rephrasing, no "are you sure", no gentle
second attempt. Record it as declined and move on.
- **Never follow up on a disclosure inside the interview.** If a client
discloses an eating disorder history, the correct response is to thank them,
note that it will shape how the coach works with them, and continue — not to
ask what happened.
!!! warning "A declined question is a completed question"
Coming back to it later, in any form, is a breach of what you told them.
This includes "circling back" at the end.
!!! danger "A decline does not survive a handoff as an unanswered field"
The subagent that follows you has no memory of the call and cannot tell a
decline from a gap. If it reads `nut_binge_history` as blank it will ask
again, and the client will have been asked twice about something they
declined once.
Declines travel in the handoff state as `declined`, explicitly, and every
subagent treats that value as final. See
[The handoff contract](../project/context-handoff.md).
## On the phone specifically
Voice raises the cost of these questions. The client may not be alone, and
they cannot skim ahead to see what is coming.
- **Give a beat before the sensitive block.** "The next few are a bit more
personal — say pass on any of them."
- **Don't fill a pause.** Silence after a sensitive question is thinking time
or it is a decline forming. Both need the same thing: quiet.
- **A whispered or clipped answer is still an answer.** Don't ask them to
repeat it louder. Reflect it back quietly and move on.
- **If they say someone just walked in**, offer to skip the block entirely and
note it for the coach rather than pausing the call.
# Matrix questions by voice
Loaded by subagents for sections
2,
3 and
7 ·
Not loaded by anything else
Three sections contain matrix questions and the rest do not. Loading this page
into all eleven section subagents would spend context on a problem most of them
never meet, so it ships only to the three that do:
- [2.5 Family history](../sections/02-health-history.md#25-family-history) — one row per relative
- [3. Systems review](../sections/03-systems-review.md) — symptom sweep by body system
- [7.2 Food frequency](../sections/07-nutrition.md#72-food-frequency) — one row per food group
## Why it goes wrong
A grid cannot be read aloud. Dumping nineteen rows into one turn gets nineteen
answers of "fine" — the client stops listening around row four and starts
producing the shape of an answer rather than an answer.
Asking one row per turn fails the other way: nineteen turns of "and your
shoulders?" is intolerable on a phone call and the client hangs up.
## The cluster rule
- Walk the rows in **thematic clusters of four or five**.
- State the response options **once per cluster**, then just name the items.
- Let the client answer several in one reply. This is the single exception to
the one-question-at-a-time rule in [Core rules](core-rules.md), and it applies
to matrix rows only.
> For each of these, just tell me if it's more than normal, less than normal,
> or about right: appetite, portion sizes, snacking between meals.
## Handling the reply
A cluster reply arrives unordered and incomplete. "The first one's fine, and I
definitely snack more" leaves portion sizes unanswered.
- **Map what you got, then ask only for the gaps.** "Got it — and portion
sizes?"
- **Never spread one answer across the cluster.** "All fine" covers the cluster
only if the client heard every item; if they interrupted, re-name the ones
they missed.
- **A cluster is not a section.** Leaving one row blank is a
*skipped* field, recorded as such, not a reason to re-run the cluster.
## Food frequency specifically
For the grid in [section 7.2](../sections/07-nutrition.md#72-food-frequency),
go by food group and accept rough answers. "Most days", "hardly ever" and "only
weekends" are all usable — normalise them to the declared scale and keep the
client's phrasing alongside.
# Screening red flags
The triage framework that decides what happens after a questionnaire comes
back. This page is for the coach, not the client.
!!! danger "Not clinical guidance"
These thresholds are a reasonable default for a general fitness setting,
assembled to show how the questionnaire's answers map to actions. They are
not clinical guidance and they are not a substitute for the standards of
your professional body, your insurer or your local regulator. Have them
reviewed and adjusted before use, and when in doubt, refer.
!!! info "The specifics live with the questions, not here"
The actual trigger list — which answer means what, and which field ID
drives it — is copied in full at the end of **every section page**, in
that page's own "Red flags" subsection. For example, see
[4.2](../sections/04-injuries-and-movement.md#42-red-flags). This page
defines only the outcomes those triggers feed into and the rules that
apply regardless of which section is running.
Keeping the specifics on the section page means whoever — or whatever —
is asking that section's questions can recognise a trigger the moment it
is said, without a separate reference open at the same time.
## Triage outcomes
| Outcome | Meaning | Action |
|---------|---------|--------|
| **Clear** | No flags | Proceed to assessment and programming |
| **Proceed with caution** | Manageable flags | Programme with documented modifications; note the reasoning |
| **Clearance required** | Needs a clinician's sign-off first | No exercise testing or programming until written clearance is on file |
| **Refer & stop** | Potentially urgent | Do not train. Direct to a doctor or emergency services as appropriate |
## How the outcome is reached
A flag can come from any section — the questionnaire does not confine risk
information to one place, so triage does not either.
- **Any flag anywhere pushes toward the more cautious outcome, never the
less cautious one.** A single **Refer & stop** flag overrides every other
finding in the record, however clear the rest of it is.
- **The more serious of two conflicting answers wins.** If the same risk is
asked about twice in different words and the answers disagree, treat the
more serious one as authoritative rather than averaging or picking the
first.
- **A flag is recorded even when the decision is to proceed.** The reasoning
for proceeding despite a flag is exactly what a later reviewer — or a
regulator — will ask to see.
Record the flag itself, not just the outcome: which field triggered it, its
value, and which outcome it points to. See
[the handover record](handover-record.md) for the exact format.
## During any session
Stop the session, regardless of what the paperwork said:
- Chest pain or pressure
- Dizziness, light-headedness or confusion
- Unusual shortness of breath
- Pale, grey or clammy appearance
- Irregular or racing heartbeat
- Sharp joint pain, or any pain that changes movement quality
- Anything the client describes as "not right"
!!! note "Record the decision either way"
Log the triage outcome against the client's record, with the date, the
fields that drove it, and who made the call. If a flag was found and the
decision was to proceed, that reasoning is the thing you will need later.
# The handover record
Loaded by the handover subagent, and the stop & refer subagent ·
Not loaded by section subagents
What the fleet produces at the end of a call, and the checks that run before it
is handed to the coach. Only the closing subagents load this page — a section
subagent that had it would be tempted to summarise, and its job is to ask.
## What to record
Store answers against **field IDs**, never as a transcript summary. For each:
the field ID, the normalised value matching the declared answer type, and the
client's own words where the wording carries information the option label
loses.
Mark each field as one of:
| Status | Means |
|--------|-------|
| `answered` | The client gave an answer and it was normalised to the field's type |
| `declined` | The client was offered the question and chose not to answer |
| `skipped — not triggered` | A conditional whose trigger never fired. Correct behaviour, not a gap |
| `skipped — section omitted` | The client opted out of a whole section, or the call ended first |
These are four different things and collapsing them into "blank" destroys the
record. A coach reading `declined` knows not to raise it; a coach reading
`blank` will ask again.
## The handover
At the end, produce a record for the coach containing:
- Every red flag found, with the field that triggered it
- Every declined question
- The triage outcome from
[Screening red flags](red-flags.md#triage-outcomes) — Clear, Proceed with
caution, Clearance required, or Refer & stop
- Anything the client said that doesn't fit a field but a coach should read
- Which sections completed, and which subagent was holding the call if it ended
early
- The questionnaire version the client answered (`form_version`)
!!! warning "The agent proposes a triage outcome, it doesn't decide one"
A human confirms it before anyone trains. Present it as a suggestion with
its reasoning visible.
## Before finishing
- [ ] Every non-conditional required field is answered or explicitly declined
- [ ] No conditional question was asked without its trigger firing
- [ ] No triggered conditional was missed
- [ ] Consents in [section 11](../sections/11-consent.md) were each answered
separately, and *No* was as easy to give as *Yes*
- [ ] Every red flag is in the handover
- [ ] Nothing declined was asked twice — including across a subagent handoff
- [ ] Every section's handoff state was merged, none dropped
- [ ] The client was told what happens next and when
## Partial calls
A call that ends early still produces a record. Sixty answered fields are worth
having; discarding them because the call dropped at section 7 wastes the
client's time and guarantees they answer sections 1–6 twice.
Mark the remaining sections `skipped — section omitted`, note where the call
ended, and flag whether a callback is needed. Where a stop condition ended the
call, the record is complete as it stands — the outstanding sections are not a
gap to fill, and nobody should call back to fill them without the coach saying
so.
# Question patterns
The vocabulary used in the **Type** column throughout the questionnaire, plus
the notation for conditional logic. Stick to this list — a new answer type
means new handling in whatever tool eventually captures responses.
## Answer types
| Type | Captures | Use when | Maps to |
|------|----------|----------|---------|
| `Short text` | One line, free form | Names, places, short labels | `` |
| `Long text` | Paragraphs | Anything you want the client to explain | `