We Recovered a Post-Fest Partner Review After February Closeout Receipt Passed But Annex Was Empty - 2026 Case Study

This is a synthesized case study—a field pattern from March 2027 micro-studios who filed february_fest_closeout_receipt_v1.json with post_fest_debrief_allowed: true, ran Sunday closeout C1–C10 on schedule, and opened the partner diligence call with a GREEN boolean—then failed the first annex path request because jsonl_annex[] was empty or pointed at moved files. It is not a named studio turnaround. There are no invented download counts, no fake partner quotes, and no fabricated wishlist percentages.
What follows is the failure signature, a D1–D3 recovery timeline, post_fest_partner_review_recovery_receipt_v1.json with gates P1–P6, and an annex backfill checklist teams run when closeout receipts pass but diligence stories fail.
Pair Sunday closeout #11, Monday debrief facilitator card, March evidence sprint, Q3 diligence analysis, forward blog #11 Friday March capstone.
Non-repetition note: Monday debrief evening owns non-empty annex card export. March evidence sprint owns E1–E7 consumption when annex exists. Fest-day setlive mismatch owns live depot drift. This URL owns empty or stale jsonl_annex[] after GREEN closeout—partner diligence recovery, not closeout mechanics redo.
Why this matters now (March 2027 diligence calls)
- GREEN receipt ≠ GREEN story —
february_fest_closeout_okdocuments ritual completion; partners ask for paths. - Feature sprint amnesia — March merges rename
release-evidence/folders while closeout JSON still lists old paths. - Compressed intake windows — Q3 diligence packets expect annex index on first call—not a week to backfill.
- Evidence sprint blocked — March E3 sha256 walk fails on empty annex.
- Facilitator card theater — Monday debrief card printed hooks with no files behind them.
Direct answer: Recovery required annex inventory from cluster receipts, backfill jsonl_annex[], re-run Sunday C7 with real paths, file recovery receipt, and post_fest_partner_review_recovery_ok: true before rescheduling partner review.
Beginner quick start — what recovered means here
Recovered in this pattern means:
- Admitted empty or broken annex on the diligence call—no bluffing paths.
- Rebuilt annex index from February cluster #1–#10 receipts on disk.
- Re-filed closeout receipt with populated
jsonl_annex[]+receipt_versionbump. - Filed
post_fest_partner_review_recovery_receipt_v1.jsonwith P1–P6 GREEN. - Rescheduled partner review with zip bundle—paths open in under 60 seconds.
Success check: Partner asks for funnel CSV path; facilitator opens file in shared screen without searching Slack.
The partner-facing failure (typical signals)
| Channel | Typical wording |
|---|---|
| Partner diligence | "Your closeout receipt shows annex—where is the hourly jsonl?" |
Internal #fest-ops |
"We passed Sunday—why is annex empty?" |
| March E3 | sha256 walk exits 1 on MISSING |
| Producer | "Slides say strong fest—we have no files" |
Internal language before fix: "Closeout was GREEN" — when root cause was empty index or path drift, not fest performance.
Starting state (what was wrong)
| Layer | Symptom |
|---|---|
| Closeout receipt | february_fest_closeout_ok: true, jsonl_annex: [] |
| BUILD_RECEIPT | post_fest_debrief_allowed: true |
| Sunday C7 | Passed with waiver note "annex TBD"—undocumented |
| Cluster receipts | Files exist scattered—not indexed |
| Monday card | Block B lists paths that 404 on disk |
| Partner call | First path request fails live |
Fest may have been legitimately strong—the failure is evidence index, not necessarily demo quality.
Root cause pattern (synthesized)
| Mechanic | What drifted |
|---|---|
| Placeholder closeout | Team set post_fest_debrief_allowed before C7 annex populated |
| Path move without re-index | release-evidence/ reorganized March week 1 |
| Copy-paste closeout JSON | Template jsonl_annex[] never filled from cluster |
| Skipped C7 waiver | Undeclared empty annex—C7 should RED |
| Debrief before backfill | Monday card built from memory not closeout export |
None require malice—only Sunday night speed and March folder churn.
Timeline D1–D3 (recovery pattern)
| Day | Focus | Output |
|---|---|---|
| D1 | Admit + inventory | annex_backfill_inventory_v1.json |
| D2 | Rebuild jsonl_annex[] + closeout re-file |
Updated FEBRUARY_FEST_CLOSEOUT_RECEIPT.json |
| D3 | Recovery receipt + partner zip | post_fest_partner_review_recovery_receipt_v1.json |
Teams with velocity exports caught path drift in stand-up; teams without learned on partner call.
D1 — inventory discipline (beginner path)
Goal: List every February cluster receipt that should have been in annex.
| Step | Action |
|---|---|
| 1 | Walk closeout row catalog table |
| 2 | find release-evidence/february-live -name '*receipt*.json' |
| 3 | Map found files to annex keys (funnel, refund, hourly, HOTFIX, pager) |
| 4 | Record missing[] vs found[] in inventory JSON |
| 5 | Post internal status—pause partner scheduling |
Beginner rule: Do not edit closeout receipt until inventory complete—P2 requires honest gap list.
annex_backfill_inventory_v1.json (sketch)
{
"schema": "annex_backfill_inventory_v1",
"fest_window": "2027-02-next-fest-live",
"found": [
{ "key": "hour_one_funnel_csv", "path": "release-evidence/analytics/hour-one-funnel-2027.csv", "exists": true },
{ "key": "refund_daily_jsonl", "path": "release-evidence/february-live/refund/february_refund_spike_daily_log.jsonl", "exists": true }
],
"missing": [
{ "key": "hourly_ops_jsonl", "expected": "release-evidence/february-live/ops/february_fest_live_ops_hourly_log.jsonl", "exists": false, "action": "re-export from jq hourly cluster" }
],
"empty_annex_root_cause": "C7 waiver not documented; jsonl_annex never populated"
}
D2 — rebuild annex index (working dev)
Goal: Populate jsonl_annex[] on closeout receipt; bump receipt_version.
| Step | Action | Gate |
|---|---|---|
| 1 | Re-export or restore each missing[] path |
P3 |
| 2 | Build annex array from inventory found[] |
P4 |
| 3 | sha256sum each annex file; store in annex row |
P4 |
| 4 | Update FEBRUARY_FEST_CLOSEOUT_RECEIPT.json |
P5 |
| 5 | Re-run verify_february_fest_closeout.sh |
P5 |
| 6 | Update Monday facilitator card Block B paths | P5 |
#!/usr/bin/env bash
# backfill_annex_from_inventory.sh
set -euo pipefail
INV="${1:-annex_backfill_inventory_v1.json}"
CLOSEOUT="${2:-release-evidence/february-live/FEBRUARY_FEST_CLOSEOUT_RECEIPT.json}"
jq --slurpfile inv "$INV" '
.jsonl_annex = ($inv[0].found | map({
key: .key,
path: .path,
sha256: .sha256
}))
| .receipt_version = ((.receipt_version // 1) + 1)
| .notes += ["annex backfill 2027-03-05"]
' "$CLOSEOUT" > "${CLOSEOUT}.tmp" && mv "${CLOSEOUT}.tmp" "$CLOSEOUT"
Fail-closed: Any missing[] without restored file blocks P5—reschedule partner, do not bluff.
D3 — partner review reschedule (producer path)
Goal: File recovery receipt; send diligence zip; rerun March E3 if sprint active.
| Step | Action |
|---|---|
| 1 | Write post_fest_partner_review_recovery_receipt_v1.json |
| 2 | Zip closeout + annex files + recovery receipt |
| 3 | Email partner with path index (not slides-only) |
| 4 | BUILD_RECEIPT post_fest_partner_review_recovery_ok: true |
| 5 | Resume March evidence sprint Night 3+ |
Gates P1–P6 (recovery blockers)
| Gate | Name | Pass criteria |
|---|---|---|
| P1 | Failure admitted | Partner call notes document empty annex discovery |
| P2 | Inventory filed | annex_backfill_inventory_v1.json with found + missing |
| P3 | Missing resolved or waived | Each missing[] has action + file OR documented waiver |
| P4 | Annex sha256 pinned | Every annex row has hash |
| P5 | Closeout re-filed | jsonl_annex[] length ≥ adopted cluster count |
| P6 | Recovery receipt | post_fest_partner_review_recovery_ok: true on BUILD_RECEIPT |
P3–P5 are reschedule blockers when RED.
post_fest_partner_review_recovery_receipt_v1.json (schema)
{
"schema": "post_fest_partner_review_recovery_receipt_v1",
"fest_window": "2027-02-next-fest-live",
"recovery_started_utc": "2027-03-05T10:00:00Z",
"recovery_completed_utc": "2027-03-07T16:00:00Z",
"gates": {
"P1": "GREEN",
"P2": "GREEN",
"P3": "GREEN",
"P4": "GREEN",
"P5": "GREEN",
"P6": "GREEN"
},
"cousin_receipts": {
"february_fest_closeout_before": "release-evidence/february-live/archive/FEBRUARY_FEST_CLOSEOUT_RECEIPT_v1_empty_annex.json",
"february_fest_closeout_after": "release-evidence/february-live/FEBRUARY_FEST_CLOSEOUT_RECEIPT.json",
"monday_debrief_facilitator": "release-evidence/post-fest/debrief/POST_FEST_DEBRIEF_FACILITATOR_RECEIPT.json"
},
"inventory_path": "release-evidence/post-fest/recovery/annex_backfill_inventory_v1.json",
"partner_zip": "release-evidence/post-fest/recovery/partner-review-recovery-2027-03-07.zip",
"annex_row_count_before": 0,
"annex_row_count_after": 6,
"post_fest_partner_review_recovery_ok": true,
"partner_review_rescheduled_utc": "2027-03-10T14:00:00Z",
"notes": "Root cause: C7 empty annex with undeclared waiver; March folder move broke 2 paths"
}
BUILD_RECEIPT rows (D3 commit)
{
"february_fest_closeout_ok": true,
"post_fest_debrief_allowed": true,
"post_fest_partner_review_recovery_ok": true,
"post_fest_partner_review_recovery_receipt": "release-evidence/post-fest/recovery/POST_FEST_PARTNER_REVIEW_RECOVERY_RECEIPT.json",
"closeout_receipt_version": 2
}
verify_post_fest_partner_review_recovery.sh
#!/usr/bin/env bash
set -euo pipefail
REC="${1:-release-evidence/post-fest/recovery/POST_FEST_PARTNER_REVIEW_RECOVERY_RECEIPT.json}"
CLOSEOUT="${2:-release-evidence/february-live/FEBRUARY_FEST_CLOSEOUT_RECEIPT.json}"
jq -e '.schema == "post_fest_partner_review_recovery_receipt_v1"' "$REC" || exit 1
jq -e '.post_fest_partner_review_recovery_ok == true' "$REC" || exit 6
COUNT=$(jq '.jsonl_annex | length' "$CLOSEOUT")
test "$COUNT" -gt 0 || exit 5
while IFS= read -r path; do test -f "$path" || exit 4; done < <(jq -r '.jsonl_annex[].path' "$CLOSEOUT")
echo "post_fest_partner_review_recovery verify: OK"
Annex backfill checklist (printable)
# Annex backfill after empty closeout — March 2027
□ P1 — Document empty annex on partner/internal record
□ P2 — Inventory JSON (found + missing)
□ P3 — Restore or waive each missing path
□ P4 — sha256 each annex file
□ P5 — Re-file closeout receipt (version bump)
□ P6 — Recovery receipt + partner zip
□ Reschedule partner review only after verify exit 0
□ Re-run March evidence sprint E3 if active
Proof table
| Evidence | Proves | Fail signal |
|---|---|---|
| Partner call notes | P1 admission | Blame partner "wrong question" |
| Inventory JSON | P2 honest gap list | Skip straight to re-file |
| Restored files on disk | P3 | Fake paths in JSON |
| sha256 rows | P4 integrity | Hand-typed hashes |
| Closeout v2 | P5 non-empty annex | Edit v1 in place |
| Recovery receipt | P6 completion | Verbal "we fixed it" |
Scenarios A–G
| ID | Situation | Move |
|---|---|---|
| A | Annex empty, files exist | D1 inventory → D2 index |
| B | Annex populated, paths wrong | Path walk + re-index only |
| C | Files deleted | Re-export from Steamworks/cluster rituals |
| D | Partner call tomorrow | Delay call; P1 email with timeline |
| E | March E3 already RED | This recovery unblocks E3 |
| F | Solo founder | Same checklist—inventory script is not team-size gated |
| G | Partial cluster adoption | Annex only indexes adopted rows—document waivers |
Comparison pack (recovery vs cousins)
| Artifact | Owns |
|---|---|
| Sunday closeout | C1–C10 including C7 annex |
| Monday debrief card | Card from non-empty annex |
| March evidence sprint | Consume annex nights |
| This case study | Empty/stale annex recovery |
| Q3 diligence analysis | Packet expectations |
Partner diligence zip (D3)
#!/usr/bin/env bash
set -euo pipefail
OUT="release-evidence/post-fest/recovery/partner-review-recovery-2027-03-07.zip"
zip -j "$OUT" \
release-evidence/post-fest/recovery/POST_FEST_PARTNER_REVIEW_RECOVERY_RECEIPT.json \
release-evidence/february-live/FEBRUARY_FEST_CLOSEOUT_RECEIPT.json \
release-evidence/post-fest/debrief/POST_FEST_DEBRIEF_FACILITATOR_RECEIPT.json \
release-evidence/post-fest/recovery/annex_backfill_inventory_v1.json
while IFS= read -r p; do zip -u "$OUT" "$p"; done < <(jq -r '.jsonl_annex[].path' release-evidence/february-live/FEBRUARY_FEST_CLOSEOUT_RECEIPT.json)
echo "partner recovery zip: $OUT"
Aligns with Q3 demo evidence packets—paths over narrative.
Prevention (post-recovery discipline)
- Sunday C7 fail-closed — Empty
jsonl_annex[]→ RED unless waiver innoteswith producer sign-off. - No Monday card before annex walk — D3 path script must exit 0.
- March folder freeze — No
release-evidence/moves without closeoutreceipt_versionbump. - **Start March sprint only after annex non-empty or recovery P6 GREEN.
Common mistakes
Re-running Sunday C1–C10 from scratch — Recovery is annex backfill, not full live week replay.
Fabricating annex rows — P4 sha256 audit catches empty files.
Hiding empty annex on call — P1 requires documented admission.
Editing closeout v1 in place — Archive v1; file v2 with version bump.
Skipping partner reschedule — Recovery receipt is not the call—send zip + new slot.
Extended scenarios H–L
H — Only hourly jsonl missing
P3 single-file re-export from jq hourly #8—do not re-index entire fest.
I — Partner accepts delayed call
P1 email template: "empty annex discovered; recovery ETA 72h"—better than live path failure.
J — Velocity receipt unrelated
Velocity listicle continues—recovery is closeout annex cousin.
K — Forward Friday March capstone (#11)
Capstone expects recovery receipt if partner review slipped—log cousin link in notes.
L — Help row forward
Help planner #37–#41 may ship annex path fix article—blog owns recovery timeline.
Worked example — D1 through D3 (synthetic timeline)
| UTC | Phase | Action | Artifact |
|---|---|---|---|
| 2027-03-05T10:00 | D1 | Partner asks for hourly jsonl; jq '.jsonl_annex\|length' returns 0 |
Call notes |
| 2027-03-05T14:00 | D1 | find + inventory JSON |
annex_backfill_inventory_v1.json |
| 2027-03-06T09:00 | D2 | Re-export jq hourly from blog #8 ritual | hourly jsonl restored |
| 2027-03-06T16:00 | D2 | Closeout v2 + verify script exit 0 | FEBRUARY_FEST_CLOSEOUT_RECEIPT.json |
| 2027-03-07T11:00 | D3 | Recovery receipt + partner zip | POST_FEST_PARTNER_REVIEW_RECOVERY_RECEIPT.json |
| 2027-03-10T14:00 | D3 | Rescheduled review—paths open in 42 seconds | Partner sign-off email |
Producer email (P1 template):
Subject: February fest evidence annex — recovery in progress
We discovered our closeout receipt indexed an empty annex array during today's diligence prep.
We are backfilling paths from February cluster receipts and will send an updated zip within 72 hours.
Rescheduled review proposed: 2027-03-10 14:00 UTC.
Cluster receipt map (annex backfill source)
| Annex key | Typical source receipt | Blog cousin |
|---|---|---|
hour_one_funnel_csv |
HOUR_ONE_FUNNEL_SNAPSHOT_RECEIPT.json |
Hour-one funnel #2 |
refund_daily_jsonl |
february_refund_spike_receipt_v1.json |
Refund spike #9 |
hourly_ops_jsonl |
february_fest_live_ops_receipt_v1.json |
jq hourly #8 |
hotfix_exception_list |
hotfix_exception_list_receipt_v1.json |
HOTFIX opinion #10 |
pager_challenge_receipt |
february_live_ops_challenge_receipt_v1.json |
Pager challenge #4 |
whisper_clips_index |
february_live_whisper_triage_receipt_v1.json |
Whisper same-day #12 |
Inventory walks disk first, then maps to receipts—never invent paths from slide deck.
PowerShell verify cousin
$rec = Get-Content "release-evidence/post-fest/recovery/POST_FEST_PARTNER_REVIEW_RECOVERY_RECEIPT.json" | ConvertFrom-Json
if ($rec.schema -ne "post_fest_partner_review_recovery_receipt_v1") { exit 1 }
if (-not $rec.post_fest_partner_review_recovery_ok) { exit 6 }
$closeout = Get-Content "release-evidence/february-live/FEBRUARY_FEST_CLOSEOUT_RECEIPT.json" | ConvertFrom-Json
if ($closeout.jsonl_annex.Count -le 0) { exit 5 }
foreach ($row in $closeout.jsonl_annex) {
if (-not (Test-Path $row.path)) { Write-Error "MISSING: $($row.path)"; exit 4 }
}
Write-Host "post_fest_partner_review_recovery verify: OK"
CI hook sketch (post-recovery)
jobs:
partner-review-recovery:
if: github.ref == 'refs/heads/march-sprint-2027'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: bash scripts/verify_post_fest_partner_review_recovery.sh
- run: jq -e '.post_fest_partner_review_recovery_ok == true' release-evidence/BUILD_RECEIPT.json
Counterarguments (honest limits)
"Partners should accept narrative."
Some angels do—publishers with Q3 packet norms increasingly do not.
"We can rebuild annex from memory."
Memory drifts; sha256 walk is the audit.
"Closeout GREEN means legal protection."
Receipts are operational truth, not legal shields—recovery restores trust.
"Recovery takes too long."
72-hour reschedule beats a failed live screen share.
D2 deep dive — annex row shape after backfill
Each jsonl_annex[] entry should match Sunday closeout C7 expectations:
{
"key": "hourly_ops_jsonl",
"path": "release-evidence/february-live/ops/february_fest_live_ops_hourly_log.jsonl",
"source_receipt": "february_fest_live_ops_receipt_v1",
"fest_day": "D7",
"sha256": "a1b2c3d4…",
"indexed_utc": "2027-03-06T16:00:00Z"
}
Developer checks after backfill:
# Annex length vs adopted cluster count
jq '.jsonl_annex | length' FEBRUARY_FEST_CLOSEOUT_RECEIPT.json
# Crosswalk Monday facilitator annex_index
diff <(jq -c '.jsonl_annex[]' FEBRUARY_FEST_CLOSEOUT_RECEIPT.json | sort) \
<(jq -c '.[]' release-evidence/post-fest/debrief/annex_index.json | sort)
Mismatch between closeout annex and Monday debrief annex_index.json fails partner trust—re-sync both in same commit.
Red flag table (pre-partner call)
| Signal | Severity | Action |
|---|---|---|
jsonl_annex.length == 0 |
CRITICAL | Do not schedule call—start D1 |
| Path 404 on first request | CRITICAL | Pause call; run recovery |
| sha256 mismatch | HIGH | Re-export source file |
| Monday card paths ≠ closeout | HIGH | Re-render card from annex_index |
| Velocity ok but annex empty | MEDIUM | Orthogonal—fix annex first |
| Producer slide deck only | MEDIUM | Replace with zip index |
Post-recovery stand-up script
## Annex recovery complete
- closeout receipt_version: 2
- annex rows: 6 (was 0)
- recovery receipt: POST_FEST_PARTNER_REVIEW_RECOVERY_RECEIPT.json
- partner review: 2027-03-10T14:00:00Z
- March sprint E3: re-run tonight
Closing
Empty jsonl_annex[] is a silent failure mode—february_fest_closeout_ok looks fine in stand-up until a partner clicks a path. Recovery is inventory, backfill, re-file, and reschedule—not shame, not re-running the entire live week. Beginners follow D1–D3; working devs wire verify scripts; producers send zips before the second call. Prevention is Sunday C7 fail-closed on empty annex—recovery is the honest bridge when prevention slipped. Forward Friday March capstone (#11) expects either clean annex consumption or documented recovery receipt before April content update authorization.
Treat annex_backfill_inventory_v1.json as the partner-facing index: every path in jsonl_annex[] must resolve on disk with sha256 matching the closeout row review—not a second annex invented during recovery. If your team already started March evidence sprint Night 3, pause at failed E3, complete P1–P6 here, archive the partial challenge receipt with superseded_by, then restart Night 1 from a non-empty annex so sprint gates consume real files.
Key takeaways
- GREEN closeout can still be RED partner story when
jsonl_annex[]is empty. - P1–P6 recovery: admit → inventory → restore → re-file → receipt.
post_fest_partner_review_recovery_receipt_v1.jsonindexes before/after closeout cousins.- Pair Sunday closeout #11 C7 annex discipline.
- Pair Monday debrief #1—requires non-empty annex first.
- Unblocks March evidence sprint E3.
- Q3 diligence packets expect path index on call one.
verify_post_fest_partner_review_recovery.shgives CI one exit code.- Archive closeout v1—never edit empty annex in place.
- Forward #11 Friday March capstone consumes recovery cousin.
- March cluster #5 consumed—#6 signup trend next.
- Prevention beats recovery—C7 fail-closed on empty annex.
FAQ
Is this saying Sunday closeout was wrong?
Ritual may have run—index was incomplete; recovery fixes index.
Can we skip partner reschedule?
P6 expects new call with zip—async path review is valid.
Same as empty annex on Monday card only?
Monday card symptom; root cause is closeout jsonl_annex[].
Do we re-run February live week?
No—backfill annex from existing cluster receipts.
How long does D1–D3 take?
Typically 48–72 hours for six annex rows—depends on missing exports.
Does recovery replace velocity exports?
No—orthogonal; velocity listicle continues.
What if we already ran March evidence sprint with empty annex?
Pause sprint at failed E3, complete P1–P6 recovery, archive partial challenge receipt with superseded_by, restart Night 1 from non-empty annex.
How does this relate to BUILD_RECEIPT beginner pipeline?
Recovery extends root row discipline—post_fest_partner_review_recovery_ok is a cousin boolean, not a replacement for closeout columns.
Can we skip annex backfill if closeout boolean is GREEN?
No—C7 fail-closed on empty jsonl_annex[] exists precisely because booleans can pass while paths are hollow; this case study is the recovery bridge.
Related GamineAI reads
- Sunday February fest closeout
- Monday post-fest debrief facilitator card
- 7-day March evidence sprint
- 16 velocity export tools
- Q3 indie publisher diligence packets
- Fest-day setlive mismatch case study
- Forward: Friday March capstone closeout (#11)
GREEN booleans are not paths—inventory the annex, backfill the index, file the recovery receipt, then reschedule the partner call with files that open.