Lesson 194: Q1 2027 Intake Evidence Folder Assembler from Rehearsal Completion and Year-End Risk Packets (2026)
Direct answer: Lesson 193 exports rehearsal_completion_v1.json. Lesson 189 ships year_end_risk_packet_manifest.json and the year-end ZIP. Lesson 194 copies both into one intake evidence folder, writes intake_evidence_folder_manifest.json with per-file SHA-256 rows, recomputes bundle_sha256, and blocks promotion on intake_folder_incomplete until every required member is present and hash-verified.

Why this matters now (January 2027 partner intake)
January 2027 intake templates stopped accepting “here are three Drive links”:
- Partners replay October 2026 decks and expect
rehearsal_completion_v1.jsonbeside the risk letter ZIP—not a screenshot of Lesson 193 SQL. - Lesson 176 reply packets must cite archived tuple hashes that match files inside one folder.
- Ops teams that Slack
year_end_risk_2026.zipseparately from rehearsal exports get intake_folder_incomplete in the publish pipeline. - Q1 2027 window opens only when the assembler proves both rehearsal proof and year-end structural risk landed in the same evidence tree.
Lesson objectives
You will implement:
- Job
assemble_intake_evidence_folder_v1 - Contract
intake_evidence_folder_manifest.json - Deterministic member ordering + SHA-256 verification
- Partner-facing
INTAKE_EVIDENCE_INDEX.md - Publish gate
intake_folder_incomplete - Receipt
INTAKE_EVIDENCE_FOLDER_RECEIPT.jsonunderrelease-evidence/07-intake/
Prerequisites
- Lesson 193 —
rehearsal_completion_v1.json, gaterehearsal_completion_incomplete - Lesson 189 —
year_end_risk_packet_manifest.json, year-end ZIP, gateyear_end_packet_incomplete - Lesson 176 — tuple-hash versioning for reply packet crosswalk
- Lesson 172 — rollup semantics referenced inside year-end members
- Lesson 170 — FAQ tone for
INTAKE_EVIDENCE_INDEX.md
Required folder members
| # | Artifact | Source lesson | Required |
|---|---|---|---|
| 1 | rehearsal_completion_v1.json |
193 | Yes |
| 2 | REHEARSAL_COMPLETION_ROLLUP_RECEIPT.json |
193 | Yes |
| 3 | year_end_risk_packet_manifest.json |
189 | Yes |
| 4 | year_end_risk_2026.zip (or fiscal-year name) |
189 | Yes |
| 5 | YEAR_END_RISK_COVER.md |
189 | Yes (extracted from zip or sidecar) |
| 6 | INTAKE_EVIDENCE_INDEX.md |
194 | Yes |
| 7 | tuple_hash_index.json |
176 | Yes when partner reply lane active |
Target directory: release-evidence/07-intake/q1_2027/
intake_evidence_folder_manifest.json
{
"schema": "intake_evidence_folder_manifest_v1",
"intake_window_id": "q1_2027_partner_intake",
"cert_window_ids": ["q4_2026_meta_holiday", "q1_2027_steam_winter"],
"assembled_at_utc": "2027-01-08T16:00:00Z",
"assembled_by_email": "[email protected]",
"members": [
{
"path": "rehearsal_completion_v1.json",
"sha256": "aa11…",
"source_lesson": 193,
"gate_cleared": "rehearsal_completion_incomplete"
},
{
"path": "year_end_risk_packet_manifest.json",
"sha256": "bb22…",
"source_lesson": 189,
"gate_cleared": "year_end_packet_incomplete"
},
{
"path": "year_end_risk_2026.zip",
"sha256": "cc33…",
"source_lesson": 189,
"bundle_member": true
}
],
"bundle_sha256": "full_folder_zip_hex…",
"rehearsal_completion_pass": true,
"year_end_packet_complete": true,
"tuple_hash_index_sha256": "dd44…"
}
Rules:
members[]sorted lexicographically bypathbefore hash recomputation (deterministic replays).rehearsal_completion_passmust mirror"pass": trueinsiderehearsal_completion_v1.json.- Do not include raw
mock_audit_logCSV—Lesson 195 owns sanitized letters.
Preflight gates (fail-closed)
BLOCKERS = (
"rehearsal_completion_incomplete",
"year_end_packet_incomplete",
"intake_folder_incomplete",
)
def preflight_intake_folder(window_ids: list[str]) -> None:
assert_gate_clear("rehearsal_completion_incomplete") # Lesson 193
assert_gate_clear("year_end_packet_incomplete") # Lesson 189
rc = load_json("rehearsal_completion_v1.json")
if not rc.get("pass"):
raise IntakeFolderError("rehearsal_completion_v1.pass is false")
verify_year_end_manifest_members() # Lesson 189 hashes
Assembler sketch
def assemble_intake_evidence_folder(
intake_window_id: str,
out_dir: Path,
) -> Path:
members: list[Path] = []
members.append(copy_latest("rehearsal_completion_v1.json"))
members.append(copy_latest("REHEARSAL_COMPLETION_ROLLUP_RECEIPT.json"))
members.append(copy_latest("year_end_risk_packet_manifest.json"))
members.append(copy_latest("year_end_risk_2026.zip"))
members.append(extract_cover_md_from_zip_or_sidecar())
members.append(copy_latest("tuple_hash_index.json")) # Lesson 176
index_md = render_intake_evidence_index(members)
members.append(write_text(out_dir / "INTAKE_EVIDENCE_INDEX.md", index_md))
members_sorted = sorted(members, key=lambda p: p.name)
verify_sha256_rows(members_sorted)
zip_path = write_zip(members_sorted, out_dir / f"intake_evidence_{intake_window_id}.zip")
manifest = build_intake_manifest(members_sorted, zip_path, intake_window_id)
write_json(out_dir / "intake_evidence_folder_manifest.json", manifest)
write_receipt(out_dir / "INTAKE_EVIDENCE_FOLDER_RECEIPT.json", manifest)
return zip_path
INTAKE_EVIDENCE_INDEX.md (partner index)
Minimum sections:
- Intake window —
q1_2027_partner_intake+ cert windows covered. - Rehearsal completion summary — copy
completion_score_percentand phase table from Lesson 193 JSON (no raw logs). - Year-end risk summary —
structural_red_count,open_deficiency_count,weighted_pass_rate_pctfrom Lesson 189 manifest. - Tuple hash crosswalk — pointer to
tuple_hash_index.json(Lesson 176). - Verification — how to recompute
bundle_sha256locally.
Publish gate intake_folder_incomplete
Pipeline treats folder as incomplete when any of:
| Condition | Block reason |
|---|---|
| Missing required member | missing_member:<path> |
| SHA-256 mismatch vs manifest | hash_mismatch:<path> |
rehearsal_completion_v1.pass false |
rehearsal_not_passing |
year_end_packet_incomplete still open |
year_end_open |
tuple_hash_index.json absent while reply lane active |
tuple_index_missing |
| Zip older than source JSON mtime | stale_bundle |
Clear gate only after manifest write + receipt pin.
Ninety-second verification
- [ ] Lesson 193 and 189 gates green in CI
- [ ] Folder zip contains all seven member types (or documented optional waiver)
- [ ]
bundle_sha256recomputes from sorted members - [ ]
INTAKE_EVIDENCE_INDEX.mdreadable without opening zip - [ ]
intake_folder_incompleteclears on publish dry-run - [ ] Receipt JSON pinned under
release-evidence/07-intake/
Troubleshooting
| Symptom | Likely cause | Fix |
|---|---|---|
| Hash mismatch on rehearsal JSON | Re-exported after zip | Re-run assembler |
| Year-end zip missing cover | Extract step skipped | Re-extract YEAR_END_RISK_COVER.md |
pass true but gate red |
Stale materialized view | Refresh Lesson 193 rollup |
| Partner rejects folder | Raw audit CSV included | Remove; wait for Lesson 195 letter |
| Tuple index drift | Lesson 176 archive rotated | Re-copy latest tuple_hash_index.json |
Mini exercise (30 minutes)
- Seed passing
rehearsal_completion_v1.jsonand complete year-end zip from fixtures. - Run assembler; confirm seven manifest rows.
- Deliberately corrupt one SHA; confirm
intake_folder_incomplete. - Restore hash; pin receipt.
- Open
INTAKE_EVIDENCE_INDEX.md—confirm partner-readable summary without SQL.
Continuity
- Lesson 193 — rehearsal completion source.
- Lesson 189 — year-end risk packet source.
- Lesson 176 — tuple hash index for reply versioning.
- Next: Lesson 195 — partner-sanitized score letter without raw
mock_audit_logrows. - Resource: Q3 2026 submission intake mock-audit packet templates — tooling context for intake folders.
FAQ
Can we ship intake if T-3 passed but year-end zip is draft?
No—both source gates must be clear; partial folders fail intake_folder_incomplete.
Do we duplicate mock audit logs into this zip?
No—rollup JSON + manifests only; raw logs violate partner redaction policy (Lesson 195).
One zip or folder + manifest?
Ship zip + manifest; partners verify bundle_sha256 against the manifest file outside the zip.
How does this relate to Lesson 199 attestation?
Lesson 199 bundles Lessons 194–198 receipts; this lesson is the first required green member.
January 2027 intake earns trust when partners download one evidence ZIP whose manifest proves rehearsal scored and year-end risk landed together—not when ops reconstructs the story from chat history.