一键导入
training-deck-render
Render a training deck spec.yaml into a Google Slides deck via the 14-stencil ACE template. Produces a presentable Slides URL.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Render a training deck spec.yaml into a Google Slides deck via the 14-stencil ACE template. Produces a presentable Slides URL.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
Produce a domain-expert-facing before/after (pre-post) Google Doc for a DDD narrative iteration, and read the expert's edits back. Pull the verbatim CURRENT narration from canopy-web, apply reviewer feedback into a PROPOSED next version, publish a scannable side-by-side doc a non-engineer can review, then read their suggestion-mode edits via the structured Doc. Use when iterating a Connect DDD narrative on expert feedback (e.g. RF Surveys / Sophie), when asked to "make a before/after of the narration", "iterate the narrative on <expert>'s feedback", or "let <expert> sign off on the language".
Apply the two HQ-layer standing-instruction settings Nova can't set at build time — camera-only photo capture (appearance="acquire" on Deliver image uploads) and grid menu display on every module — to the deployed draft apps, then resolve the matching Phase-3 residuals. Runs between app-deploy and app-release.
Build the CommCare Learn (training) app from the PDD via Nova's /nova:autobuild. Captures nova_app_id and writes a structure summary.
Phase 3 § Step 2.8 — structural + install-time QA on the released Learn + Deliver CCZs. Downloads each CCZ via commcare_download_ccz, parses the zip + suite.xml + form XMLs, verifies form counts + Connect-marker presence match the Nova blueprint, then runs commcare-cli `validate` + `play` as install-time runtime gates. AVD-free, Connect-free — purely CCHQ-side. Halts loud on mismatch.
Run app smoke recipes against a local AVD and capture per-step screenshots for the training deck. Per-opp content only.
Generate a training deck spec.yaml from PDD, app summaries, screenshot manifests, and a template bundle. The spec is the source of truth for the training deck — training-deck-render produces Google Slides from it.
| name | training-deck-render |
| description | Render a training deck spec.yaml into a Google Slides deck via the 14-stencil ACE template. Produces a presentable Slides URL. |
| disable-model-invocation | true |
Reads training-deck-spec.yaml from Drive, validates it, resolves the
manifest, copies the template, and executes the Slides batchUpdate
pipeline. Single-pass (no speaker notes).
Phase 6 (qa-and-training), after training-deck-generate. The last
training material step before Phase 7.
| Source | Artifact | Used for |
|---|---|---|
Phase 6 (training-deck-generate) | ACE/<opp>/runs/<run-id>/6-qa-and-training/training-deck-spec.yaml | The spec to render |
ACE_TRAINING_DECK_TEMPLATE_ID — the 14-stencil Slides template.Read training-deck-spec.yaml from the run's
6-qa-and-training/ folder.
Parse and validate via parseTrainingSpec(yamlStr) — halt on
validation error.
Resolve manifest via resolveManifest(spec.manifest).
Check image aliases. Verify all image aliases used in
walkthrough / mobile_flow / web_screen / mobile_zoom /
two_column slides are resolvable against the manifest. HALT if
any are unresolvable — do not render a partial deck.
Verify env. Confirm ACE_TRAINING_DECK_TEMPLATE_ID is set.
HALT if missing with a clear error.
Copy template. Call slides_copy_template with:
templatePresentationId: ACE_TRAINING_DECK_TEMPLATE_IDtitle: "<opp-name> — Training Deck"parentFolderId: the run's 6-qa-and-training/ folder IDDiscover stencil objectIds. Call slides_get on the copied
deck. Verify all 14 stencils are present (match against the
STENCILS constant). HALT if any missing.
Build requests. Call
buildSlidesRequestsV2(spec, { stencils, manifest }).
Execute. Call slides_batch_update — single call with all
requests.
Write deck handoff to run_state.yaml:
phases:
qa-and-training:
products:
training:
deck:
file_id: <presentationId>
title: "<opp-name> — Training Deck"
web_view_link: <url>
slide_count: <N>
rendered_at: <ISO timestamp>
Multi-writer block (sibling slots are the five training doc
skills' docs.<key> entries) — apply via read-modify-write
following the canonical pattern in
skills/synthetic-data-generate/SKILL.md § Step 6 so sibling
sub-keys are preserved. See agents/qa-and-training.md § Products
for the full slot table.
Print deck URL for operator.
Before rendering:
anyone-with-link. Use
drive_set_anyone_with_link on each. (Slides image import won't
work without this.)Three criteria:
createImage errors). FAIL if any failed.slides_batch_update completed without error.
FAIL if error.Verdict to
ACE/<opp>/runs/<run-id>/6-qa-and-training/training-deck-render_verdict.yaml
in the standard shape (see lib/verdict-schema.ts).
The CURRENTLY-MINTED template still contains a 6×6pt decorative ELLIPSE
on the walkthrough stencil (and mobile_zoom — same Dimagi source
page), cloned from the source slide and missed by the original
bootstrap strips. Fresh renders from that template inherit it as a
stray blue dot on every walkthrough-derived slide until the template is
re-minted via the (now-fixed) scripts/bootstrap-training-deck-template.ts.
Until then, after rendering: slides_get the deck, filter pageElements
with isDecorativeLeftover (lib/training-deck-stencil-geometry.ts —
ELLIPSE rendered ≤ 12pt in both dimensions), and issue one
slides_batch_update of deleteObject requests for the matches. The
in-place re-render script (below) already runs this sweep automatically
when it rebuilds stencils, so re-rendered decks self-clean.
6-qa-and-training/ folderACE/<opp>/runs/<run-id>/6-qa-and-training/training-deck-render_verdict.yaml
per standard verdict shaperun_state.yamlFor a deck that has already been shared at a stable URL and needs regeneration (e.g. new screenshots after a capture unblock), do NOT copy the template again — that mints a new presentationId and breaks the shared link. Use the in-place re-render script instead (dimagi-internal/ace#864):
npx tsx scripts/rerender-training-deck-in-place.ts \
--deck <presentationId> \
--spec <new-spec.yaml> \
--old-spec <spec.yaml that produced the CURRENT slides> \
[--key <gws-sa-key.json>]
--old-spec is required: it must be the spec that rendered the
deck's CURRENT slides — stored in the run's 6-qa-and-training/
folder as the deck-spec doc. The script derives each live slide's
layout from it and HALTS if the live slide count differs (the deck
was hand-edited; reconcile first).lib/training-deck-stencil-geometry.ts (single source, shared with
the bootstrap script), so re-rendered stencils match the template.ACE_TRAINING_DECK_TEMPLATE_ID not set: emit verdict skipped
with reason. Don't FAIL.failed with Zod error
details.slides_batch_update fails: emit verdict failed with API
error.ace-gdrive:
drive_read_file (read the spec YAML)drive_set_anyone_with_link (pre-flight image sharing)slides_copy_template (copy the template into the opp folder)slides_get (discover stencil objectIds)slides_batch_update (render all slides in one call)dry_run: true and a count of slides that would be
created.run_state.yaml.phases.qa-and-training.products.training.deck —
{file_id, title, web_view_link, slide_count, rendered_at} typed
handoff (multi-writer block; sibling docs.* slots written by the
five training doc skills)ACE/<opp>/runs/<run-id>/6-qa-and-training/training-deck-render_verdict.yaml
— standard verdict shape (see lib/verdict-schema.ts); passed:
true if parse + batchUpdate succeededtraining-deck-build. Reads
training-deck-spec.yaml (from training-deck-generate) instead
of training-deck-outline.md. Single-pass render via
buildSlidesRequestsV2 against 14-stencil template. No speaker
notes pass.