3-Day No False Green CI Challenge for Unity Addressables Cache Keys - October 2026
Monday CI green. Tuesday CI green. Wednesday CI green. Thursday demo smoke fails on the first Addressables.Load with InvalidKeyException. Your workflow restored Library/ from actions/cache three nights in a row—compile succeeded, catalog content did not.
October 2026 fest teams move Addressables groups weekly. False-green CI is the silent failure: the badge proves compilation, not player-load truth. 7-day key audit owns K1–K7 inventory calendar; evening cache-bust tutorial owns one-night YAML; Library cache preflight owns ninety-second C1–C6. This Challenges & Community Hooks sprint is the three-day accountability ladder: log cache keys, force a bust after a group move, require installed smoke, file addressables_ci_cache_receipt_v1.json—hashtag #NoFalseGreenAddressables2026.
Non-repetition note: This URL is three-day CI cache truth—not seven-day key inventory, not one-evening tutorial depth, not Invalid Key runtime triage. Same cluster, different angle per workflows/content-ecosystem.md format ladder.
Why this matters now (October 2026)
- Tuesday group moves, Wednesday promote — Branch-only cache keys hide catalog drift on the same ref.
- Three green nights ≠ ship — Teams skip player smoke because GitHub passed.
- Fest strip weeks — Deleted groups + restored
Library/= ghost catalog references. - Discord noise — “Addressables broken” when the fix is cache key material.
- BUILD_RECEIPT rows — Thursday row review needs
no_false_green_ci_okbesidedemo_smokeandlibrary_cache_bust_ok.
Direct answer: Three weekdays (~20 minutes each); gates F1–F6; artifacts under release-evidence/unity/ci-cache-challenge/; file addressables_ci_cache_receipt_v1.json with three_day_ladder; no fest promotion until F6 and catalog hash promotion rule pass.
Who this challenge is for
| Audience | You will… |
|---|---|
| Beginner | Tweet-thread daily checklist—cache key, smoke, receipt |
| Solo engineer | Stop trusting green badges after Addressables moves |
| Producer | Block Wednesday smoke week until F6 GREEN |
| Working dev | Wire catalog hash promotion rule in CI jq |
Engines: Unity 6.x LTS + Addressables; GitHub Actions with actions/cache on Library/.
Time: ~60 minutes total over three weekdays (20 min/day).
Challenge vs tutorial vs seven-day audit (format ladder)
| Artifact | Role |
|---|---|
| This challenge | 3-day false-green CI ladder + community hook |
| Evening cache-bust tutorial | One-evening YAML + unity_ci_library_cache_receipt_v1 |
| 7-day key audit | K1–K7 inventory before content strip |
| Library cache preflight | Ninety-second C1–C6 |
| Lesson 261 | BUILD_RECEIPT library_cache_bust_ok |
| Lesson 219 | String table receipt after strip |
| Help #26 forward | Stale Library fix lane |
| Resource #24 forward | Cache debug tool list |
Order: K1 inventory (if strip week) → evening tutorial or preflight C1–C6 → this 3-day challenge after any group move → Wednesday smoke.
Before you start — readiness checklist
- [ ]
release-evidence/unity/ci-cache-challenge/folder exists - [ ] GitHub Actions workflow logs accessible for last three runs
- [ ]
actions/cacherestoresLibrary/on your Unity job - [ ] One Addressables group move planned (or simulated) for Day 2
- [ ]
clean-library-on-group-movejob exists (evening tutorial Block B) - [ ] Wednesday smoke golden path documented for your demo
- [ ]
build_labelvisible in player build (visible label opinion) - [ ] Producer agrees: no fest promotion until F6 receipt filed
Do not start the challenge during a quiet week with zero Addressables changes—the ladder proves bust after move, not generic CI hygiene.
Rules of the challenge
- One owner signs each day (
day_N_pass). - Fail stops the ladder—do not start Day 3 if Day 2 cache key did not change after a group move.
- Installed build required on Day 3—Editor Play Mode does not count for F5.
- Pair with player-visible build label on smoke build.
- Post daily progress with
#NoFalseGreenAddressables2026(tweet thread or Discord devlog). - Friday Block 5:
no_false_green_ci_ok Y/N.
Three-day calendar at a glance
| Day | Gates | Primary artifact | Pass signal |
|---|---|---|---|
| Day 1 | F1–F2 | cache_baseline_v1.json |
Cache key + ContentState + catalog hashes logged |
| Day 2 | F3–F4 | cache_key_diff_table.csv |
Group move + cache key changed OR clean job + cache miss |
| Day 3 | F5–F6 | addressables_ci_cache_receipt_v1.json |
Player smoke pass + no_false_green_ci_ok: true |
Weekend between Day 2 and Day 3 is allowed—re-run F4 if CI ran over the weekend.
Wednesday smoke integration (Day 3 — F5 detail)
Wednesday smoke gates S4–S6 prove the installed artifact—not the Editor. For this challenge, extend smoke with one Addressables-specific row:
| Smoke row | Check | Pass when |
|---|---|---|
| S-ADDR | Golden path loads one remote Addressables asset | No InvalidKeyException in first 10 min Player.log |
| S-LABEL | On-screen build_label matches receipt |
Matches Day 2 CI artifact |
| S-CACHE | BUILD_RECEIPT catalog_hash matches receipt Day 3 |
Promotion rule satisfied |
Beginner: If smoke fails S-ADDR, do not re-run CI blindly—return to Day 2 and verify F4 cache key diff. Re-running CI without bust repeats false green.
Developer: Save Player.log excerpt to release-evidence/unity/ci-cache-challenge/runtime_load_smoke.log; grep:
grep -i "InvalidKeyException" runtime_load_smoke.log && exit 1 || exit 0
Wire as optional CI job after player build—cousin to Lesson 200 concat_ok gate culture.
Beginner path — daily 20-minute tweet thread
Copy this thread skeleton each day:
Day 1 tweet: “#NoFalseGreenAddressables2026 Day 1 — logged cache key + ContentState sha256 + catalog hash. F1–F2 GREEN. Tomorrow: move one group and prove key bust.”
Day 2 tweet: “Day 2 — moved fest_strip_candidate group / ran clean-library job. Cache key changed (see diff table). F3–F4 GREEN.”
Day 3 tweet: “Day 3 — installed smoke passed on build_label. Filed addressables_ci_cache_receipt_v1.json. F5–F6 GREEN. No false green this week.”
Day 1 checklist (F1–F2) — ~20 minutes
| Step | Action | Pass |
|---|---|---|
| 1 | Open latest CI log; copy actions/cache primary key string |
F1 |
| 2 | sha256 Library/com.unity.addressables/AddressablesContentState.bin |
F1 |
| 3 | Record catalog hash from Build Report or catalog_build_fingerprint.txt |
F1 |
| 4 | Save cache_baseline_v1.json under release-evidence/unity/ci-cache-challenge/ |
F1 |
| 5 | Confirm cousin address_inventory_v1.json exists (jq preflight) |
F2 |
sha256sum Library/com.unity.addressables/AddressablesContentState.bin
Red flag: Cache key is only github.ref or branch name—note for Day 2 bust.
Day 2 checklist (F3–F4) — ~20 minutes
| Step | Action | Pass |
|---|---|---|
| 1 | Move one Addressables group or merge a prepared strip PR | F3 |
| 2 | Trigger workflow_dispatch clean-library job or delete cache entry manually |
F3 |
| 3 | Re-run CI; capture new cache key + ContentState hash | F4 |
| 4 | Fill cache_key_diff_table.csv (before vs after) |
F4 |
| 5 | Confirm CI log shows cache miss or new key—not silent restore of old Library/ |
F4 |
Fail-closed: If cache key unchanged after group move, Day 2 fails—fix YAML before Day 3.
Day 3 checklist (F5–F6) — ~20 minutes
| Step | Action | Pass |
|---|---|---|
| 1 | Download/install CI player build from Day 2 run | F5 |
| 2 | Run Wednesday smoke golden path (10–15 min) | F5 |
| 3 | Zero InvalidKeyException in Player.log excerpt |
F5 |
| 4 | Apply catalog hash promotion rule (below) | F6 |
| 5 | File addressables_ci_cache_receipt_v1.json; jq gate in CI |
F6 |
Developer path — gates F1–F6
| Gate | Check | Fail when |
|---|---|---|
| F1 | Baseline hashes + cache key archived | Missing ContentState or catalog hash |
| F2 | Inventory cousin path valid | address_inventory_v1.json missing groups[] |
| F3 | Deliberate catalog change + bust policy executed | Group moved but no clean job |
| F4 | Cache key diff proves bust | Before == after key strings |
| F5 | Installed player smoke | InvalidKey in golden path |
| F6 | Receipt + promotion rule | no_false_green_ci_ok false |
Cache key diff table (Day 2 artifact)
release-evidence/unity/ci-cache-challenge/cache_key_diff_table.csv:
field,day_1_before,day_2_after,changed
actions_cache_primary_key,unity-library-Linux-main-abc123,unity-library-Linux-main-def456,true
content_state_sha256,b7e2c4f1…,c8f3d5a2…,true
catalog_hash,fest_catalog_2026-10-01,fest_catalog_2026-10-02,true
library_cache_restore_hit,true,false,true
Pass F4 when: changed column is true for actions_cache_primary_key and content_state_sha256 after a group move.
Catalog hash promotion rule (developer)
Block fest branch promotion when:
receipt.catalog_hash != BUILD_RECEIPT.last_promoted_catalog_hash
AND receipt.no_false_green_ci_ok != true
CI tail (fail-closed):
jq -e '.no_false_green_ci_ok == true' release-evidence/unity/ci-cache-challenge/ADDRESSABLES_CI_CACHE_RECEIPT.json
jq -e '.three_day_ladder.day_3.demo_smoke_pass == true' release-evidence/unity/ci-cache-challenge/ADDRESSABLES_CI_CACHE_RECEIPT.json
Pair Lesson 219 optional gate column when strip includes localization groups.
addressables_ci_cache_receipt_v1.json (F6)
{
"schema": "addressables_ci_cache_receipt_v1",
"build_label": "october-fest-2026-rc6",
"challenge_hashtag": "#NoFalseGreenAddressables2026",
"three_day_ladder": {
"day_1": {
"date": "2026-10-06",
"cache_key": "unity-library-Linux-main-abc123",
"content_state_sha256": "b7e2c4f1a9d8e3b6…",
"catalog_hash": "fest_catalog_2026-10-06",
"gates": { "F1": "pass", "F2": "pass" }
},
"day_2": {
"date": "2026-10-07",
"group_move": "fest_strip_candidate → Remote",
"cache_key": "unity-library-Linux-main-def456",
"cache_key_changed": true,
"clean_library_job": "clean-library-on-group-move",
"cache_key_diff_csv": "release-evidence/unity/ci-cache-challenge/cache_key_diff_table.csv",
"gates": { "F3": "pass", "F4": "pass" }
},
"day_3": {
"date": "2026-10-08",
"demo_smoke_pass": true,
"player_log_excerpt": "release-evidence/unity/ci-cache-challenge/runtime_load_smoke.log",
"gates": { "F5": "pass", "F6": "pass" }
}
},
"cousin_receipts": {
"unity_ci_library_cache": "release-evidence/unity/ci-cache/UNITY_CI_LIBRARY_CACHE_RECEIPT.json",
"addressables_key_audit": "release-evidence/unity/addressables-audit-week/addressables_key_audit_receipt_v1.json"
},
"catalog_hash_promotion_rule_applied": true,
"gates": {
"F1_baseline": "pass",
"F2_inventory_cousin": "pass",
"F3_group_move_bust": "pass",
"F4_cache_key_diff": "pass",
"F5_player_smoke": "pass",
"F6_receipt": "pass"
},
"no_false_green_ci_ok": true,
"fest_promotion_allowed": true
}
Pin under release-evidence/unity/ci-cache-challenge/ADDRESSABLES_CI_CACHE_RECEIPT.json.
Alias note: Evening tutorial references unity_ci_library_cache_receipt_v1 as canonical for one-evening setup; addressables_ci_cache_receipt_v1 indexes the three-day ladder and promotion rule—cross-link in cousin_receipts, do not merge schemas.
BUILD_RECEIPT columns
| Column | Example |
|---|---|
no_false_green_ci_ok |
true |
addressables_ci_cache_receipt_path |
release-evidence/unity/ci-cache-challenge/ADDRESSABLES_CI_CACHE_RECEIPT.json |
catalog_hash |
fest_catalog_2026-10-08 |
library_cache_bust_ok |
true (cousin from Lesson 261) |
YAML sketch — ContentState in cache key (Day 2 target)
If Day 1 shows branch-only keys, Day 2 PR should resemble:
- name: Hash Addressables ContentState
id: content_state
run: |
echo "hash=$(sha256sum Library/com.unity.addressables/AddressablesContentState.bin | cut -d' ' -f1)" >> $GITHUB_OUTPUT
- uses: actions/cache@v4
with:
path: Library
key: unity-library-${{ runner.os }}-${{ github.sha }}-${{ steps.content_state.outputs.hash }}
Full evening walkthrough: cache-bust tutorial.
Day 1 developer script — cache_baseline_v1.json
#!/usr/bin/env bash
set -euo pipefail
OUT="release-evidence/unity/ci-cache-challenge/cache_baseline_v1.json"
CS="Library/com.unity.addressables/AddressablesContentState.bin"
test -f "$CS" || { echo "Run Addressables build first"; exit 1; }
HASH=$(sha256sum "$CS" | awk '{print $1}')
CATALOG=$(cat release-evidence/unity/addressables-audit-week/catalog_build_fingerprint.txt 2>/dev/null || echo "unknown")
# Paste primary cache key from latest CI log into CACHE_KEY env before running
jq -n \
--arg hash "$HASH" \
--arg catalog "$CATALOG" \
--arg key "${CACHE_KEY:-paste-from-ci-log}" \
'{schema:"cache_baseline_v1",content_state_sha256:$hash,catalog_hash:$catalog,actions_cache_primary_key:$key,day:1}'
Archive the CI log snippet showing Cache restored from key: beside the JSON—F4 later compares against this baseline.
Day 2 developer notes — proving cache miss
In GitHub Actions logs, search:
Cache not found for input keys
or
Cache restored from key: unity-library-...
Pass F4 when post-move log shows miss or restored key ≠ Day 1 key. Fail when restored key matches Day 1 after a catalog-changing merge.
Help #30 forward: if concurrency: cancel-in-progress interrupted Addressables build, run clean-library before interpreting F4—poisoned Library/ mimics false greens.
Community hook — #NoFalseGreenAddressables2026
| Day | Suggested post | Attach |
|---|---|---|
| 1 | Baseline hashes + “branch-only key?” callout | cache_baseline_v1.json redacted |
| 2 | Before/after cache key strings | cache_key_diff_table.csv screenshot |
| 3 | Smoke pass + receipt path | build_label photo |
Working dev: Pin Discord thread in #release-ops with three checkboxes—producers mark F6 without reading YAML.
Pair Tuesday CSV ingest when playtest week overlaps strip week—engineering floor is cache + smoke, not marketing bursts (time-box worksheet).
False-green signals (qualitative, late 2026)
Patterns from fest post-mortems and CI threads—no invented close rates:
- Three consecutive green workflow runs on
mainafter Addressables group PR - Player smoke fails only on CI-built artifact—not local Development Build
- Cache log line “Cache restored from key” with key from before group merge
- Engineers rerun CI without
clean-libraryand declare “flake” library_cache_bust_okmissing on BUILD_RECEIPT whiledemo_smokefails
Treat InvalidKey after green CI as P0 cache until F4 proves key change.
Counterargument — “We already run Wednesday smoke”
Smoke catches false green after promotion pressure builds. This challenge front-loads cache proof before producers schedule fest branch merges—receipt shows Day 2 bust before Day 3 smoke, not only smoke failure as alarm. Teams without smoke discipline still benefit: F6 jq gate blocks merge when receipt missing.
Weekly ritual map
| Day | Ritual | Receipt |
|---|---|---|
| Mon | F1–F2 baseline (this challenge) | cache_baseline_v1.json |
| Tue | Group move + F3–F4 | cache_key_diff_table.csv |
| Wed | F5 smoke + F6 receipt | ADDRESSABLES_CI_CACHE_RECEIPT.json |
| Thu | Row review | no_false_green_ci_ok |
| Fri | Block 5 evidence maintenance | Archive challenge folder |
Proof table
| Row | Evidence | Pass |
|---|---|---|
| Baseline | cache_baseline_v1.json |
All three hashes present |
| Inventory cousin | address_inventory_v1.json |
groups[] via jq |
| Key diff | cache_key_diff_table.csv |
changed=true for key + ContentState |
| Smoke | runtime_load_smoke.log |
No InvalidKey |
| Receipt | ADDRESSABLES_CI_CACHE_RECEIPT.json |
no_false_green_ci_ok: true |
| BUILD_RECEIPT | Weekly row | Catalog hash + booleans |
Seven scenarios (A–G)
| ID | Situation | Response |
|---|---|---|
| A | First October strip week | Run full F1–F6 once |
| B | No group move this week | Skip challenge; keep preflight C1–C6 |
| C | Day 2 green but key unchanged | F4 fail—fix cache YAML |
| D | CI slow after bust | Expected—correctness over cache hit rate |
| E | Editor smoke passes, installed fails | F5 fail—false green confirmed |
| F | concurrency: cancel-in-progress mid-build |
Help #30 cousin + clean Library/ |
| G | Promotion without receipt | Block; file F6 first |
| H | Strip week + localization | Add Lesson 219 cousin row to cousin_receipts before F6 |
Common mistakes
- Branch-only cache keys — F4 never passes after group move.
- Day 3 smoke in Editor only — F5 requires installed CI artifact.
- Merging
addressables_ci_cache_receiptwithunity_ci_library_cache_receipt— cousin paths only. - Skipping Day 2 when no group move—challenge is for move weeks.
- Green CI without reading cache restore line — F4 requires log proof.
- Deleting jq guards to unblock merge — fix inventory (jq preflight J5).
- Trusting compile without visible build label on smoke build.
- Running challenge during strip without K1 inventory — pair 7-day K1 the week before.
Troubleshooting
| Symptom | Lane |
|---|---|
| CI green, InvalidKey in player | F3–F4 bust; Help #26 forward |
| Cache key never changes | Evening tutorial C2 |
| Inventory jq fails | 7-day K1 |
| Smoke passes, catalog hash drift | Promotion rule block; re-run Day 2 |
| Intermittent after cancel | Help #30 concurrency |
Tools and sibling reads
- 15-free GitHub Actions CI recipes
- Resource #24 forward — Addressables cache debug tools
- Invalid Key runtime help
- OBS OneDrive case study — different false-green class (empty inbox)
- SteamPipe queue wall-clock trend
Key takeaways
- Three green CI nights ≠ player truth—run F5 installed smoke.
- Cache key diff table is the receipt artifact that proves bust (F4).
addressables_ci_cache_receipt_v1.jsonindexes the three-day ladder.- Catalog hash promotion rule blocks promote when hash drifts without F6.
#NoFalseGreenAddressables2026— community accountability hook.- Evening tutorial sets up YAML; this challenge verifies it after moves.
- 7-day audit is preventive inventory; this is CI cache verification.
- Lesson 261 + Lesson 219 cousin columns.
- Help #26 forward owns fix; this challenge owns preventive ladder.
- Pair Wednesday smoke on Day 3.
FAQ
Can we run this every week?
Run when Addressables groups move or cache policy changes—not on quiet weeks.
Is this replacing the 7-day challenge?
No—K1–K7 is inventory before strip; F1–F6 is CI cache truth after moves.
One receipt or two?
File addressables_ci_cache_receipt_v1 for the ladder; keep unity_ci_library_cache_receipt_v1 from evening setup as cousin.
What if we do not use GitHub Actions?
Adapt F1–F4 to your CI cache key logs; F5–F6 still require installed smoke + receipt.
Does this fix InvalidKey at runtime?
Prevents false-green promotion; runtime triage stays Invalid Key help.
When should we skip this challenge?
Skip on weeks with no Addressables group moves and no cache policy edits—run preflight C1–C6 only.
How does this relate to OBS empty inbox case study?
OneDrive KFM case study is capture path false confidence; this challenge is CI cache false confidence—same receipt culture, different drift class.
Can solo devs run this without a producer?
Yes—sign each day yourself; still file F6 before merging to fest_public or running 12 setlive checks.
Conclusion
October fest teams cannot afford three green nights that hide stale Library/ restores. Log baseline hashes, force cache key change after group moves, smoke the installed CI build, file addressables_ci_cache_receipt_v1.json—then promote.
Next reads: Evening cache-bust tutorial, Library cache preflight, Lesson 261, Wednesday smoke.
Post Day 1 baseline with #NoFalseGreenAddressables2026 before your next Tuesday group move—not after Thursday's InvalidKey thread. Archive all three daily artifacts under one build_label folder so Thursday row review can diff no_false_green_ci_ok, demo_smoke, and library_cache_bust_ok in a single ten-minute pass.