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.

Lesson hero for Q1 2027 intake evidence folder assembler

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.json beside 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.zip separately 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.json under release-evidence/07-intake/

Prerequisites

  • Lesson 193rehearsal_completion_v1.json, gate rehearsal_completion_incomplete
  • Lesson 189year_end_risk_packet_manifest.json, year-end ZIP, gate year_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 by path before hash recomputation (deterministic replays).
  • rehearsal_completion_pass must mirror "pass": true inside rehearsal_completion_v1.json.
  • Do not include raw mock_audit_log CSV—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:

  1. Intake windowq1_2027_partner_intake + cert windows covered.
  2. Rehearsal completion summary — copy completion_score_percent and phase table from Lesson 193 JSON (no raw logs).
  3. Year-end risk summarystructural_red_count, open_deficiency_count, weighted_pass_rate_pct from Lesson 189 manifest.
  4. Tuple hash crosswalk — pointer to tuple_hash_index.json (Lesson 176).
  5. Verification — how to recompute bundle_sha256 locally.

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_sha256 recomputes from sorted members
  • [ ] INTAKE_EVIDENCE_INDEX.md readable without opening zip
  • [ ] intake_folder_incomplete clears 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)

  1. Seed passing rehearsal_completion_v1.json and complete year-end zip from fixtures.
  2. Run assembler; confirm seven manifest rows.
  3. Deliberately corrupt one SHA; confirm intake_folder_incomplete.
  4. Restore hash; pin receipt.
  5. 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_log rows.
  • 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.