{"id":"98b34921-d1ed-429d-947f-c7cffcc5721e","shortId":"LNvURe","kind":"skill","title":"pptx-html-fidelity-audit","tagline":"Audit a python-pptx export against its source HTML deck, identify layout/content drift (footer overflow, cropped content, missing italic/em, lost styling, off-rhythm spacing), and re-export with strict footer-rail + cursor-flow layout discipline. Use this skill whenever the user ","description":"# PPTX ↔ HTML Fidelity Audit\n\nA repeatable workflow for catching the ways a `python-pptx` export silently drifts from its HTML source — and fixing them with a layout discipline that prevents the same regressions on the next pass.\n\n## When this skill applies\n\nThe user has:\n\n- A source HTML slide deck (typically a single-file deck with `<section class=\"slide\">` blocks):\n\n  ```html\n  <section class=\"slide light\">\n    <div class=\"chrome\">2026 · Q2 review</div>\n    <span class=\"kicker\">Pillar 03</span>\n    <h2 class=\"h-xl\">Shipping <em>velocity</em> doubled</h2>\n    <p class=\"lead\">…</p>\n    <div class=\"foot\">page 5 / 14</div>\n  </section>\n  ```\n\n- A PPTX file generated from that deck via python-pptx (or similar).\n- A suspicion (or visible evidence) that the PPTX doesn't match the HTML — text bleeding into the footer, italic words gone flat, hero slides not centered, sections cropped, tag styling lost.\n\nIf the user only has *one* of those two artifacts, this skill doesn't apply yet — first generate the missing one, or ask the user to provide it.\n\n## Why this is hard (and why a skill helps)\n\nPPTX is a fixed-canvas, absolute-positioned medium. HTML is a fluid, flow-based medium. A naive python-pptx export pins each block at hand-picked `(top, left)` coordinates, which works for the *first slide it was tested on* and silently fails for every other slide whose content has different intrinsic height. The result is the most common drift modes:\n\n1. **Footer overflow** — content's `top + height` crosses into the footer row.\n2. **Off-canvas content** — bottom of last block exceeds `7.5\"` (16:9 canvas).\n3. **Italic loss** — `<em>` in HTML never gets `run.font.italic = True`.\n4. **Hero slides not centered** — vertical-stack slides use `MARGIN_TOP` instead of computing center.\n5. **Box bounds intruding** — the text fits, but the *shape's bounding box* is oversized and visually crosses the rail.\n6. **Tag/styling loss** — colored chrome rows, kicker uppercase tracking, mono-vs-serif assignments quietly fall back to defaults.\n\nEvery one of these is a *layout discipline* problem, not a content problem. Once you adopt the discipline, they stop happening.\n\n---\n\n## Workflow\n\nThe audit is five steps. Don't skip any of them — the discipline only works if the audit produces a real list of issues to drive the re-export. A fix-without-audit pass tends to leave half the issues alive.\n\n### Step 1 — Extract ground truth from the PPTX\n\nRun `scripts/extract_pptx.py <path-to.pptx> > pptx_dump.json`. The script walks every shape on every slide and dumps text, position (`top` / `left`), size (`width` / `height`), and per-run typography (font name, size pt, bold, italic, color). This is the *actual* state of the export — don't trust the export script's intent, trust the dump.\n\nFor 14-slide decks, the dump is ~30–60 KB and human-readable.\n\n### Step 2 — Walk the HTML structure\n\nRead the source HTML and enumerate `<section class=\"slide\">` blocks. For each, note:\n\n- The slide's theme (`light` / `dark` / `hero light` / `hero dark`).\n- The `chrome` row text (top metadata).\n- The `kicker` (small uppercase eyebrow above the headline).\n- The headline (h-hero / h-xl / etc.) and any sub-head.\n- The body copy and any structured blocks (pipeline steps, cards, pillars, observation cards).\n- The `foot` row (bottom metadata).\n- Any `<em>` or italic-styled spans — italic is the silent regression.\n\nMap each HTML slide to a PPTX slide index. For decks following the convention \"slide 1 = cover, slide N = closing\", the mapping is positional.\n\n### Step 3 — Build the audit table\n\nFor each slide, walk shapes from the dump and check against expected layout rules. Use this exact table format — the severity column is what drives the fix priority:\n\n```\n| Slide | Issue | Severity |\n|---|---|---|\n| 1 cover | meta-row 底端 6.95\" 蓋過 footer (6.7\") | 🔴 |\n| 5 checklist | row B 步驟描述底端 7.2\" 切到 footer | 🔴 |\n| 8 3E | 收束段落直接坐在 footer 起點 | 🔴 |\n| 9 on-day | step 描述底端剛好碰 footer，無安全距 | 🟠 |\n| 多處 | em (Playfair italic) 未保留 | 🟡 |\n```\n\nSeverity rubric:\n\n- 🔴 **critical** — content cropped, text invisible, footer overlap, off-canvas. Must fix.\n- 🟠 **high** — content visible but visual hierarchy broken, no breathing room, hero not centered. Should fix.\n- 🟡 **medium** — italic/em missing, font fallback wrong, color drift. Fix in this pass.\n- 🟢 **low** — minor spacing/alignment, sub-pixel offsets. Note but don't block.\n\nAfter the table, write a short root-cause section: 90 % of the issues usually come from 2–3 systemic causes (e.g. \"no footer rail enforced\", \"hero stacks pinned to MARGIN_TOP instead of centered\", \"italic never propagated\"). Naming the systemic causes makes the re-export script much smaller and more correct.\n\n### Step 4 — Re-export with footer-rail + cursor-flow layout discipline\n\nThis is the load-bearing technique. See `references/layout-discipline.md` for the full rules; the summary:\n\n**Define the rails up front, once, for the whole deck:**\n\n```python\nfrom pptx.util import Inches\n\nCANVAS_W       = Inches(13.333)   # 16:9\nCANVAS_H       = Inches(7.5)\nMARGIN_X       = Inches(0.6)\nMARGIN_TOP     = Inches(0.5)\nCONTENT_MAX_Y  = Inches(6.70)     # NOTHING in content area may cross this\nFOOTER_TOP     = Inches(6.85)     # footer row pinned here, edge-to-edge\n```\n\n> **Customizing the rails.** The defaults above suit a 16:9 canvas with a slim footer. If your design system uses a wider footer or a 4:3 canvas, override these constants in your export script and pass the same values to `verify_layout.py` via `--content-max-y` / `--canvas-h` / `--canvas-w`. See `references/layout-discipline.md` §1 for the full constant table.\n\n\n**Use a cursor for content blocks instead of pinning each block at an absolute y:**\n\n```python\nclass Cursor:\n    \"\"\"Advances down the slide; refuses to cross the footer rail.\"\"\"\n    def __init__(self, y_start, cap=CONTENT_MAX_Y):\n        self.y = y_start\n        self.cap = cap\n    def take(self, h, gap=Inches(0.12)):  # ~1 line of whitespace at 14pt; tighten/loosen per design system\n        top = self.y\n        self.y = top + h + gap\n        if self.y > self.cap:\n            raise OverflowError(\n                f\"cursor at {self.y} exceeds footer rail {self.cap}; \"\n                f\"reduce block height or split slide\"\n            )\n        return top\n```\n\nFor each slide, instantiate `Cursor(MARGIN_TOP)` and `take(height)` each block in reading order. The slide refuses to render if any block would cross the rail, so overflows become loud build errors instead of silent visual bugs.\n\n**Hero (vertically-centered) slides use a budget instead of a cursor:**\n\n```python\ndef hero_layout(blocks):\n    \"\"\"blocks = list of (height, gap_after) tuples in reading order.\"\"\"\n    total = sum(h + g for h, g in blocks)\n    y_start = (CANVAS_H - total) / 2\n    return Cursor(y_start)\n```\n\nThat single change kills \"hero slide content sticks to top\" — the most common hero defect.\n\n**Tighten box height to fit text + minimal padding.** PowerPoint reveals shape bounds when they overlap (selection halos, Z-order conflicts), and an oversized box can visually cross the footer rail even when the text inside doesn't. Compute box height from text metrics + ~0.05\" pad, not from generous wrappers.\n\n**Preserve italic / em explicitly:**\n\n```python\ndef add_run(p, text, font, size_pt, italic=False, bold=False, color=None):\n    r = p.add_run()\n    r.text = text\n    r.font.name = font\n    r.font.size = Pt(size_pt)\n    r.font.italic = italic\n    r.font.bold = bold\n    if color:\n        r.font.color.rgb = color\n    return r\n```\n\nWhen walking HTML, detect `<em>` / `<i>` / inline style `font-style: italic` and pass `italic=True`. Use the EN serif face (Playfair Display, Source Serif, or fallback Georgia) for italic display copy — the CJK serif typically has no italic and looks broken if you try to italicize it.\n\nFor deeper font issues that the layout rails can't catch — variable-font traps where PowerPoint silently swaps to Calibri / Microsoft JhengHei, missing `<a:ea>` slot causing CJK runs to fall back, fake-italic on Han characters — read `references/font-discipline.md`. The five layers there cover everything `verify_layout.py` can't see.\n\n### Step 5 — Verify post-export\n\nAfter writing the new `.pptx`, run `scripts/verify_layout.py <path-to.pptx>`. The script:\n\n- Walks every shape on every slide.\n- Asserts `top + height ≤ CONTENT_MAX_Y` for content shapes (footer/page-number shapes are allowed below the rail).\n- Asserts `top + height ≤ CANVAS_H` for all shapes (no off-canvas).\n- Asserts `left + width ≤ CANVAS_W` and `left ≥ 0`.\n- Reports violations as a single block: slide index, shape name, observed bottom, rail.\n\nZero violations is the gate for \"this re-export is shippable\". Don't claim the audit is fixed without running the verifier — the human eye misses 1–2 mm overflow at zoom-out, the script doesn't.\n\n---\n\n## Output to the user\n\nAfter Step 5 passes, report:\n\n1. **Audit table** — the table from Step 3.\n2. **Root causes** — 1-paragraph systemic explanation.\n3. **Fix list** — terse list of what was changed and why (e.g. \"hero slides switched to budget centering\", \"all content blocks routed through Cursor\", \"em runs explicitly italic\").\n4. **Verification** — \"0 rail violations across N slides, file size X KB\".\n5. **Path** — absolute path to the re-exported `.pptx`.\n\nThe user is reading for two reasons: confirming the visible bugs are fixed, and trusting the systemic fix is right. Cover both.\n\n---\n\n## Bundled resources\n\n- `scripts/extract_pptx.py` — dump every shape on every slide as JSON. Run before the audit. **Important:** also run on the *original* export to compare, and on the *re-exported* one to confirm.\n- `scripts/verify_layout.py` — post-export rail checker. Returns nonzero exit code on violations so it slots into a CI pipeline if needed.\n- `references/layout-discipline.md` — the full footer-rail + cursor-flow rule set with code snippets for each common slide type (hero, content, pipeline, two-column, observation grid).\n- `references/font-discipline.md` — five-layer font audit: mapping, presence, variable-vs-static traps, the three XML language slots (`latin` / `ea` / `cs`), CJK + Latin italic interaction.\n- `references/audit-table-template.md` — copy-pasteable table template with severity legend.\n\nRead the references when:\n\n- The deck has slide types beyond what the SKILL.md covers (multi-column dashboards, embedded images, charts) → `layout-discipline.md`.\n- The audit shows 🟡 typography issues — italic missing, CJK falling back, unexpected `Calibri` / `Microsoft JhengHei` in the XML → `font-discipline.md`.\n- You want to drop the audit table directly into a report or markdown deliverable → `audit-table-template.md`.\n\n---\n\n## Anti-patterns to avoid\n\n- **Patching individual slides without naming the systemic cause.** If you fix slide 5 by lowering its block by 0.2\", you'll be back fixing slide 9, 11, and 14 next. Find the rule that produced all four problems.\n- **Trusting the original export script's intent.** Always run the extractor against the actual file. Drift between intent and reality is the bug.\n- **Skipping verification because \"it looked fine in PowerPoint preview\".** Preview anti-aliasing hides 1–2 mm overflows. The script doesn't.\n- **Italicizing scripts that have no italic tradition.** CJK, Arabic, Hebrew, Devanagari, Thai, and Khmer all produce a synthesized slant when forced into `italic=True`, and the result looks mechanically deformed. Italicize *only* runs whose primary script supports italic — Latin, Cyrillic, Greek. See `references/font-discipline.md` Layer 5 for the implementation pattern.\n- **Using `MARGIN_TOP` for hero slides.** Hero slides need *budget centering*, not top-anchored. This is the most common hero defect and the cheapest to fix.\n\n---\n\n## Why geometry-based verification, not visual diff\n\nAn earlier iteration of this skill leaned on visual diffing — render the\n.pptx through Keynote → PDF → PNG, screenshot the HTML through Chrome\nheadless, stitch them side-by-side with `magick`. It worked, but with\nthree sharp drawbacks:\n\n- **Platform lock-in.** Keynote AppleScript is macOS-only; `magick` and\n  font-discovery commands vary across OSes; CI pipelines on Linux can't\n  reproduce the chain.\n- **Imprecision.** A 1-2 mm overflow gets anti-aliased away in a PNG\n  preview. The human eye misses it; the script catches it as a hard\n  numeric violation.\n- **Setup cost.** Every contributor needs the full graphics toolchain\n  installed before they can audit. Geometry checks need only\n  `python-pptx`.\n\nGeometry-based verification gives up one thing the visual diff is good\nat: catching cases where shape positions are correct but the rendered\nglyph looks wrong (font fallback, kerning bugs, missing weight). When\nthat case appears, fall back to a manual screenshot review — the\nfive-layer audit in `references/font-discipline.md` covers most of the\nunderlying causes.","tags":["pptx","html","fidelity","audit","open","design","nexu-io","agent-skills","ai-agents","ai-design","byok","claude"],"capabilities":["skill","source-nexu-io","skill-pptx-html-fidelity-audit","topic-agent-skills","topic-ai-agents","topic-ai-design","topic-byok","topic-claude","topic-claude-code-for-design","topic-claude-design","topic-coding-agents","topic-design-systems","topic-design-tools","topic-desktop-app","topic-figma-alternative"],"categories":["open-design"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/nexu-io/open-design/pptx-html-fidelity-audit","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add nexu-io/open-design","source_repo":"https://github.com/nexu-io/open-design","install_from":"skills.sh"}},"qualityScore":"0.700","qualityRationale":"deterministic score 0.70 from registry signals: · indexed on github topic:agent-skills · 44905 github stars · SKILL.md body (12,940 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-18T18:50:17.169Z","embedding":null,"createdAt":"2026-05-02T18:52:30.471Z","updatedAt":"2026-05-18T18:50:17.169Z","lastSeenAt":"2026-05-18T18:50:17.169Z","tsv":"'-2':1916 '0':1356,1463 '0.05':1159 '0.12':977 '0.2':1698 '0.5':843 '0.6':839 '03':115 '1':268,424,594,640,923,978,1397,1418,1429,1755,1915 '11':1706 '13.333':829 '14':121,483,1708 '14pt':983 '16':291,830,876 '2':280,497,746,1095,1398,1426,1756 '2026':111 '3':294,604,747,894,1425,1433 '30':489 '3e':659 '4':303,783,893,1461 '5':120,319,650,1301,1415,1473,1692,1807 '6':339 '6.7':649 '6.70':848 '6.85':859 '6.95':646 '60':490 '7.2':655 '7.5':290,835 '8':658 '9':292,663,831,877,1705 '90':739 'absolut':210,942,1475 'absolute-posit':209 'across':1466,1902 'actual':466,1731 'add':1171 'adopt':373 'advanc':947 'alias':1753,1922 'aliv':422 'allow':1333 'also':1521 'alway':1725 'anchor':1826 'anti':1676,1752,1921 'anti-alias':1751,1920 'anti-pattern':1675 'appear':1999 'applescript':1890 'appli':93,180 'arab':1771 'area':852 'artifact':175 'ask':188 'assert':1321,1337,1349 'assign':352 'audit':5,6,55,381,397,414,607,1386,1419,1519,1591,1643,1665,1955,2011 'audit-table-template.md':1674 'avoid':1679 'away':1923 'b':653 'back':355,1281,1651,1702,2001 'base':219,1842,1965 'bear':801 'becom':1045 'beyond':1629 'bleed':149 'block':109,229,288,508,556,728,934,939,1009,1027,1038,1070,1071,1089,1362,1453,1696 'bodi':551 'bold':460,1180,1198 'bottom':285,566,1368 'bound':321,330,1126 'box':320,331,1116,1139,1154 'breath':698 'broken':696,1244 'budget':1061,1449,1821 'bug':1053,1493,1740,1993 'build':605,1047 'bundl':1505 'calibri':1271,1653 'canva':208,283,293,687,826,832,878,895,916,919,1092,1340,1348,1352 'canvas-h':915 'canvas-w':918 'cap':962,970 'card':559,562 'case':1978,1998 'catch':60,1261,1935,1977 'caus':737,749,770,1276,1428,1687,2019 'center':160,307,318,702,763,1057,1450,1822 'chain':1912 'chang':1102,1441 'charact':1287 'chart':1640 'cheapest':1836 'check':618,1957 'checker':1543 'checklist':651 'chrome':343,523,1868 'ci':1555,1904 'cjk':1236,1277,1607,1649,1770 'claim':1384 'class':945 'close':598 'code':1547,1571 'color':342,462,711,1182,1200,1202 'column':630,1583,1636 'come':744 'command':1900 'common':265,1112,1575,1831 'compar':1528 'comput':317,1153 'confirm':1490,1537 'conflict':1135 'constant':898,927 'content':23,255,271,284,369,679,691,844,851,912,933,963,1106,1324,1328,1452,1579 'content-max-i':911 'contributor':1945 'convent':592 'coordin':236 'copi':552,1234,1613 'copy-past':1612 'correct':781,1983 'cost':1943 'cover':595,641,1294,1503,1633,2014 'critic':678 'crop':22,162,680 'cross':275,336,854,953,1040,1142 'cs':1606 'cursor':42,792,931,946,1000,1020,1065,1097,1456,1566 'cursor-flow':41,791,1565 'custom':868 'cyril':1802 'dark':517,521 'dashboard':1637 'day':666 'deck':16,101,107,128,485,589,820,1625 'deeper':1252 'def':957,971,1067,1170 'default':357,872 'defect':1114,1833 'defin':811 'deform':1792 'deliver':1673 'design':885,986 'detect':1208 'devanagari':1773 'dif':1856 'diff':1846,1973 'differ':257 'direct':1667 'disciplin':45,80,365,375,392,795 'discoveri':1899 'display':1225,1233 'doesn':143,178,1151,1407,1761 'doubl':118 'drawback':1884 'drift':19,69,266,712,1733 'drive':405,633 'drop':1663 'dump':443,481,487,616,1508 'e.g':750,1444 'ea':1605 'earlier':1848 'edg':865,867 'edge-to-edg':864 'em':672,1167,1457 'embed':1638 'en':1221 'enforc':754 'enumer':507 'error':1048 'etc':544 'even':1146 'everi':251,358,437,440,1316,1319,1509,1512,1944 'everyth':1295 'evid':139 'exact':625 'exceed':289,1003 'exit':1546 'expect':620 'explan':1432 'explicit':1168,1459 'export':11,35,67,226,409,470,475,775,786,901,1305,1379,1481,1526,1534,1541,1721 'extract':425 'extractor':1728 'eye':1395,1930 'eyebrow':532 'f':999,1007 'face':1223 'fail':249 'fake':1283 'fake-ital':1282 'fall':354,1280,1650,2000 'fallback':709,1229,1991 'fals':1179,1181 'fidel':4,54 'file':106,124,1469,1732 'find':1710 'fine':1746 'first':182,241 'fit':325,1119 'five':383,1291,1588,2009 'five-lay':1587,2008 'fix':75,207,412,635,689,704,713,1388,1434,1495,1500,1690,1703,1838 'fix-without-audit':411 'fixed-canva':206 'flat':156 'flow':43,218,793,1567 'flow-bas':217 'fluid':216 'follow':590 'font':456,708,1175,1190,1212,1253,1264,1590,1898,1990 'font-discipline.md':1659 'font-discoveri':1897 'font-styl':1211 'foot':564 'footer':20,39,152,269,278,648,657,661,669,683,752,789,856,860,882,890,955,1004,1144,1563 'footer-rail':38,788,1562 'footer/page-number':1330 'forc':1783 'format':627 'four':1716 'front':815 'full':807,926,1561,1948 'g':1084,1087 'gap':975,993,1075 'gate':1374 'generat':125,183 'generous':1163 'geometri':1841,1956,1964 'geometry-bas':1840,1963 'georgia':1230 'get':300,1919 'give':1967 'glyph':1987 'gone':155 'good':1975 'graphic':1949 'greek':1803 'grid':1585 'ground':426 'h':539,542,833,917,974,992,1083,1086,1093,1341 'h-hero':538 'h-xl':541 'half':419 'halo':1131 'han':1286 'hand':232 'hand-pick':231 'happen':378 'hard':197,1939 'head':549 'headless':1869 'headlin':535,537 'hebrew':1772 'height':259,274,450,1010,1025,1074,1117,1155,1323,1339 'help':202 'hero':157,304,518,520,540,700,755,1054,1068,1104,1113,1445,1578,1816,1818,1832 'hide':1754 'hierarchi':695 'high':690 'html':3,15,53,72,99,110,147,213,298,500,505,581,1207,1866 'human':494,1394,1929 'human-read':493 'identifi':17 'imag':1639 'implement':1810 'import':824,1520 'imprecis':1913 'inch':825,828,834,838,842,847,858,976 'index':587,1364 'individu':1681 'init':958 'inlin':1209 'insid':1150 'instal':1951 'instanti':1019 'instead':315,761,935,1049,1062 'intent':478,1724,1735 'interact':1610 'intrins':258 'intrud':322 'invis':682 'issu':403,421,638,742,1254,1646 'ital':153,295,461,571,574,674,764,1166,1178,1196,1214,1217,1232,1241,1284,1460,1609,1647,1768,1785,1800 'italic':1249,1763,1793 'italic-styl':570 'italic/em':25,706 'iter':1849 'jhenghei':1273,1655 'json':1515 'kb':491,1472 'kern':1992 'keynot':1861,1889 'khmer':1776 'kicker':345,529 'kill':1103 'languag':1602 'last':287 'latin':1604,1608,1801 'layer':1292,1589,1806,2010 'layout':44,79,364,621,794,1069,1257 'layout-discipline.md':1641 'layout/content':18 'lean':1853 'leav':418 'left':235,447,1350,1355 'legend':1619 'light':516,519 'line':979 'linux':1907 'list':401,1072,1435,1437 'll':1700 'load':800 'load-bear':799 'lock':1887 'lock-in':1886 'look':1243,1745,1790,1988 'loss':296,341 'lost':26,165 'loud':1046 'low':717 'lower':1694 'maco':1893 'macos-on':1892 'magick':1877,1895 'make':771 'manual':2004 'map':579,600,1592 'margin':313,759,836,840,1021,1813 'markdown':1672 'match':145 'max':845,913,964,1325 'may':853 'mechan':1791 'medium':212,220,705 'meta':643 'meta-row':642 'metadata':527,567 'metric':1158 'microsoft':1272,1654 'minim':1121 'minor':718 'miss':24,185,707,1274,1396,1648,1931,1994 'mm':1399,1757,1917 'mode':267 'mono':349 'mono-vs-serif':348 'much':777 'multi':1635 'multi-column':1634 'must':688 'n':597,1467 'naiv':222 'name':457,767,1366,1684 'need':1558,1820,1946,1958 'never':299,765 'new':1309 'next':88,1709 'none':1183 'nonzero':1545 'note':511,724 'noth':849 'numer':1940 'observ':561,1367,1584 'off-canva':281,685,1346 'off-rhythm':28 'offset':723 'on-day':664 'one':171,186,359,1535,1969 'order':1030,1080,1134 'origin':1525,1720 'ose':1903 'output':1409 'overflow':21,270,1044,1400,1758,1918 'overflowerror':998 'overlap':684,1129 'overrid':896 'overs':333,1138 'p':1173 'p.add':1185 'pad':1122,1160 'page':119 'paragraph':1430 'pass':89,415,716,904,1216,1416 'pasteabl':1614 'patch':1680 'path':1474,1476 'pattern':1677,1811 'pdf':1862 'per':453,985 'per-run':452 'pick':233 'pillar':114,560 'pin':227,757,862,937 'pipelin':557,1556,1580,1905 'pixel':722 'platform':1885 'playfair':673,1224 'png':1863,1926 'posit':211,445,602,1981 'post':1304,1540 'post-export':1303,1539 'powerpoint':1123,1267,1748 'pptx':2,10,52,66,123,132,142,203,225,430,585,1310,1482,1859,1962 'pptx-html-fidelity-audit':1 'pptx.util':823 'pptx_dump.json':433 'presenc':1593 'preserv':1165 'prevent':82 'preview':1749,1750,1927 'primari':1797 'prioriti':636 'problem':366,370,1717 'produc':398,1714,1778 'propag':766 'provid':192 'pt':459,1177,1192,1194 'python':9,65,131,224,821,944,1066,1169,1961 'python-pptx':8,64,130,223,1960 'q2':112 'quiet':353 'r':1184,1204 'r.font.bold':1197 'r.font.color.rgb':1201 'r.font.italic':1195 'r.font.name':1189 'r.font.size':1191 'r.text':1187 'rail':40,338,753,790,813,870,956,1005,1042,1145,1258,1336,1369,1464,1542,1564 'rais':997 're':34,408,774,785,1378,1480,1533 're-export':33,407,773,784,1377,1479,1532 'read':502,1029,1079,1288,1486,1620 'readabl':495 'real':400 'realiti':1737 'reason':1489 'reduc':1008 'refer':1622 'references/audit-table-template.md':1611 'references/font-discipline.md':1289,1586,1805,2013 'references/layout-discipline.md':804,922,1559 'refus':951,1033 'regress':85,578 'render':1035,1857,1986 'repeat':57 'report':1357,1417,1670 'reproduc':1910 'resourc':1506 'result':261,1789 'return':1014,1096,1203,1544 'reveal':1124 'review':113,2006 'rhythm':30 'right':1502 'room':699 'root':736,1427 'root-caus':735 'rout':1454 'row':279,344,524,565,644,652,861 'rubric':677 'rule':622,808,1568,1712 'run':431,454,1172,1186,1278,1311,1390,1458,1516,1522,1726,1795 'run.font.italic':301 'screenshot':1864,2005 'script':435,476,776,902,1314,1406,1722,1760,1764,1798,1934 'scripts/extract_pptx.py':432,1507 'scripts/verify_layout.py':1312,1538 'section':161,738 'see':803,921,1299,1804 'select':1130 'self':959,973 'self.cap':969,996,1006 'self.y':966,989,990,995,1002 'serif':351,1222,1227,1237 'set':1569 'setup':1942 'sever':629,639,676,1618 'shape':328,438,613,1125,1317,1329,1331,1344,1365,1510,1980 'sharp':1883 'ship':116 'shippabl':1381 'short':734 'show':1644 'side':1873,1875 'side-by-sid':1872 'silent':68,248,577,1051,1268 'similar':134 'singl':105,1101,1361 'single-fil':104 'size':448,458,1176,1193,1470 'skill':48,92,177,201,1852 'skill-pptx-html-fidelity-audit' 'skill.md':1632 'skip':387,1741 'slant':1781 'slide':100,158,242,253,305,311,441,484,513,582,586,593,596,611,637,950,1013,1018,1032,1058,1105,1320,1363,1446,1468,1513,1576,1627,1682,1691,1704,1817,1819 'slim':881 'slot':1275,1552,1603 'small':530 'smaller':778 'snippet':1572 'sourc':14,73,98,504,1226 'source-nexu-io' 'space':31 'spacing/alignment':719 'span':573 'split':1012 'stack':310,756 'start':961,968,1091,1099 'state':467 'static':1597 'step':384,423,496,558,603,667,782,1300,1414,1424 'stick':1107 'stitch':1870 'stop':377 'strict':37 'structur':501,555 'style':27,164,572,1210,1213 'sub':548,721 'sub-head':547 'sub-pixel':720 'suit':874 'sum':1082 'summari':810 'support':1799 'suspicion':136 'swap':1269 'switch':1447 'synthes':1780 'system':748,769,886,987,1431,1499,1686 'tabl':608,626,731,928,1420,1422,1615,1666 'tag':163 'tag/styling':340 'take':972,1024 'techniqu':802 'templat':1616 'tend':416 'ters':1436 'test':245 'text':148,324,444,525,681,1120,1149,1157,1174,1188 'thai':1774 'theme':515 'thing':1970 'three':1600,1882 'tighten':1115 'tighten/loosen':984 'toolchain':1950 'top':234,273,314,446,526,760,841,857,988,991,1015,1022,1109,1322,1338,1814,1825 'top-anchor':1824 'topic-agent-skills' 'topic-ai-agents' 'topic-ai-design' 'topic-byok' 'topic-claude' 'topic-claude-code-for-design' 'topic-claude-design' 'topic-coding-agents' 'topic-design-systems' 'topic-design-tools' 'topic-desktop-app' 'topic-figma-alternative' 'total':1081,1094 'track':347 'tradit':1769 'trap':1265,1598 'tri':1247 'true':302,1218,1786 'trust':473,479,1497,1718 'truth':427 'tupl':1077 'two':174,1488,1582 'two-column':1581 'type':1577,1628 'typic':102,1238 'typographi':455,1645 'under':2018 'unexpect':1652 'uppercas':346,531 'use':46,312,623,887,929,1059,1219,1812 'user':51,95,168,190,1412,1484 'usual':743 'valu':907 'vari':1901 'variabl':1263,1595 'variable-font':1262 'variable-vs-stat':1594 'veloc':117 'verif':1462,1742,1843,1966 'verifi':1302,1392 'verify_layout.py':909,1296 'vertic':309,1056 'vertical-stack':308 'vertically-cent':1055 'via':129,910 'violat':1358,1371,1465,1549,1941 'visibl':138,692,1492 'visual':335,694,1052,1141,1845,1855,1972 'vs':350,1596 'w':827,920,1353 'walk':436,498,612,1206,1315 'want':1661 'way':62 'weight':1995 'whenev':49 'whitespac':981 'whole':819 'whose':254,1796 'wider':889 'width':449,1351 'without':413,1389,1683 'word':154 'work':238,394,1879 'workflow':58,379 'would':1039 'wrapper':1164 'write':732,1307 'wrong':710,1989 'x':837,1471 'xl':543 'xml':1601,1658 'y':846,914,943,960,965,967,1090,1098,1326 'yet':181 'z':1133 'z-order':1132 'zero':1370 'zoom':1403 'zoom-out':1402 '切到':656 '多處':671 '底端':645 '描述底端剛好碰':668 '收束段落直接坐在':660 '未保留':675 '步驟描述底端':654 '無安全距':670 '蓋過':647 '起點':662","prices":[{"id":"70fc45a4-e41a-48b5-9bf3-81910a5a4761","listingId":"98b34921-d1ed-429d-947f-c7cffcc5721e","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"nexu-io","category":"open-design","install_from":"skills.sh"},"createdAt":"2026-05-02T18:52:30.471Z"}],"sources":[{"listingId":"98b34921-d1ed-429d-947f-c7cffcc5721e","source":"github","sourceId":"nexu-io/open-design/pptx-html-fidelity-audit","sourceUrl":"https://github.com/nexu-io/open-design/tree/main/skills/pptx-html-fidelity-audit","isPrimary":false,"firstSeenAt":"2026-05-02T18:52:30.471Z","lastSeenAt":"2026-05-18T18:50:17.169Z"},{"listingId":"98b34921-d1ed-429d-947f-c7cffcc5721e","source":"skills_sh","sourceId":"nexu-io/open-design/pptx-html-fidelity-audit","sourceUrl":"https://skills.sh/nexu-io/open-design/pptx-html-fidelity-audit","isPrimary":true,"firstSeenAt":"2026-05-07T20:43:31.903Z","lastSeenAt":"2026-05-07T22:42:14.583Z"}],"details":{"listingId":"98b34921-d1ed-429d-947f-c7cffcc5721e","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"nexu-io","slug":"pptx-html-fidelity-audit","github":{"repo":"nexu-io/open-design","stars":44905,"topics":["agent-skills","ai-agents","ai-design","byok","claude","claude-code-for-design","claude-design","coding-agents","design-systems","design-tools","desktop-app","figma-alternative","generative-ai","hermes-agent","local-first","nextjs","no-code","prototyping","ui-generator","vibe-coding"],"license":"apache-2.0","html_url":"https://github.com/nexu-io/open-design","pushed_at":"2026-05-18T18:43:11Z","description":"🎨 Local-first, open-source alternative to Anthropic's Claude Design. ⚡ 19 Skills · ✨ 71 brand-grade Design Systems 🖼 Generate web · desktop · mobile prototypes · slides · images · videos · HyperFrames 📦 Sandboxed preview · HTML/PDF/PPTX/MP4 export 🤖 Runs on Claude Code / Codex / Cursor / Gemini / OpenCode / Qwen / Copilot / Hermes / Kimi CLI.","skill_md_sha":"6a31b90add3cc0d8c3ab6a9f5710263a38029159","skill_md_path":"skills/pptx-html-fidelity-audit/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/nexu-io/open-design/tree/main/skills/pptx-html-fidelity-audit"},"layout":"multi","source":"github","category":"open-design","frontmatter":{"name":"pptx-html-fidelity-audit","description":"Audit a python-pptx export against its source HTML deck, identify layout/content drift (footer overflow, cropped content, missing italic/em, lost styling, off-rhythm spacing), and re-export with strict footer-rail + cursor-flow layout discipline. Use this skill whenever the user has a .pptx that was generated from an HTML slide deck and asks to compare/audit/verify/fix the export — including phrases like \"compare ppt with html\", \"fidelity audit\", \"fix the pptx\", \"ppt is cut off\", \"footer overlap\", \"italic missing in pptx\", \"re-export the deck\", \"pptx-html-fidelity-audit\", or any case where a python-pptx → HTML round-trip needs verification or repair. Also trigger when the user shows you a deck.html and a deck.pptx side by side and is debugging visual differences."},"skills_sh_url":"https://skills.sh/nexu-io/open-design/pptx-html-fidelity-audit"},"updatedAt":"2026-05-18T18:50:17.169Z"}}