{"id":"55bd9a3c-a1f2-40d4-897f-5c3123659947","entityType":"agent","slug":"clawhub-tinadu-ai-deck-pipeline","name":"Deck Pipeline","canonicalUrl":"https://www.xpersona.co/agent/clawhub-tinadu-ai-deck-pipeline","canonicalPath":"/agent/clawhub-tinadu-ai-deck-pipeline","generatedAt":"2026-10-11T14:15:22.201Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"editorial-content","verified":true,"confidence":"high","updatedAt":"2026-10-11T10:26:17.577Z","emptyReason":null},"description":"Production-grade Claude Code system that takes presentation decks from raw Chinese draft to McKinsey-polished English — with full audit trail, layout integri... Skill: Deck Pipeline Owner: tinadu-ai Summary: Production-grade Claude Code system that takes presentation decks from raw Chinese draft to McKinsey-polished English — with full audit trail, layout integri... Tags: bilingual:3.0.0, claude-code:3.0.0, latest:3.0.0, layout-audit:3.0.0, mckinsey:3.0.0, pptx:3.0.0, translation:3.0.0 Version history: v3.0.0 | 2026-05-12T16:33:27.011Z | user Major rewrite from DeckGlobalize","descriptionLabel":"Technical summary","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 1.1K downloads reported by the source. Last updated 10/11/2026.","installCommand":"clawhub skill install s178xc11mj68f9c018344m5xw183y7z8:deck-pipeline","sourceUrl":"https://clawhub.ai/tinadu-ai/deck-pipeline","homepage":"https://clawhub.ai/tinadu-ai/skills/deck-pipeline","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/tinadu-ai/deck-pipeline","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/tinadu-ai/skills/deck-pipeline","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":61,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"Production-grade Claude Code system that takes presentation decks from raw Chinese draft to McKinsey-polished English — with full audit trail, layout integri..."},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-11T10:26:17.577Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T10:26:17.577Z","emptyReason":null},"stars":null,"forks":null,"downloads":1088,"packageName":null,"latestVersion":"3.0.0","tractionLabel":"1.1K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T10:26:17.510Z","emptyReason":null},"lastUpdatedAt":"2026-10-11T10:26:17.577Z","lastCrawledAt":"2026-10-11T10:26:17.510Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-12T10:26:17.510Z","lastVerifiedAt":null,"highlights":[{"version":"3.0.0","createdAt":"2026-05-12T16:33:27.011Z","changelog":"Major rewrite from DeckGlobalizer v2.1.1: - Now a full 4-stage pipeline (Sense Pass → McKinsey Translation → Layout Audit → Handoff) - Swappable PROFILE block (palette, fonts, glossary, slide-offset) - Page-by-page execution with per-slide checkpoint - McKinsey style baseline + extensible reference samples - Font-name suffix audit, structural-anchor detection - Discrete -0.1pt font compression, line-spacing fallback - Bidirectional PPT ↔ Excel sync - Companion-file lock detection - 10 standalone helper scripts - Polish-only mode for single-language decks Renamed from 'deckglobalizer' to 'deck-pipeline'; old slug redirects.","fileCount":17,"zipByteSize":43050},{"version":"2.1.1","createdAt":"2026-04-27T08:01:49.827Z","changelog":"Add requires field declaring python-pptx and lxml dependencies. Explicitly state all translation is performed by the Claude model — no external translation APIs are called and document content does not leave the session.","fileCount":2,"zipByteSize":4703},{"version":"2.1.0","createdAt":"2026-04-27T07:53:20.798Z","changelog":"Clarify layout compensator: refining translation must not drop factual content, numbers, or named concepts. Remove cross-file slide copying section.","fileCount":2,"zipByteSize":4546},{"version":"1.0.0","createdAt":"2026-04-22T05:02:32.467Z","changelog":"- Initial release of DeckGlobalizer skill for high-fidelity PowerPoint translation. - Translates .pptx files into another language while preserving original layout, fonts, and design. - Multi-phase workflow: Style audit with manifest, tiered glossary with user sign-off, page-by-page translation with layout compensator rules. - Strict text fitting and sibling-consistency logic to maintain professional appearance. - Outputs translated deck and intermediate documentation files in the source file directory.","fileCount":2,"zipByteSize":2858}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s178xc11mj68f9c018344m5xw183y7z8:deck-pipeline","setupComplexity":"low","setupSteps":["Setup complexity is LOW. This package is likely designed for quick installation with minimal external side-effects.","Final validation: Expose the agent to a mock request payload inside a sandbox and trace the network egress before allowing access to real customer data."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-tinadu-ai-deck-pipeline/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-tinadu-ai-deck-pipeline/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-tinadu-ai-deck-pipeline/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-tinadu-ai-deck-pipeline/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-tinadu-ai-deck-pipeline/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-tinadu-ai-deck-pipeline/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-11T14:15:22.200Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-tinadu-ai-deck-pipeline/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-tinadu-ai-deck-pipeline/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-tinadu-ai-deck-pipeline/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-tinadu-ai-deck-pipeline/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"high","updatedAt":"2026-10-11T10:26:17.577Z","emptyReason":null},"readme":"Skill: Deck Pipeline\n\nOwner: tinadu-ai\n\nSummary: Production-grade Claude Code system that takes presentation decks from raw Chinese draft to McKinsey-polished English — with full audit trail, layout integri...\n\nTags: bilingual:3.0.0, claude-code:3.0.0, latest:3.0.0, layout-audit:3.0.0, mckinsey:3.0.0, pptx:3.0.0, translation:3.0.0\n\nVersion history:\n\nv3.0.0 | 2026-05-12T16:33:27.011Z | user\n\nMajor rewrite from DeckGlobalizer v2.1.1:\n\n- Now a full 4-stage pipeline (Sense Pass → McKinsey Translation → Layout Audit → Handoff)\n- Swappable PROFILE block (palette, fonts, glossary, slide-offset)\n- Page-by-page execution with per-slide checkpoint\n- McKinsey style baseline + extensible reference samples\n- Font-name suffix audit, structural-anchor detection\n- Discrete -0.1pt font compression, line-spacing fallback\n- Bidirectional PPT ↔ Excel sync\n- Companion-file lock detection\n- 10 standalone helper scripts\n- Polish-only mode for single-language decks\n\nRenamed from 'deckglobalizer' to 'deck-pipeline'; old slug redirects.\n\nv2.1.1 | 2026-04-27T08:01:49.827Z | user\n\nAdd requires field declaring python-pptx and lxml dependencies. Explicitly state all translation is performed by the Claude model — no external translation APIs are called and document content does not leave the session.\n\nv2.1.0 | 2026-04-27T07:53:20.798Z | user\n\nClarify layout compensator: refining translation must not drop factual content, numbers, or named concepts. Remove cross-file slide copying section.\n\nv1.0.0 | 2026-04-22T05:02:32.467Z | auto\n\n- Initial release of DeckGlobalizer skill for high-fidelity PowerPoint translation.\n- Translates .pptx files into another language while preserving original layout, fonts, and design.\n- Multi-phase workflow: Style audit with manifest, tiered glossary with user sign-off, page-by-page translation with layout compensator rules.\n- Strict text fitting and sibling-consistency logic to maintain professional appearance.\n- Outputs translated deck and intermediate documentation files in the source file directory.\n\nArchive index:\n\nArchive v3.0.0: 17 files, 43050 bytes\n\nFiles: CHANGELOG.md (2306b), CONTRIBUTING.md (2162b), LICENSE (1083b), README.md (16402b), scripts/anchor_detect.py (3582b), scripts/apply.py (5166b), scripts/excel_sync.py (10181b), scripts/extract.py (2096b), scripts/glossary_audit.py (4945b), scripts/handoff.py (2260b), scripts/layout_audit.py (7996b), scripts/overflow_recheck.py (6081b), scripts/sense_pass.py (6505b), scripts/style_distill.py (6272b), skill-card.md (2294b), SKILL.md (17289b), _meta.json (132b)\n\nFile v3.0.0:SKILL.md\n\n---\nname: deck-pipeline\ndescription: |\n  Production-grade Claude Code system that takes presentation decks from raw\n  Chinese draft to McKinsey-polished English — with full audit trail, layout\n  integrity checks, and a swappable PROFILE block for project-specific\n  defaults. Built on a 4-stage pipeline (Sense Pass → McKinsey Translation →\n  Layout Audit → Handoff). Also runs polish-only on any single-language deck.\n\n  TRIGGER when the user:\n    • hands over a .pptx containing Chinese and asks for English / translation\n    • asks for \"deck pipeline\", \"deck polish\", \"deck globalizer\"\n    • asks for layout polish, font cleanup, overflow fixing on any deck\n    • asks to update / reverse-sync a bilingual comparison Excel against a deck\n\n  SUPPRESS with \"Ignore deck-pipeline\".\nversion: 0.1.0\nlicense: MIT\n---\n\n# Deck Pipeline\n\n> **A 4-stage, audit-trailed Chinese→English deck globalization system with a swappable project profile.**\n\nThis skill bundles the generic deck-globalization engine (originally upstream\nDeckGlobalizer v2.1.1) and an editable PROFILE block (palette, fonts,\nglossary, style preferences). The two are **separated** by section so the\nprofile can be swapped per project / brand without touching the engine.\n\nFor a marketing-style overview, see `README.md` in this directory.\nFor implementation, see `scripts/` and the per-stage runbooks below.\n\n---\n\n## 0. Modes & activation\n\n| Mode | Trigger | Stages |\n|---|---|---|\n| **Full pipeline** | CN deck (± EN draft) + user wants English output | 1 → 2 → 3 → 4 |\n| **Polish-only**   | Single-language deck + \"layout / format only / skip translation\" | 1 → 3 → 4 |\n| **Reverse-sync only** | User hand-edited a PPT after a comparison Excel was generated | 3.5 (sync sub-routine) |\n\nDetect the mode in the first turn. If ambiguous, ask one yes/no question\n(\"This deck is already in EN — should I just polish layout, or also rewrite\nMcKinsey-style?\"). Do not guess silently.\n\n---\n\n## 1. PROFILE block — defaults (swappable)\n\nEdit this block to retarget the skill for your project / brand. Everything\nbelow this block is **profile-agnostic**.\n\n```yaml\nPROFILE:\n  # ---- L1 Tokens ----\n  palette:\n    # Replace with your brand colors.\n    ink:          \"#1A1A1A\"\n    primary:      \"#000000\"   # accent / brand primary\n    soft:         \"#FFFFFF\"   # soft fill behind banners\n    page_bg:      \"#FFFFFF\"\n  fonts:\n    # Choose a serif title face + a sans-serif body face for best contrast.\n    title:        \"Georgia\"\n    body:         \"Verdana\"\n    title_bold:   true\n  unit_table:\n    # Chinese number magnitudes → English. 亿 is 100M, NOT \"billion\".\n    \"百万\":       \"M\"\n    \"千万\":       \"10M\"\n    \"亿\":         \"100M\"\n    \"十亿\":       \"1B\"\n    \"百亿\":       \"10B\"\n    \"千亿\":       \"100B\"\n    \"万亿\":       \"1T\"\n    # Currency suffix is left to the user — append \"$\" / \"RMB\" / \"€\" as appropriate.\n\n  # ---- L2 Constants ----\n  size_ladder:           [22, 14, 10, 8, 6, 4]   # H1, H2, body, caption, footnote, source\n  floors:\n    body:     7\n    caption:  6\n    source:   4\n  compression_step:      0.1     # discrete -0.1pt iterations only\n  line_height_default:   1.25\n  line_height_fallback:  1.15    # used before sub-floor compression\n  quote_style:           \"single\"  # 'McKinsey' single quotes\n  footer_format:         \"Confidential · For Intended Recipients Only · {month} {year}\"\n  separator_in_footer:   \"·\"     # middle dot, NOT em-dash\n\n  # ---- L1 Glossary (extensible) ----\n  # Replace the example entries below with your project's locked terms.\n  # Categories are illustrative; you can rename / add / remove.\n  glossary:\n    locked:\n      people_orgs:\n        # \"<source term>\": \"<canonical translation>\"\n        # e.g. \"John Smith\": \"John Smith\"\n        # e.g. \"Acme Capital\": \"Acme Capital\"\n        {}\n      business_terms:\n        # Common Chinese business-deck idioms with industry-standard\n        # English mappings. Edit / extend as needed.\n        \"流水\":     \"gross revenue\"\n        \"私域\":     \"owned audience\"\n        \"出海\":     \"global expansion\"\n      domain_specific:\n        # Project / industry / domain terms.\n        # \"<source term>\": \"<canonical translation>\"\n        {}\n    rejected_rewrites:\n      # Entries the user vetoed during prior sessions.\n      # Format: { source: \"...\", proposed: \"...\", reason: \"...\" }\n      []\n    pending: []\n    session_added: []\n\n  # ---- Style rules ----\n  # McKinsey is the default baseline. Additional style references can be\n  # uploaded and distilled via scripts/style_distill.py; their rules layer\n  # ON TOP of the McKinsey base.\n  style_baseline: \"mckinsey\"\n  mckinsey:\n    title_is_takeaway:      true   # title = the so-what, not the topic\n    lead_with_so_what:      true\n    parallel_structure:     true   # bullets share tense, opening part-of-speech\n    strong_action_verbs:    true   # cut \"is/has\", prefer concrete verb\n    cut_filler:\n      - \"in order to → to\"\n      - \"a number of → many\"\n      - \"due to the fact that → because\"\n      - \"at this point in time → now\"\n    case:                   \"sentence\"   # lowercase unless proper noun or locked term\n    em_dash_policy:         \"use em-dash for parentheticals; use · (middle dot) in lists/footers\"\n  style_references:\n    # Each entry is a PDF / .pptx reference. style_distill.py reads it and\n    # emits rules (cadence, signature phrases, paragraph length, tone) that\n    # layer on top of the McKinsey base. Conflicts: more recent entry wins;\n    # user is asked at first conflict.\n    # Example:\n    # - path: \"/path/to/sample.pdf\"\n    #   weight: 0.7\n    []\n\n  # ---- Structural anchor heuristics ----\n  anchor_detection:\n    min_pages: 3              # appears on ≥3 slides\n    match_on:                 # signature components\n      - position_xy\n      - fill_color\n      - font_size_class\n    auto_protect: true\n\n  # ---- Overflow estimator ----\n  overflow:\n    severity:\n      high: 1.5\n      med:  1.15\n      low:  1.0\n    surface_only: \"high\"      # surface MED/LOW only when explicitly asked\n    defer_to_user_threshold: 10   # if HIGH > 10 → ask user to render externally\n\n  # ---- CN ↔ EN slide alignment ----\n  # Default is 1:1 (EN slide N maps to CN slide N).\n  # Set overrides only when the two decks have been restructured.\n  # Pass this config to excel_sync.py via `--cn-offset <yaml>`.\n  cn_en_slide_offset:\n    default: 0           # offset added to EN slide number (0 = 1:1)\n    overrides: {}        # e.g. {\"9-26\": -1, \"20\": null}\n                         # int = relative offset; null = no CN counterpart\n```\n\n> **Profile-agnostic note:** all sections below treat `PROFILE` as an\n> opaque dict. Do not hardcode project-specific values anywhere outside the\n> PROFILE block.\n\n---\n\n## 2. Pipeline stages\n\nEach stage has: **inputs · what it does · outputs · stop-and-ask conditions.**\n\n### Stage 1 — Sense Pass\n\n**Inputs:** one or two `.pptx` paths (CN, optional EN draft)\n**What it does:**\n1. Run `scripts/sense_pass.py` to extract:\n   - palette (top fill colors)\n   - font usage histogram\n   - size distribution\n   - title-zone shapes (top ≤ 600K EMU)\n   - layout heuristics\n2. Cross-check sensed values against `PROFILE.palette` / `PROFILE.fonts`.\n   If a sensed font is NOT in the whitelist AND NOT in `SKIP_POLLUTION`,\n   record it as **font pollution**.\n3. Surface **candidate glossary entries**: any CN noun phrase that appears\n   ≥2 times and isn't already in `glossary.locked`.\n\n**Outputs:**\n- `Style_Manifest.md` (in-memory; not written to disk unless requested)\n- `pollution_report` (slide → font → count)\n- `candidate_glossary` (term → count → sample context)\n\n**Stop-and-ask:**\n- Candidate glossary surfaces a term Claude can't confidently translate →\n  ask user, write answer to `glossary.session_added`.\n- Sensed primary palette color differs from `PROFILE.palette.primary` →\n  ask whether to update profile or keep existing.\n\n---\n\n### Stage 2 — McKinsey Translation (skipped in polish-only mode)\n\n**Inputs:** Stage 1 outputs + the CN deck (and optional EN draft for diff context) + any uploaded `style_references`.\n\n**Style layering**: McKinsey base rules (`PROFILE.mckinsey`) apply first. If\n`PROFILE.style_references` is non-empty, run `scripts/style_distill.py` on\neach reference before translation begins; the distilled rules (cadence,\nsignature phrases, paragraph length, tone) layer on top. More recent entry\nwins on conflict; ask user at the first conflict.\n\n**Page-by-page execution (hard requirement):**\n1. **Overall confirmation first** — after Stage 1, show the user the planned\n   per-page edit count + sample of style rules in effect; wait for \"go\".\n2. **Then loop slides 1 → N**, one at a time:\n   - Collect paragraph-level CN text on this slide via `scripts/extract.py`.\n   - For each paragraph, produce EN per the layered style rules:\n     - lowercase by default; title = so-what; parallel bullets; strong verbs;\n       filler-word table applied; glossary `locked` inline\n     - any unknown term → STOP, ask user, write to `session_added`\n   - Build the slide's edit batch as a JSON object.\n   - Run `scripts/apply.py` with the slide's batch → writes that slide's\n     changes into `<file>-en-polished-<date>.pptx` AND appends rows to\n     `<file>-bilingual-diff-<date>.xlsx` immediately.\n   - **Checkpoint**: print \"P{n} done — N changes applied. Continue?\" and\n     wait for user OK before moving to P{n+1}.\n   - User can interject \"back to P{n-1}\" or \"stop here\" between pages.\n\n**Why per-page (not all-at-once):**\n- The user can review and steer mid-stream.\n- A bad assumption on P3 doesn't propagate to P27 unnoticed.\n- Excel grows incrementally — survives any mid-session interruption.\n- Token-efficient: only one slide's context in active scratchpad.\n\n---\n\n### Stage 3 — Layout Audit\n\n**Inputs:** the post-translation deck (or, in polish-only mode, the raw deck)\n**What it does:**\n\n#### 3a. Font pollution cleanup\nRun `scripts/layout_audit.py --fix`:\n- For every run whose `font.name` is NOT in the title/body whitelist\n  OR ends in a style suffix (`Bold` / `Regular` / `Italic` / `Light`):\n  - Strip the suffix\n  - Set `font.name` to the pure family\n  - Set `font.bold` / `font.italic` attributes accordingly\n- Skip any face in the configured `SKIP_POLLUTION` set.\n\n#### 3b. Structural-anchor detection\nRun `scripts/anchor_detect.py`:\n- For each shape, compute a signature: `(rounded_position, fill_color, font_size_class)`.\n- Group across slides. Any signature occurring on ≥ `PROFILE.anchor_detection.min_pages`\n  pages becomes an **anchor**.\n- Build `per_page_protect[page] = [anchor_shape_ids...]`.\n- Surface the anchor list to the user. They can add/remove.\n\n#### 3c. Overflow estimation\nRun `scripts/overflow_recheck.py`:\n- Honor `auto_size` (skip if SHAPE_TO_FIT_TEXT or TEXT_TO_FIT_SHAPE).\n- Read actual `margin_*`.\n- Use `PROFILE.line_height_default = 1.25` initially. If a shape is flagged,\n  try 1.15 as a what-if before flagging as HIGH.\n- Per-character width by class (narrow `iIl`, wide `MW`, digits, upper, space).\n- Greedy word-wrap simulation.\n- Emit only HIGH (`ratio > PROFILE.overflow.severity.high`) by default.\n\nIf HIGH count > `PROFILE.overflow.defer_to_user_threshold`:\n- **Do not** dump 30+ rendered PNGs into the session.\n- Tell the user: \"Render to PDF/PNG via Keynote or PowerPoint, tell me which\n  pages look broken, I'll fix those targeted pages.\"\n\n#### 3d. Compression (when user OKs a fix)\nFor each shape needing fix:\n1. Is it in `per_page_protect[page]`? → SKIP (it's an anchor).\n2. Try widening: increase shape `width` until ratio < 1.0 OR shape collides.\n3. Still > 1.0? Try line-height 1.25 → 1.15.\n4. Still > 1.0? Iterate `font.size -= PROFILE.compression_step` (0.1pt) until\n   floor (`PROFILE.floors.<body|caption|source>`) hit.\n5. Still > 1.0 at floor? **STOP. Escalate to user.** List the shape, its\n   current size, the calculated ratio, and ask whether to break the floor.\n\n#### 3e. Late-stage glossary re-scan\nRun `scripts/glossary_audit.py`:\n- For each text run in the deck, check against `glossary.locked`:\n  - If a CN-side phrase exists locked but a non-canonical EN translation\n    appears → flag.\n  - If the same source term is translated two different ways in the deck\n    (wavering) → flag.\n- Surface flagged rows. Auto-fix if all flags point to the same canonical\n  translation; ask otherwise.\n\n#### 3f. Reverse sync (sub-routine, also Mode 3.5 entry point)\nRun `scripts/excel_sync.py --reverse`:\n- Diff current PPT against the Excel's `en_optimized` column.\n- For each mismatched row:\n  - Try ordinal-position match (slide + paragraph-index).\n  - If no match, try `difflib.get_close_matches` against same-slide texts.\n  - Update Excel cell on success.\n- Report any leftover unmatched rows.\n\n**Outputs:**\n- `<file>-final-<date>.pptx` (full pipeline) or `<file>-final-<date>.pptx` (polish-only)\n- Updated Excel (if applicable)\n\n---\n\n### Stage 4 — Handoff\n\n**Inputs:** all prior-stage outputs\n**What it does:**\n1. Write `HANDOFF.md` to the same directory as the deck — see `scripts/handoff.py`.\n2. Print a one-paragraph deliverables summary to the user.\n\n**Stop-and-ask:** none.\n\n---\n\n## 3. Operational rules (apply across stages)\n\n### 3.1 File-write discipline\n\nBefore writing **any** `.pptx` or `.xlsx`:\n1. Check for `~$<filename>` lock file in the same directory.\n2. If present → **STOP.** Tell the user: \"`<filename>` is open in\n   PowerPoint/Excel. Save and close it, then say 'go' to continue.\"\n3. After writing, immediately readback-verify (next rule).\n\n### 3.2 Excel companion three guard-rails\n\n1. **Pre-write check** — load existing Excel (if any), confirm header row is\n   `[page, kind, cn, en_original, en_optimized, notes]`. If columns missing\n   → rebuild header before writing data.\n2. **Post-write readback** — immediately reload the saved file and assert\n   `max_column ≥ 7` and header is intact.\n3. **Reverse sync** available on demand: see Stage 3f.\n\n### 3.3 Font compression discipline\n\nSee Stage 3d. The single rule: **never** bulk-reduce font sizes.\nAlways discrete `-0.1pt`, always after exhausting widening + line-height\nfallback, always with anchor protection.\n\n### 3.4 Glossary discipline\n\n- Ask once per session per unknown term. Then it's in `session_added` for\n  the rest of the session.\n- At handoff, promote `session_added` to a `glossary_proposed_additions.yaml`\n  file next to the deck. The user can copy them into PROFILE for the next run.\n- **Never** silently apply a translation Claude is unsure about. Stop and ask.\n\n### 3.5 Magnitude verification\n\nAny number with a CN magnitude word (百万 / 千万 / 亿 / 百亿 / 千亿 / 万亿)\nmust be re-verified against `PROFILE.unit_table` before being written to EN.\nTreat this as a HARD CHECK; do NOT take prior-session translations on faith.\n\n### 3.6 CN-alignment confidence\n\nWhen auto-aligning the Excel's `cn` column by paragraph ordinal:\n- Slides with > 15 changes → auto-tag `notes` column as `needs-review`.\n- Always present this as best-effort, never as ground truth.\n\n---\n\n## 4. Scripts (in `scripts/`)\n\n| Script | Role | Stage |\n|---|---|---|\n| `sense_pass.py` | extract design DNA, font usage, palette | 1 |\n| `extract.py`    | paragraph-level text extraction | 1, 2, 3 |\n| `apply.py`      | apply EN edits + write Excel with highlight | 2 |\n| `layout_audit.py` | font pollution cleanup, suffix audit | 3a |\n| `anchor_detect.py` | cross-page anchor signature detection | 3b |\n| `overflow_recheck.py` | overflow estimator with severity tiers | 3c |\n| `glossary_audit.py` | late-stage glossary re-scan + wavering | 3e |\n| `excel_sync.py` | bidirectional PPT ↔ Excel sync (configurable slide offset) | 3f |\n| `handoff.py`    | write HANDOFF.md | 4 |\n| `style_distill.py` | distill style fingerprint from a reference PDF/.pptx | pre-2 |\n\nEach script is invokable standalone; the skill wires them together.\n\n---\n\n## 5. Deliverables (recap)\n\n**Full pipeline (4 files):**\n- `<file>-en-polished-<date>.pptx`\n- `<file>-final-<date>.pptx`\n- `<file>-bilingual-diff-<date>.xlsx`\n- `HANDOFF.md`\n\n**Polish-only (3 files):**\n- `<file>-final-<date>.pptx`\n- `<file>-layout-changes-<date>.xlsx`\n- `HANDOFF.md`\n\n**Mode 3.5 (reverse-sync only):**\n- updated `<file>-bilingual-diff-<date>.xlsx`\n\n---\n\n## 6. Known limitations\n\n1. Overflow estimator is a **hint, not a verdict** — final visual check\n   requires external rendering (Keynote / PowerPoint export to PDF).\n2. `python-pptx` cannot render slides. There is no built-in preview.\n3. CN auto-alignment by paragraph ordinal can drift on heavily-restructured\n   pages — configure `PROFILE.cn_en_slide_offset.overrides` for known cases.\n4. The skill assumes the CN source is semantic ground truth — typos in CN\n   propagate to EN unless the user catches them.\n5. File-lock collisions silently corrupt output. The pre-write `~$xxx` check\n   is the only line of defense.\n\n---\n\n## 7. Changelog\n\nSee `CHANGELOG.md`.\n\n---\n\n## 8. Credits\n\nGeneric deck-globalization engine derived from upstream **DeckGlobalizer v2.1.1**\nby tinadu-ai (<https://clawhub.ai/tinadu-ai/deckglobalizer>). Original\nthree-phase architecture (Visual Audit / Semantic Alignment /\nPage-by-Page Execution) credited and retained.\n\nFile v3.0.0:README.md\n\n# Deck Pipeline · CN→EN · McKinsey Polish · Layout Audit\n\n![version](https://img.shields.io/badge/version-0.1.0-blue)\n![license](https://img.shields.io/badge/license-MIT-green)\n![python](https://img.shields.io/badge/python-3.9%2B-blue)\n![status](https://img.shields.io/badge/status-beta-orange)\n\n> A production-grade Claude Code system for taking decks from raw Chinese draft to McKinsey-polished English — with full audit trail, layout integrity checks, and a swappable PROFILE block for project-specific defaults. Built on a 4-stage pipeline; also runs polish-only on any single-language deck.\n>\n> 一套生产级 Claude Code 系统，把 deck 从中文原稿做到麦肯锡级英文成稿——全程留痕、排版守护、可替换的项目级 PROFILE 块。基于 4 阶段流水线；也支持纯排版模式，处理任意单语言 deck。\n\n---\n\n## What it does / 做什么\n\nTakes a Chinese deck (and optionally an English draft) and runs it through a 4-stage pipeline. Or, if you give it a single-language deck and ask for layout-only cleanup, skips translation and runs polish stages alone.\n\nWorks for any kind of deck — sales, product, research, conference talks, internal reports, whatever.\n\n输入一份中文 deck（可选搭配一版英文草稿），经过 4 阶段流水线。或者，给它一份单语言 deck + 要求\"只做排版\"，就跳过翻译，只跑排版相关 stage。\n\n| Stage / 阶段 | What happens / 做什么 | Polish-only? |\n|---|---|---|\n| **1. Sense Pass** | Reverse-engineer design DNA (palette, fonts, size hierarchy) and surface candidate glossary terms.<br>反推设计 DNA（色板、字体、字号梯队），扒出候选术语。 | ✅ runs |\n| **2. McKinsey Translation** | CN → EN in McKinsey style from the first pass (top-down, parallel, strong verbs, no filler). Glossary applied inline; unclear terms asked on the spot. Runs **page-by-page** with a checkpoint after each slide.<br>中翻英直接出麦肯锡风格（top-down、平行结构、强动词、去填充词）。术语表 inline 应用；生僻词当场问。**逐页执行**，每页结束 checkpoint 等用户确认。 | ⏭️ skipped |\n| **3. Layout Audit** | Font pollution cleanup, overflow estimation, structural-anchor protection, reverse-sync from hand-edits.<br>字体污染清理、溢出估算、结构锚点保护、手动改动反向同步。 | ✅ runs |\n| **4. Handoff** | Three or four deliverables + a HANDOFF.md contract for the next session.<br>3–4 件交付物 + 给下一个 session 的 HANDOFF.md 接力契约。 | ✅ runs |\n\nYou do **not** need any external skill installed. The generic deck-globalization engine (3-phase visual audit / semantic alignment / page-by-page execution) is bundled inside.\n\n**不需要**安装任何外部 skill。通用 deck 全球化引擎（3 阶段：视觉审计 / 语义对齐 / 逐页执行）已内置。\n\n---\n\n## Install / 安装\n\n```bash\ngit clone https://github.com/<your-org>/deck-pipeline ~/.claude/skills/deck-pipeline\npip3 install python-pptx openpyxl pymupdf pyyaml\n```\n\nThe skill is loaded automatically by Claude Code on next start.\n\n下次 Claude Code 启动时会自动加载本 skill。\n\n---\n\n## Modes / 模式\n\n| Mode / 模式 | Trigger / 触发 | Stages run / 跑哪些 stage |\n|---|---|---|\n| **Full pipeline / 完整流水线** | CN deck (± EN draft) provided, translation requested<br>提供 CN deck（± EN 草稿），要翻译 | 1 → 2 → 3 → 4 |\n| **Polish-only / 纯排版** | Single-language deck, \"just polish / format only / skip translation\"<br>单语言 deck，说\"只做排版 / 跳过翻译 / format only\" | 1 → 3 → 4 |\n| **Reverse-sync only / 反向同步** | User hand-edited PPT after Excel was generated<br>用户在 Excel 生成后手动改了 PPT | 3.5 sub-routine |\n\n---\n\n## Outputs / 输出\n\n**Full pipeline / 完整流水线**（4 件）：\n\n| File / 文件 | Content / 内容 |\n|---|---|\n| `xxx-en-polished-[date].pptx` | English deck after McKinsey-style translation + glossary lock.<br>麦肯锡风格翻译 + 术语锁定后的英文 deck。 |\n| `xxx-final-[date].pptx` | Above + font/layout normalization, overflow fixes.<br>在前者基础上做完字体/布局规范化、溢出修复。 |\n| `xxx-bilingual-diff-[date].xlsx` | Row-by-row comparison: `page / kind / cn / en_original / en_optimized / notes`. Red-bold rows = key corrections.<br>逐行对照表，红粗 = 关键修正。 |\n| `HANDOFF.md` | Session contract: goal · tools · completed · unresolved · cautions · principles · constraints.<br>session 契约。 |\n\n**Polish-only / 纯排版**（3 件）：\n\n| File / 文件 | Content / 内容 |\n|---|---|\n| `xxx-final-[date].pptx` | After font/layout normalization, overflow fixes.<br>字体/布局规范化、溢出修复后。 |\n| `xxx-layout-changes-[date].xlsx` | What was changed.<br>改了什么。 |\n| `HANDOFF.md` | Same as above.<br>同上。 |\n\n---\n\n## Architecture / 架构\n\nThree layers, in order of stability / 三层，按稳定性排序：\n\n### L1 Tokens（stable, project-defined / 稳定，项目级定义）\n- **Palette / 色板** — ink, primary brand, soft fill, page background\n- **Font whitelist / 字体白名单** — title face (e.g. serif) + body face (e.g. sans-serif)\n- **Unit conversion / 单位换算** — 百万=M · 亿=100M · 十亿=1B · 百亿=10B · 千亿=100B · 万亿=1T\n- **Glossary / 术语表**（见下）\n\n### L2 Constants（operational defaults / 操作默认值）\n- **Size ladder / 字号梯队** — 22 / 14 / 10 / 8 / 6 / 4 pt\n- **Floors / 地板** — body ≥ 7pt · caption ≥ 6pt · source ≥ 4pt\n- **Compression step / 压缩步进** — `-0.1pt` discrete only / 仅 -0.1pt 离散迭代，不一刀切\n- **Line-spacing fallback / 行距备选档** — 1.25 → 1.15 before sub-floor compression\n- **Quote style / 引号风格** — McKinsey single quotes `'…'`\n- **Footer format / 页脚格式** — `Confidential · For Intended Recipients Only · {month} {year}` (middle dot, not em-dash)\n\n### L3 Sensed（run-time, per-deck / 运行时，按 deck 推算）\n- **Font-name suffix audit / 字体名后缀审计** — `font.name` must not contain `Bold` / `Regular` / `Italic` / `Light` suffixes; split into `name` + boolean attribute\n- **Structural-anchor detection / 结构锚点检测** — shapes consistent across ≥3 pages (footers, callout bands, watermarks) → per-page protection list\n- **Late-stage glossary re-scan / 末段术语复扫** — catches hand-edit regressions\n- **Glossary wavering detection / 术语摇摆检测** — same source term getting multiple translations across the deck\n\n---\n\n## Style baseline + extensible references / 风格基线 + 可扩展引用\n\n**McKinsey is the default baseline.** Title-as-takeaway, lead-with-so-what, parallel structure, strong action verbs, filler removal, sentence-case by default.\n\n**麦肯锡是默认基线**：标题即结论、so-what 前置、平行结构、强动词、去填充词、默认小写。\n\n**On top of McKinsey, you can upload additional reference samples** — any PDF or .pptx whose writing style you want to emulate (a colleague's well-written report, an industry whitepaper, your own prior work, etc.). The skill distills each via `scripts/style_distill.py` and layers its rules on top of the McKinsey base.\n\n**在麦肯锡之上，可以上传其他参考样本**——任何你想模仿其文风的 PDF 或 pptx（同事写得好的报告、行业白皮书、自己之前的作品等）。skill 用 `scripts/style_distill.py` 抽每份样本的风格指纹，在麦肯锡基线之上叠加。\n\nDistillation extracts / 蒸馏出来的内容：\n- Cadence: avg sentence/paragraph length, p90 length / 节奏：句长、段长、p90\n- Vocab: signature phrases, top action verbs, filler-word patterns / 词汇：标志短语、高频动词、填充词模式\n- Structure: bullet pattern, parallel-structure score / 结构：bullet 模式、平行度\n- Tone: first-person ratio, hedge ratio, certainty ratio / 调性：第一人称比例、保守语 / 笃定语比例\n\nAdd references in PROFILE / 在 PROFILE 加 references：\n\n```yaml\nstyle_references:\n  - path: \"/path/to/sample.pdf\"\n    weight: 0.7   # 0.0–1.0; how strongly to bias toward this sample\n```\n\nConflicts between references → most recent entry wins; user asked at first conflict.\n\nReferences 冲突 → 最新一条优先；首次冲突时问用户。\n\n---\n\n## Page-by-page execution / 逐页执行\n\nStage 2 is **not** all-at-once. After overall confirmation, the skill iterates slides 1 → N. For each slide:\n\nStage 2 **不是**一次性全跑。整体确认后逐页跑：\n\n1. Apply edits to that slide's paragraphs / 应用该页的 edits\n2. Append rows to the Excel immediately / 立刻把该页的对照行追加到 Excel\n3. Print \"P{n} done — N changes applied. Continue?\" / 打印 \"P{n} 完成，N 处改动，继续？\"\n4. Wait for user confirmation before moving to P{n+1} / 等用户确认再进下一页\n\nYou can interject \"back to P{n-1}\", \"stop here\", or \"redo P{n}\" between pages.\n\n页间可以说\"回到 P{n-1}\"、\"停在这里\"、\"P{n} 重做\"。\n\nWhy / 为什么：\n- Mid-stream review and steering / 中途可审查、可调整\n- Bad assumptions don't propagate silently / 错误假设不会静默扩散\n- Excel grows incrementally → survives interruption / Excel 增量增长，中断也能续上\n- Token-efficient: only current slide in active scratchpad / 省 token：当前页才在活跃上下文\n\n---\n\n## Glossary categories / 术语表分类（extensible / 可扩展）\n\n```\nLocked            → user-confirmed, never re-asked / 用户确认过，不再问\nPending           → asked but not yet confirmed / 问过但未拍板，跨 session 接力\nRejected rewrites → user vetoed; never propose again / 被驳回过，永久回避\nSession-added     → added mid-session; promoted to Locked at handoff / 本次新加，handoff 时升 Locked\nPer-row override  → \"ignore glossary for this row\" / 单行豁免\n```\n\nReplace the example entries in `SKILL.md` `PROFILE.glossary.locked` with your project's terms (proper nouns, brand names, product names, industry phrases, etc.).\n\n把 `SKILL.md` 中 `PROFILE.glossary.locked` 的示例条目替换成你项目的术语（专有名词、品牌名、产品名、行业说法等）。\n\n---\n\n## Magnitude trap / 量级陷阱\n\nThe Chinese 亿 is **100 million**, NOT \"billion\". / 中文「亿」= 1 亿 = 100M，**不是** \"billion\"。\n\n| CN | EN |\n|---|---|\n| 一百万 / 百万 | 1 million |\n| 一千万 / 千万 | 10 million |\n| 一亿 / 1亿 | 100 million |\n| 十亿 | 1 billion |\n| 百亿 | 10 billion |\n| 千亿 | 100 billion |\n| 万亿 | 1 trillion |\n\nAppend your currency suffix (`$`, `RMB`, `€`, etc.) in PROFILE per project.\n\n---\n\n## Interaction model / 交互模型\n\nThe skill is **bidirectional** — it stops and asks at specific checkpoints rather than guessing.\n\n本 skill **双向交互**——在特定检查点停下来问，不瞎猜。\n\nYou will be asked when / 以下情况会问你：\n\n1. A source term has no glossary entry and Claude is unsure<br>遇到未收录术语且拿不准\n2. A McKinsey rewrite candidate looks ambiguous (only when unsure — not every line)<br>麦肯锡改写候选有歧义（仅在拿不准时问，不是每行都问）\n3. A shape's font hits the floor and overflow remains<br>某 shape 字号撞地板但仍溢出\n4. A companion file (`.pptx` / `.xlsx`) is open in another app (lock file present)<br>配套文件被其他 app 打开（lock 文件存在）\n5. The overflow estimator reports > 10 HIGH-risk shapes (defer to user-side rendering)<br>估算器报 > 10 个 HIGH 风险 shape（让用户外部渲染复核）\n\nYou will **not** be asked twice for the same thing in one session — once confirmed, it enters Locked.\n\n同一件事**不会问两次**——确认过的进 Locked。\n\n---\n\n## Operational rules / 操作规则\n\n### File-write discipline / 文件写入纪律\n- Overwrite the original by default / 默认覆盖原文件\n- Scan for `~$xxx` lock file before writing / 写前扫 `~$xxx` lock 文件\n- If lock exists → **stop and ask user to save + close first** / 存在 → **停 + 让用户先保存并关闭**\n\n### Excel companion guard-rails / Excel 配套文件三护栏\n1. **Pre-write check / 写前校验** — verify header has all 6 columns / 校验 header 6 列齐全\n2. **Post-write readback / 写后回读** — immediately reload and confirm columns survived / 立即重读，确认列数没丢\n3. **Reverse sync / 反向同步** — bidirectional diff (ordinal first, fuzzy fallback) updates Excel from a hand-edited PPT / 双向 diff（先 ordinal，再 fuzzy 兜底），把 PPT 的修改同步回 Excel\n\n### Font compression discipline / 压字号纪律\n- Detect per-page protection list (structural anchors + user-specified) / 先取 per-page 保护列表（结构锚点 + 用户指定）\n- Iterate `-0.1pt` until no overflow / 按 -0.1pt 迭代到无溢出\n- If floor is hit / 撞地板：\n  1. Geometric widening (eat margin) / 横向扩框（吃 margin）\n  2. Line-spacing 1.25 → 1.15 / 行距压缩\n  3. Still overflowing → **escalate to user** / 仍溢出 → **上报用户**，列出问题 shape\n\n### CN-alignment configuration / CN 对齐配置\nConfigure `PROFILE.cn_en_slide_offset` (or pass `--cn-offset <yaml>` to `excel_sync.py`) for decks where CN and EN have been restructured.\n\n如果 CN/EN 两版有结构性差异，配置 `PROFILE.cn_en_slide_offset`（或给 `excel_sync.py` 传 `--cn-offset <yaml>`）。\n\nDefault is 1:1 alignment.\n\n默认 1:1 对齐。\n\n---\n\n## Overflow estimator / 溢出估算器\n\nStatic analyzer flagging shapes whose text likely overflows. Three severity bands:\n\n静态分析，三档严重度：\n\n- **HIGH** — `ratio > 1.5`（very likely real / 极可能为真）\n- **MED** — `ratio 1.15 – 1.5`（might be real / 可能为真）\n- **LOW** — `ratio 1.0 – 1.15`（probably fine / 大概率没事）\n\nOnly HIGH is surfaced by default. / 默认只报 HIGH。\n\n### Accuracy details\n- Honors `auto_size`（NONE / SHAPE_TO_FIT_TEXT / TEXT_TO_FIT_SHAPE）\n- Reads actual margins (no defaults)\n- Line-height multiplier `1.15`\n- Per-character width by class (narrow / wide / digit / upper / space)\n- Greedy word-wrap simulation\n\n### When the estimator is still wrong / 估算器仍可能错\n\nStatic analysis cannot render. If > 10 HIGH-risk shapes are reported:\n\n静态分析不能渲染。HIGH > 10 个时：\n\n> \"Render the deck to PDF or PNGs externally (Keynote `File → Export`, or PowerPoint `Save as PDF`) and tell me which page numbers look problematic. I'll fix those targeted pages.\"\n>\n> 「请用 Keynote 导出或 PPT 另存 PDF，告诉我哪几页有问题，我针对性修。」\n\nBy design — dumping 30+ rendered pages into a single session causes context overload.\n\n这是刻意设计——把 30+ 渲染页一次性灌进 session 会过载。\n\n---\n\n## Known limitations / 已知限制\n\n1. Overflow estimator is a **hint, not a verdict** — final visual check requires external rendering.<br>溢出估算器是 hint 不是判决，最终视觉确认需外部渲染。\n2. `python-pptx` cannot render slides.<br>`python-pptx` 不能渲染。\n3. CN auto-alignment can drift on heavily restructured pages — configure overrides for known cases.<br>CN 自动对齐对重排页可能漂移，已知情况配 overrides。\n4. The skill assumes the CN source is semantic ground truth — typos in CN propagate.<br>把 CN 当语义基线，CN 自带的错也会传过去。\n5. File-lock collisions silently corrupt output. Always close before letting the skill write.<br>文件锁冲突会静默破坏输出，让 skill 写之前一定要关。\n\n---\n\n## License / 许可\n\nMIT. See `LICENSE`. / MIT 协议，见 `LICENSE`。\n\n## Contributing / 贡献\n\nSee `CONTRIBUTING.md`. / 见 `CONTRIBUTING.md`。\n\n## Credits / 致谢\n\nGeneric deck-globalization engine derived from upstream **DeckGlobalizer v2.1.1** by tinadu-ai (<https://clawhub.ai/tinadu-ai/deckglobalizer>). Original three-phase architecture (Visual Audit / Semantic Alignment / Page-by-Page Execution) credited and retained.\n\n通用 deck 全球化引擎来自上游 **DeckGlobalizer v2.1.1**（作者 tinadu-ai，<https://clawhub.ai/tinadu-ai/deckglobalizer>）。原三阶段架构（视觉审计 / 语义对齐 / 逐页执行）credit 保留。\n\nFile v3.0.0:_meta.json\n\n{\n  \"ownerId\": \"kn7c4vnnxm0hrg85thcqxz9h3181tzkd\",\n  \"slug\": \"deck-pipeline\",\n  \"version\": \"3.0.0\",\n  \"publishedAt\": 1778603607011\n}\n\nFile v3.0.0:CHANGELOG.md\n\n# Changelog\n\nAll notable changes are documented here.\nFormat follows [Keep a Changelog](https://keepachangelog.com/).\n\n## [Unreleased]\n\n## [0.1.0] — 2026-05-12\n\n### Added\n- Initial public release.\n- 4-stage pipeline: Sense Pass → McKinsey Translation → Layout Audit → Handoff.\n- Polish-only mode for single-language decks (skips translation).\n- Swappable `PROFILE` block (palette, fonts, glossary, style rules, slide-offset config).\n- 10 helper scripts:\n  - `sense_pass.py` — reverse-engineer design DNA (palette, fonts, size hierarchy).\n  - `extract.py` — paragraph-level text extraction.\n  - `apply.py` — apply EN edits + write comparison Excel.\n  - `layout_audit.py` — font pollution cleanup + font-name suffix audit.\n  - `overflow_recheck.py` — overflow estimator with HIGH/MED/LOW tiers.\n  - `anchor_detect.py` — cross-page structural-anchor detection.\n  - `glossary_audit.py` — late-stage glossary re-scan + wavering detection.\n  - `excel_sync.py` — bidirectional PPT ↔ Excel sync, configurable CN↔EN slide alignment.\n  - `handoff.py` — HANDOFF.md template writer.\n  - `style_distill.py` — distill style fingerprint from a reference PDF/.pptx.\n- Page-by-page execution with per-slide user checkpoint.\n- Extensible style references (McKinsey baseline; users can layer additional reference samples).\n- Bidirectional PPT ↔ Excel sync (ordinal-position + fuzzy fallback).\n- Overflow estimator improvements: honors `auto_size`, reads real margins, per-character width by class, greedy word-wrap simulation.\n- Font-name suffix audit (`Bold`/`Regular`/`Italic`/`Light` not allowed in `font.name`).\n- Structural-anchor cross-page detection (auto per-page compression protection list).\n- Discrete `-0.1pt` font compression step; line-spacing fallback (1.25 → 1.15).\n- Companion-file lock detection (`~$xxx`).\n- Excel three guard-rails (pre-write check, post-write readback, reverse sync).\n- HANDOFF.md as a session-end deliverable.\n- Bilingual README (English + 中文).\n\n### Sources / credits\n- The generic deck-globalization engine is derived from upstream\n  **DeckGlobalizer v2.1.1** by tinadu-ai\n  (<https://clawhub.ai/tinadu-ai/deckglobalizer>).\n  Original three-phase architecture (Visual Audit / Semantic Alignment /\n  Page-by-Page Execution) credited and retained.\n\nFile v3.0.0:CONTRIBUTING.md\n\n# Contributing\n\nThanks for your interest. This is a small, opinionated tool — contributions are welcome but please keep the surface area minimal.\n\n## Reporting issues\n\nOpen a GitHub issue with:\n- What you ran (command + relevant CLI flags)\n- What you expected vs what happened\n- A minimal reproduction (a sanitized 1–3 slide `.pptx` is ideal)\n- Your environment (Python version, OS, `python-pptx` version)\n\nDo **not** attach decks containing confidential content.\n\n## Pull requests\n\n1. Fork → branch from `main` → PR back into `main`.\n2. Keep PRs focused. One concern per PR. Split if needed.\n3. Touch the smallest possible surface.\n4. Update `CHANGELOG.md` under `[Unreleased]` with a one-line summary.\n5. If you change script behavior, update the corresponding section in `SKILL.md` and `README.md`.\n6. New scripts must:\n   - Be runnable standalone via `python3 <script>.py`.\n   - Print a usage line when called with no args.\n   - Honor `~$xxx` lock-file checks if they write `.pptx` / `.xlsx`.\n   - Follow the existing scripts as style references.\n\n## Design principles (please respect)\n\n- **No silent guessing.** When unsure, stop and ask the user (the skill is bidirectional by design).\n- **Discrete steps over bulk reductions.** Font compression goes by `-0.1pt`, never `-1pt` shortcuts.\n- **Profile-agnostic core.** Anything organization-specific belongs in the `PROFILE` block in `SKILL.md`, never hardcoded in a script.\n- **Reverse-syncable.** Excel companion files must support being updated from hand-edited PPTs, not just one-way generation.\n- **Don't delete content.** Layout fixes use geometry / line-height / discrete font compression. If those fail, escalate to the user.\n\n## Style references\n\nAdding additional reference samples for style distillation is supported via `style_distill.py` and the `PROFILE.style_references` list. PRs that ship new bundled samples should:\n- Use materials that are publicly distributable (no NDA / leaked content).\n- Add a note in the `style_references` documentation describing the sample's origin and any usage caveats.\n\n## Code of conduct\n\nBe decent. Disagree on technical substance, not on the person.\n\nFile v3.0.0:skill-card.md\n\n## Description:\n\nDeck Pipeline helps an agent translate Chinese presentation decks into polished English, audit layout integrity, and produce handoff artifacts for review.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[tinadu-ai](https://clawhub.ai/user/tinadu-ai)\n\n### License/Terms of Use:\n\nMIT\n\n## Use Case:\n\nDevelopers, consultants, and analysts use this skill to process presentation decks through a staged workflow for translation, McKinsey-style English polishing, layout audit, Excel comparison, reverse sync, and session handoff.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Generated Excel audit files can contain active formulas from untrusted deck text.\n\nMitigation: Open generated XLSX files in protected mode, treat source decks and edit JSON as trusted input, and review generated spreadsheets before using them.\n\nRisk: Processing decks from outside the organization can expose the workflow to untrusted document content.\n\nMitigation: Review before installing for external deck workflows and install from a verified repository in a virtual environment with pinned dependencies.\n\nRisk: The skill's overflow checks are estimators and cannot render slides directly.\n\nMitigation: Use PowerPoint or Keynote export to visually verify final decks, especially when many high-risk overflow findings are reported.\n\n## Reference(s):\n\n- [DeckGlobalizer](https://clawhub.ai/tinadu-ai/deckglobalizer)\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, code, shell commands, configuration, guidance]\n\n**Output Format:** [Markdown guidance with JSON edit batches, shell commands, and generated PPTX/XLSX/HANDOFF files]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [May produce translated or polished presentation files, comparison spreadsheets, layout-change spreadsheets, and handoff notes depending on the selected mode.]\n\n## Skill Version(s):\n\n3.0.0 (source: server release metadata; artifact frontmatter and changelog list 0.1.0)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nFile v3.0.0:LICENSE\n\nMIT License\n\nCopyright (c) 2026 deck-pipeline contributors\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\nArchive v2.1.1: 2 files, 4703 bytes\n\nFiles: SKILL.md (9146b), _meta.json (132b)\n\nFile v2.1.1:SKILL.md\n\n---\nname: deckglobalizer\ndescription: >\n  Use this skill when the user wants to translate a PowerPoint (.pptx) file into\n  another language while preserving the original layout, fonts, and visual design.\n  Trigger phrases: \"translate my deck\", \"localize my PPT\", \"translate slides and keep\n  formatting\", \"high-fidelity PPT translation\", \"translate pitch deck\", \"translate\n  presentation\", \"DeckGlobalizer\". Also trigger when the user mentions translating\n  a presentation for investors, clients, or partners across languages (e.g. Chinese\n  to English, English to Chinese, etc.) and wants the layout untouched.\nversion: 2.1.1\nlicense: MIT\nrequires:\n  packages:\n    - python-pptx>=0.6.21\n    - lxml>=4.9\n---\n\n# DeckGlobalizer — High-Fidelity Cross-Language PPT Reconstruction\n\nYou are operating as **DeckGlobalizer**, a precision tool for translating PowerPoint\npresentations while preserving every aspect of the original visual design. Your\noutput must be indistinguishable from a deck built natively in the target language.\n\n---\n\n## Phase 1 — Visual Audit\n\nUse `python-pptx` to scan the uploaded `.pptx` file.\n\n1. Walk the full slide tree and extract all text frames, shapes, and style properties.\n   When traversing GroupShapes (`shape_type == 6`), recurse into children — but mark\n   them so they are never mistaken for top-level title shapes (pass a `top=False` flag).\n2. Identify **Style Clusters** — groups of text elements sharing the same font family,\n   size, weight, color, and layout role (e.g. slide title, body bullet, caption, label).\n3. Detect any existing target-language text already present (e.g. English captions on\n   a Chinese deck) — these act as **alignment anchors** for Tone of Voice calibration.\n4. Run an initial **font audit**: list every typeface name found across all slides,\n   including inside groups and tables. Flag anything unexpected.\n5. Output a `Style_Manifest.md` with the following table per cluster:\n\n   | Cluster | Role | Font | Size | Bold | Color | Count |\n   |---------|------|------|------|------|-------|-------|\n\n**Stop here.** Present the Style Manifest to the user and wait for confirmation\nbefore proceeding to Phase 2.\n\n---\n\n## Phase 2 — Semantic Alignment (Tiered Glossary)\n\nProduce a `Tiered_Glossary.md` with three tiers:\n\n### Tier 1 — Industry Standard Terms\nAuto-detect the document domain (Finance, Tech, Medical, Legal, etc.) from slide\ncontent. Apply the standard professional vocabulary for that domain in the target\nlanguage. Do not improvise these terms — use established equivalents.\n\n### Tier 2 — Proprietary / Invented Concepts\nIdentify terms that are:\n- High-frequency across slides, OR\n- Positioned at structurally central locations (slide titles, section headers, diagram\n  node labels), OR\n- Appear to be invented or branded (e.g. fund names, product names, framework names)\n\nFor each Tier 2 term: **do not translate directly**. Infer meaning from surrounding\ncontext, then offer 2–3 target-language candidates with a brief rationale. Wait for\nthe user to select one before proceeding.\n\n### Tier 3 — Scenario Tone of Voice\nDetect the document type:\n- **Fundraising / Pitch Deck** → confident, forward-looking, investor-grade English\n- **Product Introduction** → clear, benefit-driven, accessible\n- **Annual Review / Report** → formal, data-forward, conservative\n- **Technical Document** → precise, jargon-accurate, passive voice acceptable\n\nApply the corresponding tone consistently throughout all translations.\n\n**Stop here.** Present the full Tiered Glossary and wait for user sign-off before\nexecuting any slide translations.\n\n---\n\n## Phase 3 — Page-by-Page Execution\n\nProcess slides **one at a time**. For each slide, follow this checklist in order:\n\n1. **Merge multi-run paragraphs before translating.** Chinese PPTX files often split\n   one sentence across 10–20 runs due to inline formatting. If you translate only the\n   first run, the rest remain in the source language. Before writing any translation,\n   consolidate all runs in a paragraph into the first run (preserving the first run's\n   `rPr`), then write the full translated string.\n\n2. **Translate** all text using the confirmed glossary and tone.\n\n3. **Apply font changes** per the target font spec (defined by the user or an active\n   profile). See Font Operation Rules below.\n\n4. **Apply the Layout Compensator** rules below.\n\n5. **Verify**: confirm no source-language text remains. Show the user a before/after\n   summary and wait for approval before moving to the next slide.\n\n---\n\n## Font Operation Rules\n\nThese rules govern how fonts are written into the PPTX XML. Follow them precisely —\nmistakes here produce invisible rendering errors that are hard to debug.\n\n### Classification\n- Classify font choice at the **paragraph level**, not the run level. All runs within\n  one paragraph must receive the same font. Do not let different runs in one paragraph\n  end up with different fonts.\n- Within a page, elements of the same type (same visual role, same size range) must\n  use the same font. Do not alternate fonts across visually equivalent elements.\n\n### Title Detection\nA shape qualifies as a \"title\" only when **all** of the following are true:\n- It is a top-level shape (not a child inside a GroupShape)\n- Its `top` coordinate is between 0 and ~200,000 EMU (the very top strip of the slide)\n- It has a text frame\n\nGroupShape children inherit the group's position — their raw `top` values are relative\nand must not be used for title detection.\n\n### XML Surgery\nWhen writing font information into a run's `rPr` element:\n\n1. **Never create a new `rPr`** if one does not already exist. Creating a blank `rPr`\n   forces PowerPoint to fill in default EA fonts (often 华文中宋 or 等线), polluting\n   the entire slide. If `rPr is None`, skip that run entirely.\n\n2. **Delete before writing.** Remove the `<a:sym>`, `<a:latin>`, `<a:ea>`, and\n   `<a:cs>` child elements first, then append fresh ones with the correct attributes.\n   Leaving `<a:sym>` causes theme-font fallback even when `latin` is set correctly.\n\n3. **Write all three slots.** Set `latin`, `ea`, and `cs` explicitly. Leaving `ea`\n   unset lets the OS fill in a default CJK font.\n\n4. **Include `panose`, `pitchFamily`, and `charset`** on each font element. These\n   ensure correct rendering across platforms.\n\n### Global Font Audit\nAfter completing all slides, run a final sweep across the entire file:\n- Extract every `typeface` value from every run on every slide (including inside\n  groups and table cells)\n- List any font that does not match the target font spec\n- Present to the user for confirmation or auto-fix\n\n---\n\n## Number Verification Step\n\nAfter completing translation, extract all text containing numbers from both the\nsource and target files and present a side-by-side table for the user to verify.\n\nPay particular attention to unit conversions. For Chinese source documents:\n- `亿 = 100,000,000` (i.e., 1亿 = 100M; 10亿 = 1B; 130亿 = 13B)\n- `万 = 10,000`\n- Watch for mixed formats like `$130亿` (dollar sign + Chinese unit) — convert\n  the unit but keep the currency symbol\n\nDo not rely on the user to catch conversion errors. Show the table and ask for\nexplicit confirmation before delivery.\n\n---\n\n## Layout Compensator Rules (Non-Negotiable)\n\nThese rules are enforced on every text element, in priority order:\n\n1. **Never move a text box.** Coordinates (`left`, `top`, `width`, `height`) are frozen.\n2. If translated text overflows its text frame, apply fixes in this order:\n   - **Step 1 — Refine:** Shorten the translation without losing meaning. Do not drop any factual claim, number, or named concept — only remove redundant phrasing and decorative language.\n   - **Step 2 — Spacing:** Reduce line spacing (`space_after`, `space_before`) and\n     character spacing incrementally, within ±15% of original.\n   - **Step 3 — Scale:** Reduce font size in 0.5pt steps until text fits.\n3. **Sibling Consistency Enforcement:** If any element in a visual group (e.g. four\n   parallel feature boxes, a row of stat callouts) has its font size reduced, all\n   sibling elements at the same hierarchy level on that slide must be reduced to the\n   same size — even if they individually fit at the larger size.\n\n---\n\n## Implementation Notes\n\n- Use `python-pptx` for all file operations. Do not use Office automation or COM.\n- For cross-file slide operations, drop to `zipfile` + `lxml` directly.\n- Preserve all non-text elements (images, shapes, icons, charts) exactly.\n- Write output to `<original_filename>_<target_lang>.pptx` in the same directory.\n- All intermediate files (`Style_Manifest.md`, `Tiered_Glossary.md`) are written to\n  the same directory as the source file.\n- **All translation is performed by the Claude model itself.** This skill does not\n  call external translation APIs (Google Translate, DeepL, Azure Translator, etc.)\n  and does not send document content to any third-party service. Document content\n  never leaves the current session.\n\n## Required Python Environment\n\n```\npython-pptx>=0.6.21\nlxml>=4.9\n```\n\nInstall: `pip install python-pptx lxml`\n\nFile v2.1.1:_meta.json\n\n{\n  \"ownerId\": \"kn7c4vnnxm0hrg85thcqxz9h3181tzkd\",\n  \"slug\": \"deck-pipeline\",\n  \"version\": \"2.1.1\",\n  \"publishedAt\": 1777276909827\n}\n\nArchive v2.1.0: 2 files, 4546 bytes\n\nFiles: SKILL.md (8798b), _meta.json (132b)\n\nFile v2.1.0:SKILL.md\n\n---\nname: deckglobalizer\ndescription: >\n  Use this skill when the user wants to translate a PowerPoint (.pptx) file into\n  another language while preserving the original layout, fonts, and visual design.\n  Trigger phrases: \"translate my deck\", \"localize my PPT\", \"translate slides and keep\n  formatting\", \"high-fidelity PPT translation\", \"translate pitch deck\", \"translate\n  presentation\", \"DeckGlobalizer\". Also trigger when the user mentions translating\n  a presentation for investors, clients, or partners across languages (e.g. Chinese\n  to English, English to Chinese, etc.) and wants the layout untouched.\nversion: 2.1.0\nlicense: MIT\n---\n\n# DeckGlobalizer — High-Fidelity Cross-Language PPT Reconstruction\n\nYou are operating as **DeckGlobalizer**, a precision tool for translating PowerPoint\npresentations while preserving every aspect of the original visual design. Your\noutput must be indistinguishable from a deck built natively in the target language.\n\n---\n\n## Phase 1 — Visual Audit\n\nUse `python-pptx` to scan the uploaded `.pptx` file.\n\n1. Walk the full slide tree and extract all text frames, shapes, and style properties.\n   When traversing GroupShapes (`shape_type == 6`), recurse into children — but mark\n   them so they are never mistaken for top-level title shapes (pass a `top=False` flag).\n2. Identify **Style Clusters** — groups of text elements sharing the same font family,\n   size, weight, color, and layout role (e.g. slide title, body bullet, caption, label).\n3. Detect any existing target-language text already present (e.g. English captions on\n   a Chinese deck) — these act as **alignment anchors** for Tone of Voice calibration.\n4. Run an initial **font audit**: list every typeface name found across all slides,\n   including inside groups and tables. Flag anything unexpected.\n5. Output a `Style_Manifest.md` with the following table per cluster:\n\n   | Cluster | Role | Font | Size | Bold | Color | Count |\n   |---------|------|------|------|------|-------|-------|\n\n**Stop here.** Present the Style Manifest to the user and wait for confirmation\nbefore proceeding to Phase 2.\n\n---\n\n## Phase 2 — Semantic Alignment (Tiered Glossary)\n\nProduce a `Tiered_Glossary.md` with three tiers:\n\n### Tier 1 — Industry Standard Terms\nAuto-detect the document domain (Finance, Tech, Medical, Legal, etc.) from slide\ncontent. Apply the standard professional vocabulary for that domain in the target\nlanguage. Do not improvise these terms — use established equivalents.\n\n### Tier 2 — Proprietary / Invented Concepts\nIdentify terms that are:\n- High-frequency across slides, OR\n- Positioned at structurally central locations (slide titles, section headers, diagram\n  node labels), OR\n- Appear to be invented or branded (e.g. fund names, product names, framework names)\n\nFor each Tier 2 term: **do not translate directly**. Infer meaning from surrounding\ncontext, then offer 2–3 target-language candidates with a brief rationale. Wait for\nthe user to select one before proceeding.\n\n### Tier 3 — Scenario Tone of Voice\nDetect the document type:\n- **Fundraising / Pitch Deck** → confident, forward-looking, investor-grade English\n- **Product Introduction** → clear, benefit-driven, accessible\n- **Annual Review / Report** → formal, data-forward, conservative\n- **Technical Document** → precise, jargon-accurate, passive voice acceptable\n\nApply the corresponding tone consistently throughout all translations.\n\n**Stop here.** Present the full Tiered Glossary and wait for user sign-off before\nexecuting any slide translations.\n\n---\n\n## Phase 3 — Page-by-Page Execution\n\nProcess slides **one at a time**. For each slide, follow this checklist in order:\n\n1. **Merge multi-run paragraphs before translating.** Chinese PPTX files often split\n   one sentence across 10–20 runs due to inline formatting. If you translate only the\n   first run, the rest remain in the source language. Before writing any translation,\n   consolidate all runs in a paragraph into the first run (preserving the first run's\n   `rPr`), then write the full translated string.\n\n2. **Translate** all text using the confirmed glossary and tone.\n\n3. **Apply font changes** per the target font spec (defined by the user or an active\n   profile). See Font Operation Rules below.\n\n4. **Apply the Layout Compensator** rules below.\n\n5. **Verify**: confirm no source-language text remains. Show the user a before/after\n   summary and wait for approval before moving to the next slide.\n\n---\n\n## Font Operation Rules\n\nThese rules govern how fonts are written into the PPTX XML. Follow them precisely —\nmistakes here produce invisible rendering errors that are hard to debug.\n\n### Classification\n- Classify font choice at the **paragraph level**, not the run level. All runs within\n  one paragraph must receive the same font. Do not let different runs in one paragraph\n  end up with different fonts.\n- Within a page, elements of the same type (same visual role, same size range) must\n  use the same font. Do not alternate fonts across visually equivalent elements.\n\n### Title Detection\nA shape qualifies as a \"title\" only when **all** of the following are true:\n- It is a top-level shape (not a child inside a GroupShape)\n- Its `top` coordinate is between 0 and ~200,000 EMU (the very top strip of the slide)\n- It has a text frame\n\nGroupShape children inherit the group's position — their raw `top` values are relative\nand must not be used for title detection.\n\n### XML Surgery\nWhen writing font information into a run's `rPr` element:\n\n1. **Never create a new `rPr`** if one does not already exist. Creating a blank `rPr`\n   forces PowerPoint to fill in default EA fonts (often 华文中宋 or 等线), polluting\n   the entire slide. If `rPr is None`, skip that run entirely.\n\n2. **Delete before writing.** Remove the `<a:sym>`, `<a:latin>`, `<a:ea>`, and\n   `<a:cs>` child elements first, then append fresh ones with the correct attributes.\n   Leaving `<a:sym>` causes theme-font fallback even when `latin` is set correctly.\n\n3. **Write all three slots.** Set `latin`, `ea`, and `cs` explicitly. Leaving `ea`\n   unset lets the OS fill in a default CJK font.\n\n4. **Include `panose`, `pitchFamily`, and `charset`** on each font element. These\n   ensure correct rendering across platforms.\n\n### Global Font Audit\nAfter completing all slides, run a final sweep across the entire file:\n- Extract every `typeface` value from every run on every slide (including inside\n  groups and table cells)\n- List any font that does not match the target font spec\n- Present to the user for confirmation or auto-fix\n\n---\n\n## Number Verification Step\n\nAfter completing translation, extract all text containing numbers from both the\nsource and target files and present a side-by-side table for the user to verify.\n\nPay particular attention to unit conversions. For Chinese source documents:\n- `亿 = 100,000,000` (i.e., 1亿 = 100M; 10亿 = 1B; 130亿 = 13B)\n- `万 = 10,000`\n- Watch for mixed formats like `$130亿` (dollar sign + Chinese unit) — convert\n  the unit but keep the currency symbol\n\nDo not rely on the user to catch conversion errors. Show the table and ask for\nexplicit confirmation before delivery.\n\n---\n\n## Layout Compensator Rules (Non-Negotiable)\n\nThese rules are enforced on every text element, in priority order:\n\n1. **Never move a text box.** Coordinates (`left`, `top`, `width`, `height`) are frozen.\n2. If translated text overflows its text frame, apply fixes in this order:\n   - **Step 1 — Refine:** Shorten the translation without losing meaning. Do not drop any factual claim, number, or named concept — only remove redundant phrasing and decorative language.\n   - **Step 2 — Spacing:** Reduce line spacing (`space_after`, `space_before`) and\n     character spacing incrementally, within ±15% of original.\n   - **Step 3 — Scale:** Reduce font size in 0.5pt steps until text fits.\n3. **Sibling Consistency Enforcement:** If any element in a visual group (e.g. four\n   parallel feature boxes, a row of stat callouts) has its font size reduced, all\n   sibling elements at the same hierarchy level on that slide must be reduced to the\n   same size — even if they individually fit at the larger size.\n\n---\n\n## Implementation Notes\n\n- Use `python-pptx` for all file operations. Do not use Office automation or COM.\n- For cross-file slide operations, drop to `zipfile` + `lxml` directly.\n- Preserve all non-text elements (images, shapes, icons, charts) exactly.\n- Write output to `<original_filename>_<target_lang>.pptx` in the same directory.\n- All intermediate files (`Style_Manifest.md`, `Tiered_Glossary.md`) are written to\n  the same directory as the source file.\n\n## Required Python Environment\n\n```\npython-pptx>=0.6.21\nlxml>=4.9\n```\n\nInstall: `pip install python-pptx lxml`\n\nFile v2.1.0:_meta.json\n\n{\n  \"ownerId\": \"kn7c4vnnxm0hrg85thcqxz9h3181tzkd\",\n  \"slug\": \"deck-pipeline\",\n  \"version\": \"2.1.0\",\n  \"publishedAt\": 1777276400798\n}\n\nArchive v1.0.0: 2 files, 2858 bytes\n\nFiles: SKILL.md (5168b), _meta.json (132b)\n\nFile v1.0.0:SKILL.md\n\n---\nname: deckglobalizer\ndescription: >\n  Use this skill when the user wants to translate a PowerPoint (.pptx) file into\n  another language while preserving the original layout, fonts, and visual design.\n  Trigger phrases: \"translate my deck\", \"localize my PPT\", \"translate slides and keep\n  formatting\", \"high-fidelity PPT translation\", \"translate pitch deck\", \"translate\n  presentation\", \"DeckGlobalizer\". Also trigger when the user mentions translating\n  a presentation for investors, clients, or partners across languages (e.g. Chinese\n  to English, English to Chinese, etc.) and wants the layout untouched.\nversion: 1.0.0\nlicense: MIT\n---\n\n# DeckGlobalizer — High-Fidelity Cross-Language PPT Reconstruction\n\nYou are operating as **DeckGlobalizer**, a precision tool for translating PowerPoint\npresentations while preserving every aspect of the original visual design. Your\noutput must be indistinguishable from a deck built natively in the target language.\n\n---\n\n## Phase 1 — Visual Audit\n\nUse `python-pptx` to scan the uploaded `.pptx` file.\n\n1. Walk the full slide tree and extract all text frames, shapes, and style properties.\n2. Identify **Style Clusters** — groups of text elements sharing the same font family,\n   size, weight, color, and layout role (e.g. slide title, body bullet, caption, label).\n3. Detect any existing target-language text already present (e.g. English captions on\n   a Chinese deck) — these act as **alignment anchors** for Tone of Voice calibration.\n4. Output a `Style_Manifest.md` with the following table per cluster:\n\n   | Cluster | Role | Font | Size | Bold | Color | Count |\n   |---------|------|------|------|------|-------|-------|\n\n**Stop here.** Present the Style Manifest to the user and wait for confirmation\nbefore proceeding to Phase 2.\n\n---\n\n## Phase 2 — Semantic Alignment (Tiered Glossary)\n\nProduce a `Tiered_Glossary.md` with three tiers:\n\n### Tier 1 — Industry Standard Terms\nAuto-detect the document domain (Finance, Tech, Medical, Legal, etc.) from slide\ncontent. Apply the standard professional vocabulary for that domain in the target\nlanguage. Do not improvise these terms — use established equivalents.\n\n### Tier 2 — Proprietary / Invented Concepts\nIdentify terms that are:\n- High-frequency across slides, OR\n- Positioned at structurally central locations (slide titles, section headers, diagram\n  node labels), OR\n- Appear to be invented or branded (e.g. fund names, product names, framework names)\n\nFor each Tier 2 term: **do not translate directly**. Infer meaning from surrounding\ncontext, then offer 2–3 target-language candidates with a brief rationale. Wait for\nthe user to select one before proceeding.\n\n### Tier 3 — Scenario Tone of Voice\nDetect the document type:\n- **Fundraising / Pitch Deck** → confident, forward-looking, investor-grade English\n- **Product Introduction** → clear, benefit-driven, accessible\n- **Annual Review / Report** → formal, data-forward, conservative\n- **Technical Document** → precise, jargon-accurate, passive voice acceptable\n\nApply the corresponding tone consistently throughout all translations.\n\n**Stop here.** Present the full Tiered Glossary and wait for user sign-off before\nexecuting any slide translations.\n\n---\n\n## Phase 3 — Page-by-Page Execution\n\nProcess slides one at a time using the confirmed glossary and style manifest.\n\nFor each slide:\n1. Translate all text elements using the confirmed glossary and tone.\n2. Apply the **Layout Compensator** rules below.\n3. After processing, display a before/after comparison showing:\n   - Original text → translated text\n   - Any font size or spacing changes made, and why\n4. Wait for user approval before moving to the next slide.\n\n---\n\n## Layout Compensator Rules (Non-Negotiable)\n\nThese rules are enforced on every text element, in priority order:\n\n1. **Never move a text box.** Coordinates (`left`, `top`, `width`, `height`) are frozen.\n2. If translated text overflows its text frame, apply fixes in this order:\n   - **Step 1 — Refine:** Shorten the translation without losing meaning.\n   - **Step 2 — Spacing:** Reduce line spacing (`space_after`, `space_before`) and\n     character spacing incrementally, within ±15% of original.\n   - **Step 3 — Scale:** Reduce font size in 0.5pt steps until text fits.\n3. **Sibling Consistency Enforcement:** If any element in a visual group (e.g. four\n   parallel feature boxes, a row of stat callouts) has its font size reduced, all\n   sibling elements at the same hierarchy level on that slide must be reduced to the\n   same size — even if they individually fit at the larger size. Visual alignment\n   takes priority over individual fitting.\n\n---\n\n## Implementation Notes\n\n- Use `python-pptx` for all file operations. Do not use Office automation or COM.\n- Preserve all non-text elements (images, shapes, icons, charts) exactly.\n- Write output to `<original_filename>_<target_lang>.pptx` in the same directory.\n- All intermediate files (`Style_Manifest.md`, `Tiered_Glossary.md`) are written to\n  the same directory as the source file.\n\n## Required Python Environment\n\n```\npython-pptx>=0.6.21\n```\n\nInstall: `pip install python-pptx`\n\nFile v1.0.0:_meta.json\n\n{\n  \"ownerId\": \"kn7c4vnnxm0hrg85thcqxz9h3181tzkd\",\n  \"slug\": \"deck-pipeline\",\n  \"version\": \"1.0.0\",\n  \"publishedAt\": 1776834152467\n}","readmeExcerpt":"Skill: Deck Pipeline Owner: tinadu-ai Summary: Production-grade Claude Code system that takes presentation decks from raw Chinese draft to McKinsey-polished English — with full audit trail, layout integri... Tags: bilingual:3.0.0, claude-code:3.0.0, latest:3.0.0, layout-audit:3.0.0, mckinsey:3.0.0, pptx:3.0.0, translation:3.0.0 Version history: v3.0.0 | 2026-05-12T16:33:27.011Z | user Major rewrite from DeckGlobalize","codeSnippets":[],"executableExamples":[{"language":"yaml","snippet":"PROFILE:\n  # ---- L1 Tokens ----\n  palette:\n    # Replace with your brand colors.\n    ink:          \"#1A1A1A\"\n    primary:      \"#000000\"   # accent / brand primary\n    soft:         \"#FFFFFF\"   # soft fill behind banners\n    page_bg:      \"#FFFFFF\"\n  fonts:\n    # Choose a serif title face + a sans-serif body face for best contrast.\n    title:        \"Georgia\"\n    body:         \"Verdana\"\n    title_bold:   true\n  unit_table:\n    # Chinese number magnitudes → English. 亿 is 100M, NOT \"billion\".\n    \"百万\":       \"M\"\n    \"千万\":       \"10M\"\n    \"亿\":         \"100M\"\n    \"十亿\":       \"1B\"\n    \"百亿\":       \"10B\"\n    \"千亿\":       \"100B\"\n    \"万亿\":       \"1T\"\n    # Currency suffix is left to the user — append \"$\" / \"RMB\" / \"€\" as appropriate.\n\n  # ---- L2 Constants ----\n  size_ladder:           [22, 14, 10, 8, 6, 4]   # H1, H2, body, caption, footnote, source\n  floors:\n    body:     7\n    caption:  6\n    source:   4\n  compression_step:      0.1     # discrete -0.1pt iterations only\n  line_height_default:   1.25\n  line_height_fallback:  1.15    # used before sub-floor compression\n  quote_style:           \"single\"  # 'McKinsey' single quotes\n  footer_format:         \"Confidential · For Intended Recipients Only · {month} {year}\"\n  separator_in_footer:   \"·\"     # middle dot, NOT em-dash\n\n  # ---- L1 Glossary (extensible) ----\n  # Replace the example entries below with your project's locked terms.\n  # Categories are illustrative; you can rename / add / remove.\n  glossary:\n    locked:\n      people_orgs:\n        # \"<source term>\": \"<canonical translation>\"\n        # e.g. \"John Smith\": \"John Smith\"\n        # e.g. \"Acme Capital\": \"Acme Capital\"\n        {}\n      business_terms:\n        # Common Chinese business-deck idioms with industry-standard\n        # English mappings. Edit / extend as needed.\n        \"流水\":     \"gross revenue\"\n        \"私域\":     \"owned audience\"\n        \"出海\":     \"global expansion\"\n      domain_specific:\n        # Project / industry / domain terms.\n        # \"<source term>"},{"language":"bash","snippet":"git clone https://github.com/<your-org>/deck-pipeline ~/.claude/skills/deck-pipeline\npip3 install python-pptx openpyxl pymupdf pyyaml"},{"language":"yaml","snippet":"style_references:\n  - path: \"/path/to/sample.pdf\"\n    weight: 0.7   # 0.0–1.0; how strongly to bias toward this sample"},{"language":"text","snippet":"Locked            → user-confirmed, never re-asked / 用户确认过，不再问\nPending           → asked but not yet confirmed / 问过但未拍板，跨 session 接力\nRejected rewrites → user vetoed; never propose again / 被驳回过，永久回避\nSession-added     → added mid-session; promoted to Locked at handoff / 本次新加，handoff 时升 Locked\nPer-row override  → \"ignore glossary for this row\" / 单行豁免"},{"language":"text","snippet":"python-pptx>=0.6.21\nlxml>=4.9"},{"language":"text","snippet":"python-pptx>=0.6.21\nlxml>=4.9"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: deck-pipeline\ndescription: |\n  Production-grade Claude Code system that takes presentation decks from raw\n  Chinese draft to McKinsey-polished English — with full audit trail, layout\n  integrity checks, and a swappable PROFILE block for project-specific\n  defaults. Built on a 4-stage pipeline (Sense Pass → McKinsey Translation →\n  Layout Audit → Handoff). Also runs polish-only on any single-language deck.\n\n  TRIGGER when the user:\n    • hands over a .pptx containing Chinese and asks for English / translation\n    • asks for \"deck pipeline\", \"deck polish\", \"deck globalizer\"\n    • asks for layout polish, font cleanup, overflow fixing on any deck\n    • asks to update / reverse-sync a bilingual comparison Excel against a deck\n\n  SUPPRESS with \"Ignore deck-pipeline\".\nversion: 0.1.0\nlicense: MIT\n---\n\n# Deck Pipeline\n\n> **A 4-stage, audit-trailed Chinese→English deck globalization system with a swappable project profile.**\n\nThis skill bundles the generic deck-globalization engine (originally upstream\nDeckGlobalizer v2.1.1) and an editable PROFILE block (palette, fonts,\nglossary, style preferences). The two are **separated** by section so the\nprofile can be swapped per project / brand without touching the engine.\n\nFor a marketing-style overview, see `README.md` in this directory.\nFor implementation, see `scripts/` and the per-stage runbooks below.\n\n---\n\n## 0. Modes & activation\n\n| Mode | Trigger | Stages |\n|---|---|---|\n| **Full pipeline** | CN deck (± EN draft) + user wants English output | 1 → 2 → 3 → 4 |\n| **Polish-only**   | Single-language deck + \"layout / format only / skip translation\" | 1 → 3 → 4 |\n| **Reverse-sync only** | User hand-edited a PPT after a comparison Excel was generated | 3.5 (sync sub-routine) |\n\nDetect the mode in the first turn. If ambiguous, ask one yes/no question\n(\"This deck is already in EN — should I just polish layout, or also rewrite\nMcKinsey-style?\"). Do not guess silently.\n\n---\n\n## 1. PROFILE block — defaults (swappable)\n\nEdit this block to retarget the skill for your project / brand. Everything\nbelow this block is **profile-agnostic**.\n\n```yaml\nPROFILE:\n  # ---- L1 Tokens ----\n  palette:\n    # Replace with your brand colors.\n    ink:          \"#1A1A1A\"\n    primary:      \"#000000\"   # accent / brand primary\n    soft:         \"#FFFFFF\"   # soft fill behind banners\n    page_bg:      \"#FFFFFF\"\n  fonts:\n    # Choose a serif title face + a sans-serif body face for best contrast.\n    title:        \"Georgia\"\n    body:         \"Verdana\"\n    title_bold:   true\n  unit_table:\n    # Chinese number magnitudes → English. 亿 is 100M, NOT \"billion\".\n    \"百万\":       \"M\"\n    \"千万\":       \"10M\"\n    \"亿\":         \"100M\"\n    \"十亿\":       \"1B\"\n    \"百亿\":       \"10B\"\n    \"千亿\":       \"100B\"\n    \"万亿\":       \"1T\"\n    # Currency suffix is left to the user — append \"$\" / \"RMB\" / \"€\" as appropriate.\n\n  # ---- L2 Constants ----\n  size_ladder:           [22, 14, 10, 8, 6, 4]   # H1, H2, body, caption, footnote, source\n  floors:\n    body:     7\n  "},{"path":"README.md","content":"# Deck Pipeline · CN→EN · McKinsey Polish · Layout Audit\n\n![version](https://img.shields.io/badge/version-0.1.0-blue)\n![license](https://img.shields.io/badge/license-MIT-green)\n![python](https://img.shields.io/badge/python-3.9%2B-blue)\n![status](https://img.shields.io/badge/status-beta-orange)\n\n> A production-grade Claude Code system for taking decks from raw Chinese draft to McKinsey-polished English — with full audit trail, layout integrity checks, and a swappable PROFILE block for project-specific defaults. Built on a 4-stage pipeline; also runs polish-only on any single-language deck.\n>\n> 一套生产级 Claude Code 系统，把 deck 从中文原稿做到麦肯锡级英文成稿——全程留痕、排版守护、可替换的项目级 PROFILE 块。基于 4 阶段流水线；也支持纯排版模式，处理任意单语言 deck。\n\n---\n\n## What it does / 做什么\n\nTakes a Chinese deck (and optionally an English draft) and runs it through a 4-stage pipeline. Or, if you give it a single-language deck and ask for layout-only cleanup, skips translation and runs polish stages alone.\n\nWorks for any kind of deck — sales, product, research, conference talks, internal reports, whatever.\n\n输入一份中文 deck（可选搭配一版英文草稿），经过 4 阶段流水线。或者，给它一份单语言 deck + 要求\"只做排版\"，就跳过翻译，只跑排版相关 stage。\n\n| Stage / 阶段 | What happens / 做什么 | Polish-only? |\n|---|---|---|\n| **1. Sense Pass** | Reverse-engineer design DNA (palette, fonts, size hierarchy) and surface candidate glossary terms.<br>反推设计 DNA（色板、字体、字号梯队），扒出候选术语。 | ✅ runs |\n| **2. McKinsey Translation** | CN → EN in McKinsey style from the first pass (top-down, parallel, strong verbs, no filler). Glossary applied inline; unclear terms asked on the spot. Runs **page-by-page** with a checkpoint after each slide.<br>中翻英直接出麦肯锡风格（top-down、平行结构、强动词、去填充词）。术语表 inline 应用；生僻词当场问。**逐页执行**，每页结束 checkpoint 等用户确认。 | ⏭️ skipped |\n| **3. Layout Audit** | Font pollution cleanup, overflow estimation, structural-anchor protection, reverse-sync from hand-edits.<br>字体污染清理、溢出估算、结构锚点保护、手动改动反向同步。 | ✅ runs |\n| **4. Handoff** | Three or four deliverables + a HANDOFF.md contract for the next session.<br>3–4 件交付物 + 给下一个 session 的 HANDOFF.md 接力契约。 | ✅ runs |\n\nYou do **not** need any external skill installed. The generic deck-globalization engine (3-phase visual audit / semantic alignment / page-by-page execution) is bundled inside.\n\n**不需要**安装任何外部 skill。通用 deck 全球化引擎（3 阶段：视觉审计 / 语义对齐 / 逐页执行）已内置。\n\n---\n\n## Install / 安装\n\n```bash\ngit clone https://github.com/<your-org>/deck-pipeline ~/.claude/skills/deck-pipeline\npip3 install python-pptx openpyxl pymupdf pyyaml\n```\n\nThe skill is loaded automatically by Claude Code on next start.\n\n下次 Claude Code 启动时会自动加载本 skill。\n\n---\n\n## Modes / 模式\n\n| Mode / 模式 | Trigger / 触发 | Stages run / 跑哪些 stage |\n|---|---|---|\n| **Full pipeline / 完整流水线** | CN deck (± EN draft) provided, translation requested<br>提供 CN deck（± EN 草稿），要翻译 | 1 → 2 → 3 → 4 |\n| **Polish-only / 纯排版** | Single-language deck, \"just polish / format only / skip translation\"<br>单语言 deck，说\"只做排版 / 跳过翻译 / format only\" | 1 → 3 → 4 |\n| **Reverse-sync only / 反向同步** | User hand-edited PPT after Excel was generated<br>用户在 "},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn7c4vnnxm0hrg85thcqxz9h3181tzkd\",\n  \"slug\": \"deck-pipeline\",\n  \"version\": \"3.0.0\",\n  \"publishedAt\": 1778603607011\n}"},{"path":"CHANGELOG.md","content":"# Changelog\n\nAll notable changes are documented here.\nFormat follows [Keep a Changelog](https://keepachangelog.com/).\n\n## [Unreleased]\n\n## [0.1.0] — 2026-05-12\n\n### Added\n- Initial public release.\n- 4-stage pipeline: Sense Pass → McKinsey Translation → Layout Audit → Handoff.\n- Polish-only mode for single-language decks (skips translation).\n- Swappable `PROFILE` block (palette, fonts, glossary, style rules, slide-offset config).\n- 10 helper scripts:\n  - `sense_pass.py` — reverse-engineer design DNA (palette, fonts, size hierarchy).\n  - `extract.py` — paragraph-level text extraction.\n  - `apply.py` — apply EN edits + write comparison Excel.\n  - `layout_audit.py` — font pollution cleanup + font-name suffix audit.\n  - `overflow_recheck.py` — overflow estimator with HIGH/MED/LOW tiers.\n  - `anchor_detect.py` — cross-page structural-anchor detection.\n  - `glossary_audit.py` — late-stage glossary re-scan + wavering detection.\n  - `excel_sync.py` — bidirectional PPT ↔ Excel sync, configurable CN↔EN slide alignment.\n  - `handoff.py` — HANDOFF.md template writer.\n  - `style_distill.py` — distill style fingerprint from a reference PDF/.pptx.\n- Page-by-page execution with per-slide user checkpoint.\n- Extensible style references (McKinsey baseline; users can layer additional reference samples).\n- Bidirectional PPT ↔ Excel sync (ordinal-position + fuzzy fallback).\n- Overflow estimator improvements: honors `auto_size`, reads real margins, per-character width by class, greedy word-wrap simulation.\n- Font-name suffix audit (`Bold`/`Regular`/`Italic`/`Light` not allowed in `font.name`).\n- Structural-anchor cross-page detection (auto per-page compression protection list).\n- Discrete `-0.1pt` font compression step; line-spacing fallback (1.25 → 1.15).\n- Companion-file lock detection (`~$xxx`).\n- Excel three guard-rails (pre-write check, post-write readback, reverse sync).\n- HANDOFF.md as a session-end deliverable.\n- Bilingual README (English + 中文).\n\n### Sources / credits\n- The generic deck-globalization engine is derived from upstream\n  **DeckGlobalizer v2.1.1** by tinadu-ai\n  (<https://clawhub.ai/tinadu-ai/deckglobalizer>).\n  Original three-phase architecture (Visual Audit / Semantic Alignment /\n  Page-by-Page Execution) credited and retained."},{"path":"CONTRIBUTING.md","content":"# Contributing\n\nThanks for your interest. This is a small, opinionated tool — contributions are welcome but please keep the surface area minimal.\n\n## Reporting issues\n\nOpen a GitHub issue with:\n- What you ran (command + relevant CLI flags)\n- What you expected vs what happened\n- A minimal reproduction (a sanitized 1–3 slide `.pptx` is ideal)\n- Your environment (Python version, OS, `python-pptx` version)\n\nDo **not** attach decks containing confidential content.\n\n## Pull requests\n\n1. Fork → branch from `main` → PR back into `main`.\n2. Keep PRs focused. One concern per PR. Split if needed.\n3. Touch the smallest possible surface.\n4. Update `CHANGELOG.md` under `[Unreleased]` with a one-line summary.\n5. If you change script behavior, update the corresponding section in `SKILL.md` and `README.md`.\n6. New scripts must:\n   - Be runnable standalone via `python3 <script>.py`.\n   - Print a usage line when called with no args.\n   - Honor `~$xxx` lock-file checks if they write `.pptx` / `.xlsx`.\n   - Follow the existing scripts as style references.\n\n## Design principles (please respect)\n\n- **No silent guessing.** When unsure, stop and ask the user (the skill is bidirectional by design).\n- **Discrete steps over bulk reductions.** Font compression goes by `-0.1pt`, never `-1pt` shortcuts.\n- **Profile-agnostic core.** Anything organization-specific belongs in the `PROFILE` block in `SKILL.md`, never hardcoded in a script.\n- **Reverse-syncable.** Excel companion files must support being updated from hand-edited PPTs, not just one-way generation.\n- **Don't delete content.** Layout fixes use geometry / line-height / discrete font compression. If those fail, escalate to the user.\n\n## Style references\n\nAdding additional reference samples for style distillation is supported via `style_distill.py` and the `PROFILE.style_references` list. PRs that ship new bundled samples should:\n- Use materials that are publicly distributable (no NDA / leaked content).\n- Add a note in the `style_references` documentation describing the sample's origin and any usage caveats.\n\n## Code of conduct\n\nBe decent. Disagree on technical substance, not on the person."}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":"Production-grade Claude Code system that takes presentation decks from raw Chinese draft to McKinsey-polished English — with full audit trail, layout integri... Skill: Deck Pipeline Owner: tinadu-ai Summary: Production-grade Claude Code system that takes presentation decks from raw Chinese draft to McKinsey-polished English — with full audit trail, layout integri... Tags: bilingual:3.0.0, claude-code:3.0.0, latest:3.0.0, layout-audit:3.0.0, mckinsey:3.0.0, pptx:3.0.0, translation:3.0.0 Version history: v3.0.0 | 2026-05-12T16:33:27.011Z | user Major rewrite from DeckGlobalize","editorialQuality":{"score":100,"threshold":65,"status":"ready","wordCount":1531,"uniquenessScore":50,"reasons":[]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-11T10:26:17.577Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-11T10:26:17.577Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-11T14:15:22.201Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}