| name | training-process-video |
| sheetId | 4.02 |
| description | Post-process a livestream transcript into four parallel workstreams: an event recap Google Doc, a Q&A knowledge base diff, course lecture note proposals, and marketing content idea seeds. |
| category | training |
| project | training-process-video |
| platform | claude |
| status | Done |
| author | Peter Tu |
| input | Raw livestream transcript text and a stream-config.md file identifying the training stream |
| process | 4 parallel agents โ event recap doc, Q&A knowledge base update, course outline enhancement, and content idea curation |
| output | Google Doc recap, Q&A diff entries, lecture note proposals, and content idea seeds |
| synergy | [] |
Process Livestream
Orchestrate four parallel agents to transform a livestream transcript into reusable course content, a knowledge base update, a published recap document, and new content ideas for the marketing pipeline.
Step 0 โ Stream selection
Scan the subdirectories of <your-training-design-root>/ for folders that contain a stream-config.md file. Each such folder is an available training stream.
Display:
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
้ธๆ่จ็ทดไธฒๆต
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
่ซ้ธๆๆญค้ๅญ็จฟๆๅฑฌ็่จ็ทดไธฒๆต๏ผ
1๏ธโฃ [folder name of first match]
2๏ธโฃ [folder name of second match]
3๏ธโฃ [folder name of third match]
๏ผไพๆๆ็ตๆๅๅบ๏ผๆธ้ไธๅบๅฎ๏ผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Wait for the user to type a number.
After selection:
- Store the absolute path to the selected stream directory as
STREAM_DIR (e.g., <your-training-design-root>/4.4 claude-code-for-operation)
- Read
[STREAM_DIR]/stream-config.md to load all stream configuration
- From the config, extract and store:
course_outline: filename of the course outline file (e.g., 4.4.1 course.md)
chapter_prefix: prefix used for chapter files (e.g., claude-code-ops)
chapter_count: total number of chapter files
recap_folder_id: Google Drive folder ID for recap uploads
roster_folder_id: Google Drive folder ID for participant roster Sheets (TODO = skip Gate F)
roster_input_folder_id: Google Drive folder ID where a shortcut to the roster Sheet is created for GAS aggregation (TODO = skip shortcut creation)
kit_tag_prefix: Kit tag prefix for this stream, e.g. [4] Claude Code (TODO = skip Gate F.5)
- All Google Doc/Sheet IDs listed in the Google Workspace Sync Map section of the config
Display: โ
ๅทฒ่ผๅ
ฅไธฒๆต่จญๅฎ๏ผ[selected stream folder name]
Step 1 โ Collect inputs
Ask the user for:
- Transcript file path: path to the transcript
.md file (can be anywhere on disk)
- Stream title: short name for this session (e.g., "Claude Code ็้็ดๆญ no.1")
- Stream date: YYYY-MM-DD format (default: today's date if not provided)
Step 1a โ Transcript intake (always runs)
The transcript file was already loaded into context by the user (via @file reference). This step only handles renaming and path storage โ no file reading required.
Compute standardized filename:
- Take
stream_title, convert to lowercase
- Replace spaces and special characters with hyphens; remove consecutive hyphens
- Append
-[stream_date].cleaned.md
- Format:
[slug]-[YYYY-MM-DD].cleaned.md
Determine what action is needed:
Store the resulting absolute path as FILE_PATH and the filename as FILE_NAME for use in Step 10.
If the rename or copy fails, display the error and stop.
Display:
โ
้ๅญ็จฟๅฐฑ็ท
ๅๅงๆชๆก๏ผ[source_file_path]
ๆจๆบๅๅ็จฑ๏ผ[FILE_NAME]
Step 2 โ Pre-flight check
Before launching agents, display:
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
็ดๆญๅพ่ฃฝ โ ๆบๅๅๅ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Stream : [title]
Date : [date]
Length : [N] words / approx. [M] minutes of reading
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
ๅฐๅๅ 4 ๅๅนณ่ก Agent๏ผ
[1] Event Recap โ ๅ้กงๆ็ซ ่็จฟ๏ผ้ๅฏฉๆ ธๅพไธๅณ Google Drive๏ผ
[2] Q&A KB โ Diff ๅ ฑๅ๏ผ้ๅฏฉๆ ธๅพๅฏซๅ
ฅ๏ผ
[3] Course Enhancer โ ่ฌ็พฉๆๆก๏ผ้ๅฏฉๆ ธๅพๅฏซๅ
ฅ๏ผ
[4] Content Curator โ ๅ
งๅฎน้ปๅญๆๆก๏ผ้ๅฏฉๆ ธๅพๅฏซๅ
ฅ _matrix.md๏ผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
ๆๆๅฏซๅ
ฅ่ไธๅณๅๅจๅฏฉๆ ธๅพๅท่ก๏ผไธๆ่ชๅ็ผๅธใ
็นผ็บ๏ผ [Y/n]
Wait for confirmation. If the user types n or no, stop.
Google Workspace Sync Map
After human approval at each gate, approved local file changes are also pushed to their corresponding Google Workspace documents. Use <your-google-workspace-account> as user_google_email for all MCP calls.
Read the Google Workspace Sync Map from [STREAM_DIR]/stream-config.md. Use the Doc/Sheet IDs listed there for all sync operations.
If any ID is TODO, skip that sync and note it in the summary.
Sync procedure (applies to Gates A, B, C, D):
- Write approved content to the local file first.
- Read the full updated local file.
- Use
mcp__google-workspace__get_doc_content to get the current Google Doc content.
- Use
mcp__google-workspace__batch_update_doc to replace the Google Doc body with the full updated local file content (delete existing text from index 1 to end, then insert at index 1).
- For the Content Matrix Google Sheet (Gate D), use
mcp__google-workspace__modify_sheet_values to append new rows to the appropriate sheet tab.
- If any MCP sync call fails, report the error but do not block the workflow โ the local file is the source of truth.
Step 3 โ Read reference files
Before launching agents, read the following files so their contents are available to pass to agents:
[FILE_PATH] (the transcript โ use this as transcript input for all agents)
[STREAM_DIR]/knowledge-base/qa-master.md (KB contents for Agent 2)
[STREAM_DIR]/[course_outline from config] (course outline for Agent 3)
[STREAM_DIR]/[chapter_prefix from config]-ch1.md through [STREAM_DIR]/[chapter_prefix from config]-ch[chapter_count].md (chapter files for Agent 3)
[STREAM_DIR]/content-matrix/_matrix.md (content matrix for Agent 4)
If any chapter file is missing, note it and pass an empty string for that chapter.
If _matrix.md cannot be read, note it and Agent 4 will treat all ideas as NEW.
If [STREAM_DIR]/knowledge-base/qa-master.md does not exist, prompt:
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ ๏ธ ๆพไธๅฐ knowledge-base/qa-master.md
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
[B] Bootstrap โ ไพ็ซ ็ฏๅ้กๆถๆงๅปบ็ซ็ฉบ็ฝ qa-master.md๏ผๅพ stream-config.md ่ฎๅ็ซ ็ฏ taxonomy๏ผ
[S] ็ฅ้ Agent 2๏ผๆฌๆฌกๅท่กไธๅท่ก Q&A ็ฅ่ญๅบซๆดๆฐ๏ผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Wait for user input.
- [B]: Create
[STREAM_DIR]/knowledge-base/qa-master.md with chapter taxonomy headers as defined in stream-config.md. Then proceed with Agent 2 normally.
- [S]: Skip Agent 2 entirely for this run. Set its status to
โญ ๅทฒ็ฅ้ on the status board.
Step 4 โ Launch 4 agents in parallel
Launch all four agents simultaneously using the Task tool. Show the status board immediately after launching:
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Agent ็ๆ
ๆฟ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
[1] Event Recap โณ ๅท่กไธญ...
[2] Q&A KB โณ ๅท่กไธญ...
[3] Course Enhancer โณ ๅท่กไธญ...
[4] Content Curator โณ ๅท่กไธญ...
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Agent 1 โ Event Recap
Instruction to agent (pass as prompt):
- Read
agents/training-event-recap.md for your full instructions
- Inputs: transcript text, title, date
- Do NOT call any MCP tools โ return formatted content only
- Return the structured result block described in your instructions
Agent 2 โ Q&A Knowledge Base
Instruction to agent (pass as prompt):
- Read
agents/training-qa-knowledge.md for your full instructions
- Inputs: transcript text, full contents of
[STREAM_DIR]/knowledge-base/qa-master.md
- Local file reads only โ no MCP writes
- Return the diff report described in your instructions
Agent 3 โ Course Outline Enhancer
Instruction to agent (pass as prompt):
- Read
agents/training-outline-enhancer.md for your full instructions
- Inputs: transcript text, course outline (
[STREAM_DIR]/[course_outline from config]), all chapter files ([STREAM_DIR]/[chapter_prefix]-ch1.md through [STREAM_DIR]/[chapter_prefix]-ch[chapter_count].md)
- Local file reads only โ no MCP writes
- Return the match report described in your instructions
Agent 4 โ Content Idea Curator
Instruction to agent (pass as prompt):
- Read
agents/training-idea-curator.md for your full instructions
- Inputs: transcript text, stream title, stream date, full contents of
[STREAM_DIR]/content-matrix/_matrix.md
- Local file reads only โ no MCP writes
- Return the idea report described in your instructions
Step 5 โ Collect results and update status board
As each agent completes, update the status board:
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Agent ็ๆ
ๆฟ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
[1] Event Recap โ
ๅฎๆ โ ่็จฟๅทฒๅๅฆฅ๏ผๅพ
ๅฏฉๆ ธไธๅณ
[2] Q&A KB โ
ๅฎๆ โ [N] ็ญๆฐๅข๏ผ[M] ็ญ้่ค
[3] Course Enhancer โ
ๅฎๆ โ [K] ๆฎต็ฌฆๅ๏ผ[J] ๆฎตๆชๅน้
[4] Content Curator โ
ๅฎๆ โ [L] ๅ้ปๅญ็ฌฆๅ๏ผ[P] ๅ็ฅ้
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
If any agent returned an error, show it clearly and continue with the remaining agents.
After all four complete (or fail), display a 1-paragraph plain-text summary for each.
Step 6 โ Gate A: Q&A Knowledge Base write
Display the MECE health check from Agent 2 first:
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Gate A โ MECE ๅฅๆชข
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
[Display the full MECE HEALTH CHECK block from Agent 2]
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
If any MECE flags exist (CATEGORY_MISMATCH, OVERLAP_RISK, CATEGORY_BLOAT, ORPHAN_CATEGORY), prompt:
โ ๏ธ ็ผ็พ [N] ๅ MECE ๅ้ก๏ผๅปบ่ญฐๅจๅฏซๅ
ฅๅ่็ใ
[F] ้็ญไฟฎๆญฃ๏ผ้ไธ้กฏ็คบๆฏๅๅ้ก๏ผ่ฎไฝ ๆฑบๅฎๆฅๅๅปบ่ญฐๆ็ฅ้๏ผ
[I] ๅฟฝ็ฅ๏ผ็ดๆฅ้ฒๅ
ฅๅฏซๅ
ฅๅฏฉๆ ธ
Wait for user input. If [F]:
- For each flag, show the issue and the agent's suggestion. User types
y to accept the suggested fix (update category / skip entry / merge), n to keep as-is.
Then display the full diff report and show:
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Gate A โ Q&A ็ฅ่ญๅบซๅฏซๅ
ฅๅฏฉๆ ธ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
ๆฐๅข๏ผ[N] ็ญ | Variant๏ผ[M] ็ญ | ่ก็ช๏ผ[K] ็ญ
๏ผ้่ค้
็ฎๅทฒ่ชๅ็ฅ้๏ผ
[A] ๅ
จ้จๅฏซๅ
ฅๆฐๅข้
็ฎ
[S] ้็ญ้ธๆ
[N] ็ฅ้๏ผไธๅฏซๅ
ฅ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Wait for user input.
- [A]: Insert all NEW entries into
[STREAM_DIR]/knowledge-base/qa-master.md at their specified insert_after positions (the KB is ordered by chapter โ topic; do NOT append to the end). If a new topic group is needed, add a <!-- Topic: [name] --> comment before the first entry in the group. For VARIANT and CONTRADICTS entries, ask separately: "ๆฏๅฆๆดๆฐ็พๆ KB ๆข็ฎ๏ผ[Y/n]"
- [S]: Show each NEW entry one at a time (including its
insert_after position). User types y to include, n to skip. After cycling through NEW entries, handle VARIANT/CONTRADICTS the same way.
- [N]: Skip all writes for Gate A.
After writing (if any), show: ๅทฒๅฏซๅ
ฅ [N] ็ญๅฐ knowledge-base/qa-master.md
Google Sync: If any entries were written to [STREAM_DIR]/knowledge-base/qa-master.md, sync the full updated file to the QA Master KB Google Doc using the ID from stream-config.md and the sync procedure described in the Google Workspace Sync Map section. Show: โ๏ธ ๅทฒๅๆญฅ่ณ Google Doc๏ผQA Master KB๏ผ
Step 7 โ Gate B: Lecture notes write
Display the match report from Agent 3, grouped by target chapter file.
Then show:
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Gate B โ ่ฌ็พฉๆๆกๅฏฉๆ ธ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
็ฌฆๅๆฎต่ฝ๏ผ[N] ๆฎต๏ผๅๅธๆผ [K] ๅ็ซ ็ฏๆชๆก
[A] ๅ
จ้จๅฏซๅ
ฅ
[S] ้ๆฎต้ธๆ
[N] ็ฅ้๏ผไธๅฏซๅ
ฅ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Wait for user input.
- [A]: Append all qualifying lecture note blocks to their respective chapter files.
- [S]: Show each proposal one at a time. User types
y to append, n to skip.
- [N]: Skip all writes for Gate B.
For each approved block, append to the end of the correct chapter file ([STREAM_DIR]/[chapter_prefix]-ch[N].md).
After writing (if any), show: ๅทฒๅฏซๅ
ฅ [N] ๆฎตๅฐ [K] ๅ็ซ ็ฏๆชๆก
Google Sync: For each chapter file that was modified, sync the full updated file to its corresponding Google Doc using the sync procedure and IDs from stream-config.md. Show: โ๏ธ ๅทฒๅๆญฅ [K] ๅ็ซ ็ฏ่ณ Google Docs
Step 8 โ Gate C: Unmatched content
If Agent 3 returned any unmatched segments, display them now:
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Gate C โ ๆชๅน้
ๅ
งๅฎน่็
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
ไปฅไธ [N] ๆฎตๅ
งๅฎนๆช่ฝๅน้
็พๆ่ชฒ็จ็ซ ็ฏ๏ผ
For each unmatched segment, show it and prompt:
[ๆฎต่ฝๆ่ฟฐ]
Agent ๅปบ่ญฐ๏ผ[add to outline / skip]
[1] ๅ ๅ
ฅ่ชฒ็จๅคง็ถฑ๏ผๆๆจ่จๅจ [course_outline from config] ็ๅปบ่ญฐๆธ
ๅฎ๏ผ
[2] ๅ ๅ
ฅ็ซ ็ฏๆชๆซๅฐพ๏ผ้ธๆ็ซ ็ฏ๏ผ
[3] ็ฅ้
Wait for user to type 1, 2, or 3.
- [1]: Append a note to
[STREAM_DIR]/[course_outline from config] at the end under a ## ็ดๆญๅ
งๅฎนๅปบ่ญฐ section (create if not exists).
- [2]: Ask which chapter, then append as a brief note at the end of that chapter file (
[STREAM_DIR]/[chapter_prefix]-ch[N].md).
- [3]: Do nothing.
Google Sync: After all unmatched segments are processed, sync any modified files to their corresponding Google Docs using the sync procedure and IDs from stream-config.md. This may include [course_outline from config] and/or chapter files. Show: โ๏ธ ๅทฒๅๆญฅๆชๅน้
ๅ
งๅฎน่ณ Google Docs
Step 9 โ Gate D: Content idea matrix write
If Agent 4 returned no qualifying ideas, skip this gate.
Otherwise, display the full idea report from Agent 4.
Then show:
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Gate D โ ๅ
งๅฎน้ปๅญๅฏซๅ
ฅๅฏฉๆ ธ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
็ฌฆๅๆๆก๏ผ[N] ๅ | ไฝๅ็ฅ้๏ผ[M] ๅ | ้่ค็ฅ้๏ผ[K] ๅ
็ฎๆจๆชๆก๏ผ[STREAM_DIR]/content-matrix/_matrix.md
้่ค็ฅ้ๆ็ดฐ๏ผ
- [pain summary] โ ่ [existing-id] (global_index [NNN]) ้่ค
- ...
ไฝๅ็ฅ้ๆ็ดฐ๏ผ
- [pain summary] | [X]/8 | ๆช้้๏ผ[failed checks]
- ...
[A] ๅ
จ้จๅฏซๅ
ฅ็ฌฆๅๆๆก
[S] ้็ญ้ธๆ
[N] ็ฅ้๏ผไธๅฏซๅ
ฅ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Wait for user input.
- [A]: Append all qualifying seed rows to
[STREAM_DIR]/content-matrix/_matrix.md under the correct category table. Also append a new session entry to [STREAM_DIR]/content-matrix/_sourcing-log.md documenting this run: date, stream title, method "livestream transcript", count of ideas added.
- [S]: Show each proposal one at a time. User types
y to include, n to skip. After all selections, write approved rows and log the session.
- [N]: Skip all writes for Gate D.
When appending to [STREAM_DIR]/content-matrix/_matrix.md:
- Add each approved row to the correct category table (prompt / skills / subagents / mcp / cot)
- Assign the
global_index sequentially, incrementing from the current highest value in the matrix
- Update the Status Summary table at the bottom: increment
seed count by the number of rows added, update Last updated date
When appending to [STREAM_DIR]/content-matrix/_sourcing-log.md:
- Add a new session block under
## Sessions, newest first:
### [YYYY-MM-DD] โ [Stream Title]
**Method:** Livestream transcript
**Duration:** โ
**Ideas added to matrix:** [N] ([list of IDs added])
**Validation runs:** 0 (all remain `seed`)
**Notes:** Extracted by training-idea-curator agent via /training-process-video.
After writing (if any), show: ๅทฒๅฏซๅ
ฅ [N] ็ญๅฐ _matrix.md๏ผไธฆๆดๆฐ _sourcing-log.md
Google Sync: If any ideas were written to _matrix.md, also sync to the Content Matrix Google Sheet and sourcing-log sheet using the IDs from stream-config.md.
Matrix sheet (use the Content Matrix Sheet ID and sheet name matrix from stream-config.md):
- If the sheet has no header row, first write the header row to
matrix!A1:K1:
| A | B | C | D | E | F | G | H | I | J | K |
|---|
| global_index | id | category | pain_point_raw | pain_resonance_score | solution_type | result_claim | status | file_path | sourced_from | notes |
- Append each approved seed row to the next empty row using
mcp__google-workspace__modify_sheet_values with range matrix!A[next_row]:K[next_row].
Sourcing-log sheet (use the same Content Matrix Sheet ID with sheet name sourcing-log from stream-config.md):
- If the sheet has no header row, first write the header row to
sourcing-log!A1:F1:
| A | B | C | D | E | F |
|---|
| date | stream_title | method | ideas_added | idea_ids | notes |
- Append a session row with: date, stream title, "livestream transcript", count of ideas, comma-separated list of IDs, "Extracted by training-idea-curator agent via /training-process-video."
Show: โ๏ธ ๅทฒๅๆญฅ [N] ็ญ่ณ Google Sheet๏ผContent Matrix + Sourcing Log๏ผ
Step 9.5 โ Gate E: Event Recap upload to Google Drive
If Agent 1 returned an error, skip this gate and note it in Step 10.
Otherwise, display the full formatted recap content from Agent 1 for review.
Then show:
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Gate E โ ๆดปๅๅ้กงไธๅณๅฏฉๆ ธ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
ๆจ้ก๏ผ[DOC_TITLE]
๏ผไปฅไธ็บๅณๅฐๅปบ็ซ็ Google Doc ๅ
งๅฎน๏ผ
[Y] ็ขบ่ชไธๅณ Google Drive
[E] ็ทจ่ผฏๅพๅไธๅณ๏ผ่ซ็ดๆฅไฟฎๆนไธๆนๅ
งๅฎนไธฆๅ่ฆ Y๏ผ
[N] ็ฅ้๏ผไธไธๅณ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Wait for user input.
- [Y]: First, save a local copy of the approved recap content to
[STREAM_DIR]/[YYYY-MM-DD]-course-recap.md. Then, read recap_folder_id from stream-config.md. If it is TODO, skip the Google Drive upload step and note it in the summary. Otherwise, create the Google Doc and move it to the recap folder using MCP:
- Write the approved recap content to
[STREAM_DIR]/[YYYY-MM-DD]-course-recap.md
mcp__google-workspace__create_doc โ title: [DOC_TITLE]
mcp__google-workspace__batch_update_doc โ insert the approved content into the document body
- If
recap_folder_id is not TODO: mcp__google-workspace__update_drive_file โ move the doc to the recap folder by setting add_parents: [recap_folder_id] and remove_parents: root
mcp__google-workspace__get_drive_shareable_link โ retrieve shareable URL
Store the URL as RECAP_DOC_URL and the local path as RECAP_LOCAL_PATH for use in Step 10.
Show: โ
ๆฌๅฐๆชๆก๏ผ[RECAP_LOCAL_PATH] and โ
Google Doc ๅทฒๅปบ็ซไธฆ็งป่ณๅ้กง่ณๆๅคพ๏ผ[RECAP_DOC_URL]
- [E]: Wait for the user to provide edited content, then proceed as [Y] with the revised text.
- [N]: Skip upload and local save. Set
RECAP_DOC_URL to "๏ผ็ฅ้๏ผ" and RECAP_LOCAL_PATH to "๏ผ็ฅ้๏ผ".
Step 9.6 โ Gate F: Participant roster upload
This step handles the .xlsx participant roster downloaded from the event platform (e.g. Accupass/ๆดปๅ้). Accupass has no API โ the user downloads the file manually and provides the path.
Read roster_folder_id from stream-config.md. If it is TODO, skip this gate, set ROSTER_STATUS to "็ฅ้๏ผๆช่จญๅฎ roster_folder_id๏ผ" and proceed to Step 9.7.
If no participant list path was provided in Step 1, ask:
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Gate F โ ๅๅ ๅๅฎๆญธๆช
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
่ซๆไพๆดปๅๅนณๅฐไธ่ผ็ .xlsx ๆชๆก่ทฏๅพ๏ผ
๏ผ่ผธๅ
ฅ่ทฏๅพ๏ผๆๆ Enter ็ฅ้๏ผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
If user skips (empty Enter), set ROSTER_STATUS to "็ฅ้" and proceed to Step 9.7.
Otherwise, show:
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Gate F โ ๅๅ ๅๅฎๆญธๆช
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
ไพๆบๆชๆก๏ผ[xlsx ่ทฏๅพ]
ไธๅณ็ฎๆจ๏ผ[ๆดปๅๅ็จฑ]_[YYYY.M.DD]๏ผGoogle Sheet๏ผ
็ฎๆจ่ณๆๅคพ๏ผ[roster_folder_id ๅฐๆ่ณๆๅคพ]
[่ฅ roster_input_folder_id ๅทฒ่จญๅฎ] ๅๆๅปบ็ซๆทๅพ่ณ input ่ณๆๅคพ๏ผไพ GAS ๆดๆฐ็ธฝ่กจ็จ๏ผ
[Y] ็ขบ่ชไธๅณ
[N] ็ฅ้
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
[Y] โ execute (use Python + Drive API; MCP has no xlsxโSheet conversion tool):
-
Upload the xlsx and convert it to a Google Sheet in the roster_folder_id folder:
from googleapiclient.http import MediaFileUpload
media = MediaFileUpload(xlsx_path,
mimetype='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
resumable=True)
file_meta = {
'name': '[ๆดปๅๅ็จฑ]_[YYYY.M.DD]',
'mimeType': 'application/vnd.google-apps.spreadsheet',
'parents': ['[roster_folder_id]']
}
sheet = drive_service.files().create(body=file_meta, media_body=media, fields='id,webViewLink').execute()
SHEET_ID = sheet['id']
-
If roster_input_folder_id in stream-config.md is not TODO, create a shortcut in that input folder (one per event):
shortcut_meta = {
'name': '[ๆดปๅๅ็จฑ]_[YYYY.M.DD]',
'mimeType': 'application/vnd.google-apps.shortcut',
'shortcutDetails': {'targetId': SHEET_ID},
'parents': ['[roster_input_folder_id]']
}
drive_service.files().create(body=shortcut_meta, fields='id').execute()
-
Set ROSTER_STATUS to "โ
ๅทฒไธๅณไธฆๅปบ็ซๆทๅพ"
Show:
โ
ๅๅ ๅๅฎๅทฒไธๅณ็บ Google Sheet๏ผ[webViewLink]
โ
ๆทๅพๅทฒๅปบ็ซ่ณ input ่ณๆๅคพ๏ผไพ GAS ไฝฟ็จ๏ผ
[N]: Set ROSTER_STATUS to "็ฅ้"
Step 9.7 โ Gate F.5: Upload subscribers to Kit
If ROSTER_STATUS is "็ฅ้" (Gate F was skipped), skip this gate and set KIT_STATUS to "็ฅ้".
Read kit_tag_prefix from stream-config.md (e.g. [4] Claude Code). If it is TODO, skip this gate and set KIT_STATUS to "็ฅ้๏ผๆช่จญๅฎ kit_tag_prefix๏ผ".
Otherwise, display:
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Gate F.5 โ ไธๅณ่จ้ฑ่
่ณ Kit
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
ไพๆบ๏ผๅๅ ๅๅฎ Google Sheet๏ผ[SHEET_ID]๏ผ
ๅไฝ๏ผๆฐๅข่ณ Kit ่จ้ฑ่
ๅ่กจ + ๆไธๆดปๅๆจ็ฑค
[Y] ็ขบ่ชๅท่ก
[N] ็ฅ้
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
[N]: Set KIT_STATUS to "็ฅ้", proceed to Step 10.
[Y] โ execute:
1. Read the roster
Read SHEET_ID with mcp__google-workspace__get_drive_file_content to get the CSV content.
Column mapping (Accupass format):
- Column index 2: ่จ่ณผไบบๅงๅ โ Kit
first_name
- Column index 3: ่จ่ณผไบบEmail โ Kit
email_address
2. Clean the data
- Dedupe: keep the first row per email
- Filter: skip emails containing
privaterelay.appleid.com (Apple private relay โ undeliverable)
Display the cleaning result: ๅๅง N ็ญ โ ๅป้ X ็ญ โ ้ๆฟพ Y ็ญ โ ๆๆ Z ็ญ
3. Resolve the Kit tag
Use mcp__kit__list_tags to find the highest number among tags sharing the kit_tag_prefix, then +1 for the new tag number. Create it with mcp__kit__create_tag (returns the existing ID if the tag already exists).
4. Bulk-create subscribers
Call mcp__kit__bulk_create_subscribers in batches of โค100 (upsert โ existing subscribers are updated automatically).
Collect every valid subscriber_id โ including those returned inside "Cannot override state" failure items. Those subscribers already exist and must still be tagged, otherwise they are silently missed.
5. Bulk-tag subscribers
Call mcp__kit__bulk_tag_subscribers in batches of โค100 with the tag from step 3.
Set KIT_STATUS to "โ
[N] ็ญๅทฒไธๅณ๏ผๆจ็ฑค๏ผ[tag_name]"
Show:
โ
Kit ่จ้ฑ่
ๅทฒๆดๆฐ๏ผ[N] ็ญๆๅ | [M] ็ญๅคฑๆ
๐ท ๆจ็ฑค๏ผ[tag_name]๏ผID: [tag_id]๏ผ
Step 10 โ Final summary and file archival
Display:
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
Process Livestream ๅฎๆ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Stream : [title] ([date])
๐ ๆดปๅๅ้กง
ๆฌๅฐๆชๆก๏ผ[RECAP_LOCAL_PATH]
Google Doc๏ผ[RECAP_DOC_URL]
๐ Q&A ็ฅ่ญๅบซ
ๅฏซๅ
ฅ๏ผ[N] ็ญๆฐๅข | ๆดๆฐ๏ผ[M] ็ญ Variant | ็ฅ้๏ผ[K] ็ญ
โ๏ธ Google Sync๏ผ[ๆๅ/็ฅ้/ๅคฑๆ]
๐ ่ชฒ็จ่ฌ็พฉ
ๅฏซๅ
ฅ๏ผ[N] ๆฎต โ [list of chapter files modified]
ๆชๅน้
่็๏ผ[N] ๆฎตๅ ๅ
ฅๅคง็ถฑๅปบ่ญฐ | [M] ๆฎต็ฅ้
โ๏ธ Google Sync๏ผ[K] ๅๆไปถๅทฒๅๆญฅ / [ๅคฑๆๆธ
ๅฎ]
๐ก ๅ
งๅฎน้ปๅญ
ๅฏซๅ
ฅ๏ผ[N] ๅ seed โ _matrix.md | ็ฅ้๏ผ[M] ๅ
โ๏ธ Google Sync๏ผ[ๆๅ/็ฅ้/ๅคฑๆ]
๐ ๅๅ ๅๅฎ
[ROSTER_STATUS]
๐ง Kit ่จ้ฑ่
[KIT_STATUS]
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
After displaying the summary, call agents/training-doc-admin.md with:
action: move
file_path: the FILE_PATH stored from Step 1a
processed_transcript_dir: [STREAM_DIR]/processed-transcript/
Display the result:
- On success:
๐ ้ๅญ็จฟๅทฒ็งป่ณ processed-transcript/[FILE_NAME]
- On error: surface the error message from the agent
Error Handling
- If the admin agent returns
blocked or error during transcript intake, stop the entire workflow โ there is no transcript to process.
- If Agent 1 (Event Recap) returns an error, skip Gate E and note it in the final summary.
- If Agent 2 returns no Q&A pairs, skip Gate A entirely.
- If Agent 3 returns no qualifying segments, skip Gate B. Still run Gate C if unmatched segments exist.
- If a chapter file write fails, report the specific file and continue with others.
- If Agent 4 returns no qualifying ideas, skip Gate D entirely.
- If
_matrix.md cannot be written, report the error โ do not attempt to write _sourcing-log.md either.
- If any MCP call in Gate E fails, show the error and offer to retry or skip.
- Never silently swallow errors โ always surface them in the status board.