Lesson 260: Unity UGS OTLP Diligence Receipt on BUILD_RECEIPT (2026)
Direct answer: Before Q4 2026 partner diligence calls, promote ugs_otlp_diligence_receipt_v1.json proving the UGS Data Privacy URL returns HTTP HEAD success, the Steam About legal link matches, and OTLP export is either reachable with a corporate CA pin or covered by an offline span batch policy—distinct from Lesson 213 (telemetry_session_receipt_v1 event schema) and Q4 diligence blog (diligence_telemetry_receipt_v1 annex strategy). Pair the Unity UGS OTLP diligence preflight (Guide #23).

Why this matters now (Q4 diligence week)
Q4 2026 partners open 07-observability/ and ask why UGS Analytics returns 401 on public builds or why OTLP dashboards stay empty behind corporate VPNs. Teams file Lesson 213 session schemas but skip URL hosting and egress proof—diligence stalls on “we use Unity Gaming Services” without receipts. 260 wires ugs_otlp_diligence_ok on BUILD_RECEIPT so diligence_telemetry_receipt_v1 can reference a real child row.
The UGS OTLP preflight is the ninety-second gate—260 is the BUILD_RECEIPT milestone.
Beginner path (privacy URL → receipt)
| Step | Action | Success check |
|---|---|---|
| 1 | Copy Data Privacy URL from UGS dashboard | Exact string in receipt |
| 2 | Run curl -I or PowerShell HEAD |
Status 200 logged |
| 3 | Match Steam About legal link | Q3 crosswalk |
| 4 | Document OTLP endpoint or offline batch | Q4–Q5 |
| 5 | File receipt + BUILD_RECEIPT | ugs_otlp_diligence_ok: true |
Time: ~50 minutes first diligence sprint; ~12 minutes when preflight template exists.
Developer path (gates Q1–Q6)
| Gate | Check | Fail when |
|---|---|---|
| Q1 | Privacy URL from dashboard in receipt | Typo vs live URL |
| Q2 | HTTP HEAD success | 404/403 on public hosting |
| Q3 | Store About matches dashboard URL | Split legal pages |
| Q4 | OTLP endpoint documented | Verbal “we use UGS” |
| Q5 | Proxy CA or offline batch policy | Silent span drop |
| Q6 | Receipt + BUILD_RECEIPT | Promote before Q2 GREEN |
Q1 — cousin receipt crosswalk
| Field | Cousin (213) | Cousin (Q4 blog) | This lesson (260) |
|---|---|---|---|
| Schema | telemetry_session_receipt_v1 |
diligence_telemetry_receipt_v1 |
ugs_otlp_diligence_receipt_v1 |
| Scope | Session event no-PII | Observability annex index | UGS URL + OTLP egress proof |
| Path | release-evidence/privacy/ |
07-observability/ |
release-evidence/telemetry/ |
Do not merge schemas—reference paths in cousin_receipts only.
Q2 — HTTP HEAD on Data Privacy URL
curl -sI "https://yourstudio.com/privacy" | head -n 1
PowerShell:
(Invoke-WebRequest -Uri "https://yourstudio.com/privacy" -Method Head -UseBasicParsing).StatusCode
Log status, final URL after redirects, and date. 404 commonly correlates with UGS Analytics 401 on session ingest.
Q3 — store crosswalk table
| Surface | Privacy URL |
|---|---|
| UGS dashboard | (paste exact) |
| Steam About / legal | (paste exact) |
release-evidence/privacy.md |
(paste exact) |
Normalize trailing slashes—hosts must match.
Q4–Q5 — OTLP corporate proxy
export OTEL_EXPORTER_OTLP_ENDPOINT="https://otel-collector.internal:4318"
export SSL_CERT_FILE="/etc/ssl/corp-root.pem"
Offline batch policy (Q5 pass without live OTLP): README exports spans to release-evidence/telemetry/offline_spans/batch_YYYYMMDD.json before partner zip—aligned with Q4 diligence annex.
ugs_otlp_diligence_receipt_v1.json
{
"schema": "ugs_otlp_diligence_receipt_v1",
"build_label": "fest-demo-2026-10-rc6",
"privacy_url": "https://yourstudio.com/privacy",
"privacy_url_head_status": 200,
"privacy_url_final": "https://yourstudio.com/privacy",
"store_about_privacy_match": true,
"otlp_endpoint": "https://otlp.example.com/v1/traces",
"otlp_mode": "live",
"corporate_proxy": {
"required": true,
"ssl_cert_file": "/etc/ssl/corp-root.pem",
"offline_batch_path": "release-evidence/telemetry/offline_spans/"
},
"cousin_receipts": {
"telemetry_session": "release-evidence/privacy/telemetry_session_receipt_v1.json",
"diligence_telemetry": "07-observability/diligence_telemetry_receipt_v1.json"
},
"gates": {
"Q1_dashboard_url": "pass",
"Q2_head_ok": "pass",
"Q3_store_crosswalk": "pass",
"Q4_otlp_documented": "pass",
"Q5_proxy_or_offline": "pass",
"Q6_build_receipt": "pass"
},
"ugs_otlp_diligence_ok": true,
"telemetry_promotion_allowed": true
}
Pin under release-evidence/telemetry/UGS_OTLP_DILIGENCE_RECEIPT.json.
BUILD_RECEIPT row (Q6)
| Column | Pass when |
|---|---|
ugs_otlp_diligence |
ugs_otlp_diligence_ok: true |
telemetry_session |
Cousin Lesson 213 independent column |
diligence_telemetry |
Cousin Q4 blog annex independent column |
Thursday row review — UGS OTLP diligence line: privacy HEAD Y/N.
Key takeaways
- HTTP HEAD privacy URL before fest ship—401 often means 404 legal page (Q2).
- Store About must match UGS dashboard string (Q3).
- Corporate proxy needs CA pin or offline span batch (Q5).
- Lesson 213 = event schema; 260 = egress + diligence proof.
- Q4 diligence blog bundles into
07-observability/. - UGS OTLP preflight — ninety-second gate before this lesson.
- Cousin: Lesson 261 — Unity CI Library cache BUILD_RECEIPT column (
unity_ci_library_cache_receipt_v1.json). - October capstone 265 wires 254–264 including this row.
- Help #18/#22 (planned) — fix lanes for 401 URL and OTLP proxy block.
- Top 20 receipts hub — telemetry spine rows.
Common mistakes
- Privacy URL points to draft Notion page that 404s on HEAD (Q2).
- Filing 213 while privacy URL still dead—session schema ≠ hosting proof.
- Assuming UGS works on corporate laptops without
SSL_CERT_FILE(Q5). - Merging
ugs_otlp_diligence_receiptintotelemetry_session_receipt. - Shipping diligence zip without offline span policy when OTLP blocked.
Troubleshooting
| Symptom | Lane |
|---|---|
| UGS Analytics 401 | Q2 HEAD fail → fix URL hosting |
| Events in Editor, none in release | API keys / release vs dev build |
| OTLP timeout behind VPN | Q5 CA pin or offline batch |
| Partner asks for spans, empty folder | Export offline_spans/ per Q4 blog |
| Crash receipts OK, telemetry row RED | Run UGS preflight before 260 |
Mini exercise (45 minutes)
- Break privacy URL intentionally (wrong path)—confirm HEAD fail.
- Fix hosting—confirm Q2 pass.
- Crosswalk Steam About—Q3 table.
- Document OTLP mode (live or offline)—Q4/Q5.
- File receipt; BUILD_RECEIPT GREEN.
Continuity — October–Q4 2026 fest ops truth (254–265)
| Lesson | Receipt focus |
|---|---|
| 259 | Bevy menu UI flush |
| 260 (this) | Unity UGS OTLP diligence |
| 261 | Unity CI Library cache |
| 265 | October ops capstone |
Previous: Lesson 259 — Bevy menu UI flush
Next: Lesson 261 — Unity CI Library cache Addressables
FAQ
Same as Lesson 213?
213 = session event schema without PII; 260 = privacy URL HEAD + OTLP egress proof.
Same as Q4 diligence blog?
Blog owns 07-observability/ annex strategy; 260 owns ugs_otlp_diligence_receipt_v1 BUILD_RECEIPT column.
Need live OTLP for Q5?
No—documented offline span batch path passes when corporate proxy blocks export.
PostHog instead of UGS?
Still file privacy URL crosswalk; OTLP section documents your exporter or offline policy.
Unreal Engine SKU in same diligence zip?
File cousin Unreal OTLP corporate proxy case study with unreal_otlp_diligence_receipt_v1—schemas stay separate from 260.
Q4 diligence stalls when privacy URLs 404 and OTLP dies behind proxy—HEAD the URL, pin the CA or batch offline spans, then ugs_otlp_diligence_ok before diligence_telemetry_receipt_v1.json ships.