Yellow-flag Screen
Status:
stableCategory:fear_avoidanceAdded:2026-04-20Last reviewed:2026-04-21
Summary
The Optimal Screening for Prediction of Referral and Outcome —
Yellow Flag screen (OSPRO-YF) is a brief presence/absence screen
for psychosocial risk factors in musculoskeletal pain. Trinity
implements a 10-item binary version: each item is yes/no, and
the total count maps to three bands (low, moderate, high).
Unlike most other instruments in the catalog, OSPRO-YF's score is a flag count, not a continuous-scale severity.
⚠ Binary response format
Every item here accepts only 0 (no) or 1 (yes). Trinity will
score other values per the rubric's math (summing whatever integer
is provided), but the band semantics assume binary responses. Do
not send Likert-style responses to this endpoint — use
kinesiophobia,
fear_avoidance_beliefs,
depression_screen, or
anxiety_screen for
Likert-scaled constructs.
Resource identity
| Field | Value |
|---|---|
| Category | fear_avoidance |
| Resource | yellow_flag_screen |
| Instrument ID | yellow_flag_screen |
| Rubric version | 1.0.0 |
| Path prefix | /api/fear_avoidance/yellow_flag_screen |
Operations
| Operation | Method | Path | Contract |
|---|---|---|---|
| Questions | GET | /api/fear_avoidance/yellow_flag_screen/questions | patterns-questions.md |
| Score | POST | /api/fear_avoidance/yellow_flag_screen/score | patterns-score.md |
Items
Ten binary presence/absence items.
| ID | Prompt (paraphrased) |
|---|---|
item_1 | Marked pain-related worry present. |
item_2 | Depressed mood present. |
item_3 | Anxious / tense mood present. |
item_4 | Low self-efficacy for recovery. |
item_5 | High pain catastrophizing. |
item_6 | High fear of movement / reinjury. |
item_7 | Low recovery expectation. |
item_8 | Somatic complaints beyond index pain region. |
item_9 | Sleep disturbance reported. |
item_10 | Active substance-use concern. |
Answer choices per item:
| Value | Label |
|---|---|
0 | No |
1 | Yes |
Scoring
| Field | Value |
|---|---|
| Method | simple_sum over all ten items. |
| Score range | 0 – 10 (count of flags present). |
Bands
| Band | Range (inclusive) | Clinical meaning |
|---|---|---|
low | 0 – 2 | Low psychosocial-flag burden. |
moderate | 3 – 5 | Moderate flag burden; consider targeted follow-up. |
high | 6 – 10 | High flag burden; multi-domain follow-up typically warranted. |
Bands reflect the count of "yes" flags — more flags means broader psychosocial risk footprint.
Required items
All ten items are required for a strict /score call.
Worked example
All ten flags raised. See quickstart.md for
per-language scaffolding and patterns-score.md
for the shared /score contract.
Send:
POST /api/fear_avoidance/yellow_flag_screen/score HTTP/1.1
Host: engine.tripod-health.com
apikey: $ENGINE_API_KEY
Content-Type: application/json
X-Request-ID: docs-yellow_flag_screen-score-basic
{
"responses": {
"item_1": 1, "item_2": 1, "item_3": 1, "item_4": 1, "item_5": 1,
"item_6": 1, "item_7": 1, "item_8": 1, "item_9": 1, "item_10": 1
}
}
Receive (200 OK):
{
"instrument": "yellow_flag_screen",
"category": "fear_avoidance",
"finding": {
"algorithm_id": "yellow_flag_screen",
"algorithm_version": "1.0.0",
"score": 10,
"band": "high",
"raw": {
"rubric_version": "1.0.0",
"responded_items": 10
},
"context": null,
"imputed": false,
"sd": null,
"prior_source": null
},
"confidence": {
"overall": 1,
"tier": "high",
"breakdown": {
"input_completeness": 1,
"imputation_variance": null,
"model_certainty": null
}
},
"recommendations": null,
"depth": "basic",
"catalog_version": "0.13.0",
"request_id": "docs-yellow_flag_screen-score-basic",
"timestamp": "2026-04-21T23:15:00.089456+00:00"
}
Computation: sum of 0/1 flags = 10 → high band. Zero flags
→ 0 → low; three flags (for example item_1, item_3, item_6) →
3 → moderate (3–5).
Calling in your language
curl
curl -sS -X POST "https://engine.tripod-health.com/api/fear_avoidance/yellow_flag_screen/score" \
-H "apikey: $ENGINE_API_KEY" \
-H "Content-Type: application/json" \
-d '{"responses":{"item_1":1,"item_2":1,"item_3":1,"item_4":1,"item_5":1,"item_6":1,"item_7":1,"item_8":1,"item_9":1,"item_10":1}}'
Python (requests)
# Uses the call() helper from quickstart.md.
responses = {f"item_{i}": 1 for i in range(1, 11)}
result = call("POST", "/api/fear_avoidance/yellow_flag_screen/score",
{"responses": responses})
print(result["finding"]["score"], result["finding"]["band"])
Node.js (native fetch)
// Uses the call() helper from quickstart.md.
const responses = Object.fromEntries(
Array.from({ length: 10 }, (_, i) => [`item_${i + 1}`, 1]),
);
const result = await call("POST",
"/api/fear_avoidance/yellow_flag_screen/score", { responses });
console.log(result.finding.score, result.finding.band);
TypeScript
// Uses the typed call<T>() helper from quickstart.md.
const responses = Object.fromEntries(
Array.from({ length: 10 }, (_, i) => [`item_${i + 1}`, 1]),
);
const result = await call<ScoreResponse>(
"POST",
"/api/fear_avoidance/yellow_flag_screen/score",
{ responses },
);
Go
// Uses the call() helper from quickstart.md.
responses := make(map[string]int, 10)
for i := 1; i <= 10; i++ {
responses[fmt.Sprintf("item_%d", i)] = 1
}
result, err := call("POST",
"/api/fear_avoidance/yellow_flag_screen/score",
map[string]any{"responses": responses}, 3)
if err != nil {
panic(err)
}
finding := result["finding"].(map[string]any)
fmt.Printf("OSPRO-YF: %v (%v)\n", finding["score"], finding["band"])
Java
// Uses the call() helper from quickstart.md.
StringBuilder body = new StringBuilder("{\"responses\":{");
for (int i = 1; i <= 10; i++) {
if (i > 1) body.append(",");
body.append("\"item_").append(i).append("\":1");
}
body.append("}}");
String result = call("POST",
"/api/fear_avoidance/yellow_flag_screen/score",
body.toString(), 3);
System.out.println(result);
C# (.NET HttpClient)
// Uses the Call() helper from quickstart.md.
var responses = Enumerable.Range(1, 10)
.ToDictionary(i => $"item_{i}", _ => 1);
var result = await Call(HttpMethod.Post,
"/api/fear_avoidance/yellow_flag_screen/score",
new { responses });
var finding = result.GetProperty("finding");
Console.WriteLine($"OSPRO-YF: {finding.GetProperty("score").GetDouble()} ({finding.GetProperty("band").GetString()})");
PowerShell
# Uses the Invoke-Engine helper from quickstart.md.
$responses = @{}
1..10 | ForEach-Object { $responses["item_$_"] = 1 }
$result = Invoke-Engine -Method Post -Path "/api/fear_avoidance/yellow_flag_screen/score" -Body @{ responses = $responses }
"OSPRO-YF: $($result.finding.score) ($($result.finding.band))"
Clinical interpretation
- What it measures. Breadth of psychosocial risk across multiple domains — worry, mood, anxiety, self-efficacy, catastrophizing, fear of movement, recovery expectation, somatic complaints, sleep, and substance-use concern.
- Flag count, not severity. The score measures how many domains
show concern, not the severity within any domain. A subject with
3mild flags and a subject with3severe flags have the same OSPRO-YF score; severity should be assessed with the domain-specific instruments. - Companion to Örebro. Where
orebroreturns a weighted total and one risk band, OSPRO-YF returns a breadth count. They answer overlapping but distinct questions.
Intended use
- Rapid multi-domain screen when the caller wants to know how many psychosocial risk areas are elevated.
- Triage signal for deciding whether to administer the domain-specific instruments (PHQ-9, GAD-7, TSK-11, FABQ-W, recovery expectation).
- Feeding the CDRI composite as a complementary breadth measure alongside Örebro's weighted total.
Mistaken use
- Do not send Likert or scaled values. The rubric's scoring is
a simple sum; a
3on an item produces three times the band contribution of a1, which breaks the flag-count semantics. - Do not interpret flag count as severity within any domain.
A
moderateOSPRO-YF with aseverePHQ-9 is different from amoderateOSPRO-YF with aminimalPHQ-9. The OSPRO-YF alone does not distinguish the two. - Do not skip the domain-specific follow-up on a
moderateorhighband. The screen points where to look, but the depth of evaluation in each flagged domain belongs to a dedicated instrument. - Do not compare OSPRO-YF scores across populations without context. The meaning of "moderate" flag burden differs between acute and chronic pain populations.
Debugging
- Capture
request_id. Present in every response body. - Score substantially above
10. A Likert-style response (value2or higher) was sent on a binary item. Send only0or1. 400 ValidationErrorwithmissing_items. Send all ten items.- Band
unknownin a response. Not possible under the current rubric with binary responses (0–10covers the whole band space). If you see it, a non-binary value was summed into the score.
Related
- patterns-questions.md, patterns-score.md — shared contracts.
- instruments-orebro.md — Örebro; multi-domain screen with a weighted total score.
- instruments-depression_screen.md,
instruments-anxiety_screen.md,
instruments-kinesiophobia.md,
instruments-fear_avoidance_beliefs.md,
instruments-recovery_expectation.md
— the domain-specific instruments a
moderateorhighOSPRO-YF typically triages into. - composite-cdri-compute.md — composite.
Change history
| Date | Change |
|---|---|
| 2026-04-20 | Initial publication. |