diff --git a/config/external-sources.lock.json b/config/external-sources.lock.json index c61ae40f..03c079c0 100644 --- a/config/external-sources.lock.json +++ b/config/external-sources.lock.json @@ -33,8 +33,8 @@ "repo": "https://github.com/nextlevelbuilder/ui-ux-pro-max-skill.git", "ref": "main", "adapter": "claude-skill", - "commit": "a38d04c3d5c298c851dbe5e6ee1965ee3de42cb5", - "syncedAt": "2026-08-14T16:00:00Z" + "commit": "8a1a6d857332da32252d77365da90c3f6293b47b", + "syncedAt": "2026-08-19T16:00:01Z" }, { "id": "caveman", @@ -42,8 +42,8 @@ "repo": "https://github.com/JuliusBrussee/caveman.git", "ref": "main", "adapter": "codex-plugin", - "commit": "ae405e872270acc57484693612ae038b16c8f6cd", - "syncedAt": "2026-08-18T16:00:00Z" + "commit": "99a9aa2f5a45097fc3563febea7d0baf64407441", + "syncedAt": "2026-08-19T16:00:01Z" }, { "id": "taste-skill", @@ -60,8 +60,8 @@ "repo": "https://github.com/shadcn-ui/ui.git", "ref": "main", "adapter": "claude-skill", - "commit": "5c8f5b06746ac445e97a50cbeb63253d657d7541", - "syncedAt": "2026-08-18T16:00:00Z" + "commit": "25be24cca34d06eed29a4779c3f48c4816aa812c", + "syncedAt": "2026-08-19T16:00:01Z" }, { "id": "frontend-slides", @@ -96,8 +96,8 @@ "repo": "https://github.com/hugohe3/ppt-master.git", "ref": "main", "adapter": "claude-skill", - "commit": "2f6a06ce34365a999de1a34e13c1784a48d4f7d3", - "syncedAt": "2026-08-18T16:00:00Z" + "commit": "a160e776b7faff5d2227d180d0f31c6253056fae", + "syncedAt": "2026-08-19T16:00:01Z" }, { "id": "grill-me", @@ -105,8 +105,8 @@ "repo": "https://github.com/mattpocock/skills.git", "ref": "main", "adapter": "skill-collection", - "commit": "9c9f36ccd3995266cd675468af71639c8dde1ec5", - "syncedAt": "2026-08-17T16:00:00Z" + "commit": "885e2ca4d842d139e9aef4e48d366c63cb1b8013", + "syncedAt": "2026-08-19T16:00:01Z" }, { "id": "next-skills", @@ -114,8 +114,8 @@ "repo": "https://github.com/vercel/next.js.git", "ref": "canary", "adapter": "skill-collection", - "commit": "b18acf67128591337eb8e50d07ba20cbbb239f34", - "syncedAt": "2026-08-18T16:00:00Z" + "commit": "5c5daffedd06d434263b1847257636149e36baf7", + "syncedAt": "2026-08-19T16:00:01Z" } ] } diff --git a/plugins/codex/plugins/caveman/THIRD_PARTY_SOURCE.json b/plugins/codex/plugins/caveman/THIRD_PARTY_SOURCE.json index 1fe6e1d6..712af8c3 100644 --- a/plugins/codex/plugins/caveman/THIRD_PARTY_SOURCE.json +++ b/plugins/codex/plugins/caveman/THIRD_PARTY_SOURCE.json @@ -2,8 +2,8 @@ "sourceId": "caveman", "repo": "https://github.com/JuliusBrussee/caveman.git", "ref": "main", - "commit": "ae405e872270acc57484693612ae038b16c8f6cd", + "commit": "99a9aa2f5a45097fc3563febea7d0baf64407441", "adapter": "codex-plugin", "sourcePath": "plugins/caveman", - "syncedAt": "2026-08-18T16:00:00Z" + "syncedAt": "2026-08-19T16:00:01Z" } diff --git a/plugins/codex/plugins/grill-me/THIRD_PARTY_SOURCE.json b/plugins/codex/plugins/grill-me/THIRD_PARTY_SOURCE.json index 50cbc633..0da3513f 100644 --- a/plugins/codex/plugins/grill-me/THIRD_PARTY_SOURCE.json +++ b/plugins/codex/plugins/grill-me/THIRD_PARTY_SOURCE.json @@ -2,8 +2,8 @@ "sourceId": "grill-me", "repo": "https://github.com/mattpocock/skills.git", "ref": "main", - "commit": "9c9f36ccd3995266cd675468af71639c8dde1ec5", + "commit": "885e2ca4d842d139e9aef4e48d366c63cb1b8013", "adapter": "skill-collection", "sourcePath": "skills/productivity", - "syncedAt": "2026-08-17T16:00:00Z" + "syncedAt": "2026-08-19T16:00:01Z" } diff --git a/plugins/codex/plugins/mcp-playwright/MCP_SOURCE.json b/plugins/codex/plugins/mcp-playwright/MCP_SOURCE.json index e3076796..9c9a2c4f 100644 --- a/plugins/codex/plugins/mcp-playwright/MCP_SOURCE.json +++ b/plugins/codex/plugins/mcp-playwright/MCP_SOURCE.json @@ -3,5 +3,5 @@ "name": "playwright浏览器自动化操作", "version": "20260605", "keySource": "none", - "syncedAt": "2026-08-18T16:02:13Z" + "syncedAt": "2026-08-19T16:02:27Z" } diff --git a/plugins/codex/plugins/next-skills/THIRD_PARTY_SOURCE.json b/plugins/codex/plugins/next-skills/THIRD_PARTY_SOURCE.json index 55ec9134..9d7878e7 100644 --- a/plugins/codex/plugins/next-skills/THIRD_PARTY_SOURCE.json +++ b/plugins/codex/plugins/next-skills/THIRD_PARTY_SOURCE.json @@ -2,8 +2,8 @@ "sourceId": "next-skills", "repo": "https://github.com/vercel/next.js.git", "ref": "canary", - "commit": "b18acf67128591337eb8e50d07ba20cbbb239f34", + "commit": "5c5daffedd06d434263b1847257636149e36baf7", "adapter": "skill-collection", "sourcePath": "skills", - "syncedAt": "2026-08-18T16:00:00Z" + "syncedAt": "2026-08-19T16:00:01Z" } diff --git a/plugins/codex/plugins/ppt-master/THIRD_PARTY_SOURCE.json b/plugins/codex/plugins/ppt-master/THIRD_PARTY_SOURCE.json index de7badb8..95bcf533 100644 --- a/plugins/codex/plugins/ppt-master/THIRD_PARTY_SOURCE.json +++ b/plugins/codex/plugins/ppt-master/THIRD_PARTY_SOURCE.json @@ -2,8 +2,8 @@ "sourceId": "ppt-master", "repo": "https://github.com/hugohe3/ppt-master.git", "ref": "main", - "commit": "2f6a06ce34365a999de1a34e13c1784a48d4f7d3", + "commit": "a160e776b7faff5d2227d180d0f31c6253056fae", "adapter": "claude-skill", "sourcePath": "skills/ppt-master", - "syncedAt": "2026-08-18T16:00:00Z" + "syncedAt": "2026-08-19T16:00:01Z" } diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/SKILL.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/SKILL.md index 731070ce..7099e9b2 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/SKILL.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/SKILL.md @@ -17,11 +17,17 @@ PPT Master is a routed presentation workflow. This entry owns global execution d ## Mandatory Load Order +**Hard rule — paths before commands**: Retain the host-provided absolute +directory containing this file as `SKILL_DIR`. Per tool call, expand +`${SKILL_DIR}` and replace any `skills/ppt-master/` prefix with it. Never `cd`, +use CWD, or assume a repo checkout. If unavailable, ask; never search or guess. + 1. Read this file. -2. Run `python3 scripts/attribution_guard.py` from this Skill directory. Any - non-zero result stops the Skill immediately; do not inspect, repair, or - bypass the integrity gate. -3. Read [`workflows/routing.md`](workflows/routing.md). +2. Run `python3 "${SKILL_DIR}/scripts/attribution_guard.py"`. Any non-zero result + stops the Skill immediately; do not inspect, repair, or bypass the integrity + gate. +3. Read [`workflows/routing.md`](workflows/routing.md) through the concrete + absolute path `${SKILL_DIR}/workflows/routing.md`. 4. Select exactly one top-level route and its active profile from the routing authority. 5. Read only the resulting runtime authority and its explicitly triggered @@ -54,7 +60,6 @@ never compete with it. 5. **No speculative execution** — Do not prepare later-phase artifacts before their owning step. 6. **Deterministic routing** — Do not add a route-choice question when [`routing.md`](workflows/routing.md) resolves the request. If a route prerequisite is missing, state it and stop that route. 7. **Owning-source recovery** — On failure, repair or regenerate the owning source artifact and resume from the route's declared pointer. Do not silently downgrade a required artifact. -8. **Stable paths** — Use absolute skill/project paths; never derive them from CWD. The Skill root is the directory containing `SKILL.md`; the host supplies its path. If it cannot be determined, ask the user — never guess it via file search. ## Global Communication Rules diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/animations.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/animations.md index 18f62831..0fc293af 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/animations.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/animations.md @@ -254,14 +254,13 @@ copy its global-library file into the project and reference that local copy. | Source | Action | |---|---| -| Bundled CC0 library | Discover ids with `sound_sync.py list`, sync only the selected ids, then use the corresponding `sounds//.wav` paths | +| Bundled CC0 library | Read the complete objective [`sound-vocabulary.md`](../templates/sounds/sound-vocabulary.md), select one exact id from the resolved auditory job, sync only that selection, then use the corresponding `sounds//.wav` path | | User-provided audio already inside the project | Reference its existing project-relative `.m4a`, `.mp3`, or `.wav` path for object animation; a transition sound uses `.wav` | | External absolute file | The low-level object-animation path remains compatible, but new generated projects should copy or sync the intended file into the project and use a relative path | | No concrete auditory cue job | Keep `sound` omitted; do not create `/sounds/` and do not copy the library | ```bash -# Inspect ids only after the visual motion solution exists -python3 skills/ppt-master/scripts/sound_sync.py list +# Optional exact filtering only after the complete vocabulary is in context python3 skills/ppt-master/scripts/sound_sync.py list --query # Materialize only the chosen ids diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/executor-base.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/executor-base.md index 74850b4b..2b2e373d 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/executor-base.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/executor-base.md @@ -10,7 +10,7 @@ Always-loaded Executor authority for flat SVG page authoring and behavior shared | Any selected Chart/Table `family/key` reference, or a legacy `page_charts` row that resolves to a live Chart/Table SVG | [`executor-visualization.md`](./executor-visualization.md), then the resolver-returned Chart/Table branch | | Any value-driven geometry, including a chart-family reference, mini chart, sparkline, inset, or small multiple | [`executor-chart.md`](./executor-chart.md) | | Any semantic cell grid, including a table-family reference | [`executor-table.md`](./executor-table.md) | -| A page will use a preset pattern fill or an independent object is explicitly selected as native-ready | [`native-data-interface.md`](./native-data-interface.md) before emitting the pattern or replacement metadata | +| A page uses a preset pattern fill, or an independent Chart/Table object is resolved as `=yes` | [`native-data-interface.md`](./native-data-interface.md) before emitting the pattern or replacement metadata | | Any image | [`executor-image.md`](./executor-image.md) + [`image-layout-spec.md`](./image-layout-spec.md) + [`image-layout-patterns.md`](./image-layout-patterns.md) + [`svg-image-embedding.md`](./svg-image-embedding.md) | | Any nontrivial mathematical expression | [`native-formula.md`](./native-formula.md) | | Any external or same-deck click hyperlink | [`native-hyperlinks.md`](./native-hyperlinks.md) | @@ -120,7 +120,7 @@ Apply the content-vs-expression contract above within the selected reading mode. - **Prepared decorative lettering**: When the approved plan selects stable artistic lettering as part of the visual, place its prepared AI/slice file as an image asset and keep the ordinary editable title/subtitle in separate native text frames. Do not recreate the asset with layered glyph copies or native WordArt; when the plan keeps that wording as native text and prepares no lettering asset, use ordinary `` without inventing a missing image. - **Outside-band recovery**: for structural text, reflow geometry and use the declared role band locally. For a sparse display occurrence, keep the unitless value and verify that its deck-wide count remains at most two. Never flatten a justified distinction or add a role merely to silence the checker. Mirror pages preserve exact source typography as inherited input. - Images MUST reference files listed under `images`; no invented filenames -- For math, load [`native-formula.md`](./native-formula.md): simple notation stays text; one-line structural prose uses inline; matrices, multiline derivations, or standalone high structure use block. Keep exact LaTeX plus preview; never use an image. +- For math, load [`native-formula.md`](./native-formula.md): simple notation stays text; one-line structural prose uses inline only when its native-height envelope fits the reserved row/module space; matrices, multiline derivations, standalone high structure, or vertically expanding math without that clearance use block. Keep exact LaTeX plus preview; never use an image. Return upstream before any derived/accent identity becomes recurring or structural, or when an undeclared display size reaches its third occurrence, then update the retained context under §2.1. Local garnish, same-role `±2`px adjustments, and at most two sparse display-size occurrences need no lock row. Never expand the lock to silence a comparison. New icon acquisition, images, structural fonts, role anchors, and resources keep their preparation/role rules. @@ -197,10 +197,11 @@ materialize that contour with Boolean semantics, and use freeform last. Block arrows, chevrons, banners / ribbons, callouts, flowchart nodes, stars, and other Office symbols use `preset_shape_svg.py`, not plain paths or fake rectangles. -Before the first page, complete [`native-shape-authoring.md`](./native-shape-authoring.md)'s -unfiltered full-registry discovery. Decide every page-fit contour and its -simplest exact authoring form directly from the page content and visual system; -no Design Spec construction selection or material inventory gates this choice. +Before the first page, read +[`preset-shape-vocabulary.md`](./preset-shape-vocabulary.md) completely. Decide +every page-fit contour and its simplest exact authoring form directly from the +page content and visual system; no Design Spec construction selection, scorer, +or material inventory gates this choice. **Mandatory — independent per-page geometry move**: after the Structure result and any applicable topology resolve, apply diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/image-generator.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/image-generator.md index e99d0bf2..442f7d7b 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/image-generator.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/image-generator.md @@ -54,7 +54,7 @@ Every AI image uses one deck-wide rendering, the deck's stable color anchors/sem | Reference | Loaded | |---|---| -| [`image-renderings/_index.md`](./image-renderings/_index.md) — rendering catalog + auto-selection table | Always (Step 1 below) | +| [`image-renderings/_index.md`](./image-renderings/_index.md) — complete rendering catalog + objective selection boundary | Always (Step 1 below) | | [`image-type-templates/_index.md`](./image-type-templates/_index.md) — type catalog + auto-selection table | Always (Step 1 below) | | `image-renderings/.md` | After Step 2 resolves the rendering — one preset file, or every exact reference listed for `custom` | | `image-type-templates/.md` | After Step 3 picks the type per image — only the types actually used | @@ -101,11 +101,12 @@ This fallback covers a missing key only. An empty or invalid value stops for loc | Signal | Maps to | |---|---| -| `design_spec.md d. Style` mode + descriptor | Rendering (consult renderings `_index.md` auto-selection table) | +| `design_spec.md d. Style` mode + descriptor plus intended image jobs | Rendering (compare the complete objective catalog; no keyword or paired style decides the result) | | Existing `spec_lock.md colors` rows | Deck color anchors; interpret them with the completed `design_spec.md`, never replace confirmed identity from a second palette | | Existing `spec_lock.md icons.library` | Sanity check: chosen rendering should be compatible with the icon library's visual weight | -If rendering inference surfaces multiple candidates, pick the first; do not present another choice after confirmation. +If rendering inference surfaces multiple candidates, choose the strongest +whole-deck fit; do not present another choice after confirmation. If the table returns `custom`, stop and repair the lock: authoring `image_rendering_behavior` is a planning decision this fallback cannot make, and the deck's SVG style prose is not an image-rendering description. diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/image-renderings/_index.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/image-renderings/_index.md index 4cea2a1b..db2ab9c9 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/image-renderings/_index.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/image-renderings/_index.md @@ -14,7 +14,7 @@ Each rendering keeps its own authoritative file with: style paragraph, line / te ### 1.1 Modern / commercial (the corporate-PPT main field) -| Rendering | One-liner | Best for | +| Rendering | One-liner | Typical image job | |---|---|---| | [`vector-illustration`](./vector-illustration.md) | Clean flat vector with bold shapes, no gradients | Consulting / SaaS / general professional decks | | [`flat`](./flat.md) | Modern geometric blocks, slightly more design-forward than vector | Brand / product showcase decks | @@ -28,7 +28,7 @@ Each rendering keeps its own authoritative file with: style paragraph, line / te ### 1.2 Hand-drawn / educational -| Rendering | One-liner | Best for | +| Rendering | One-liner | Typical image job | |---|---|---| | [`sketch-notes`](./sketch-notes.md) | Warm cream paper, black hand-drawn lines, pastel fills | Education / training / onboarding | | [`ink-notes`](./ink-notes.md) | Pure white, black ink, sparse semantic color | Methodology / Before-After / manifestos | @@ -37,7 +37,7 @@ Each rendering keeps its own authoritative file with: style paragraph, line / te ### 1.3 Narrative / atmospheric -| Rendering | One-liner | Best for | +| Rendering | One-liner | Typical image job | |---|---|---| | [`watercolor`](./watercolor.md) | Painterly soft edges, color bleeding | Illustrative lifestyle / travel story / brand story | | [`warm-scene`](./warm-scene.md) | Golden-hour cinematic warmth | Personal growth / origin story | @@ -46,7 +46,7 @@ Each rendering keeps its own authoritative file with: style paragraph, line / te ### 1.4 Specialty -| Rendering | One-liner | Best for | +| Rendering | One-liner | Typical image job | |---|---|---| | [`fantasy-animation`](./fantasy-animation.md) | Ghibli/Disney hand-drawn warmth | Children / storybook / brand fable | | [`pixel-art`](./pixel-art.md) | 8-bit retro game aesthetic | Gaming / retro tech / nostalgic | @@ -75,38 +75,30 @@ Write `image_rendering_references` only when the confirmed custom direction actu --- -## 2. Selection recall — confirmed style + image job → rendering +## 2. Selection Boundary -**Reference — not a constraint**: Resolve the direction's intended image jobs and visual style before using this table. A topic keyword alone never selects the deck-wide rendering or turns a named real-world subject into an AI row. Travel planning and other documentary work keeps verifiable places in `provided` / `web`; its AI rendering applies only to complementary invented or deliberately stylized roles. Choose the strongest task-and-style match. **No row matches** → use `custom` per §1.5 rather than force-fitting `vector-illustration`. When the visual style names a paired rendering, prefer that for aesthetic alignment only when the intended image jobs still fit. +**Reference — not a constraint**: Resolve the intended image jobs and visual +style before choosing. Compare every catalog row through the image's required +line quality, texture, depth, material, mood, documentary identity, and role in +the page. A topic or industry keyword never selects the deck-wide rendering or +turns a named real-world subject into an AI row. A paired visual-style +rendering is one coherence candidate, not a default answer. When no preset +describes the intended treatment, use `custom` per §1.5. -| `d. Style` signal | Recommended rendering | Alternates | -|---|---|---| -| Strategic / MBB / board | `editorial` or `vector-illustration` | `blueprint`, `minimalist-swiss` | -| Corporate report / analysis | `vector-illustration` | `flat`, `digital-dashboard` | -| High-end consulting / luxury / 高端 / design-firm | `minimalist-swiss` | `editorial`, `vector-illustration` | -| Tech / SaaS / AI / system / architecture | `3d-isometric`, `blueprint`, or `digital-dashboard` | `flat`, `vector-illustration` | -| Modern SaaS / fintech / health-tech / premium app | `glassmorphism` | `digital-dashboard`, `flat` | -| Product launch / brand / marketing | `flat`, `3d-isometric`, or `corporate-photo` | `vector-illustration` | -| Education / training / onboarding / 教学 | `sketch-notes` | `vector-illustration` (if school is corporate), `paper-cut` | -| Children / story / storybook / 儿童 | `fantasy-animation` | `paper-cut`, `watercolor`, `sketch-notes` | -| Cultural / folk / festival / 文化 / 节日 | `paper-cut` | `vintage-poster`, `screen-print` | -| Methodology / Before-After / manifesto / 方法论 | `ink-notes` | `editorial` | -| Government / formal / official report | `editorial` or `corporate-photo` | `vector-illustration` | -| Finance / data journalism / 财经 | `editorial` or `digital-dashboard` | `vector-illustration` | -| Personal story / 个人成长 / lifestyle | `watercolor`, `warm-scene` | `corporate-photo`, `paper-cut` | -| Cultural / media / opinion / cinematic | `screen-print`, `vintage-poster` | `editorial`, `warm-scene` | -| Brand heritage / historic hospitality identity / 老字号 / 周年 | `vintage-poster` | `screen-print`, `editorial` | -| Gaming / retro / 8-bit / 复古 | `pixel-art` | `vintage-poster` | -| Environment / wellness / 环保 / 户外 | `nature` | `watercolor`, `paper-cut` | -| Classroom / blackboard / 课堂 | `chalkboard` | `sketch-notes` | -| Team / company / product photo | `corporate-photo` | — | +| Decision dimension | Evidence to compare | +|---|---| +| Subject identity | Documentary likeness, invented expression, metaphor, atmosphere, or abstract structure | +| Mark language | Photographic detail, vector edges, hand-drawn line, halftone, pixel grid, or material contour | +| Depth and material | Flat fields, layered paper, glass, isometric volume, wash, grain, or natural light | +| Page role | Full composition, local illustration, reusable transparent element, or supporting visual cue | +| Deck coherence | Fit with the resolved visual system and color roles without replacing the page's actual communication job | --- ## 3. How to use -1. From `design_spec.md` extract `d. Style` mode + descriptor. -2. Find the matching row above; pick the primary recommendation. +1. Read the resolved visual system and the deck's intended AI image jobs. +2. Compare the complete catalog and choose the strongest whole-deck fit, or use a warranted `custom` treatment. 3. For a preset, read `image-renderings/.md`. For `custom`, read every file named in `image_rendering_references`, then synthesize them under the confirmed behavior; with no references, use the novel behavior directly. Apply the result when assembling prompts per [`image-generator.md`](../image-generator.md) §4. **Lock for the whole deck.** Don't change rendering between images in the same deck. diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/modes/_index.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/modes/_index.md index fc6b17d5..f6986863 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/modes/_index.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/modes/_index.md @@ -10,7 +10,7 @@ A **mode** is the deck's **narrative + persuasion skeleton** — how the argumen Each mode keeps its own authoritative file with: narrative skeleton, page-structure tendencies, speaker-notes register, and a page skeleton example. Read this index alone while choosing a direction. Only after a preset or custom bases are fixed may the active role read the selected sibling files: one file for a preset, every exact `mode_references` file for a catalog-based custom, and none for a novel custom. Never glob the directory or read an unselected sibling. -| Mode | Narrative skeleton | Best for | +| Mode | Narrative skeleton | Typical communication context | |---|---|---| | [`pyramid`](./pyramid.md) | Conclusion first; structured arguments; data contextualized with supported comparisons where useful | Decision support, analysis, strategy, board / exec reports | | [`narrative`](./narrative.md) | Story arc — situation → tension → resolution; suspense and turns | Pitches, case studies, brand journeys, fundraising | @@ -24,19 +24,17 @@ Each mode keeps its own authoritative file with: narrative skeleton, page-struct --- -## 2. Auto-selection — communication contract + source signal → mode +## 2. Decision Distinctions -| Contract / source signal | Recommended mode | Alternates | -|---|---|---| -| Decision / recommendation outcome; analysis, board, investor; criteria and trade-offs must land | `pyramid` | `narrative` | -| Persuasion or mobilization lands through a case, tension, transformation, or origin arc | `narrative` | `showcase`, `pyramid` | -| Understanding or capability must build step by step; course, onboarding, how-to, explainer | `instructional` | `pyramid`, `briefing` | -| Attention / emotion / launch moment is primary; sparse presenter-led delivery | `showcase` | `narrative` | -| Complete reference, status, record, hand-off, FAQ, meeting pack; no thesis dominates | `briefing` | `pyramid`, `instructional` | +**Reference — not a constraint**: Read `communication_intent`, +`audience_outcome`, `core_message`, delivery context / afterlife, source texture, +and any user-authored outline together. The catalog exposes complete argument +strategies; it does not rank them or map a topic keyword to a result. When +several purposes coexist, judge the dominant argument movement of the body +pages, not the cover or the first purpose word. -> No keyword decides the mode. Read `communication_intent`, `audience_outcome`, `core_message`, delivery context / afterlife, source texture, and any user-authored outline together. When several purposes coexist, follow the dominant **argument movement of the body pages**, not the cover and not the first purpose word. A data review can legitimately run almost entirely `pyramid`; a progress report whose durable hand-off matters more than persuasion may stay `briefing`. - -**Close calls** — the genuinely adjacent pairs; every other pair is far enough apart that the auto-selection signal decides. +The following adjacent pairs expose their structural difference without +selecting one for the current deck: | Torn between | …the first when | …the second when | |---|---|---| diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/native-data-interface.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/native-data-interface.md index 2536ba11..271b0b4c 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/native-data-interface.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/native-data-interface.md @@ -43,14 +43,16 @@ this enum. [`executor-base.md`](./executor-base.md) remains the single Shape-first authoring authority: the complete visible SVG fallback is required regardless of native eligibility. This section only adds dormant replacement metadata to independently selected objects and defines how export may activate it. **Hard rule — selected-object authoring**: write the marker and JSON metadata in -the same edit only for a supported chart or pure text-grid table independently -selected as native-ready. Default reads the exact semantic object key from §IX +the same edit for every supported chart and pure text-grid table; both are +native-ready by default. An unactivated marker changes no export, so never skip +an eligible object because the current request did not ask for native output. +The Default route reads the exact semantic object key from §IX `Native-ready: =yes|no; ...`; Quick assigns the same page-local `kebab-case` key in active context before drawing. Use that key as the marker group `id` and metadata `name`. A catalog `family/key`, family name, §VII row, numeric content, or another ready object on the page never implies eligibility. -Default `=no`, Quick `no`, and unlisted incidental microvisuals stay -on the SVG fallback route. Canonical rectangular merged text cells may use the narrow +A `=no` entry and unlisted incidental microvisuals stay on the SVG +fallback route. Canonical rectangular merged text cells may use the narrow `row_span` / `col_span` contract below; graphical cells stay unmarked. The marker group supplies visible fallback children for browser rendering and JSON metadata for `svg_to_pptx` native export. diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/native-formula.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/native-formula.md index 55bc33bf..1771c4d1 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/native-formula.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/native-formula.md @@ -19,8 +19,8 @@ construction, accent, or complex script. | Content form | Authoring choice | |---|---| | Short variables, percentages, simple assignments, or notation such as `O(n log n)` | Ordinary editable SVG text | -| One-line structural math embedded in prose | Inline native marker | -| Matrix, `cases`, `aligned`, multiline derivation, or standalone high-structure expression | Block native marker | +| One-line structural math embedded in prose whose native-height envelope fits the reserved row/module space | Inline native marker | +| Matrix, `cases`, `aligned`, multiline derivation, standalone high-structure expression, or vertically expanding math that cannot fit its prose row | Block native marker | The Strategist's `Mathematical content` field does not pre-decide this choice. Formula handling is not a user-confirmed policy, image resource, manifest, or @@ -57,6 +57,14 @@ preserved `txBody`, geometry transport subtree, another inline marker, or any `data-pptx-replace-with` subtree. Export keeps the surrounding text runs in the same `a:p` and replaces only the marker run with `a14:m > m:oMath`. +**Hard rule — reserve native height**: Treat the parsed formula structure, not +its flat SVG preview, as vertical layout truth. Keep adjacent content outside +the native ascent/descent required by fractions, radicals, nested scripts, +n-ary limits, accents, and other stacked structures. The exporter and SVG +checker use the same structural envelope. If the prose row or root module +cannot reserve that space without overlap, isolate the formula line or use the +block marker. + ### 2.2 Block formula ```xml @@ -154,5 +162,7 @@ versions are not the source-profile baseline. WPS, Keynote, LibreOffice, and other clients receive no embedded formula fallback and are outside the rendering/editability contract. -**Validation**: The first-page/final SVG checker validates every marker and -compiles its LaTeX before release; native export repeats validation. +**Validation**: The first-page/final SVG checker validates every marker, +compiles its LaTeX, and applies the shared native-height envelope to page/module +text bounds before release; native export repeats validation and uses that +envelope for the generated text frame. diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/native-shape-authoring.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/native-shape-authoring.md index 3341a1e0..6c054cff 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/native-shape-authoring.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/native-shape-authoring.md @@ -12,35 +12,26 @@ only when those constructions fail. Neither helper writes a page. The preset helper does not create the shape's own `p:txBody`; keep visible text outside the atomic fragment. -**Mandatory — semantic registry discovery at authoring entry**: before the -first newly authored page or template contour in each valid context, run the -following command unfiltered and retain its complete output. It organizes all -187 presets by the official Office gallery categories, then adds semantic -groups, scopes, and one-line intent summaries. This compact index is -authoring-time capability discovery, never a Strategist task or Design Spec -field. Rerun only after context invalidation or a registry change. +**Mandatory — complete vocabulary at authoring entry**: before the first newly +authored page or template contour in each valid context, read +[`preset-shape-vocabulary.md`](./preset-shape-vocabulary.md) completely and +retain it. It exposes all 187 exact preset names under the Office gallery and +objective contour families. This is Executor-side capability knowledge, never +a Strategist task or Design Spec field. Reread only after context invalidation +or a known file change; a filtered query cannot replace the complete read. **Hard rule — direct structured calls**: `${SKILL_DIR}` below is the retained -absolute Skill root. Invoke each JSON command once per concrete argument set -and read stdout directly. Do not change CWD, encode executables or flag lists in -scalar shell strings, batch these calls through shell loops, merge stderr, or -add a downstream parser when `--compact` exists. +absolute Skill root. After choosing a concrete lookup or authoring operation, +invoke that command once per argument set and read stdout directly. Do not +change CWD, encode executables or flag lists in scalar shell strings, batch +these calls through shell loops, merge stderr, or add a downstream parser when +`--compact` exists. -```bash -python3 "${SKILL_DIR}/scripts/preset_shape_svg.py" list --grouped -``` - -The plain `list` command remains a compatibility view of exact registry names; -it does not replace grouped discovery. For each page entering ordinary contour -selection, run `recommend --compact --limit 6` from the actual page role and -applicable relationship, direction, aspect, text capacity, scope, or intent -terms before choosing a contour, then run `describe --compact` on the -serious candidates. Grouped discovery followed by direct `describe` does not satisfy -page-local recall. Those commands supply the full match reasons, intended uses, -misuse boundaries, adjustments, and key geometry facts omitted from the compact -entry index. Recommendation is diverse candidate recall, not a whitelist, -automatic choice, or shape quota; a neutral primitive remains valid when it -fits best. Each page still resolves the final contour through §§1–2.1. +`list --search` and `list --grouped --search` are optional spelling/location +helpers. Run `describe --compact` only when a serious candidate needs +objective identity, adjustment, connector, path, connection-site, or +text-rectangle facts. Executor makes the final comparison through §§1–2.1; +filtered lookup cannot narrow the already-loaded vocabulary. ## 1. Contour Selection and Materialization Gate @@ -97,34 +88,30 @@ objects or their composition. --- -## 2. Semantic Preset Selection +## 2. Vocabulary-Guided Preset Selection -The catalog's top level follows the Office gallery taxonomy: Lines, -Rectangles, Basic Shapes, Block Arrows, Equation Shapes, Flowchart, Stars and -Banners, Callouts, and Action Buttons. The bundled semantic layer at -`scripts/pptx_shapes/data/presetShapeSemantics.json` adds authoring roles and -use boundaries; it does not redefine the DrawingML registry. +[`preset-shape-vocabulary.md`](./preset-shape-vocabulary.md) follows the Office +gallery taxonomy: Lines, Rectangles, Basic Shapes, Block Arrows, Equation +Shapes, Flowchart, Stars and Banners, Callouts, and Action Buttons. Its family +labels and objective identities expose the available contours without deciding +their page use. The optional semantic helper data does not redefine the +DrawingML registry or override Executor judgment. Apply this page-local sequence before drawing: | Pass | Action | Result | |---|---|---| | Job | State what the object must do for the reader before naming a shape. | Page role plus any real relationship, direction, aspect, text load, or literal scope. | -| Recall | Run `recommend --compact` with the known criteria. Keep the default `general` scope unless the page truly needs `literal`, `flowchart`, or `navigation`. | A group-diverse candidate set with match reasons and misuse boundaries. | -| Inspect | Run `describe --compact` for candidates whose contour could fit; compare `intent`, `recommended_for`, `avoid_for`, adjustments, text rectangle, and connection sites. | Evidence for choosing or rejecting each serious candidate. | +| Browse | Compare that job against the complete loaded vocabulary; move from Office category to contour family to exact name. | A small candidate set chosen by meaning, not syntax convenience. | +| Inspect | When exact facts could change the decision, run `describe --compact` directly for those candidates and compare identity, scope, adjustments, connector status, paths, text rectangle, and connection sites. | Objective geometry evidence without prescribed use. | | Select | Choose the contour whose inference and visual character fit the page, including a neutral primitive when neutrality is useful. | One page-fit contour; no syntax decision yet. | | Encode | Apply §1's materialization gate. | Ordinary SVG primitive, helper-authored preset, Boolean result, or necessary freeform. | -Example recall and inspection commands: +Example location and inspection commands: ```bash -python3 "${SKILL_DIR}/scripts/preset_shape_svg.py" recommend --compact \ - --role spine --relationship order --directionality horizontal --aspect wide \ - --limit 6 python3 "${SKILL_DIR}/scripts/preset_shape_svg.py" describe chevron --compact - -python3 "${SKILL_DIR}/scripts/preset_shape_svg.py" recommend --compact \ - --scope flowchart --role node --relationship flow --query decision --limit 6 +python3 "${SKILL_DIR}/scripts/preset_shape_svg.py" list --search connector ``` **Hard rule — semantic fit, not name association**: a preset name, topic word, @@ -135,10 +122,9 @@ lightning bolt is not generic price tension, `chartX` / `chartStar` / belongs only in an actual flowchart. An action-button preset supplies visual geometry only; it never creates an action or hyperlink. -The semantic catalog chooses contours, not syntax. It never requires `rect`, -`ellipse`, `line`, or any other primitive to pass through the preset helper; -after selection, the simplest exact authoring form in §1 remains authoritative. -Export never scans or upgrades existing geometry. +The vocabulary exposes contours; Executor chooses them, and §1 chooses syntax. +It never requires `rect`, `ellipse`, `line`, or any other primitive to pass +through the preset helper. Export never scans or upgrades existing geometry. **Shape-first diagram rule**: use `` for straight thin relationships; use an exact connector-family preset for a stock bent or curved contour; use a diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/preset-shape-vocabulary.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/preset-shape-vocabulary.md new file mode 100644 index 00000000..43d69d71 --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/preset-shape-vocabulary.md @@ -0,0 +1,133 @@ +# Native Preset Shape Vocabulary + +This is Executor's complete authoring-side map of the 187 registered DrawingML +preset names. Read it once before choosing a newly authored page or template +contour. The Office categories and family descriptions expose what exists and +what each contour objectively depicts; the current page's meaning, visual +system, and composition determine whether and how to use it. + +**Reference — not a constraint**: the order and families are browse aids, not +rankings, recommendations, whitelists, quotas, or automatic selections. A +primitive, compound construction, necessary freeform, or no drawn carrier may +still be the best result. + +**Hard rule — registered identities and behavior boundaries**: + +- `flowChart*` names carry conventional flowchart meanings; they are not generic decorative nodes. +- `actionButton*` names provide visual button geometry only; they create no action, hyperlink, or navigation target. +- `bentConnector*` and `curvedConnector*` are connector contours, but newly authored instances have no endpoint attachment. +- `chartX`, `chartStar`, and `chartPlus` are partition symbols, not data charts. +- Literal pictograms and mathematical operators retain the identity named here. + +**When to run**: run `preset_shape_svg.py describe --compact` only when +an exact candidate needs objective adjustment, connector, path, +connection-site, or text rectangle facts. Authoring syntax and fragment +contracts remain in +[`native-shape-authoring.md`](./native-shape-authoring.md). + +## 1. Lines + +Straight, bent, and curved relationship contours. + +| Family | Objective identity | Exact preset names | +|---|---|---| +| Straight lines and connectors | Two diagonal orientations plus one straight connector contour. | `line`, `lineInv`, `straightConnector1` | +| Bent connectors | Orthogonal connector contours with one through four bends. | `bentConnector2`, `bentConnector3`, `bentConnector4`, `bentConnector5` | +| Curved connectors | Curved connector contours with increasing segment complexity. | `curvedConnector2`, `curvedConnector3`, `curvedConnector4`, `curvedConnector5` | + +## 2. Rectangles + +Neutral and corner-inflected rectangular carriers. + +| Family | Objective identity | Exact preset names | +|---|---|---| +| Neutral rectangular carriers | Square-corner and uniformly rounded rectangular contours. | `rect`, `roundRect` | +| Corner-inflected rectangles | Rectangles with one-sided, paired, diagonal, rounded, clipped, or mixed corner treatments. | `round1Rect`, `round2SameRect`, `round2DiagRect`, `snipRoundRect`, `snip1Rect`, `snip2SameRect`, `snip2DiagRect` | + +## 3. Basic Shapes + +Geometric bodies, boundaries, radial contours, and literal symbols. + +| Family | Objective identity | Exact preset names | +|---|---|---| +| Triangular bodies | Symmetric and right-triangle contours. | `triangle`, `rtTriangle` | +| Slanted quadrilaterals | Diamond, parallelogram, symmetric trapezoid, and asymmetric trapezoid contours. | `diamond`, `parallelogram`, `trapezoid`, `nonIsoscelesTrapezoid` | +| Regular polygon bodies | Five-, six-, seven-, eight-, ten-, and twelve-sided polygon contours. | `pentagon`, `hexagon`, `heptagon`, `octagon`, `decagon`, `dodecagon` | +| Organic carriers | Oval and teardrop contours. | `ellipse`, `teardrop` | +| Ornamental carriers | Concave-corner plaque and beveled rectangle contours. | `plaque`, `bevel` | +| Radial contours and segments | Wedge, partial circle, thick arc, ring, chord, and open arc contours. | `pieWedge`, `pie`, `blockArc`, `donut`, `chord`, `arc` | +| Frames, corners, and edge pieces | Folded corner, closed/open frames, L-corner, and diagonal stripe contours. | `foldedCorner`, `frame`, `halfFrame`, `corner`, `diagStripe` | +| Brackets | Left, right, and paired square-bracket contours. | `leftBracket`, `rightBracket`, `bracketPair` | +| Braces | Left, right, and paired curly-brace contours. | `leftBrace`, `rightBrace`, `bracePair` | +| Literal pictograms | Named object, weather, emotion, prohibition, and cloud symbols. | `cube`, `can`, `lightningBolt`, `heart`, `sun`, `moon`, `smileyFace`, `noSmoking`, `cloud` | +| Functional pictograms | Six- and nine-tooth gears plus a funnel symbol. | `gear6`, `gear9`, `funnel` | +| Plus symbol | Broad plus/cross body. | `plus` | +| Corner and edge tabs | Four corner or edge tabs that imply a rectangular field. | `cornerTabs`, `squareTabs`, `plaqueTabs` | +| Partition symbols | Rectangles divided into four or six internal regions. | `chartX`, `chartStar`, `chartPlus` | + +## 4. Block Arrows + +Filled directional bodies for movement, sequence, return, exchange, and route +emphasis. + +| Family | Objective identity | Exact preset names | +|---|---|---| +| Arrow-shaped carriers | A pointed pentagonal stage body and a V-notched directional stage. | `homePlate`, `chevron` | +| Cardinal block arrows | Filled arrows pointing right, left, up, or down. | `rightArrow`, `leftArrow`, `upArrow`, `downArrow` | +| Stylized forward arrows | Rightward arrows with tail stripes or an inward tail notch. | `stripedRightArrow`, `notchedRightArrow` | +| Multi-axis arrows | Two-, three-, and four-direction arrow bodies. | `leftRightArrow`, `upDownArrow`, `leftUpArrow`, `leftRightUpArrow`, `quadArrow` | +| Bent and return arrows | Sharp or rounded turns plus an explicit U-turn contour. | `bentUpArrow`, `bentArrow`, `uturnArrow` | +| Circular arrows | One-way, counter-oriented, and two-way circular arrow contours. | `circularArrow`, `leftCircularArrow`, `leftRightCircularArrow` | +| Curved and swoosh arrows | Curved arrows ending on each cardinal side plus a tapered swoosh. | `curvedRightArrow`, `curvedLeftArrow`, `curvedUpArrow`, `curvedDownArrow`, `swooshArrow` | +| Arrow callout bodies | Text-bearing directional callouts in one-, two-, or four-way variants. | `leftArrowCallout`, `rightArrowCallout`, `upArrowCallout`, `downArrowCallout`, `leftRightArrowCallout`, `upDownArrowCallout`, `quadArrowCallout` | + +## 5. Equation Shapes + +Literal mathematical operators. + +| Family | Objective identity | Exact preset names | +|---|---|---| +| Equation operators | Addition, subtraction, multiplication, division, equality, and inequality symbols. | `mathPlus`, `mathMinus`, `mathMultiply`, `mathDivide`, `mathEqual`, `mathNotEqual` | + +## 6. Flowchart + +Conventional flowchart notation for explicit process diagrams. + +| Family | Objective identity | Exact preset names | +|---|---|---| +| Flowchart operations | Process, subprocess, alternate process, preparation, manual operation, and delay symbols. | `flowChartProcess`, `flowChartPredefinedProcess`, `flowChartAlternateProcess`, `flowChartPreparation`, `flowChartManualOperation`, `flowChartDelay` | +| Flowchart decisions and routing | Decision, continuation, junction, collation, sorting, extraction, and merge symbols. | `flowChartDecision`, `flowChartConnector`, `flowChartOffpageConnector`, `flowChartSummingJunction`, `flowChartOr`, `flowChartCollate`, `flowChartSort`, `flowChartExtract`, `flowChartMerge` | +| Flowchart input and output | General, manual, historical punched-media, and display input/output symbols. | `flowChartInputOutput`, `flowChartManualInput`, `flowChartPunchedCard`, `flowChartPunchedTape`, `flowChartDisplay` | +| Flowchart documents | Single-document and multidocument symbols. | `flowChartDocument`, `flowChartMultidocument` | +| Flowchart storage | Internal, offline, online, tape, disk, and drum storage symbols. | `flowChartInternalStorage`, `flowChartOfflineStorage`, `flowChartOnlineStorage`, `flowChartMagneticTape`, `flowChartMagneticDisk`, `flowChartMagneticDrum` | +| Flowchart terminator | Start/end terminal symbol. | `flowChartTerminator` | + +## 7. Stars and Banners + +Emblems, bursts, banners, scrolls, and wave contours. + +| Family | Objective identity | Exact preset names | +|---|---|---| +| Stars | Four- through thirty-two-point star and burst contours. | `star4`, `star5`, `star6`, `star7`, `star8`, `star10`, `star12`, `star16`, `star24`, `star32` | +| Irregular seals and explosions | Two irregular burst contours with different edge density. | `irregularSeal1`, `irregularSeal2` | +| Straight ribbons | Raised, lowered, and outward-tailed straight banner contours. | `ribbon`, `ribbon2`, `leftRightRibbon` | +| Curved ribbons | Upward- and downward-arcing ribbon contours. | `ellipseRibbon`, `ellipseRibbon2` | +| Scrolls | Vertical and horizontal rolled-document contours. | `verticalScroll`, `horizontalScroll` | +| Waves | Single and double undulating bands. | `wave`, `doubleWave` | + +## 8. Callouts + +Annotation bodies and leaders that point to another object or region. + +| Family | Objective identity | Exact preset names | +|---|---|---| +| Leader-line callouts | Unbordered, accent-bar, bordered, and accent-bordered bodies with straight, one-bend, or two-bend leaders. | `callout1`, `callout2`, `callout3`, `accentCallout1`, `accentCallout2`, `accentCallout3`, `borderCallout1`, `borderCallout2`, `borderCallout3`, `accentBorderCallout1`, `accentBorderCallout2`, `accentBorderCallout3` | +| Wedge and thought callouts | Rectangular, rounded, oval, and cloud annotation bodies with wedge or thought tails. | `wedgeRectCallout`, `wedgeRoundRectCallout`, `wedgeEllipseCallout`, `cloudCallout` | + +## 9. Action Buttons + +Visual navigation-control shapes whose behavior must be assigned separately. + +| Family | Objective identity | Exact preset names | +|---|---|---| +| Action-button controls | Blank, home, help, information, directional, boundary, return, document, sound, and movie button faces. | `actionButtonBlank`, `actionButtonHome`, `actionButtonHelp`, `actionButtonInformation`, `actionButtonForwardNext`, `actionButtonBackPrevious`, `actionButtonEnd`, `actionButtonBeginning`, `actionButtonReturn`, `actionButtonDocument`, `actionButtonSound`, `actionButtonMovie` | diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/shared-standards-core.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/shared-standards-core.md index d3190c2f..97572cb3 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/shared-standards-core.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/shared-standards-core.md @@ -626,7 +626,7 @@ These forms are needed only when the stated PPT behavior matters: ### 4.3 Element Grouping (Mandatory) -**Hard rule — root groups protect body-text layout**: Every visible direct root `` declares positive root-coordinate `data-pptx-bounds="x y width height"`. Keep it when frame/native coordinates size one PowerPoint object; placeholder bounds also supply the slot frame. On flat pages, make each module zone as generous as the canvas and sibling layout allow without overlapping another module zone. Checker validates this subcanvas against the root `viewBox`, then recursively validates only estimable `` descendants against it using the shared SVG-to-PPTX per-run width estimate and DrawingML wrapping headroom. It validates every estimable visible text carrier directly against the root `viewBox` with the same per-run estimate before that headroom. Nested groups and all shapes, images, paths, `` instances, effects, and object frames are not module-boundary inputs. Per side, Checker ignores overflow through `1px`; module-boundary overflow warns through `5%` and fails above `5%`, while any larger root-`viewBox` text overflow fails. Bounds do not clip or reflow; unestimable visible text receives an advisory warning. The only page-boundary exception is a wholly off-canvas direct-root Morph endpoint marked `data-pptx-morph-staging="true"`; its own module bounds still apply, retained Morph uses an explicit pair, and the marker never excuses partial page overflow. +**Hard rule — root groups protect body-text layout**: Every visible direct root `` declares positive root-coordinate `data-pptx-bounds="x y width height"`. Keep it when frame/native coordinates size one PowerPoint object; placeholder bounds also supply the slot frame. On flat pages, make each module zone as generous as the canvas and sibling layout allow without overlapping another module zone. Checker validates this subcanvas against the root `viewBox`, then recursively validates only estimable `` descendants against it using the shared SVG-to-PPTX per-run width estimate, inline-formula native-height envelope, and DrawingML wrapping headroom. It validates every estimable visible text carrier directly against the root `viewBox` with the same per-run estimate before that headroom. Nested groups and all shapes, images, paths, `` instances, effects, and object frames are not module-boundary inputs. Per side, Checker ignores overflow through `1px`; module-boundary overflow warns through `5%` and fails above `5%`, while any larger root-`viewBox` text overflow fails. Bounds do not clip or reflow; unestimable visible text receives an advisory warning. The only page-boundary exception is a wholly off-canvas direct-root Morph endpoint marked `data-pptx-morph-staging="true"`; its own module bounds still apply, retained Morph uses an explicit pair, and the marker never excuses partial page overflow. Wrap each logical Slide-local body unit in one descriptive top-level ``; group count follows the page's semantic units, and each group becomes one stable animation target when animation is enabled. Generic deck-wide animation gives that target one step; an explicit animation sidecar may assign it several ordered effects. Nested implementation groups may remain anonymous and need no bounds; any nested bounds are ignored. Flat pages use ordinary groups; structured slots already qualify, while titles, direct atomic Master/Layout elements, and canvas-level static framing—including background images and full-canvas scrim/decoration rectangles—may remain root primitives. On flat pages, give such static framing a stable `id` plus `data-pptx-role="background"` / `"decoration"`; never add a `` solely to silence an ungrouped-element advisory. diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/strategist-image.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/strategist-image.md index 55971665..40722b59 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/strategist-image.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/strategist-image.md @@ -29,27 +29,26 @@ There is no confirmation field or coverage quota. Illustrated cues may coexist with base SVG/emoji icons when the overall visual system remains coherent, and their slices stay out of `icons/`. -**Mandatory — evaluate decorative lettering under the two-question gate**: -When confirmed image usage retains `ai`, scan the complete page roster once -before writing §VIII. Confirmed `ai` is a Permission, not coverage: never create +**Mandatory — scan decorative-lettering candidates before selection**: When +confirmed image usage retains `ai`, scan the complete page roster once before +writing §VIII. Confirmed `ai` is a Permission, not coverage: never create lettering merely to justify the AI source or because no other AI-image job was -found. Eligibility turns on two questions only—is the wording stable, and would -an artistic treatment communicate better than native type. When either answer -is no, create no lettering row and keep the wording as native editable text. -Page role, character count, word count, line count, and kind of noun never -filter candidates; a complete long title, multi-word phrase, and multi-line -lockup are as eligible as a short mark. Preserve each full exact character -sequence as one intended mark when its hierarchy belongs to the art; never -trim, rewrite, or split it merely to ease generation. When both answers are -yes, the second answer already establishes the communication benefit; do not -add another eligibility test. Eligibility is wide, but deck-wide use stays -selective: choose a coherent set rather than lettering every heading; this -limits coverage, not eligibility. Adopt the selected marks under the confirmed -natural-language image intent, then materialize each one as an ordinary `ai` -row or group compatible marks through the §4.3 sheet/element rows rather than -leaving them as planning suggestions. Let letterform character, treatment, and -practical generation needs guide grouping. -Use has no coverage quota. An asset may carry the complete long or multi-line +found. Candidate discovery asks two questions—is the wording stable, and could +an artistic treatment plausibly communicate better than native type. When +either answer is no, create no lettering row and keep the wording as native +editable text. Page role, character count, word count, line count, kind of noun, +and locked style never pre-filter candidates; a complete long title, multi-word +phrase, and multi-line lockup are as eligible as a short mark. Preserve each +full exact character sequence as one intended mark when its hierarchy belongs +to the art; never trim, rewrite, or split it merely to ease generation. Passing +both questions exposes a possible job rather than selecting it. Compare every +candidate inside the complete page and deck carrier mix, then choose any +coherent set whose artistic treatment wins that fit; zero selected marks +remains valid and needs no skip explanation or coverage quota. Materialize each +selected mark as an ordinary `ai` row or group compatible marks through the +§4.3 sheet/element rows rather than leaving it as a planning suggestion. Let +letterform character, treatment, and practical generation needs guide grouping. +An asset may carry the complete long or multi-line title as its display layer. Keep an ordinary native title/subtitle in a separate text frame wherever the page needs a searchable, selectable, or outline-visible heading. Chrome and body remain native text. A diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/strategist.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/strategist.md index 78fd0ce7..d4f9901d 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/strategist.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/strategist.md @@ -182,7 +182,7 @@ The base icon style is one single-select identity, not a material whitelist: | Option | Approach | Suitable Scenarios | |--------|----------|-------------------| | **A** | Emoji | Casual, playful, social media | -| **B** | Built-in generic icon library | Professional scenarios (recommended) | +| **B** | Built-in generic icon library | Recurring compact semantic cues in one coherent SVG style | | **C** | Custom project icons | Supplied, template-carried, or imported assets | | **D** | No base icons | Illustration, typography, shapes, or data already carry the compact cues | @@ -307,7 +307,7 @@ owns SVG authoring under [`native-hyperlinks.md`](./native-hyperlinks.md). **Mandatory — no AI capability preflight**: When `recommend.image_usage` includes `ai`, preserve an explicit user path instruction; otherwise recommend `auto`. Do not inspect backend configuration, check host-tool availability, or probe a provider during planning. Generate Step 5 execution is the first capability check. -**Default — visual grounding before `none` (may override when the user forbids images or charts / native SVG fully carry the visual burden)**: First decide whether the audience must recognize, experience, compare, or choose an externally verifiable subject, place, product, or setting. When yes, propose `provided` / `web`; propose `ai` when invented or deliberately stylized expression materially improves a planned visual job. Treat `none` as a positive whole-deck conclusion. Mixed sources may serve different page roles. The three Stage-2 style directions never settle source: a rendering candidate resolves how imagery looks, never whether a real subject must appear as itself. +**Default — visual grounding before `none` (may override when the full-roster carrier review finds no useful image job)**: Honor an explicit no-image requirement. First decide whether the audience must recognize, experience, compare, or choose an externally verifiable subject, place, product, or setting. When yes, propose `provided` / `web`; propose `ai` when invented or deliberately stylized expression materially improves a planned visual job. Treat `none` as a positive whole-deck conclusion when no image source owns a meaningful communication job. Mixed sources may serve different page roles. The three Stage-2 style directions never settle source: a rendering candidate resolves how imagery looks, never whether a real subject must appear as itself. **Default — consider proactive illustrated icons without creating another confirmation field**: Before each Stage-2 `recommend.image_usage`, consider @@ -316,21 +316,23 @@ illustrated cue family. This may support an `ai` recommendation, but it is not an automatic source trigger or coverage quota. Resource grouping remains a fit-driven decision under [`strategist-image.md`](./strategist-image.md). -**Mandatory — assess proactive decorative lettering without making eligibility -an automatic source trigger**: Before each Stage-2 `recommend.image_usage`, -scan the complete planned roster for exact stable display strings whose -artistic treatment could communicate better than native type. Page role, -character count, word count, line count, and kind of noun never filter -candidates: a complete long or +**Mandatory — scan proactive decorative-lettering capability without making +candidates an automatic source trigger**: Before each Stage-2 +`recommend.image_usage`, scan the complete planned roster for exact stable +display strings whose artistic treatment could plausibly communicate better +than native type. Page role, character count, word count, line count, kind of +noun, and proposed style never pre-filter candidates: a complete long or multi-line title is as eligible as a short mark. Never invent, rewrite, -shorten, or split copy to make generation easier. An eligible string is one -possible AI visual job, not a mechanical reason to add -`ai`. The second eligibility question already decides whether lettering -strengthens communication: when its answer is yes, lettering may be the sole -intended AI job and may support an AI recommendation stated in -`image_notes.value`; when either answer is no, native editable text remains -valid. The absence of another AI-image job never forces lettering. Explicit -no-AI or editable-only requirements win. Execution follows +shorten, or split copy to make generation easier. Passing both discovery +questions exposes one possible AI visual job, not a selected resource or a +mechanical reason to add `ai`. During page-carrier planning, compare those +candidates with native type and the complete deck mix; select only the marks +whose treatment wins that fit. Zero selected marks remains valid and needs no +skip explanation or coverage quota. A selected mark may be the sole intended +AI job and may support an AI recommendation stated in `image_notes.value`; +when either discovery answer is no, native editable text remains valid. The +absence of another AI-image job never forces lettering. Explicit no-AI or +editable-only requirements win. Execution follows [`image-generator.md`](./image-generator.md) §7. **Recommendation output**: Write `recommend.image_usage` as one source id or an array for mixed sources. Put the intended communication jobs of each proposed source, authoritative assets, preferred/avoided imagery, and placeholder tolerance in `image_notes.value`. When `ai` is proposed, explain in editable natural language how generated visuals are expected to contribute and mention any materially anticipated illustration, illustrated-icon, or lettering role. Keep the note an open strategy—not an enum, carrier allowlist, page-by-page assignment, count, or resource manifest; name exact pages/assets only when already authoritative or required. `none` is exclusive. Decks built around real-world recognition or choice, including travel itineraries, lean `provided` / `web`; generic human-scale topics such as family life, education, wellness, or children lean `ai` when no supplied asset carries the story and invented or stylized expression serves it. Regulated investor decks, B2B finance reports, and data-only dashboards remain eligible for `none` by judgment. @@ -341,9 +343,10 @@ no-AI or editable-only requirements win. Execution follows 1. Before authoring Stage-2 directions, load the workflow's complete fixed planning-capability batch. It includes this module, the image-layout - authorities, all compact choice indexes, the icon-library contract, and the - complete Chart/Table registries. After the three whole-direction intents - exist and their mode/style/rendering reference ids are frozen, read only + authorities, all compact decision maps, the icon-library contract, the + complete Chart and Table expression vocabularies. After the + three whole-direction intents exist and their mode/style/rendering reference + ids are frozen, read only those exact detail siblings once and author one complete custom rendering inside each direction before deciding whether `recommend.image_usage` includes AI. @@ -411,17 +414,18 @@ Classify by information model, never source PowerPoint object type: | Model | Planning action | |---|---| | Qualitative `order`, `link`, `parent`, `membership`, `contrast`, or `overlap` | Preserve units, relationship, and reading path as free §IX prose; no catalog key | -| Values/dates/durations determine geometry | Chart; compare the complete loaded chart registry | -| Row header × column header addresses each fact | Table; compare the complete loaded table registry | +| Values/dates/durations determine geometry | Chart; compare the complete loaded chart expression vocabulary | +| Row header × column header addresses each fact | Table; compare the complete loaded Table expression vocabulary | **Mandatory — relationship handoff**: keep every qualitative relationship in §IX free prose; never serialize grammar atoms, coordinates, or named models. Executor makes the per-page Structure decision at runtime. **Mandatory — complete Chart/Table capability review**: During the same §IX -roster composition, compare every page's information model against every -`Pick` / `Skip` rule in the two already-loaded live registries. The registries -expose the possibility space; they are neither usage quotas nor whitelists. -Skip custom objects and qualitative composition. Retain `no-template-match` -when no registered reference fits. +roster composition, compare every page's information model against every entry +in the already-loaded Chart and Table expression vocabularies. These +complete capability maps expose what can be selected; their descriptions do +not rank candidates or replace judgment from the actual information. They are +neither usage quotas nor whitelists. Skip custom objects and qualitative +composition. Retain `no-template-match` when no registered reference fits. **Selection**: @@ -434,12 +438,12 @@ python3 skills/ppt-master/scripts/visualization_recall.py validate \ / [/ ...] ``` -Correct failed selections by re-reading the complete registries; +Correct failed selections by re-reading the complete vocabulary/registry; `no-template-match` never enters `page_visualizations`. **Section VII selection list**: write `Page | Family | Template | Usage` for each `chart|table` reference; Usage is semantic purpose. Omit empty/no-match detail. Qualitative composition stays in §IX; only Layout/Deck owns reusable PowerPoint structure. -**Native-ready boundary**: Give every independent data chart and pure text-grid table in §IX `Visualization` a unique page-local semantic `kebab-case` key, then write one `Native-ready` map: `=yes|no; ...`. Use `yes` only when an editable native object benefits the confirmed requirement/afterlife. Qualitative shape compositions and incidental microvisuals stay unlisted. +**Native-ready boundary**: Give every independent data chart and pure text-grid table in §IX `Visualization` a unique page-local semantic `kebab-case` key, then write one `Native-ready` map: `=yes|no; ...`. Decide `yes` by default; use `no` only when [`native-data-interface.md`](./native-data-interface.md) §2 cannot express that object. Qualitative shape compositions and incidental microvisuals stay unlisted. ```markdown | Page | Family | Template | Usage | diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/visual-styles/_index.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/visual-styles/_index.md index 73597758..5563eb74 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/visual-styles/_index.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/visual-styles/_index.md @@ -21,7 +21,7 @@ Each style keeps its own authoritative file with: shape & decoration, typography > The **`visual_style` value is only ever a first-column `id`** (`swiss-minimal`, `editorial`, …). The "Paired rendering" column lists **image-rendering** names (`flat`, `minimalist-swiss`, `digital-dashboard`, …) — never treat one of those as the `visual_style`. Default records rendering under confirmation h; Quick keeps the selected rendering only in active context and any required image manifest. > -> The **`Illus.`** column is each style's illustration propensity — `core` (illustration is intrinsic to the look), `supportive` (illustration can share the composition), or `sparse` (use selectively so the style's lead visual remains clear). It tunes centrality and recurrence, never eligible page types, element scale, or carrier combinations. An explicit user request to use / skip illustrations overrides it either way, and `image_usage: none` always writes no illustration rows. Full per-style rule in each file's §6. +> The **`Illus.`** column describes illustration's role only after page-carrier selection activates it — `core` (illustration may lead the look), `supportive` (illustration may share the composition), or `sparse` (illustration stays selective so the style's lead visual remains clear). It tunes selected illustration's centrality and recurrence; it never recommends adding illustration, selects an AI source or image row, or narrows eligible page types, element scale, or carrier combinations. An explicit user request to use / skip illustrations overrides it either way, and `image_usage: none` always writes no illustration rows. Full per-style rule in each file's §6. > > **Typography character applies to editable native text.** Decorative > lettering is a separate carrier decision; a selected style informs its @@ -29,7 +29,7 @@ Each style keeps its own authoritative file with: shape & decoration, typography ### 1.1 Corporate / product -| Visual style | Character | Best for | Paired rendering | Illus. | +| Visual style | Character | Typical context | Paired rendering | Illus. | |---|---|---|---|---| | [`swiss-minimal`](./swiss-minimal.md) | Grid-locked, sharp, aggressive whitespace, near-zero ornament | High-end consulting, architecture, type-led | `minimalist-swiss` | sparse | | [`soft-rounded`](./soft-rounded.md) | Rounded cards, gentle elevation, approachable | Product, SaaS, training, consumer | `flat` | supportive | @@ -39,7 +39,7 @@ Each style keeps its own authoritative file with: shape & decoration, typography ### 1.2 Editorial / publication -| Visual style | Character | Best for | Paired rendering | Illus. | +| Visual style | Character | Typical context | Paired rendering | Illus. | |---|---|---|---|---| | [`editorial`](./editorial.md) | Magazine hierarchy, rules & columns, serif/sans interplay | Finance, journalism, analysis, explainers | `editorial` | supportive | | [`photo-editorial`](./photo-editorial.md) | Full-bleed photography dominates, text points & captions | Architecture, design, fashion, culture, travel / destination, photo-led | `corporate-photo` | sparse | @@ -48,7 +48,7 @@ Each style keeps its own authoritative file with: shape & decoration, typography ### 1.3 Expressive / print -| Visual style | Character | Best for | Paired rendering | Illus. | +| Visual style | Character | Typical context | Paired rendering | Illus. | |---|---|---|---|---| | [`memphis`](./memphis.md) | Clashing color blocks, geometric confetti, bold outlines | Festivals, consumer, youth, launch hype | `flat` | core | | [`zine`](./zine.md) | Riso misregistration, halftone, limited palette, print grit | Culture, design talks, indie brands | `screen-print` | core | @@ -57,7 +57,7 @@ Each style keeps its own authoritative file with: shape & decoration, typography ### 1.4 Hand-drawn / brush -| Visual style | Character | Best for | Paired rendering | Illus. | +| Visual style | Character | Typical context | Paired rendering | Illus. | |---|---|---|---|---| | [`sketch-notes`](./sketch-notes.md) | Warm paper, doodle line work, soft pastel blocks | Education, training, onboarding, knowledge | `sketch-notes` | core | | [`ink-notes`](./ink-notes.md) | Pale field, black hand-ink, sparse semantic accent | Methodology, before/after, manifestos | `ink-notes` | supportive | @@ -66,39 +66,32 @@ Each style keeps its own authoritative file with: shape & decoration, typography ### 1.5 Specialty -| Visual style | Character | Best for | Paired rendering | Illus. | +| Visual style | Character | Typical context | Paired rendering | Illus. | |---|---|---|---|---| | [`pixel-art`](./pixel-art.md) | Strict pixel grid, blocky forms, limited palette, flat | Gaming, retro-tech, nostalgic, game-flavored | `pixel-art` | core | --- -## 2. Selection recall — communication task + content signal → style +## 2. Selection Boundary -**Reference — not a constraint**: Resolve the audience task, outcome, delivery context, required carriers, and artifact afterlife before using this table. A topic or industry word alone never selects a style. Reject a candidate that weakens the audience's practical task or cannot integrate required real-world imagery. A travel itinerary or destination decision aid is not retro merely because its subject is cultural or hospitality-related; choose retro only when nostalgia / heritage storytelling or an explicit user direction makes it part of the communication job. +**Reference — not a constraint**: Resolve the audience task, outcome, delivery +context, required carriers, and artifact afterlife before choosing. Compare the +complete catalog's character, composition language, density, typography, and +texture with the project as a whole. A topic, industry, or style keyword never +selects a row; the same subject may support different visual systems when its +communication job changes. -| Signal | Recommended style | Alternates | -|---|---|---| -| High-end consulting / architecture / luxury / minimal | `swiss-minimal` | `editorial` | -| Finance / journalism / research / long-form analysis | `editorial` | `data-journalism` | -| Photography-led / architecture / design / fashion / 大图 | `photo-editorial` | `editorial` | -| Itinerary / destination guide / trip planning / 旅游计划 / 行程 | `photo-editorial` | `editorial`, `soft-rounded` | -| Data report / market review / 财经 / Bloomberg / Economist | `data-journalism` | `editorial` | -| Product / SaaS / training / consumer / friendly | `soft-rounded` | `editorial` | -| Modern SaaS / fintech / health-tech / premium app | `glassmorphism` | `dark-tech` | -| Tech / AI / dev tools / data / futuristic | `dark-tech` | `glassmorphism` | -| Cultural / philosophy / heritage / 新中式 / 东方 | `ink-wash` | `editorial` | -| Engineering / systems / architecture walkthrough | `blueprint` | `dark-tech` | -| Annual review / manifesto / max-density editorial | `brutalist` | `editorial` | -| Festival / consumer brand / youth / loud launch | `memphis` | `soft-rounded` | -| Indie publishing / design / culture / printed feel | `zine` | `editorial` | -| Heritage brand / historic hospitality identity / retro brand / 老字号 / 周年 | `vintage-poster` | `zine` | -| Cultural / folk / festival / children / sustainability | `paper-cut` | `sketch-notes` | -| Education / training / onboarding / 教学 | `sketch-notes` | `paper-cut` | -| Methodology / before-after / manifesto / 方法论 | `ink-notes` | `editorial` | -| Classroom / tutorial / academic / 课堂 | `chalkboard` | `sketch-notes` | -| Gaming / retro / 8-bit / 复古游戏 | `pixel-art` | `vintage-poster` | +| Decision dimension | Evidence to compare | +|---|---| +| Shape and space | Contour language, grid behavior, whitespace, and boundary strength | +| Information texture | Sparse presence, editorial hierarchy, dense evidence, or hand-made expression | +| Carrier integration | How the system accommodates the page's actual photos, illustrations, charts, tables, and native geometry | +| Typography character | The role editable type plays inside the composition, independent of exact font choice | +| Delivery and afterlife | Viewing distance, projection/print behavior, reuse, and expected editing | -> When the deck has AI images, align style with rendering: a `swiss-minimal` layout reads best with a `minimalist-swiss` rendering, so page and illustrations share one aesthetic. The "Paired rendering" column is the default pairing; override when content demands. +> When the deck has AI images, the "Paired rendering" column exposes an +> aesthetically related option. It does not select the rendering or create an +> AI image job; compare it with the actual image roles before using it. > > Not every image-rendering becomes its own visual style. A rendering earns a layout twin only when it defines a whole-page layout language (shape, whitespace, composition, texture) — not merely how an inserted image looks. Purely atmospheric renderings (`nature`, `warm-scene`, `fantasy-animation`) stay imagery-only: they pair with whichever layout style fits rather than being one. (Note the distinction `photo-editorial` draws: photography as a *rendering* is image-look, but photo-*led composition* is a real layout language — so the style exists, paired with `corporate-photo`.) diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/visual-styles/blueprint.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/visual-styles/blueprint.md index 41df367e..9872a1b7 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/visual-styles/blueprint.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/visual-styles/blueprint.md @@ -35,4 +35,4 @@ Engineering schematic — thin line work on dark blueprint paper, isometric proj ## 6. Illustration propensity -**supportive** — the natural illustration language is schematic line-work, annotated marks, and blueprint-aligned transparent elements, whether authored in SVG or generated and sliced. Choose the carrier that composes cleanly with the page. With no user steer this is the default lean; role, scale, reuse, and placement stay Strategist judgment, an explicit user request wins either way, and `image_usage: none` writes no illustration rows. +**supportive** — when illustration is selected, its natural language is schematic line-work, annotated marks, and blueprint-aligned transparent elements, whether authored in SVG or generated and sliced. Role, scale, reuse, and placement stay Strategist judgment; an explicit user request wins either way, and `image_usage: none` writes no illustration rows. diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/visual-styles/brutalist.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/visual-styles/brutalist.md index e2e7f3eb..743c1988 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/visual-styles/brutalist.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/visual-styles/brutalist.md @@ -36,4 +36,4 @@ Brutalist editorial newspaper. Wall-to-wall small type, irregular column widths, ## 6. Illustration propensity -**supportive** — raw halftone cuts and illustration elements can anchor or disrupt the newsprint composition while structure remains legible. With no user steer this is the default lean; role, scale, reuse, and placement stay Strategist judgment, an explicit user request wins either way, and `image_usage: none` writes no illustration rows. +**supportive** — when illustration is selected, raw halftone cuts and illustration elements can anchor or disrupt the newsprint composition while structure remains legible. Role, scale, reuse, and placement stay Strategist judgment; an explicit user request wins either way, and `image_usage: none` writes no illustration rows. diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/visual-styles/chalkboard.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/visual-styles/chalkboard.md index de568b3c..01466fa9 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/visual-styles/chalkboard.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/visual-styles/chalkboard.md @@ -34,4 +34,4 @@ Classroom chalkboard — a dark slate field, soft chalk-stroke line work, powder ## 6. Illustration propensity -**core** — chalk-drawn marks and doodles are the classroom aesthetic; with no user steer, default to recommending a coherent composable illustration family. Default *lean* only — role, scale, reuse, and placement stay Strategist judgment, an explicit user request wins either way, and `image_usage: none` writes no illustration rows. +**core** — when illustration is selected, chalk-drawn marks and doodles may lead the classroom aesthetic. Role, scale, reuse, and placement stay Strategist judgment; an explicit user request wins either way, and `image_usage: none` writes no illustration rows. diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/visual-styles/editorial.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/visual-styles/editorial.md index b632bea1..52ab6476 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/visual-styles/editorial.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/visual-styles/editorial.md @@ -36,4 +36,4 @@ Magazine-grade hierarchy. Columns, hairline rules, a serif / sans interplay, str ## 6. Illustration propensity -**supportive** — editorial illustration elements can anchor, frame, pace, or clarify a page while typography and evidence retain authority. With no user steer this is the default lean; role, scale, reuse, and placement stay Strategist judgment, an explicit user request wins either way, and `image_usage: none` writes no illustration rows. +**supportive** — when illustration is selected, editorial elements can anchor, frame, pace, or clarify a page while typography and evidence retain authority. Role, scale, reuse, and placement stay Strategist judgment; an explicit user request wins either way, and `image_usage: none` writes no illustration rows. diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/visual-styles/ink-notes.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/visual-styles/ink-notes.md index befe09b0..70d97951 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/visual-styles/ink-notes.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/visual-styles/ink-notes.md @@ -35,4 +35,4 @@ Whiteboard-ink minimalism — a pale field, confident black hand-ink line work, ## 6. Illustration propensity -**supportive** — hand-ink illustration elements can anchor, annotate, or connect a composition while the style's considered restraint remains intact. With no user steer this is the default lean; role, scale, reuse, and placement stay Strategist judgment, an explicit user request wins either way, and `image_usage: none` writes no illustration rows. +**supportive** — when illustration is selected, hand-ink elements can anchor, annotate, or connect a composition while the style's considered restraint remains intact. Role, scale, reuse, and placement stay Strategist judgment; an explicit user request wins either way, and `image_usage: none` writes no illustration rows. diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/visual-styles/ink-wash.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/visual-styles/ink-wash.md index 70c21900..af66172c 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/visual-styles/ink-wash.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/visual-styles/ink-wash.md @@ -34,4 +34,4 @@ New-Chinese ink-wash — a rice-paper field, vast literati whitespace, restraine ## 6. Illustration propensity -**supportive** — brush, seal, or painted illustration elements can anchor or frame a page while stillness and whitespace lead. With no user steer this is the default lean; role, scale, reuse, and placement stay Strategist judgment, an explicit user request wins either way, and `image_usage: none` writes no illustration rows. +**supportive** — when illustration is selected, brush, seal, or painted elements can anchor or frame a page while stillness and whitespace lead. Role, scale, reuse, and placement stay Strategist judgment; an explicit user request wins either way, and `image_usage: none` writes no illustration rows. diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/visual-styles/memphis.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/visual-styles/memphis.md index a1064e2c..8782e0a9 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/visual-styles/memphis.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/visual-styles/memphis.md @@ -35,4 +35,4 @@ Memphis / Pop — clashing color blocks, geometric confetti, bold outlines, 80s- ## 6. Illustration propensity -**core** — bold-outline illustration elements, confetti, and geometric shapes *are* the Memphis language; with no user steer, default to recommending a coherent composable illustration family. Default *lean* only — role, scale, reuse, and placement stay Strategist judgment, an explicit user request wins either way, and `image_usage: none` writes no illustration rows. +**core** — when illustration is selected, bold-outline elements, confetti, and geometric shapes may lead the Memphis language. Role, scale, reuse, and placement stay Strategist judgment; an explicit user request wins either way, and `image_usage: none` writes no illustration rows. diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/visual-styles/paper-cut.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/visual-styles/paper-cut.md index 73544190..b40154d8 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/visual-styles/paper-cut.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/visual-styles/paper-cut.md @@ -34,4 +34,4 @@ Layered paper-craft — scissor-cut shapes stacked in tactile layers, soft shado ## 6. Illustration propensity -**core** — layered cut-paper elements *are* the style, and transparent slices match it natively; with no user steer, default to recommending a coherent composable illustration family. Default *lean* only — role, scale, reuse, and placement stay Strategist judgment, an explicit user request wins either way, and `image_usage: none` writes no illustration rows. +**core** — when illustration is selected, layered cut-paper elements may lead the style, and transparent slices match it natively. Role, scale, reuse, and placement stay Strategist judgment; an explicit user request wins either way, and `image_usage: none` writes no illustration rows. diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/visual-styles/pixel-art.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/visual-styles/pixel-art.md index ba2dab7b..493d7e4d 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/visual-styles/pixel-art.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/visual-styles/pixel-art.md @@ -34,4 +34,4 @@ ## 6. Illustration propensity -**core** — pixel sprites and blocky forms *are* the style; with no user steer, default to recommending a coherent composable illustration family. Default *lean* only — role, scale, reuse, and placement stay Strategist judgment, an explicit user request wins either way, and `image_usage: none` writes no illustration rows. +**core** — when illustration is selected, pixel sprites and blocky forms may lead the style. Role, scale, reuse, and placement stay Strategist judgment; an explicit user request wins either way, and `image_usage: none` writes no illustration rows. diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/visual-styles/sketch-notes.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/visual-styles/sketch-notes.md index 77e187b3..1d4f3a2d 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/visual-styles/sketch-notes.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/visual-styles/sketch-notes.md @@ -34,4 +34,4 @@ Warm hand-drawn sketchnote — soft paper field, black ink doodle line work, gen ## 6. Illustration propensity -**core** — doodles and hand-drawn illustration elements are intrinsic here, not optional garnish; with no user steer, default to recommending a coherent composable illustration family. This sets the default *lean* only: role, scale, reuse, and placement stay Strategist judgment, an explicit user request wins either way, and `image_usage: none` writes no illustration rows. +**core** — when illustration is selected, doodles and hand-drawn elements may lead the style rather than act as incidental garnish. Role, scale, reuse, and placement stay Strategist judgment; an explicit user request wins either way, and `image_usage: none` writes no illustration rows. diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/visual-styles/soft-rounded.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/visual-styles/soft-rounded.md index 84129811..98070ae3 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/visual-styles/soft-rounded.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/visual-styles/soft-rounded.md @@ -35,4 +35,4 @@ Approachable and modern. Rounded cards, gentle elevation, friendly rhythm. For p ## 6. Illustration propensity -**supportive** — friendly rounded illustration elements can carry anchors, support, rhythm, or warmth across the page system. With no user steer this is the default lean; role, scale, reuse, and placement stay Strategist judgment, an explicit user request wins either way, and `image_usage: none` writes no illustration rows. +**supportive** — when illustration is selected, friendly rounded elements can carry anchors, support, rhythm, or warmth across the page system. Role, scale, reuse, and placement stay Strategist judgment; an explicit user request wins either way, and `image_usage: none` writes no illustration rows. diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/visual-styles/vintage-poster.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/visual-styles/vintage-poster.md index 2ddf7432..4f2f74a8 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/visual-styles/vintage-poster.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/visual-styles/vintage-poster.md @@ -34,4 +34,4 @@ Mid-century print poster (1950s–1970s) — bold rounded-geometric shapes, limi ## 6. Illustration propensity -**core** — mid-century illustration motifs and halftone cuts are intrinsic to the poster look; with no user steer, default to recommending a coherent composable illustration family. Default *lean* only — role, scale, reuse, and placement stay Strategist judgment, an explicit user request wins either way, and `image_usage: none` writes no illustration rows. +**core** — when illustration is selected, mid-century motifs and halftone cuts may lead the poster look. Role, scale, reuse, and placement stay Strategist judgment; an explicit user request wins either way, and `image_usage: none` writes no illustration rows. diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/visual-styles/zine.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/visual-styles/zine.md index e3c3cf1e..3d732d4b 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/visual-styles/zine.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/visual-styles/zine.md @@ -35,4 +35,4 @@ Risograph zine / DIY poster — misregistered color layers, halftone dots, a tig ## 6. Illustration propensity -**core** — riso / halftone illustration and cutout imagery is part of the zine's print grit; with no user steer, default to recommending a coherent composable illustration family. Default *lean* only — role, scale, reuse, and placement stay Strategist judgment, an explicit user request wins either way, and `image_usage: none` writes no illustration rows. +**core** — when illustration is selected, riso / halftone elements and cutout imagery may lead the zine's print grit. Role, scale, reuse, and placement stay Strategist judgment; an explicit user request wins either way, and `image_usage: none` writes no illustration rows. diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/README.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/README.md index 864ff20a..2329639d 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/README.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/README.md @@ -55,7 +55,7 @@ python3 scripts/update_repo.py | SVG pipeline | `preset_shape_svg.py`, `shape_boolean_svg.py`, `svg_authoring_view.py`, `compact_svg_coordinates.py`, `mirror_template_materialize.py`, `finalize_svg.py`, `svg_to_pptx.py`, `template_preview_pptx.py`, `total_md_split.py`, `svg_quality_checker.py`, `extract_svg_assets.py`, `extract_svg_pictures.py`, `animation_config.py`, `notes_to_audio.py`, `narration_sync.py` | [docs/svg-pipeline.md](./docs/svg-pipeline.md); [native shape authoring](../references/native-shape-authoring.md) | | PPTX transitions | `pptx_transitions.py` | [docs/pptx-transitions.md](./docs/pptx-transitions.md) | | PPTX animations | `pptx_animations.py`, `animation_config.py` | [docs/pptx-animations.md](./docs/pptx-animations.md) | -| Animation resources | `sound_sync.py` | [sound catalog](../templates/sounds/README.md); [docs/pptx-animations.md](./docs/pptx-animations.md) | +| Animation resources | `sound_sync.py` | [sound vocabulary and sync](../templates/sounds/README.md); [docs/pptx-animations.md](./docs/pptx-animations.md) | | Spec maintenance | `update_spec.py`, `visualization_recall.py`; legacy `chart_recall.py` | [docs/update_spec.md](./docs/update_spec.md); [docs/visualization-recall.md](./docs/visualization-recall.md) | | Image tools | `image_gen.py`, `image_treat.py`, `analyze_images.py`, `gemini_watermark_remover.py` | [docs/image.md](./docs/image.md) | | Maintenance smokes | Inline temporary-project commands | [advanced image and motion](./docs/advanced-image-motion-smoke.md); [mask and gradient](./docs/mask-gradient-smoke.md); [multilingual text](./docs/multilingual-text-smoke.md) | @@ -197,9 +197,7 @@ python3 scripts/pptx_delivery_check.py Native preset shape authoring (one or more registry-backed fragments on stdout): ```bash -python3 scripts/preset_shape_svg.py list --grouped -python3 scripts/preset_shape_svg.py recommend --compact --role spine --relationship order \ - --directionality horizontal --aspect wide --limit 6 +python3 scripts/preset_shape_svg.py list --search arrow python3 scripts/preset_shape_svg.py describe rightArrow --compact python3 scripts/preset_shape_svg.py render rightArrow --id process-arrow --frame 120 180 240 96 --fill '#2563EB' python3 scripts/preset_shape_svg.py render-batch --input - <<'JSON' @@ -211,23 +209,16 @@ python3 scripts/preset_shape_svg.py render-batch --input - <<'JSON' JSON ``` -`list --grouped` is the compact entry index: it organizes the exact 187-name -registry under the official Office gallery categories, then exposes semantic -groups, scopes, one-line intent summaries, and grouped preset names. Full match -reasons, intended uses, and misuse boundaries remain page-local in `recommend` -and `describe` instead of being repeated in the mandatory discovery output. -`recommend` recalls candidates from page-job criteria; its default `general` -scope excludes literal-only symbols, flowchart notation, and action controls. -Its result is neither a whitelist nor an automatic selection. -`recommend --compact` keeps criteria, counts, selection note, and each -candidate's preset, scope, literal boundary, intent, match reasons, and misuse -boundaries; plain `recommend` preserves the full payload. The -`describe --compact` view returns one flat object with semantic boundaries, -adjustments, connection/text facts, and path count. Plain `describe` preserves -the full nested geometry/semantics payload. A zero-match recommendation is -valid JSON with exit code 0 so the caller can relax its criteria; a zero-match -`list --search` remains a failed lookup with exit code 1. Plain -`list [--search QUERY]` remains the compatibility name view. +Runtime capability discovery reads +[`preset-shape-vocabulary.md`](../references/preset-shape-vocabulary.md), which +lists all 187 exact names by Office category and objective contour family. +`list [--search QUERY]` and `list --grouped [--search QUERY]` remain optional +location views; they do not replace the complete vocabulary. +`describe --compact` returns the selected preset's objective identity, Office +category, family, scope, literal boundary, adjustments, connector/path facts, +connection sites, and text-rectangle availability. Plain `describe` preserves +the full nested semantics payload. A zero-match `list --search` remains +a failed lookup with exit code 1. The helper never writes a page or project file. Select one exact semantic stock-shape match, inspect the emitted fragment, and insert it into the diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/attribution_guard.py b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/attribution_guard.py index d43cb2be..023199aa 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/attribution_guard.py +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/attribution_guard.py @@ -6,10 +6,10 @@ Fail closed when the distributed Skill attribution bundle or its execution gates are missing or modified. Usage: - python3 scripts/attribution_guard.py + python3 "/scripts/attribution_guard.py" Examples: - python3 scripts/attribution_guard.py + python3 "/opt/agent-skills/ppt-master/scripts/attribution_guard.py" Dependencies: None (only uses standard library) @@ -52,7 +52,7 @@ _REQUIRED_GATE_FILES = ( "scripts/register_template.py", "scripts/template_preview_pptx.py", ) -_SKILL_GATE_MARKER = "python3 scripts/attribution_guard.py" +_SKILL_GATE_MARKER = 'python3 "${SKILL_DIR}/scripts/attribution_guard.py"' _SECONDARY_GATE_FILE = "scripts/console_encoding.py" _SECONDARY_GATE_NAME = "_require_official_distribution_identity" diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/docs/prompt_audit.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/docs/prompt_audit.md index 66ba9125..cc6ffdf8 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/docs/prompt_audit.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/docs/prompt_audit.md @@ -24,7 +24,7 @@ Exit code `1` on any deterministic error. An unaccepted exact duplicate or schem | Corpus and hot-file token ceilings | error on budget overflow | | Declared load sets (route/stage scenarios) | error on budget overflow, unknown files, selector/registry drift | | Load coverage | error when a corpus file is in no load set and has no `coverage.exempt` entry | -| Registry claims (layout patterns, modes, styles, renderings, types, charts) | error on ID/count/index drift | +| Registry claims and declared vocabulary projections | error on ID/count/index/projection drift | | Markdown references and declared authority edges | error on broken links or unreferenced edges | | Cross-file exact duplicates | warning until adjudicated via `duplicates.accepted` | | Cross-file near duplicates | informational candidates in the report; no finding | @@ -38,6 +38,7 @@ The manifest is audit-only (`audit_only: true`, `runtime_consumed: false`); it i - **New corpus file** → when no existing category exemption matches it, the audit fails with `LOAD_COVERAGE_GAP` until you add it to the load sets that read it or exempt it with a one-line reason. Exempt only material that never enters role context (for example, a legacy tombstone, generated maintenance asset, maintainer-only doc, or license notice); represent conditional runtime reads as incremental load sets. - **Intentional exact duplicate** → run `--json`, copy the candidate's `kind`, `fingerprint`, and `paths` into `duplicates.accepted` with a reason. The acceptance identity is all three values, so separate path pairs with identical prose remain independently reviewable. Editing either reported raw block changes its fingerprint; stale acceptance fails with `DUPLICATE_ACCEPTED_STALE`. - **Near duplicate** → inspect `duplicates.near` as heuristic maintenance information. It produces no warning. A maintainer may still record a stable intentional pair in `duplicates.accepted`; `--skip-near-duplicates` deliberately leaves accepted near pairs unchecked because that scan did not run. +- **Registry projection** → declare `projection.source` plus an `entry_pattern` with a named `id` group on the canonical registry entry. For a JSON list registry, also declare `id_field` to identify each item's stable id. The audit requires the projected ids to match the registry exactly and rejects duplicates, missing ids, and extra ids. - **Schema owner** → every configured field must have a field-local definition signal in its declared owner. Split fields into separate owner entries when they belong to different artifacts. Generic `key` / `value` prose elsewhere on a long line is not a grammar signal; explicit assignments, field-local grammar/format language, and forms such as `field ... one of ...` are. - **Intentional schema projection** → run `--json`, then copy the field's `owner_fingerprint` and each reviewed projection's `path` / `fingerprint` into that `schema_grammars[]` entry. Classify every projection as `producer`, `consumer`, `reference`, or `compatibility`, and record a one-line reason: diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/docs/svg-pipeline.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/docs/svg-pipeline.md index 73def5c1..c165b43e 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/docs/svg-pipeline.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/docs/svg-pipeline.md @@ -691,7 +691,7 @@ Behavior: supplies the default gap between successive non-trigger-shape rows in `after-previous` mode (default `0.5`) - Optional object-level overrides live in `/animations.json` or a path passed via `--animation-config`; build and validate them with `animation_config.py scaffold|validate`. The scaffold is neutral (`defaults.animation.effect: none`, untouched groups `{}`). A populated group uses either the fully compatible legacy single-effect fields or a non-empty `effects[]`, never both; every `effects[]` row names an explicit effect -- Transition/object sound remains off by default. After SVG and visual motion are complete, discover bundled ids with `sound_sync.py list [--query ]` and copy only selected ids with `sound_sync.py / [...]`. `transition.sound` references a project-relative `.wav`; object-animation `sound` accepts the existing `.m4a`/`.mp3`/`.wav` path contract, while bundled selections use the synced project-relative `.wav`. With no selected cue, do not create `/sounds/`. Export never resolves ids or reads `templates/sounds/` directly +- Transition/object sound remains off by default. After SVG and visual motion are complete and one row has a concrete auditory job, read the complete [`sound-vocabulary.md`](../../templates/sounds/sound-vocabulary.md), then copy only selected ids with `sound_sync.py / [...]`; `list --query ` is optional exact filtering after that review. `transition.sound` references a project-relative `.wav`; object-animation `sound` accepts the existing `.m4a`/`.mp3`/`.wav` path contract, while bundled selections use the synced project-relative `.wav`. With no selected cue, do not create `/sounds/`. Export never resolves ids or reads `templates/sounds/` directly - One `effects[]` row becomes one Animation Pane record on the group's shape target. Each row may independently set sequence `order`, `delay`, `duration`, `trigger`, and `trigger_shape`; ordinary rows use page-wide order, while `trigger_shape` rows keep relative order in separate interactive sequences and imply `on-click` - Animation configuration is strict: unknown effects/modes/triggers, invalid finite/range/order values, missing slides/groups, and structural-layer targets fail export without fallback or silent omission - Generated export reads every slide back and verifies animation row order, including repeated rows on one shape target, trigger, shape target, resolved effect tuple and native behavior signature, duration, and offset. Package validation then checks timing placement, `p:cTn` ids, and `p:spTgt` references before publication diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/docs/visualization-recall.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/docs/visualization-recall.md index 1f4d794a..30bb951a 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/docs/visualization-recall.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/docs/visualization-recall.md @@ -1,14 +1,17 @@ # Visualization Candidate Recall -Default Strategist and the Quick Generate main agent read both complete compact -registries before planning. `visualization_recall.py validate` resolves their -selected canonical references. Its `recall` command remains an optional -deterministic diagnostic across the same live Chart and Table registries; it is -not the runtime capability-discovery gate and cannot replace the complete -registry review. The tool reads these indexes on every invocation and maintains -no second category or keyword index: +Default Strategist and the Quick Generate main agent read the complete Chart +and Table expression vocabularies before planning. +`visualization_recall.py validate` resolves their selected canonical +references. Its `recall` command remains an optional deterministic diagnostic +across the machine Chart and Table registries; it is not the runtime +capability-discovery gate and cannot replace the complete planning review. The +tool reads these indexes on every invocation and maintains no second category +or keyword index: +- `templates/charts/chart-vocabulary.md` — planning capability map, not read by this tool - `templates/charts/charts_index.json` +- `templates/tables/table-vocabulary.md` — planning capability map, not read by this tool - `templates/tables/tables_index.json` Qualitative Structure does not enter recall. Default records its relationship @@ -35,11 +38,10 @@ boundary certain; the default `all` preserves unified Chart/Table recall. `tail`, `head`, `grep`, or another truncator can discard higher-ranked candidates. `confidence` reports lexical strength only and never decides fit. -At `high` / `medium`, retain `no-template-match` when none fits. At `low` / -`none`, select a fitting bounded candidate directly; otherwise rerun the same -command once with `--semantic-fallback` to inspect its diagnostic payload. The -runtime owner still bases selection on the complete registries already loaded -before planning. +At any confidence, compare the diagnostic candidates against the complete +planning maps already loaded. `--semantic-fallback` only exposes another +diagnostic payload; it never requires a selection. Retain `no-template-match` +when none fits. | Field | Contract | |---|---| @@ -84,8 +86,9 @@ it without catalog lookup. ## Selection boundary -- Runtime selection comes from the complete loaded registries; recall output is - optional diagnostic evidence, while `validate` resolves positive selections. +- Runtime selection comes from the complete loaded Chart vocabulary and Table + registry; recall output is optional diagnostic evidence, while `validate` + resolves positive selections. - Default records `Page | Family | Template | Usage` for each positive selection and projects `family/key` into `page_visualizations`. - Usage is one concise page-local purpose; detailed adaptation remains in §IX. diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/pptx_shapes/semantics.py b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/pptx_shapes/semantics.py index 75e7f2c4..a941005f 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/pptx_shapes/semantics.py +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/pptx_shapes/semantics.py @@ -83,9 +83,6 @@ SEMANTIC_TEXT_CAPACITIES = ("none", "short", "medium", "high") SEMANTIC_VISUAL_WEIGHTS = ("quiet", "moderate", "strong", "emblematic") SEMANTIC_SCOPES = ("general", "literal", "flowchart", "navigation") -_TEXT_CAPACITY_RANK = { - value: index for index, value in enumerate(SEMANTIC_TEXT_CAPACITIES) -} _QUERY_TOKEN_RE = re.compile(r"[a-z0-9]+") _CAMEL_BOUNDARY_RE = re.compile(r"(?<=[a-z0-9])(?=[A-Z])") _QUERY_STOP_WORDS = frozenset({ @@ -143,18 +140,15 @@ class PresetShapeSemantics: groups = _require_list(root.get("groups"), "catalog.groups") self._groups: list[dict[str, object]] = [] self._preset_semantics: dict[str, dict[str, object]] = {} - self._group_order: dict[str, int] = {} - self._preset_order = { - name: index for index, name in enumerate(expected_names) - } + group_ids: set[str] = set() for index, raw_group in enumerate(groups): group = self._normalize_group(raw_group, index) group_id = str(group["id"]) - if group_id in self._group_order: + if group_id in group_ids: raise PresetShapeDataError( f"Duplicate preset semantic group: {group_id!r}" ) - self._group_order[group_id] = index + group_ids.add(group_id) self._groups.append(group) presets = group["presets"] assert isinstance(presets, dict) @@ -274,115 +268,6 @@ class PresetShapeSemantics: "office_categories": category_payloads, } - def recommend( - self, - *, - roles: Sequence[str], - scope: str = "general", - relationships: Sequence[str] = (), - directionality: str | None = None, - aspect: str | None = None, - text_capacity: str | None = None, - visual_weight: str | None = None, - query: str = "", - limit: int = 12, - ) -> dict[str, object]: - """Return a diverse, semantics-matched candidate recall set.""" - - query_tokens = _query_tokens(query) - candidates: list[dict[str, object]] = [] - for details in self._preset_semantics.values(): - if scope != "all" and details["scope"] != scope: - continue - - role_matches = [role for role in roles if role in details["roles"]] - if not role_matches: - continue - relationship_matches = [ - relationship - for relationship in relationships - if relationship in details["relationships"] - ] - if relationships and not relationship_matches: - continue - if directionality and directionality not in details["directionality"]: - continue - if aspect and not _aspect_matches(details["aspects"], aspect): - continue - if text_capacity and not _capacity_matches( - str(details["text_capacity"]), - text_capacity, - ): - continue - if visual_weight and details["visual_weight"] != visual_weight: - continue - - query_score = _query_score(details, query_tokens, query) - if query_tokens and query_score == 0: - continue - score = ( - len(role_matches) * 20 - + len(relationship_matches) * 12 - + (5 if directionality else 0) - + (4 if aspect else 0) - + (3 if text_capacity else 0) - + (2 if visual_weight else 0) - + query_score - ) - why = [f"role={value}" for value in role_matches] - why.extend( - f"relationship={value}" for value in relationship_matches - ) - if directionality: - why.append(f"directionality={directionality}") - if aspect: - why.append(f"aspect={aspect}") - if text_capacity: - why.append(f"text_capacity>={text_capacity}") - if visual_weight: - why.append(f"visual_weight={visual_weight}") - if query_tokens: - why.append(f"query={query}") - candidates.append({ - "score": score, - "preset": details["preset"], - "office_category": { - "id": details["office_category"], - "label": details["office_category_label"], - }, - "group": details["id"], - "scope": details["scope"], - "intent": details["intent"], - "why": why, - "recommended_for": details["recommended_for"], - "avoid_for": details["avoid_for"], - "literal_only": details["literal_only"], - }) - - ordered = self._diverse_order(candidates) - return { - "criteria": { - "roles": list(roles), - "scope": scope, - "relationships": list(relationships), - "directionality": directionality, - "aspect": aspect, - "text_capacity": text_capacity, - "visual_weight": visual_weight, - "query": query, - }, - "candidate_count": len(candidates), - "returned_count": min(len(ordered), limit), - "selection_note": ( - "Candidate recall only. Compare contour, content fit, and avoid_for " - "before choosing; this is neither a whitelist nor an automatic choice." - if ordered - else "No candidates matched. This is a valid recall result; relax or " - "change the criteria before selecting a contour." - ), - "candidates": ordered[:limit], - } - def _normalize_group( self, raw_group: object, @@ -543,34 +428,6 @@ class PresetShapeSemantics: "presets": normalized_presets, } - def _diverse_order( - self, - candidates: list[dict[str, object]], - ) -> list[dict[str, object]]: - candidates.sort( - key=lambda item: ( - -int(item["score"]), - self._group_order[str(item["group"])], - self._preset_order[str(item["preset"])], - ) - ) - ordered: list[dict[str, object]] = [] - scores = sorted({int(item["score"]) for item in candidates}, reverse=True) - for score in scores: - score_items = [item for item in candidates if item["score"] == score] - first_by_group: list[dict[str, object]] = [] - remaining: list[dict[str, object]] = [] - seen_groups: set[str] = set() - for item in score_items: - group_id = str(item["group"]) - target = first_by_group if group_id not in seen_groups else remaining - target.append(item) - seen_groups.add(group_id) - ordered.extend(first_by_group) - ordered.extend(remaining) - return ordered - - @lru_cache(maxsize=1) def get_preset_shape_semantics() -> PresetShapeSemantics: """Return the process-wide, lazily loaded bundled semantic catalog.""" @@ -684,33 +541,3 @@ def _matches_query(details: dict[str, object], query_tokens: Sequence[str]) -> b return True haystack = _search_text(details) return all(token in haystack for token in query_tokens) - - -def _query_score( - details: dict[str, object], - query_tokens: Sequence[str], - query: str, -) -> int: - if not query_tokens: - return 0 - haystack = _search_text(details) - matches = sum(1 for token in query_tokens if token in haystack) - if matches == 0: - return 0 - score = matches * 4 - normalized_query = " ".join(_query_tokens(query)) - if normalized_query and normalized_query in haystack: - score += 10 - preset = str(details["preset"]) - if query.casefold() == preset.casefold(): - score += 20 - return score - - -def _aspect_matches(values: object, requested: str) -> bool: - assert isinstance(values, tuple) - return requested in values or "flexible" in values - - -def _capacity_matches(actual: str, requested: str) -> bool: - return _TEXT_CAPACITY_RANK[actual] >= _TEXT_CAPACITY_RANK[requested] diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/preset_shape_svg.py b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/preset_shape_svg.py index fc16e7a7..faf8e097 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/preset_shape_svg.py +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/preset_shape_svg.py @@ -2,21 +2,18 @@ """ PPT Master - Preset Shape SVG Fragment Tool -Browse and recommend DrawingML presets, or print compact canonical -native-preset SVG groups to stdout for manual insertion into a hand-authored -page or template. +Browse and inspect DrawingML presets, or print compact canonical native-preset +SVG groups to stdout for manual insertion into a hand-authored page or +template. Usage: python3 scripts/preset_shape_svg.py list [--grouped] [--search QUERY] python3 scripts/preset_shape_svg.py describe PRESET [--compact] - python3 scripts/preset_shape_svg.py recommend --role ROLE [options] [--compact] python3 scripts/preset_shape_svg.py render PRESET --id ID --frame X Y W H python3 scripts/preset_shape_svg.py render-batch --input FILE_OR_DASH Examples: - python3 scripts/preset_shape_svg.py list --grouped - python3 scripts/preset_shape_svg.py recommend --role spine \ - --relationship order --directionality horizontal --compact + python3 scripts/preset_shape_svg.py list --search arrow python3 scripts/preset_shape_svg.py describe rightArrow --compact python3 scripts/preset_shape_svg.py render rightArrow --id next-step \ --frame 160 210 320 112 --fill "#2563EB" --stroke none @@ -36,16 +33,7 @@ from typing import Sequence from console_encoding import configure_utf8_stdio from pptx_shapes import CONNECTOR_PRESET_TYPES, get_preset_registry -from pptx_shapes.semantics import ( - SEMANTIC_ASPECTS, - SEMANTIC_DIRECTIONALITY, - SEMANTIC_RELATIONSHIPS, - SEMANTIC_ROLES, - SEMANTIC_SCOPES, - SEMANTIC_TEXT_CAPACITIES, - SEMANTIC_VISUAL_WEIGHTS, - get_preset_shape_semantics, -) +from pptx_shapes.semantics import get_preset_shape_semantics from pptx_to_svg.preset_authoring import render_preset_shape_fragment @@ -103,82 +91,14 @@ def build_parser() -> argparse.ArgumentParser: describe_parser = subparsers.add_parser( "describe", - help="Print preset geometry and semantic metadata as JSON.", + help="Print preset geometry and identity metadata as JSON.", ) describe_parser.add_argument("preset", help="DrawingML preset name.") describe_parser.add_argument( "--compact", action="store_true", help=( - "Print one flat selection view with semantic boundaries and key " - "geometry facts." - ), - ) - - recommend_parser = subparsers.add_parser( - "recommend", - help="Recall semantically matched preset candidates as JSON.", - ) - recommend_parser.add_argument( - "--role", - action="append", - required=True, - choices=SEMANTIC_ROLES, - help="Required page role; repeat to allow multiple roles.", - ) - recommend_parser.add_argument( - "--relationship", - action="append", - default=[], - choices=SEMANTIC_RELATIONSHIPS, - help="Required relationship fit; repeat to allow alternatives.", - ) - recommend_parser.add_argument( - "--scope", - choices=("all", *SEMANTIC_SCOPES), - default="general", - help=( - "Semantic scope. The general default excludes literal-only, " - "flowchart, and navigation shapes." - ), - ) - recommend_parser.add_argument( - "--directionality", - choices=SEMANTIC_DIRECTIONALITY, - help="Required direction or route character.", - ) - recommend_parser.add_argument( - "--aspect", - choices=SEMANTIC_ASPECTS, - help="Required frame tendency; flexible candidates also match.", - ) - recommend_parser.add_argument( - "--text-capacity", - choices=SEMANTIC_TEXT_CAPACITIES, - help="Minimum useful text capacity.", - ) - recommend_parser.add_argument( - "--visual-weight", - choices=SEMANTIC_VISUAL_WEIGHTS, - help="Required visual-weight band.", - ) - recommend_parser.add_argument( - "--query", - default="", - help="Optional English intent terms used to refine the recall set.", - ) - recommend_parser.add_argument( - "--limit", - type=_positive_integer, - default=12, - help="Maximum returned candidates; default: 12.", - ) - recommend_parser.add_argument( - "--compact", - action="store_true", - help=( - "Print a reduced recall view for direct inspection without " - "downstream parsing." + "Print one flat objective identity view with key geometry facts." ), ) @@ -330,9 +250,11 @@ def main(argv: Sequence[str] | None = None) -> int: payload = ( { "preset": definition.name, - "intent": semantics["intent"], - "recommended_for": semantics["recommended_for"], - "avoid_for": semantics["avoid_for"], + "identity": semantics["intent"], + "office_category": semantics["office_category_label"], + "family": semantics["label"], + "scope": semantics["scope"], + "literal_only": semantics["literal_only"], "adjustments": adjustments, "connector_preset": connector_preset, "path_count": path_count, @@ -345,42 +267,6 @@ def main(argv: Sequence[str] | None = None) -> int: print(json.dumps(payload, ensure_ascii=False, indent=2)) return 0 - if args.command == "recommend": - full_payload = get_preset_shape_semantics().recommend( - roles=args.role, - scope=args.scope, - relationships=args.relationship, - directionality=args.directionality, - aspect=args.aspect, - text_capacity=args.text_capacity, - visual_weight=args.visual_weight, - query=args.query, - limit=args.limit, - ) - payload = ( - { - "criteria": full_payload["criteria"], - "candidate_count": full_payload["candidate_count"], - "returned_count": full_payload["returned_count"], - "selection_note": full_payload["selection_note"], - "candidates": [ - { - "preset": candidate["preset"], - "scope": candidate["scope"], - "literal_only": candidate["literal_only"], - "intent": candidate["intent"], - "why": candidate["why"], - "avoid_for": candidate["avoid_for"], - } - for candidate in full_payload["candidates"] - ], - } - if args.compact - else full_payload - ) - print(json.dumps(payload, ensure_ascii=False, indent=2)) - return 0 - if args.command == "render-batch": try: items = _read_batch_items(args.input) @@ -427,16 +313,6 @@ def _parse_adjustments(values: Sequence[str]) -> dict[str, str]: return adjustments -def _positive_integer(value: str) -> int: - try: - number = int(value) - except ValueError as exc: - raise argparse.ArgumentTypeError("expected a positive integer") from exc - if number < 1: - raise argparse.ArgumentTypeError("expected a positive integer") - return number - - def _style_from_args(args: argparse.Namespace) -> dict[str, str]: return _style_from_values( fill=args.fill, diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/prompt_audit.py b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/prompt_audit.py index 94b53786..5d77d9f6 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/prompt_audit.py +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/prompt_audit.py @@ -1170,12 +1170,91 @@ def _registry_ids( if isinstance(value, dict): return set(value), source, [], None if isinstance(value, list): + id_field = config.get("id_field") + if id_field is not None: + if not isinstance(id_field, str) or not id_field: + raise AuditError( + f"Registry {config.get('name')} id_field must be a non-empty string" + ) + matched_ids: list[str] = [] + for index, item in enumerate(value): + if not isinstance(item, dict): + raise AuditError( + f"Registry {config.get('name')} item {index} is not an object" + ) + item_id = item.get(id_field) + if not isinstance(item_id, str) or not item_id.strip(): + raise AuditError( + f"Registry {config.get('name')} item {index} has no " + f"non-empty {id_field!r}" + ) + matched_ids.append(item_id.strip()) + duplicates = sorted( + item + for item, count in Counter(matched_ids).items() + if count > 1 + ) + return set(matched_ids), source, duplicates, matched_ids return set(range(len(value))), source, [], None raise AuditError(f"Registry key {key} in {source} is not a collection") + if kind == "line_collection": + values = [ + line.strip() + for line in _read_utf8(root / source).splitlines() + if line.strip() + ] + duplicates = sorted( + item for item, count in Counter(values).items() if count > 1 + ) + return set(values), source, duplicates, values + raise AuditError(f"Unsupported registry kind: {kind}") +def _registry_projection_ids( + root: Path, + registry_name: str, + config: dict[str, Any], +) -> tuple[set[str], str, list[str]] | None: + """Extract one declared Markdown projection of canonical registry ids.""" + projection = config.get("projection") + if projection is None: + return None + if not isinstance(projection, dict): + raise AuditError( + f"Registry {registry_name} projection must be an object" + ) + source = projection.get("source") + if not isinstance(source, str) or not (root / source).is_file(): + raise AuditError( + f"Registry {registry_name} projection has missing source: {source}" + ) + pattern = projection.get("entry_pattern") + if not isinstance(pattern, str): + raise AuditError( + f"Registry {registry_name} projection needs entry_pattern" + ) + try: + regex = re.compile(pattern, re.MULTILINE) + except re.error as exc: + raise AuditError( + f"Invalid registry projection entry_pattern: {exc}" + ) from exc + if "id" not in regex.groupindex: + raise AuditError( + f"Registry {registry_name} projection entry_pattern needs an id group" + ) + matched_ids = [ + match.group("id") + for match in regex.finditer(_read_utf8(root / source)) + ] + duplicates = sorted( + item for item, count in Counter(matched_ids).items() if count > 1 + ) + return set(matched_ids), source, duplicates + + def _registry_count_claims(paragraph: Paragraph, nouns: list[str]) -> list[int]: noun_pattern = "|".join(re.escape(noun) for noun in nouns) patterns = ( @@ -1218,6 +1297,38 @@ def audit_registries( path=source, ) ) + projection = _registry_projection_ids(root, name, config) + projection_source: str | None = None + projection_ids: set[str] | None = None + projection_duplicates: list[str] = [] + if projection is not None: + projection_ids, projection_source, projection_duplicates = projection + for duplicate_id in projection_duplicates: + findings.append( + Finding( + severity="error", + code="REGISTRY_PROJECTION_ID_DUPLICATE", + message=( + f"{name} projection repeats id {duplicate_id!r}" + ), + path=projection_source, + ) + ) + canonical_ids = {str(item) for item in ids} + missing_ids = sorted(canonical_ids - projection_ids) + extra_ids = sorted(projection_ids - canonical_ids) + if missing_ids or extra_ids: + findings.append( + Finding( + severity="error", + code="REGISTRY_PROJECTION_MISMATCH", + message=( + f"{name} projection differs from its registry; " + f"missing={missing_ids}, extra={extra_ids}" + ), + path=projection_source, + ) + ) expected_order: list[str] | None = None expected_ids: set[str] | None = None if config.get("kind") == "structured_markdown": @@ -1446,6 +1557,15 @@ def audit_registries( "expected_entries": len(expected_ids) if expected_ids is not None else None, "index_labels": index_labels, "index_targets": index_targets, + "projection": ( + { + "source": projection_source, + "entries": len(projection_ids), + "duplicate_ids": projection_duplicates, + } + if projection_ids is not None + else None + ), "claims": sorted(claims, key=lambda item: (item["path"], item["line"])), } ) diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/prompt_audit_manifest.json b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/prompt_audit_manifest.json index ce6978d2..21109074 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/prompt_audit_manifest.json +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/prompt_audit_manifest.json @@ -30,13 +30,17 @@ "skills/ppt-master/references/shared-standards.md": 500, "skills/ppt-master/references/shared-standards-core.md": 13000, "skills/ppt-master/references/svg-effects.md": 15000, - "skills/ppt-master/references/native-data-interface.md": 6750, + "skills/ppt-master/references/native-data-interface.md": 7500, "skills/ppt-master/references/pptx-structure-interface.md": 4750, + "skills/ppt-master/references/preset-shape-vocabulary.md": 2750, "skills/ppt-master/references/strategist.md": 18000, "skills/ppt-master/references/strategist-image.md": 3250, "skills/ppt-master/references/strategist-template.md": 3000, "skills/ppt-master/templates/design_spec_reference.md": 3750, "skills/ppt-master/templates/spec_lock_reference.md": 2750, + "skills/ppt-master/templates/charts/chart-vocabulary.md": 1250, + "skills/ppt-master/templates/tables/table-vocabulary.md": 500, + "skills/ppt-master/templates/sounds/sound-vocabulary.md": 6250, "skills/ppt-master/workflows/generate-pptx.md": 18000, "skills/ppt-master/workflows/stages/apply-template-workspace.md": 3500 }, @@ -154,7 +158,7 @@ "max_tokens": 14000 }, "route.generate.planning": { - "description": "Generate-PPTX planning through Strategist, including the fixed capability-decision batch, complete compact Chart/Table registries, and a conservative audit envelope for only the exact custom bases selected afterward; schemas and optional scaffolds are tool-consumed. Ceiling raised after BUDGET_LOAD_SET reported 116384 tokens.", + "description": "Generate-PPTX planning through Strategist, including the fixed capability-decision batch, complete Chart and Table expression vocabularies, and a conservative audit envelope for only the exact custom bases selected afterward; schemas and optional scaffolds are tool-consumed. Ceiling raised after BUDGET_LOAD_SET reported 116384 tokens.", "scope": "cumulative", "include": [ "bootstrap.routing" @@ -174,8 +178,8 @@ "skills/ppt-master/references/image-renderings/_index.md", "skills/ppt-master/scripts/docs/confirm_ui.md", "skills/ppt-master/templates/icons/README.md", - "skills/ppt-master/templates/charts/charts_index.json", - "skills/ppt-master/templates/tables/tables_index.json", + "skills/ppt-master/templates/charts/chart-vocabulary.md", + "skills/ppt-master/templates/tables/table-vocabulary.md", { "glob": "skills/ppt-master/references/modes/*.md", "exclude": [ @@ -218,6 +222,7 @@ "skills/ppt-master/references/shared-standards-core.md", "skills/ppt-master/references/svg-effects.md", "skills/ppt-master/references/native-shape-authoring.md", + "skills/ppt-master/references/preset-shape-vocabulary.md", "skills/ppt-master/references/semantic-svg.md", "skills/ppt-master/references/executor-structure.md", "skills/ppt-master/references/canvas-formats.md", @@ -227,8 +232,8 @@ "skills/ppt-master/references/visual-styles/_index.md", "skills/ppt-master/references/image-renderings/_index.md", "skills/ppt-master/templates/icons/README.md", - "skills/ppt-master/templates/charts/charts_index.json", - "skills/ppt-master/templates/tables/tables_index.json", + "skills/ppt-master/templates/charts/chart-vocabulary.md", + "skills/ppt-master/templates/tables/table-vocabulary.md", { "glob": "skills/ppt-master/references/modes/*.md", "exclude": [ @@ -378,7 +383,7 @@ "max_tokens": 130000 }, "route.generate.quick-generate.visualization": { - "description": "Quick Generate with complete Chart/Table registries already in the fixed planning context, their data-object branches, optional native-data metadata, and chart-coordinate verification before the final checker; the fixed Quick context already carries Shape Composition Grammar. Ceiling raised after BUDGET_LOAD_SET reported 126726 tokens.", + "description": "Quick Generate with complete Chart/Table expression vocabularies already in the fixed planning context, their data-object branches, optional native-data metadata, and chart-coordinate verification before the final checker; the fixed Quick context already carries Shape Composition Grammar. Ceiling raised after BUDGET_LOAD_SET reported 126726 tokens.", "scope": "cumulative", "include": [ "route.generate.quick-generate", @@ -444,7 +449,7 @@ "max_tokens": 7500 }, "stage.generate.template.style": { - "description": "Conditional roster-free Style workspace application.", + "description": "Conditional roster-free Style workspace application. Ceiling raised after BUDGET_LOAD_SET reported 9019 tokens.", "scope": "incremental", "include": [ "stage.generate.apply-template-workspace" @@ -457,7 +462,7 @@ "load_event": "template-application" } ], - "max_tokens": 9000 + "max_tokens": 10000 }, "stage.generate.template.layout": { "description": "Conditional Layout workspace application with one selected Layout spec.", @@ -727,6 +732,7 @@ "skills/ppt-master/references/shared-standards-core.md", "skills/ppt-master/references/svg-effects.md", "skills/ppt-master/references/native-shape-authoring.md", + "skills/ppt-master/references/preset-shape-vocabulary.md", "skills/ppt-master/references/semantic-svg.md", "skills/ppt-master/references/executor-structure.md", { @@ -927,6 +933,14 @@ ], "max_tokens": 35000 }, + "stage.generate.sound-selection": { + "description": "Complete post-motion sound identity vocabulary after a concrete auditory cue job exists.", + "scope": "incremental", + "files": [ + "skills/ppt-master/templates/sounds/sound-vocabulary.md" + ], + "max_tokens": 6250 + }, "stage.generate.video-motion-plan": { "description": "Conditional resolved animation-to-video handoff contract.", "scope": "incremental", @@ -976,12 +990,13 @@ "max_tokens": 1000 }, "stage.create-template.authored-preset": { - "description": "Conditional native preset and Boolean shape authoring reference for Create Layout/Create Deck. Ceiling raised after BUDGET_LOAD_SET reported 6618 tokens.", + "description": "Conditional complete preset vocabulary plus native preset and Boolean shape authoring authority for Create Layout/Create Deck. Ceiling raised after BUDGET_LOAD_SET reported 9139 tokens.", "scope": "incremental", "files": [ - "skills/ppt-master/references/native-shape-authoring.md" + "skills/ppt-master/references/native-shape-authoring.md", + "skills/ppt-master/references/preset-shape-vocabulary.md" ], - "max_tokens": 7500 + "max_tokens": 10000 }, "route.generate.planning-template": { "description": "Generate-PPTX planning context after an explicit template workspace is installed. Ceiling raised after BUDGET_LOAD_SET reported 119170 tokens.", @@ -1036,12 +1051,12 @@ "max_tokens": 3000 }, "stage.generate.executor.native-data": { - "description": "Conditional preset-pattern and native chart/table metadata interface.", + "description": "Conditional preset-pattern and native chart/table metadata interface. Ceiling raised after BUDGET_FILE and BUDGET_LOAD_SET reported 6774 tokens.", "scope": "incremental", "files": [ "skills/ppt-master/references/native-data-interface.md" ], - "max_tokens": 6750 + "max_tokens": 7500 }, "stage.generate.executor.formula": { "description": "Conditional direct authoring contract for PowerPoint-native inline and block formulas.", @@ -1090,12 +1105,13 @@ "max_tokens": 1000 }, "stage.generate.executor.native-shape": { - "description": "Stock PowerPoint shape selection and Boolean materialization authority, always included in Generate Executor contexts. Ceiling raised after BUDGET_LOAD_SET reported 6618 tokens.", + "description": "Complete stock PowerPoint shape vocabulary, selection, and Boolean materialization authority, always included in Generate Executor contexts. Ceiling raised after BUDGET_LOAD_SET reported 9139 tokens.", "scope": "incremental", "files": [ - "skills/ppt-master/references/native-shape-authoring.md" + "skills/ppt-master/references/native-shape-authoring.md", + "skills/ppt-master/references/preset-shape-vocabulary.md" ], - "max_tokens": 7500 + "max_tokens": 10000 }, "stage.shared.svg-effects": { "description": "Advanced SVG paint, effects, transforms, and geometry authority, always included in Generate Executor contexts and conditionally loaded by other SVG-authoring routes.", @@ -1617,6 +1633,10 @@ "kind": "json_collection", "source": "skills/ppt-master/templates/charts/charts_index.json", "key": "charts", + "projection": { + "source": "skills/ppt-master/templates/charts/chart-vocabulary.md", + "entry_pattern": "^\\|\\s*`chart/(?P[a-z0-9_]+)`\\s*\\|" + }, "reference_terms": [ "charts_index.json", "chart catalog", @@ -1633,13 +1653,40 @@ "types" ] }, + { + "name": "preset-shape-vocabulary", + "kind": "line_collection", + "source": "skills/ppt-master/scripts/pptx_shapes/data/shape_type_values.txt", + "projection": { + "source": "skills/ppt-master/references/preset-shape-vocabulary.md", + "entry_pattern": "(?:\\|\\s|,\\s)`(?P[A-Za-z][A-Za-z0-9]*)`(?=[^\\n]*\\|\\s*$)" + }, + "reference_terms": [ + "preset-shape-vocabulary.md", + "preset shape vocabulary", + "native preset shape vocabulary" + ], + "claim_nouns": [ + "preset", + "presets", + "shape", + "shapes", + "name", + "names" + ] + }, { "name": "table-templates", "kind": "json_collection", "source": "skills/ppt-master/templates/tables/tables_index.json", "key": "tables", + "projection": { + "source": "skills/ppt-master/templates/tables/table-vocabulary.md", + "entry_pattern": "^\\|\\s*`table/(?P[a-z0-9_]+)`\\s*\\|" + }, "reference_terms": [ "tables_index.json", + "table-vocabulary.md", "table catalog" ], "claim_nouns": [ @@ -1652,6 +1699,29 @@ "type", "types" ] + }, + { + "name": "sound-cues", + "kind": "json_collection", + "source": "skills/ppt-master/templates/sounds/sounds_index.json", + "key": "sounds", + "id_field": "id", + "projection": { + "source": "skills/ppt-master/templates/sounds/sound-vocabulary.md", + "entry_pattern": "^\\|\\s*`(?P[a-z0-9-]+/[a-z0-9_]+)`\\s*\\|" + }, + "reference_terms": [ + "sound-vocabulary.md", + "sounds_index.json", + "sound catalog", + "sound cue vocabulary" + ], + "claim_nouns": [ + "sound", + "sounds", + "cue", + "cues" + ] } ], "schema_grammars": [ @@ -2069,6 +2139,14 @@ "glob": "skills/ppt-master/scripts/docs/image.md", "reason": "Standalone image-tool command reference; generation roles load the owning image contracts directly, and its formula renderer section is legacy-only." }, + { + "glob": "skills/ppt-master/templates/charts/charts_index.json", + "reason": "Machine registry consumed by visualization validation and optional recall; planning roles load chart-vocabulary.md instead." + }, + { + "glob": "skills/ppt-master/templates/tables/tables_index.json", + "reason": "Machine registry consumed by visualization validation and optional recall; planning roles load table-vocabulary.md instead." + }, { "glob": "skills/ppt-master/scripts/docs/mask-gradient-smoke.md", "reason": "Maintainer-only executable smoke; never loaded by generation roles." diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/sound_sync.py b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/sound_sync.py index 8aa7b0db..370b5f6b 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/sound_sync.py +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/sound_sync.py @@ -2,8 +2,10 @@ """ PPT Master - Sound Sync -List the bundled CC0 sound catalog or copy explicitly selected sounds into a -project-local `sounds/` directory. The global library is never copied in bulk. +Inspect the bundled CC0 sound catalog or copy explicitly selected sounds into a +project-local `sounds/` directory. Review `templates/sounds/sound-vocabulary.md` +before using list filters for a resolved auditory job. The global library is +never copied in bulk. Usage: python3 scripts/sound_sync.py list [--query TERM] @@ -216,7 +218,8 @@ def _build_sync_parser() -> argparse.ArgumentParser: parser = argparse.ArgumentParser( description=( "Copy explicitly selected library sounds into a project's sounds/ folder. " - "Use `sound_sync.py list [--query TERM]` for discovery." + "Review `templates/sounds/sound-vocabulary.md` first; use " + "`sound_sync.py list [--query TERM]` only for optional exact filtering." ), formatter_class=argparse.RawDescriptionHelpFormatter, ) @@ -266,8 +269,9 @@ def _run_sync(argv: list[str]) -> int: for sound_id in missing: print(f" x {sound_id}", file=sys.stderr) print( - "Run `python3 skills/ppt-master/scripts/sound_sync.py list --query ` " - "and select a listed ID.", + "Review `skills/ppt-master/templates/sounds/sound-vocabulary.md`, then " + "optionally run `python3 skills/ppt-master/scripts/sound_sync.py list " + "--query ` to locate an exact ID.", file=sys.stderr, ) return 1 diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_quality/checker.py b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_quality/checker.py index 9c2e9f3f..e0ded183 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_quality/checker.py +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_quality/checker.py @@ -219,6 +219,7 @@ except ImportError: try: from svg_to_pptx.native_objects import ( INLINE_FORMULA_ATTR as _INLINE_FORMULA_ATTR, + estimate_inline_formula_vertical_extent as _estimate_inline_formula_vertical_extent, native_fallback_kind as _native_fallback_kind, inline_formula_marker_errors as _inline_formula_marker_errors, native_marker_legacy_warnings as _native_marker_legacy_warnings, @@ -227,6 +228,7 @@ try: ) except ImportError: _INLINE_FORMULA_ATTR = 'data-pptx-inline-formula' + _estimate_inline_formula_vertical_extent = None _native_fallback_kind = None _inline_formula_marker_errors = None _native_marker_legacy_warnings = None @@ -1946,6 +1948,7 @@ class SVGQualityChecker: parent_by_id, ) or '1', 'opacity_chain': tuple(reversed(opacity_chain)), + 'inline_formula': owner.get(_INLINE_FORMULA_ATTR), }) return cls._coalesce_checker_text_runs(resolved) @@ -1978,6 +1981,10 @@ class SVGQualityChecker: merged: List[Dict] = [] previous_signature: Tuple | None = None for run in runs: + if run.get('inline_formula') is not None: + merged.append(run) + previous_signature = None + continue current_signature = signature(run) if merged and current_signature == previous_signature: candidate = { @@ -1996,6 +2003,29 @@ class SVGQualityChecker: previous_signature = current_signature return merged + @staticmethod + def _text_line_vertical_extent( + runs: List[Dict], + font_size: float, + ) -> Tuple[float, float]: + """Return native-math-aware ascent/descent for checker bounds.""" + ascent = font_size * 0.85 + descent = font_size * 0.35 + if _estimate_inline_formula_vertical_extent is None: + return ascent, descent + for run in runs: + latex = run.get('inline_formula') + if latex is None: + continue + try: + run_font_size = float(run.get('font_size', font_size)) + extent = _estimate_inline_formula_vertical_extent(str(latex)) + except (TypeError, ValueError): + continue + ascent = max(ascent, run_font_size * extent.ascent_em) + descent = max(descent, run_font_size * extent.descent_em) + return ascent, descent + def _check_text_output_geometry( self, root: ET.Element, @@ -2191,8 +2221,9 @@ class SVGQualityChecker: right = x + width else: return None - top = y - font_size * 0.85 - bottom = y + font_size * 0.35 + ascent, descent = cls._text_line_vertical_extent(runs, font_size) + top = y - ascent + bottom = y + descent return cls._transformed_rect_bounds( line_el, diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_to_pptx/drawingml/elements.py b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_to_pptx/drawingml/elements.py index 13ac4a1a..a24bd2ef 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_to_pptx/drawingml/elements.py +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_to_pptx/drawingml/elements.py @@ -1969,6 +1969,39 @@ _INLINE_FORMULA_ATTR = 'data-pptx-inline-formula' _INLINE_FORMULA_KEY = '_inline_formula_latex' +def _text_line_vertical_extent( + runs: list[dict[str, Any]], + font_size: float, +) -> tuple[float, float, bool]: + """Return native-math-aware ascent/descent for one authored text line.""" + ascent = font_size * 0.85 + descent = font_size * 0.35 + has_inline_formula = False + from ..native_objects.formula_compiler import ( + estimate_inline_formula_vertical_extent, + ) + + for run in runs: + latex = run.get(_INLINE_FORMULA_KEY) + if latex is None: + continue + has_inline_formula = True + run_font_size = float(run.get('font_size', font_size)) + extent = estimate_inline_formula_vertical_extent(str(latex)) + ascent = max(ascent, run_font_size * extent.ascent_em) + descent = max(descent, run_font_size * extent.descent_em) + return ascent, descent, has_inline_formula + + +def _native_text_line_frame_height( + ascent: float, + descent: float, + font_size: float, +) -> float: + """Add the ordinary text-frame headroom to one visible line extent.""" + return ascent + descent + font_size * 0.30 + + def _normalize_text_run_whitespace( runs: list[dict[str, Any]], ) -> list[dict[str, Any]]: @@ -2888,6 +2921,7 @@ def convert_text(elem: ET.Element, ctx: ConvertContext) -> ShapeResult | None: # of how many merge into one ; used to size the textbox so PowerPoint # has room to wrap text to the SVG's original line widths. visual_line_widths: list[float] = [] + visual_line_runs: list[list[dict[str, Any]]] = [] if line_height_px is not None and line_height_px > 0: xml_space = resolve_project_xml_space(elem) paragraph_runs = [] @@ -2903,6 +2937,7 @@ def convert_text(elem: ET.Element, ctx: ConvertContext) -> ShapeResult | None: line_runs = _normalize_text_run_whitespace(line_runs) if not line_runs: continue + visual_line_runs.append(line_runs) visual_line_widths.append( _estimate_bullet_line_width(line_runs, fonts, ctx) ) @@ -2944,6 +2979,7 @@ def convert_text(elem: ET.Element, ctx: ConvertContext) -> ShapeResult | None: paragraph_runs = None paragraph_space_before = [] visual_line_widths = [] + visual_line_runs = [] else: stripped_paragraphs: list[list[dict[str, Any]]] = [] for line_runs in paragraph_runs: @@ -2975,24 +3011,61 @@ def convert_text(elem: ET.Element, ctx: ConvertContext) -> ShapeResult | None: paragraph_space_before = [] paragraph_bullets = [] visual_line_widths = [] + visual_line_runs = [] single_bullet = None # Estimate text dimensions if paragraph_runs is not None: # Use the widest authored visual line, not a reflow-joined paragraph. text_width = max(visual_line_widths) if visual_line_widths else 0.0 - # Keep the authored visual-line count as the source height contract. - text_height = ( - line_height_px * (len(visual_line_widths) - 1) - + sum(paragraph_space_before) - + font_size * 1.5 - ) + line_extents = [ + _text_line_vertical_extent(line, font_size) + for line in visual_line_runs + ] + text_height = sum(paragraph_space_before) + for ascent, descent, has_formula in line_extents[:-1]: + line_advance = line_height_px + if has_formula: + line_advance = max( + line_advance, + _native_text_line_frame_height( + ascent, + descent, + font_size, + ), + ) + text_height += line_advance + first_line_ascent = line_extents[0][0] + last_ascent, last_descent, last_has_formula = line_extents[-1] + last_line_height = font_size * 1.5 + if last_has_formula: + last_line_height = max( + last_line_height, + _native_text_line_frame_height( + last_ascent, + last_descent, + font_size, + ), + ) + text_height += last_line_height else: text_width = _estimate_text_runs_width(runs) if single_bullet: fs_px = float(runs[0].get('font_size', font_size)) if runs else font_size text_width += _bullet_margin_px(single_bullet, fs_px) + first_line_ascent, line_descent, has_formula = ( + _text_line_vertical_extent(runs, font_size) + ) text_height = font_size * 1.5 + if has_formula: + text_height = max( + text_height, + _native_text_line_frame_height( + first_line_ascent, + line_descent, + font_size, + ), + ) padding = _textbox_padding(font_size) # Adjust position based on text-anchor. This first box follows the visible @@ -3005,7 +3078,7 @@ def convert_text(elem: ET.Element, ctx: ConvertContext) -> ShapeResult | None: else: box_x = x - padding - box_y = y - font_size * 0.85 + box_y = y - first_line_ascent box_w = text_width + padding * 2 box_h = text_height + padding if reflect_y: diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_to_pptx/native_objects/__init__.py b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_to_pptx/native_objects/__init__.py index bae05579..8e4ca084 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_to_pptx/native_objects/__init__.py +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_to_pptx/native_objects/__init__.py @@ -35,6 +35,7 @@ from .fallback_hash import ( stamp_native_fallback_baseline, ) from .formula import FormulaSpec, build_native_formula, validate_formula_payload +from .formula_compiler import estimate_inline_formula_vertical_extent from .inline_formula import ( INLINE_FORMULA_ATTR, inline_formula_marker_errors, @@ -79,6 +80,7 @@ from .workbook import ( __all__ = [ "convert_native_object", + "estimate_inline_formula_vertical_extent", "INLINE_FORMULA_ATTR", "NativeMarkerAttributeError", "native_fallback_kind", diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_to_pptx/native_objects/formula_ast.py b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_to_pptx/native_objects/formula_ast.py index 863773a5..1d6c9fa1 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_to_pptx/native_objects/formula_ast.py +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_to_pptx/native_objects/formula_ast.py @@ -168,6 +168,19 @@ class BorderBox: kind: str +@dataclass(frozen=True) +class FormulaVerticalExtent: + """Conservative formula bounds relative to the surrounding baseline.""" + + ascent_em: float + descent_em: float + + @property + def height_em(self) -> float: + """Return total vertical extent in units of the owning font size.""" + return self.ascent_em + self.descent_em + + Node = ( Text | Sequence @@ -192,6 +205,227 @@ Node = ( ) +_BASE_VERTICAL_EXTENT = FormulaVerticalExtent(0.85, 0.35) +# These ratios model Office Math topology rather than any one installed font. +# The ordinary-text floor matches the exporter/checker baseline contract. +_SCRIPT_SCALE = 0.62 +_FRACTION_SCALE = 0.68 + + +def _max_vertical_extent( + *extents: FormulaVerticalExtent, +) -> FormulaVerticalExtent: + if not extents: + return FormulaVerticalExtent(0.0, 0.0) + return FormulaVerticalExtent( + max(extent.ascent_em for extent in extents), + max(extent.descent_em for extent in extents), + ) + + +def _scaled_vertical_extent( + extent: FormulaVerticalExtent, + scale: float, +) -> FormulaVerticalExtent: + return FormulaVerticalExtent( + extent.ascent_em * scale, + extent.descent_em * scale, + ) + + +def _script_vertical_extent( + base: FormulaVerticalExtent, + subscript: Sequence | None, + superscript: Sequence | None, +) -> FormulaVerticalExtent: + ascent = base.ascent_em + descent = base.descent_em + if superscript is not None: + upper = _scaled_vertical_extent( + _node_vertical_extent(superscript), + _SCRIPT_SCALE, + ) + baseline_shift = 0.55 + ascent = max(ascent, baseline_shift + upper.ascent_em) + descent = max(descent, upper.descent_em - baseline_shift) + if subscript is not None: + lower = _scaled_vertical_extent( + _node_vertical_extent(subscript), + _SCRIPT_SCALE, + ) + baseline_shift = 0.30 + ascent = max(ascent, lower.ascent_em - baseline_shift) + descent = max(descent, baseline_shift + lower.descent_em) + return FormulaVerticalExtent(ascent, descent) + + +def _limit_vertical_extent( + base: FormulaVerticalExtent, + lower: Sequence | None, + upper: Sequence | None, +) -> FormulaVerticalExtent: + ascent = base.ascent_em + descent = base.descent_em + if upper is not None: + upper_extent = _node_vertical_extent(upper) + ascent += 0.14 + _SCRIPT_SCALE * upper_extent.height_em + if lower is not None: + lower_extent = _node_vertical_extent(lower) + descent += 0.14 + _SCRIPT_SCALE * lower_extent.height_em + return FormulaVerticalExtent(ascent, descent) + + +def _rows_vertical_extent( + rows: tuple[tuple[Sequence, ...], ...] | tuple[Sequence, ...], +) -> FormulaVerticalExtent: + row_heights: list[float] = [] + for row in rows: + cells = row if isinstance(row, tuple) else (row,) + row_extent = _max_vertical_extent( + *(_node_vertical_extent(cell) for cell in cells) + ) + row_heights.append( + max(_BASE_VERTICAL_EXTENT.height_em, row_extent.height_em) + ) + if not row_heights: + return _BASE_VERTICAL_EXTENT + total_height = sum(row_heights) + 0.18 * (len(row_heights) - 1) + return FormulaVerticalExtent( + max(_BASE_VERTICAL_EXTENT.ascent_em, total_height * 0.55), + max(_BASE_VERTICAL_EXTENT.descent_em, total_height * 0.45), + ) + + +def _node_vertical_extent(node: Node) -> FormulaVerticalExtent: + if isinstance(node, Text): + return _BASE_VERTICAL_EXTENT + if isinstance(node, AlignmentPoint): + return FormulaVerticalExtent(0.0, 0.0) + if isinstance(node, Sequence): + return _max_vertical_extent( + *(_node_vertical_extent(child) for child in node.children) + ) + if isinstance(node, Styled): + return _node_vertical_extent(node.body) + if isinstance(node, Fraction): + numerator = _node_vertical_extent(node.numerator) + denominator = _node_vertical_extent(node.denominator) + return FormulaVerticalExtent( + max( + _BASE_VERTICAL_EXTENT.ascent_em, + 0.28 + _FRACTION_SCALE * numerator.height_em, + ), + max( + _BASE_VERTICAL_EXTENT.descent_em, + 0.06 + _FRACTION_SCALE * denominator.height_em, + ), + ) + if isinstance(node, Radical): + body = _node_vertical_extent(node.body) + ascent = body.ascent_em + 0.20 + if node.degree is not None: + degree = _scaled_vertical_extent( + _node_vertical_extent(node.degree), + 0.50, + ) + ascent = max(ascent, 0.55 + degree.ascent_em) + return FormulaVerticalExtent(ascent, max(body.descent_em, 0.40)) + if isinstance(node, (Script, Prescript)): + return _script_vertical_extent( + _node_vertical_extent(node.base), + node.subscript, + node.superscript, + ) + if isinstance(node, Nary): + base = _max_vertical_extent( + FormulaVerticalExtent(1.05, 0.45), + _node_vertical_extent(node.body) + if node.body is not None else FormulaVerticalExtent(0.0, 0.0), + ) + if node.limit_modifier == "limits": + return _limit_vertical_extent( + base, + node.subscript, + node.superscript, + ) + return _script_vertical_extent( + base, + node.subscript, + node.superscript, + ) + if isinstance(node, Delimiter): + body = _max_vertical_extent( + *(_node_vertical_extent(segment) for segment in node.segments) + ) + return FormulaVerticalExtent( + max(_BASE_VERTICAL_EXTENT.ascent_em, body.ascent_em + 0.05), + max(_BASE_VERTICAL_EXTENT.descent_em, body.descent_em + 0.05), + ) + if isinstance(node, Matrix): + return _rows_vertical_extent(node.rows) + if isinstance(node, EquationArray): + return _rows_vertical_extent(node.rows) + if isinstance(node, Accent): + body = _node_vertical_extent(node.body) + return FormulaVerticalExtent(body.ascent_em + 0.24, body.descent_em) + if isinstance(node, Bar): + body = _node_vertical_extent(node.body) + if node.position in {"bot", "bottom"}: + return FormulaVerticalExtent(body.ascent_em, body.descent_em + 0.16) + return FormulaVerticalExtent(body.ascent_em + 0.16, body.descent_em) + if isinstance(node, GroupChar): + body = _node_vertical_extent(node.body) + if node.position in {"bot", "bottom"}: + return FormulaVerticalExtent(body.ascent_em, body.descent_em + 0.30) + return FormulaVerticalExtent(body.ascent_em + 0.30, body.descent_em) + if isinstance(node, Limit): + return _limit_vertical_extent( + _node_vertical_extent(node.base), + node.lower, + node.upper, + ) + if isinstance(node, Function): + name = _node_vertical_extent(node.name) + if node.subscript is not None or node.superscript is not None: + if node.limit_modifier == "limits": + name = _limit_vertical_extent( + name, + node.subscript, + node.superscript, + ) + else: + name = _script_vertical_extent( + name, + node.subscript, + node.superscript, + ) + if node.body is None: + return name + return _max_vertical_extent(name, _node_vertical_extent(node.body)) + if isinstance(node, OperatorEmulator): + return _node_vertical_extent(node.body) + if isinstance(node, Phantom): + if node.kind == "hphantom": + return FormulaVerticalExtent(0.0, 0.0) + return _node_vertical_extent(node.body) + if isinstance(node, BorderBox): + body = _node_vertical_extent(node.body) + return FormulaVerticalExtent( + body.ascent_em + 0.08, + body.descent_em + 0.08, + ) + return _BASE_VERTICAL_EXTENT + + +def formula_vertical_extent(root: Node) -> FormulaVerticalExtent: + """Estimate native math ascent/descent from the parsed formula structure.""" + extent = _node_vertical_extent(root) + return FormulaVerticalExtent( + max(_BASE_VERTICAL_EXTENT.ascent_em, extent.ascent_em), + max(_BASE_VERTICAL_EXTENT.descent_em, extent.descent_em), + ) + + def merge_run_styles(base: RunStyle | None, override: RunStyle | None) -> RunStyle | None: """Merge inherited and local run style without clearing unrelated fields.""" if base is None: @@ -334,6 +568,7 @@ __all__ = [ "Delimiter", "EquationArray", "Fraction", + "FormulaVerticalExtent", "Function", "GroupChar", "Limit", @@ -351,6 +586,7 @@ __all__ = [ "Text", "append_child", "formula_node_count", + "formula_vertical_extent", "is_empty", "merge_run_styles", ] diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_to_pptx/native_objects/formula_compiler.py b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_to_pptx/native_objects/formula_compiler.py index 100ac250..fa4bdaa7 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_to_pptx/native_objects/formula_compiler.py +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_to_pptx/native_objects/formula_compiler.py @@ -20,7 +20,12 @@ Dependencies: from __future__ import annotations -from .formula_ast import formula_node_count +from .formula_ast import ( + FormulaVerticalExtent, + Sequence, + formula_node_count, + formula_vertical_extent, +) from .formula_omml import emit_omml, validate_omml_fragment from .formula_parser import FormulaCompileError, parse_latex_formula @@ -29,7 +34,7 @@ _MAX_LATEX_LENGTH = 65_536 _MAX_AST_NODES = 100_000 -def _compile(latex: str, *, display: bool) -> str: +def _parse_checked_formula(latex: str, *, display: bool) -> Sequence: if not isinstance(latex, str): raise FormulaCompileError("LaTeX formula must be a string") if len(latex) > _MAX_LATEX_LENGTH: @@ -42,6 +47,16 @@ def _compile(latex: str, *, display: bool) -> str: formula_node_count(expression, maximum=_MAX_AST_NODES) except ValueError as exc: raise FormulaCompileError(str(exc)) from exc + return expression + except RecursionError as exc: + raise FormulaCompileError( + "Formula nesting exceeds the supported limit" + ) from exc + + +def _compile(latex: str, *, display: bool) -> str: + expression = _parse_checked_formula(latex, display=display) + try: return emit_omml(expression, display=display) except RecursionError as exc: raise FormulaCompileError( @@ -59,9 +74,23 @@ def compile_latex_to_inline_omml(latex: str) -> str: return _compile(latex, display=False) +def estimate_inline_formula_vertical_extent( + latex: str, +) -> FormulaVerticalExtent: + """Estimate inline native-math bounds relative to its text baseline.""" + expression = _parse_checked_formula(latex, display=False) + try: + return formula_vertical_extent(expression) + except RecursionError as exc: + raise FormulaCompileError( + "Formula nesting exceeds the supported limit" + ) from exc + + __all__ = [ "FormulaCompileError", "compile_latex_to_inline_omml", "compile_latex_to_omml", + "estimate_inline_formula_vertical_extent", "validate_omml_fragment", ] diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/README.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/README.md index 6fe5d9b6..f39416f3 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/README.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/README.md @@ -119,14 +119,15 @@ effects and PowerPoint interfaces loaded only when triggered. Page-local Shape-first references are catalog families, not reusable template kinds: -| Family | Owns | Directory | Index | +| Family | Owns | Planning map | Machine index | |---|---|---|---| -| Chart | Value-driven geometry (33) | [`charts/`](./charts/) | [`charts_index.json`](./charts/charts_index.json) | -| Table | Row × column fact grid (6) | [`tables/`](./tables/) | [`tables_index.json`](./tables/tables_index.json) | +| Chart | Value-driven geometry (33) | [`chart-vocabulary.md`](./charts/chart-vocabulary.md) | [`charts_index.json`](./charts/charts_index.json) | +| Table | Row × column fact grid (6) | [`table-vocabulary.md`](./tables/table-vocabulary.md) | [`tables_index.json`](./tables/tables_index.json) | [`VISUALIZATION_TEMPLATE_AUTHORING.md`](./VISUALIZATION_TEMPLATE_AUTHORING.md) -is the shared authoring contract. Each index owns family membership and -selection rules. +is the shared authoring contract. Each machine index owns family membership; +the Chart and Table vocabularies are their complete objective planning +projections. Qualitative Structure is a Slide-local Executor method rather than a catalog: Default and Quick both derive its relationship model and compose shapes for the @@ -151,5 +152,7 @@ The `icons/` directory contains 12,027 vector icons across five libraries: ## Sound Library -[`sounds/`](./sounds/) is post-motion discovery, not a template or -Strategist resource. Sync selected cues only; see [usage](./sounds/README.md). +[`sounds/`](./sounds/) is a post-motion selection resource, not a template or +Strategist resource. Its complete +[cue vocabulary](./sounds/sound-vocabulary.md) is read only after a concrete +auditory job exists; sync selected cues only. See [usage](./sounds/README.md). diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/VISUALIZATION_TEMPLATE_AUTHORING.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/VISUALIZATION_TEMPLATE_AUTHORING.md index 47cb94bc..000b8f6f 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/VISUALIZATION_TEMPLATE_AUTHORING.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/VISUALIZATION_TEMPLATE_AUTHORING.md @@ -317,14 +317,14 @@ Catalog 模板本身只有一个主 Chart,可保留上述 unscoped marker 与 **Forbidden — placeholder storytelling**: 不写长篇营销文案、部门归属、真实品牌或无法复用的项目背景。 -### 7.2 Family indexes +### 7.2 分类索引与规划投影 新增模板只登记到其 owning family index: -| Family | Directory | Index object | -|---|---|---| -| `chart` | `charts/` | `charts_index.json` → `charts` | -| `table` | `tables/` | `tables_index.json` → `tables` | +| 分类 | 目录 | 机器索引 | 规划词汇表 | +|---|---|---|---| +| `chart` | `charts/` | `charts_index.json` → `charts` | `chart-vocabulary.md` | +| `table` | `tables/` | `tables_index.json` → `tables` | `table-vocabulary.md` | 每个 `.summary` 使用相同的选择句合同: @@ -334,7 +334,13 @@ Catalog 模板本身只有一个主 Chart,可保留上述 unscoped marker 与 } ``` -**Hard rule**: `summary` 是选型句,使用 `Pick for ... Skip if ...`,不是视觉描述;`key` 与同 family 文件名一致,`meta.total` 与该 family catalog 数量一致。不要建立跨 family 的第二份成员清单。 +`summary` 保留 `Pick for ... Skip if ...` 句式,供可选的机器召回诊断使用; +规划主路径不读取这些记录。Chart 与 Table 的规划词汇表必须完整列出各自同一组 +canonical `family/`,只说明信息关系,不写 SVG 实现、布局参数或选择结论。 + +**Hard rule**: `key` 与同 family 文件名一致,`meta.total` 与该 family catalog +数量一致;每份 planning vocabulary 与 owning index 的成员集合必须精确一致。 +除此以外不要建立跨 family 的第二份成员清单。 --- diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/README.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/README.md index 700fb5d5..bbf00d4b 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/README.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/README.md @@ -9,21 +9,27 @@ Cell-grid semantics belong in [`tables/`](../tables/). Reusable PowerPoint Master/Layout, page-type, slot, and placeholder contracts belong in [`layouts/`](../layouts/). -## Source of truth +## Planning vocabulary and source of truth [`charts_index.json`](./charts_index.json) is the sole chart registry. Its `charts` object maps each canonical key to one selection-rule `summary` in the form `Pick for ... Skip if ...`. The key matches `.svg`; `meta.total` matches the canonical SVG roster. -Default Strategist and Quick read this complete compact registry together with -the Table registry before planning. They compare every `Pick` / `Skip` rule, -then use [`visualization_recall.py`](../../scripts/visualization_recall.py) -`validate` to resolve selected canonical references. Its `recall` mode remains -an optional diagnostic helper, not the runtime capability gate. Default writes -`chart/` to `page_visualizations`; Quick keeps the selected reference in -active context. [`chart_recall.py`](../../scripts/chart_recall.py) and bare keys -remain legacy compatibility only. +[`chart-vocabulary.md`](./chart-vocabulary.md) is the complete planning +projection. It lists all 33 exact `chart/` references by information +relationship and states only what each encoding represents. It contains no +chart-authoring instructions and does not prescribe selection. + +Default Strategist and Quick read the vocabulary together with the Table +registry before planning, choose through their own judgment, then use +[`visualization_recall.py`](../../scripts/visualization_recall.py) `validate` +to resolve selected canonical references. Its `recall` mode remains an +optional diagnostic helper over the machine registry, not the runtime +capability gate. Default writes `chart/` to `page_visualizations`; Quick +keeps the selected reference in active context. Executor then reads only the +selected SVG and execution references. [`chart_recall.py`](../../scripts/chart_recall.py) +and bare keys remain legacy compatibility only. ## Authoring contract diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/chart-vocabulary.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/chart-vocabulary.md new file mode 100644 index 00000000..f7a8a4aa --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/chart-vocabulary.md @@ -0,0 +1,75 @@ +# Chart Expression Vocabulary + +This is the complete planning-side map of the 33 canonical Chart references. +Choose from the page's actual information relationship, then retain the exact +`chart/` identifier. This file deliberately contains no SVG construction, +data-binding, coordinate, label-placement, styling, or export instructions; +those decisions belong to Executor after selection. + +**Reference — not a constraint**: each description states what the visual +encoding represents. It is not a ranking, recommendation, threshold, quota, or +substitute for judgment from the current data and communication goal. Zero +Chart selections remains valid. + +## 1. Change over time + +| Canonical reference | Encoded relationship | +|---|---| +| `chart/line_chart` | Values positioned along a continuous axis, with connected marks showing change or direction. | +| `chart/area_chart` | A continuous series whose filled area emphasizes magnitude across the axis. | +| `chart/stacked_area_chart` | Multiple filled series whose layers encode both total magnitude and changing composition. | +| `chart/dual_axis_line_chart` | Two continuous series measured on separate value scales. | +| `chart/stock_chart` | Open, high, low, and close values across ordered dates. | +| `chart/waterfall_chart` | Sequential positive and negative contributions connecting a starting value to an ending value. | + +## 2. Category comparison and rank + +| Canonical reference | Encoded relationship | +|---|---| +| `chart/column_chart` | Category values encoded by vertical length from a shared baseline. | +| `chart/horizontal_bar_chart` | Category values encoded by horizontal length from a shared baseline. | +| `chart/grouped_bar_chart` | Multiple series placed side by side within shared categories. | +| `chart/stacked_bar_chart` | Category totals divided into value-driven component lengths. | +| `chart/butterfly_chart` | Two datasets mirrored around one shared category axis. | +| `chart/dumbbell_chart` | Two values per item joined to expose their gap and direction. | +| `chart/pareto_chart` | Descending category contributions paired with their cumulative share. | + +## 3. Target and progress + +| Canonical reference | Encoded relationship | +|---|---| +| `chart/bullet_chart` | Actual values, targets, and optional performance bands on compact linear scales. | +| `chart/progress_bar_chart` | Bounded completion values encoded as filled portions of linear tracks. | +| `chart/gauge_chart` | One bounded value positioned against a circular or semicircular domain and reference marks. | + +## 4. Distribution and multivariable relationship + +| Canonical reference | Encoded relationship | +|---|---| +| `chart/histogram_chart` | Observation frequency encoded across contiguous numeric bins. | +| `chart/box_plot_chart` | Median, quartiles, spread, and outliers summarized for one or more groups. | +| `chart/scatter_chart` | Two numeric variables encoded by x/y position. | +| `chart/bubble_chart` | Two variables encoded by x/y position and a third by mark size. | +| `chart/heatmap_chart` | Values at row-column intersections encoded by color intensity. | +| `chart/radar_chart` | Multiple measures positioned on radial axes for one or more entities. | +| `chart/matrix_2x2` | Items positioned by two numeric dimensions, with optional magnitude encoded by radius. | + +## 5. Part-to-whole and hierarchy + +| Canonical reference | Encoded relationship | +|---|---| +| `chart/pie_chart` | Flat parts of one whole encoded by sector angle and area. | +| `chart/donut_chart` | Flat parts of one whole encoded around an open center. | +| `chart/pie_of_pie_chart` | One composition with selected parts expanded into a secondary pie. | +| `chart/bar_of_pie_chart` | One composition with selected parts expanded into a secondary stacked bar. | +| `chart/treemap_chart` | Hierarchical or grouped parts encoded as nested rectangular areas. | +| `chart/sunburst_chart` | Hierarchical parts encoded as concentric radial levels and angular spans. | + +## 6. Flow, schedule, and weighted text + +| Canonical reference | Encoded relationship | +|---|---| +| `chart/funnel_chart` | Ordered stage values encoded as changing widths through a conversion sequence. | +| `chart/sankey_chart` | Magnitude moving between nodes encoded by connection width. | +| `chart/gantt_chart` | Tasks positioned and sized by dates or durations along a time axis. | +| `chart/word_cloud` | Term weight or frequency encoded by type size. | diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/design_spec_reference.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/design_spec_reference.md index a71a4883..5c0e1da7 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/design_spec_reference.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/design_spec_reference.md @@ -167,9 +167,10 @@ PowerPoint structure. Omit empty §VII and recall diagnostics; legacy rows stay readable, while new specs use four columns. In §IX `Visualization`, key every independent data chart/pure text-grid table -in `kebab-case` and add one `Native-ready` map: `=yes|no; ...`. Use `yes` -only when editable native output helps. Qualitative relationships/read order -remain unkeyed prose, as do incidental microvisuals. +in `kebab-case` and add one `Native-ready` map: `=yes|no; ...`. Decide +`yes` by default; use `no` only when the native payload cannot express that +object. Qualitative relationships/read order remain unkeyed prose, as do +incidental microvisuals. In §VIII, author every planned or explicitly required resource from the confirmed source boundary. Write one concise, non-empty `Layout pattern` suggestion in ordinary language; optionally cite hierarchical ids from the layout library when they help recall a technique. Set `Crop Policy` to `adaptive` or `no-crop`; set `Acquire Via` to `ai`, `web`, `user`, `placeholder`, or `slice`. Preserve unresolved required assets as `Pending` or `Needs-Manual` instead of dropping or reclassifying them. Native formulas never enter this table or `spec_lock.md images`. diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/sounds/README.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/sounds/README.md index 6858552d..7f8d59f1 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/sounds/README.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/sounds/README.md @@ -11,7 +11,8 @@ CC0 sound effects prepared as PowerPoint-compatible WAV files: Source snapshots, license declarations, and modifications are recorded in [THIRD_PARTY_NOTICES.md](./THIRD_PARTY_NOTICES.md). Machine-readable metadata -for every sound lives in [sounds_index.json](./sounds_index.json). +for every sound lives in [sounds_index.json](./sounds_index.json). The complete +planning-side identity map is [sound-vocabulary.md](./sound-vocabulary.md). ## Project-local selection @@ -20,11 +21,10 @@ does not create a `sounds/` directory or copy the library. Copy only the sounds explicitly selected for a deck: ```bash -python3 skills/ppt-master/scripts/sound_sync.py list --query whoosh python3 skills/ppt-master/scripts/sound_sync.py projects/deck bigsoundbank/1797 kenney-interface/click_001 ``` -The second command copies only those files to: +The command copies only those files to: ```text projects/deck/sounds/bigsoundbank/1797.wav @@ -38,19 +38,21 @@ preflight rejects a destination that escapes the resolved project root through a symlink, as well as an existing project file whose content differs from the selected library ID; the tool never silently overwrites that conflict. -## Discovery +## Vocabulary and optional filtering -List the full catalog or filter it by stable ID, label, tag, or context: +After a resolved motion row has a concrete auditory job, read +[sound-vocabulary.md](./sound-vocabulary.md) completely. It groups all 186 +canonical ids by objective cue context and includes each label, duration, and +registered context without a recommendation ranking. + +Use the CLI only to locate an already-considered id, label, tag, or context: ```bash -python3 skills/ppt-master/scripts/sound_sync.py list python3 skills/ppt-master/scripts/sound_sync.py list --query transition -python3 skills/ppt-master/scripts/sound_sync.py list --query recommended ``` -The `recommended` flag is a conservative discovery shortlist for presentation -use; it does not add sounds automatically. Sound remains opt-in, and the full -catalog stays available when another cue better fits the design. +The filter is optional and never replaces complete vocabulary review or current +motion judgment. Sound remains opt-in, and silence is valid. ## Format boundary diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/sounds/sound-vocabulary.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/sounds/sound-vocabulary.md new file mode 100644 index 00000000..1091db88 --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/sounds/sound-vocabulary.md @@ -0,0 +1,252 @@ +# Sound Cue Vocabulary + +Complete post-motion map of the 186 bundled CC0 sound cues. Read this file +only after a concrete auditory cue job exists for a resolved transition or +object-animation row; then select one exact namespaced id and materialize it +with `sound_sync.py`. + +**Reference — not a constraint**: sections expose each cue's primary catalog +context, while the final column preserves every registered context. +Labels, durations, and contexts are objective identity facts, not rankings, +recommendations, coverage targets, or automatic choices. Silence remains valid. + +## 1. Transition and motion (28) + +| Canonical id | Label | Duration | Registered contexts | +|---|---|---:|---| +| `bigsoundbank/0572` | Whoosh #1 | 10.870s | transition, object-animation | +| `bigsoundbank/0573` | Whoosh #2 | 12.298s | transition, object-animation | +| `bigsoundbank/1795` | Whoosh #3 | 0.914s | transition, object-animation | +| `bigsoundbank/1796` | Whoosh #4 | 1.036s | transition, object-animation | +| `bigsoundbank/1797` | Whoosh #5 | 0.536s | transition, object-animation | +| `bigsoundbank/1798` | Whoosh #10 | 0.460s | transition, object-animation | +| `bigsoundbank/1799` | Whoosh #6 | 0.517s | transition, object-animation | +| `bigsoundbank/1800` | Whoosh #7 | 0.887s | transition, object-animation | +| `bigsoundbank/1801` | Whoosh #8 | 0.805s | transition, object-animation | +| `bigsoundbank/1802` | Whoosh #9 | 0.373s | transition, object-animation | +| `bigsoundbank/2079` | Chimes "Dream" #1 | 2.291s | transition, object-animation, reveal | +| `bigsoundbank/2080` | Chimes "dream" #2 | 1.441s | transition, object-animation, reveal | +| `bigsoundbank/2081` | Chimes "dream" #3 | 1.145s | transition, object-animation, reveal | +| `bigsoundbank/2082` | Chimes "dream" #4 | 1.865s | transition, object-animation, reveal | +| `bigsoundbank/2083` | Chimes "dream" #5 | 1.568s | transition, object-animation, reveal | +| `bigsoundbank/2084` | Chimes "dream" #6 | 1.738s | transition, object-animation, reveal | +| `bigsoundbank/2085` | Chimes "dream" #7 | 1.780s | transition, object-animation, reveal | +| `bigsoundbank/2086` | Chimes "Dream" #8 | 2.586s | transition, object-animation, reveal | +| `bigsoundbank/2087` | Chimes "butterfly" #1 | 2.077s | transition, object-animation, reveal | +| `bigsoundbank/2088` | Chimes "butterfly" #2 | 2.289s | transition, object-animation, reveal | +| `bigsoundbank/2089` | Chimes "butterfly" #3 | 2.247s | transition, object-animation, reveal | +| `bigsoundbank/2090` | Chimes "Butterfly" #4 | 5.934s | transition, object-animation, reveal | +| `bigsoundbank/2091` | Chimes "butterfly" #5 | 5.296s | transition, object-animation, reveal | +| `kenney-interface/scroll_001` | Scroll 001 | 1.000s | object-animation, motion | +| `kenney-interface/scroll_002` | Scroll 002 | 1.000s | object-animation, motion | +| `kenney-interface/scroll_003` | Scroll 003 | 1.000s | object-animation, motion | +| `kenney-interface/scroll_004` | Scroll 004 | 1.000s | object-animation, motion | +| `kenney-interface/scroll_005` | Scroll 005 | 1.000s | object-animation, motion | + +## 2. Reveal and emphasis (17) + +| Canonical id | Label | Duration | Registered contexts | +|---|---|---:|---| +| `kenney-interface/bong_001` | Bong 001 | 0.120s | object-animation, emphasis | +| `kenney-interface/drop_001` | Drop 001 | 0.132s | object-animation, reveal | +| `kenney-interface/drop_002` | Drop 002 | 0.188s | object-animation, reveal | +| `kenney-interface/drop_003` | Drop 003 | 0.188s | object-animation, reveal | +| `kenney-interface/drop_004` | Drop 004 | 0.284s | object-animation, reveal | +| `kenney-interface/glass_001` | Glass 001 | 0.276s | object-animation, emphasis | +| `kenney-interface/glass_002` | Glass 002 | 0.122s | object-animation, emphasis | +| `kenney-interface/glass_003` | Glass 003 | 0.121s | object-animation, emphasis | +| `kenney-interface/glass_004` | Glass 004 | 0.692s | object-animation, emphasis | +| `kenney-interface/glass_005` | Glass 005 | 0.132s | object-animation, emphasis | +| `kenney-interface/glass_006` | Glass 006 | 0.132s | object-animation, emphasis | +| `kenney-interface/glitch_001` | Glitch 001 | 0.017s | object-animation, emphasis | +| `kenney-interface/glitch_002` | Glitch 002 | 0.027s | object-animation, emphasis | +| `kenney-interface/glitch_003` | Glitch 003 | 0.012s | object-animation, emphasis | +| `kenney-interface/glitch_004` | Glitch 004 | 0.020s | object-animation, emphasis | +| `kenney-interface/pluck_001` | Pluck 001 | 0.100s | object-animation, reveal | +| `kenney-interface/pluck_002` | Pluck 002 | 0.162s | object-animation, reveal | + +## 3. Notification (9) + +| Canonical id | Label | Duration | Registered contexts | +|---|---|---:|---| +| `bigsoundbank/2059` | Notification, "LaSoMarie" #1 | 0.300s | object-animation, notification | +| `bigsoundbank/2060` | Notification, "LaSoMarie" #2 | 0.300s | object-animation, notification | +| `bigsoundbank/2061` | Notification, "LaSoMarie" #3 | 0.300s | object-animation, notification | +| `bigsoundbank/2062` | Notification, "LaSoMarie" #4 | 0.400s | object-animation, notification | +| `bigsoundbank/2063` | Notification, "LaSoLisa" #1 | 0.400s | object-animation, notification | +| `bigsoundbank/2064` | Notification, "LaSoLisa" #2 | 0.400s | object-animation, notification | +| `bigsoundbank/2065` | Notification, "LaSoLisa" #3 | 0.400s | object-animation, notification | +| `bigsoundbank/2066` | Notification, "LaSoLisa" #4 | 0.400s | object-animation, notification | +| `bigsoundbank/2067` | Notification, "LaSoLisa" #5 | 0.400s | object-animation, notification | + +## 4. Confirmation (7) + +| Canonical id | Label | Duration | Registered contexts | +|---|---|---:|---| +| `kenney-interface/confirmation_001` | Confirmation 001 | 0.290s | object-animation, confirmation | +| `kenney-interface/confirmation_002` | Confirmation 002 | 0.539s | object-animation, confirmation | +| `kenney-interface/confirmation_003` | Confirmation 003 | 0.322s | object-animation, confirmation | +| `kenney-interface/confirmation_004` | Confirmation 004 | 0.490s | object-animation, confirmation | +| `kenney-interface/tick_001` | Tick 001 | 0.045s | object-animation, confirmation | +| `kenney-interface/tick_002` | Tick 002 | 0.020s | object-animation, confirmation | +| `kenney-interface/tick_004` | Tick 004 | 0.055s | object-animation, confirmation | + +## 5. Error (8) + +| Canonical id | Label | Duration | Registered contexts | +|---|---|---:|---| +| `kenney-interface/error_001` | Error 001 | 0.162s | object-animation, error | +| `kenney-interface/error_002` | Error 002 | 0.165s | object-animation, error | +| `kenney-interface/error_003` | Error 003 | 0.533s | object-animation, error | +| `kenney-interface/error_004` | Error 004 | 0.104s | object-animation, error | +| `kenney-interface/error_005` | Error 005 | 0.497s | object-animation, error | +| `kenney-interface/error_006` | Error 006 | 0.500s | object-animation, error | +| `kenney-interface/error_007` | Error 007 | 0.192s | object-animation, error | +| `kenney-interface/error_008` | Error 008 | 0.139s | object-animation, error | + +## 6. Question (4) + +| Canonical id | Label | Duration | Registered contexts | +|---|---|---:|---| +| `kenney-interface/question_001` | Question 001 | 0.491s | object-animation, question | +| `kenney-interface/question_002` | Question 002 | 0.333s | object-animation, question | +| `kenney-interface/question_003` | Question 003 | 0.330s | object-animation, question | +| `kenney-interface/question_004` | Question 004 | 0.332s | object-animation, question | + +## 7. Navigation (30) + +| Canonical id | Label | Duration | Registered contexts | +|---|---|---:|---| +| `kenney-interface/back_001` | Back 001 | 0.061s | object-animation, navigation | +| `kenney-interface/back_002` | Back 002 | 0.091s | object-animation, navigation | +| `kenney-interface/back_003` | Back 003 | 0.090s | object-animation, navigation | +| `kenney-interface/back_004` | Back 004 | 0.094s | object-animation, navigation | +| `kenney-interface/close_001` | Close 001 | 0.148s | object-animation, navigation | +| `kenney-interface/close_002` | Close 002 | 0.314s | object-animation, navigation | +| `kenney-interface/close_003` | Close 003 | 0.314s | object-animation, navigation | +| `kenney-interface/close_004` | Close 004 | 0.323s | object-animation, navigation | +| `kenney-interface/maximize_001` | Maximize 001 | 0.258s | object-animation, navigation | +| `kenney-interface/maximize_002` | Maximize 002 | 0.258s | object-animation, navigation | +| `kenney-interface/maximize_003` | Maximize 003 | 0.212s | object-animation, navigation | +| `kenney-interface/maximize_004` | Maximize 004 | 0.418s | object-animation, navigation | +| `kenney-interface/maximize_005` | Maximize 005 | 0.526s | object-animation, navigation | +| `kenney-interface/maximize_006` | Maximize 006 | 0.380s | object-animation, navigation | +| `kenney-interface/maximize_007` | Maximize 007 | 0.183s | object-animation, navigation | +| `kenney-interface/maximize_008` | Maximize 008 | 0.225s | object-animation, navigation | +| `kenney-interface/maximize_009` | Maximize 009 | 0.222s | object-animation, navigation | +| `kenney-interface/minimize_001` | Minimize 001 | 0.258s | object-animation, navigation | +| `kenney-interface/minimize_002` | Minimize 002 | 0.258s | object-animation, navigation | +| `kenney-interface/minimize_003` | Minimize 003 | 0.212s | object-animation, navigation | +| `kenney-interface/minimize_004` | Minimize 004 | 0.418s | object-animation, navigation | +| `kenney-interface/minimize_005` | Minimize 005 | 0.526s | object-animation, navigation | +| `kenney-interface/minimize_006` | Minimize 006 | 0.380s | object-animation, navigation | +| `kenney-interface/minimize_007` | Minimize 007 | 0.183s | object-animation, navigation | +| `kenney-interface/minimize_008` | Minimize 008 | 0.225s | object-animation, navigation | +| `kenney-interface/minimize_009` | Minimize 009 | 0.222s | object-animation, navigation | +| `kenney-interface/open_001` | Open 001 | 0.148s | object-animation, navigation | +| `kenney-interface/open_002` | Open 002 | 0.314s | object-animation, navigation | +| `kenney-interface/open_003` | Open 003 | 0.314s | object-animation, navigation | +| `kenney-interface/open_004` | Open 004 | 0.323s | object-animation, navigation | + +## 8. Selection (8) + +| Canonical id | Label | Duration | Registered contexts | +|---|---|---:|---| +| `kenney-interface/select_001` | Select 001 | 0.040s | object-animation, selection | +| `kenney-interface/select_002` | Select 002 | 0.040s | object-animation, selection | +| `kenney-interface/select_003` | Select 003 | 0.380s | object-animation, selection | +| `kenney-interface/select_004` | Select 004 | 0.380s | object-animation, selection | +| `kenney-interface/select_005` | Select 005 | 0.380s | object-animation, selection | +| `kenney-interface/select_006` | Select 006 | 1.941s | object-animation, selection | +| `kenney-interface/select_007` | Select 007 | 0.060s | object-animation, selection | +| `kenney-interface/select_008` | Select 008 | 0.060s | object-animation, selection | + +## 9. Interaction (18) + +| Canonical id | Label | Duration | Registered contexts | +|---|---|---:|---| +| `kenney-interface/click_001` | Click 001 | 0.097s | object-animation, interaction | +| `kenney-interface/click_002` | Click 002 | 0.012s | object-animation, interaction | +| `kenney-interface/click_003` | Click 003 | 0.007s | object-animation, interaction | +| `kenney-interface/click_004` | Click 004 | 0.022s | object-animation, interaction | +| `kenney-interface/click_005` | Click 005 | 0.007s | object-animation, interaction | +| `kenney-ui/click1` | Click 1 | 0.091s | object-animation, interaction | +| `kenney-ui/click2` | Click 2 | 0.053s | object-animation, interaction | +| `kenney-ui/click3` | Click 3 | 0.083s | object-animation, interaction | +| `kenney-ui/click4` | Click 4 | 0.038s | object-animation, interaction | +| `kenney-ui/click5` | Click 5 | 0.035s | object-animation, interaction | +| `kenney-ui/mouseclick1` | Mouseclick 1 | 0.056s | object-animation, interaction | +| `kenney-ui/mouserelease1` | Mouserelease 1 | 0.066s | object-animation, interaction | +| `kenney-ui/rollover1` | Rollover 1 | 0.224s | object-animation, interaction | +| `kenney-ui/rollover2` | Rollover 2 | 0.054s | object-animation, interaction | +| `kenney-ui/rollover3` | Rollover 3 | 0.066s | object-animation, interaction | +| `kenney-ui/rollover4` | Rollover 4 | 0.110s | object-animation, interaction | +| `kenney-ui/rollover5` | Rollover 5 | 0.109s | object-animation, interaction | +| `kenney-ui/rollover6` | Rollover 6 | 0.172s | object-animation, interaction | + +## 10. State change (49) + +| Canonical id | Label | Duration | Registered contexts | +|---|---|---:|---| +| `kenney-interface/switch_001` | Switch 001 | 0.615s | object-animation, state-change | +| `kenney-interface/switch_002` | Switch 002 | 0.608s | object-animation, state-change | +| `kenney-interface/switch_003` | Switch 003 | 0.500s | object-animation, state-change | +| `kenney-interface/switch_004` | Switch 004 | 0.497s | object-animation, state-change | +| `kenney-interface/switch_005` | Switch 005 | 0.609s | object-animation, state-change | +| `kenney-interface/switch_006` | Switch 006 | 0.608s | object-animation, state-change | +| `kenney-interface/switch_007` | Switch 007 | 0.611s | object-animation, state-change | +| `kenney-interface/toggle_001` | Toggle 001 | 0.136s | object-animation, state-change | +| `kenney-interface/toggle_002` | Toggle 002 | 0.136s | object-animation, state-change | +| `kenney-interface/toggle_003` | Toggle 003 | 0.139s | object-animation, state-change | +| `kenney-interface/toggle_004` | Toggle 004 | 0.063s | object-animation, state-change | +| `kenney-ui/switch1` | Switch 1 | 0.312s | object-animation, state-change | +| `kenney-ui/switch10` | Switch 10 | 0.387s | object-animation, state-change | +| `kenney-ui/switch11` | Switch 11 | 0.294s | object-animation, state-change | +| `kenney-ui/switch12` | Switch 12 | 0.051s | object-animation, state-change | +| `kenney-ui/switch13` | Switch 13 | 0.025s | object-animation, state-change | +| `kenney-ui/switch14` | Switch 14 | 0.035s | object-animation, state-change | +| `kenney-ui/switch15` | Switch 15 | 0.253s | object-animation, state-change | +| `kenney-ui/switch16` | Switch 16 | 0.356s | object-animation, state-change | +| `kenney-ui/switch17` | Switch 17 | 0.330s | object-animation, state-change | +| `kenney-ui/switch18` | Switch 18 | 0.432s | object-animation, state-change | +| `kenney-ui/switch19` | Switch 19 | 0.381s | object-animation, state-change | +| `kenney-ui/switch2` | Switch 2 | 0.318s | object-animation, state-change | +| `kenney-ui/switch20` | Switch 20 | 0.356s | object-animation, state-change | +| `kenney-ui/switch21` | Switch 21 | 0.407s | object-animation, state-change | +| `kenney-ui/switch22` | Switch 22 | 0.356s | object-animation, state-change | +| `kenney-ui/switch23` | Switch 23 | 0.381s | object-animation, state-change | +| `kenney-ui/switch24` | Switch 24 | 0.279s | object-animation, state-change | +| `kenney-ui/switch25` | Switch 25 | 0.381s | object-animation, state-change | +| `kenney-ui/switch26` | Switch 26 | 0.228s | object-animation, state-change | +| `kenney-ui/switch27` | Switch 27 | 0.279s | object-animation, state-change | +| `kenney-ui/switch28` | Switch 28 | 0.202s | object-animation, state-change | +| `kenney-ui/switch29` | Switch 29 | 0.304s | object-animation, state-change | +| `kenney-ui/switch3` | Switch 3 | 0.364s | object-animation, state-change | +| `kenney-ui/switch30` | Switch 30 | 0.356s | object-animation, state-change | +| `kenney-ui/switch31` | Switch 31 | 0.432s | object-animation, state-change | +| `kenney-ui/switch32` | Switch 32 | 0.432s | object-animation, state-change | +| `kenney-ui/switch33` | Switch 33 | 0.512s | object-animation, state-change | +| `kenney-ui/switch34` | Switch 34 | 0.483s | object-animation, state-change | +| `kenney-ui/switch35` | Switch 35 | 0.330s | object-animation, state-change | +| `kenney-ui/switch36` | Switch 36 | 0.329s | object-animation, state-change | +| `kenney-ui/switch37` | Switch 37 | 0.304s | object-animation, state-change | +| `kenney-ui/switch38` | Switch 38 | 0.421s | object-animation, state-change | +| `kenney-ui/switch4` | Switch 4 | 0.417s | object-animation, state-change | +| `kenney-ui/switch5` | Switch 5 | 0.312s | object-animation, state-change | +| `kenney-ui/switch6` | Switch 6 | 0.347s | object-animation, state-change | +| `kenney-ui/switch7` | Switch 7 | 0.213s | object-animation, state-change | +| `kenney-ui/switch8` | Switch 8 | 0.329s | object-animation, state-change | +| `kenney-ui/switch9` | Switch 9 | 0.259s | object-animation, state-change | + +## 11. Draw and gesture (8) + +| Canonical id | Label | Duration | Registered contexts | +|---|---|---:|---| +| `bigsoundbank/3236` | Pencil, signature #1 | 3.372s | object-animation, draw | +| `bigsoundbank/3237` | Pencil, signature #2 | 1.763s | object-animation, draw | +| `bigsoundbank/3238` | Pencil, signature #3 | 2.146s | object-animation, draw | +| `kenney-interface/scratch_001` | Scratch 001 | 0.139s | object-animation, draw | +| `kenney-interface/scratch_002` | Scratch 002 | 0.139s | object-animation, draw | +| `kenney-interface/scratch_003` | Scratch 003 | 0.123s | object-animation, draw | +| `kenney-interface/scratch_004` | Scratch 004 | 0.325s | object-animation, draw | +| `kenney-interface/scratch_005` | Scratch 005 | 0.325s | object-animation, draw | diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/tables/README.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/tables/README.md index f8bbb75e..e87ec24a 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/tables/README.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/tables/README.md @@ -12,15 +12,20 @@ Master/Layout systems belong in [`layouts/`](../layouts/). ## Source of truth -[`tables_index.json`](./tables_index.json) is the sole table registry. Its -`tables` object maps each canonical key to one selection-rule `summary`; keys -match `.svg`, and `meta.total` matches the canonical SVG roster. +[`tables_index.json`](./tables_index.json) is the machine registry. Its +`tables` object maps each canonical key to one diagnostic-recall `summary`; +keys match `.svg`, and `meta.total` matches the canonical SVG roster. +[`table-vocabulary.md`](./table-vocabulary.md) projects the same six keys as +objective planning-side information relationships without execution details or +selection conclusions. -Default Strategist and Quick read this complete compact registry together with -the Chart registry before planning. They compare every selection rule, then use +Default Strategist and Quick read the complete Table vocabulary together with +the Chart vocabulary before planning. They compare every objective +relationship, then use [`visualization_recall.py`](../../scripts/visualization_recall.py) `validate` to resolve selected canonical references. Its `recall` mode remains an optional -diagnostic helper, not the runtime capability gate. Default writes +diagnostic helper over the machine registry, not the runtime capability gate. +Default writes `table/` to `page_visualizations`; Quick keeps the selected reference in active context. @@ -33,9 +38,8 @@ family, and catalog rules. Table-specific requirements are: - Preserve the complete row/column topology, headers, values, units, ordering, merges, alignment, totals, status, and source notes. - Default output remains independently editable DrawingML shapes. -- Add native Table replacement metadata only for a supported pure text grid - selected as an independent native-ready object. The fallback and metadata - contain the same cells. +- Add native Table replacement metadata to every supported pure text grid; it + is native-ready by default. The fallback and metadata contain the same cells. - Keep graphical cells such as rating dots, icons, status marks, avatars, or embedded bars on the Shape fallback route unless the active native-data contract explicitly supports them. diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/tables/table-vocabulary.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/tables/table-vocabulary.md new file mode 100644 index 00000000..8ed92baa --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/tables/table-vocabulary.md @@ -0,0 +1,21 @@ +# Table Expression Vocabulary + +This is the complete planning-side map of the six canonical Table references. +Choose from the page's actual row-column information model, then retain the +exact `table/` identifier. This file contains no SVG construction, +cell-sizing, styling, native-replacement, or export instructions; those +decisions belong to Executor after selection. + +**Reference — not a constraint**: each description states what the cell grid +represents. It is not a ranking, recommendation, threshold, quota, or +substitute for judgment from the current facts and communication goal. Zero +Table selections remains valid. + +| Canonical reference | Encoded relationship | +|---|---| +| `table/record_table` | Each row represents one flat record, and each column represents one stable heterogeneous field. | +| `table/metric_table` | Entities form rows while metric columns hold current values, changes, statuses, or target progress inside cells. | +| `table/comparison_matrix` | Criteria and alternatives form the two grid axes, with exact values, prose, or mixed facts at their intersections. | +| `table/feature_matrix` | Capabilities and offerings form the two grid axes, with supported, unsupported, partial, or exception states in cells. | +| `table/rating_matrix` | Criteria and alternatives form the two grid axes, with one repeated ordinal scale encoded across their intersections. | +| `table/hierarchical_table` | Grouped or indented rows preserve a detail hierarchy across stable measure columns, including subtotals and totals. | diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/workflows/generate-pptx.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/workflows/generate-pptx.md index cca2d70e..4738c0a2 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/workflows/generate-pptx.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/workflows/generate-pptx.md @@ -8,6 +8,10 @@ description: Default Generate PPTX authority for source intake, planning, SVG au > Beautify profile. This file owns that runtime's Step 1–7 sequence, gates, role > switching, and mandatory commands. Explicit Quick loads its own profile instead. +**Hard rule — runtime paths**: Resolve every linked or abbreviated package path +below from the entry-time `SKILL_DIR` anchor and expand it inside each tool +call. Never change CWD or inherit a prior shell working directory. + **Default Core Pipeline**: `Initial Materials → [Fact Research] → Create Project → Template Candidate Preparation → Stage-1 Communication + Template Confirmation → [Template Installation] → Stage-2 Solution → [Image Acquisition] → Executor Live Preview → Quality Check → Post-processing → Export` **Generate-specific execution discipline**: @@ -257,8 +261,8 @@ a deck's larger identity/slide-library files only when the specific need below arises. ``` -Read references/strategist.md -Read references/canvas-formats.md +Read ${SKILL_DIR}/references/strategist.md +Read ${SKILL_DIR}/references/canvas-formats.md ``` Then load only the extra role modules triggered by the current plan: @@ -273,15 +277,15 @@ below in one batch before authoring any Stage-2 whole-solution intent, image source recommendation, or page roster: ``` -Read references/strategist-image.md -Read references/image-layout-spec.md -Read references/image-layout-patterns.md -Read references/modes/_index.md -Read references/visual-styles/_index.md -Read references/image-renderings/_index.md -Read templates/icons/README.md -Read templates/charts/charts_index.json -Read templates/tables/tables_index.json +Read ${SKILL_DIR}/references/strategist-image.md +Read ${SKILL_DIR}/references/image-layout-spec.md +Read ${SKILL_DIR}/references/image-layout-patterns.md +Read ${SKILL_DIR}/references/modes/_index.md +Read ${SKILL_DIR}/references/visual-styles/_index.md +Read ${SKILL_DIR}/references/image-renderings/_index.md +Read ${SKILL_DIR}/templates/icons/README.md +Read ${SKILL_DIR}/templates/charts/chart-vocabulary.md +Read ${SKILL_DIR}/templates/tables/table-vocabulary.md ``` This is a capability map, not a usage checklist: retain zero-use outcomes and @@ -525,7 +529,7 @@ in Step 7.1. This is frozen production input, not a third planning artifact. **Always load the common framework**: ``` -Read references/image-base.md +Read ${SKILL_DIR}/references/image-base.md ``` Then **lazy-load the path-specific reference** for each row that actually needs it: @@ -587,7 +591,7 @@ Workflow: Read the Executor role core before applying its context policy: ``` -Read references/executor-base.md # REQUIRED: flat/shared execution core +Read ${SKILL_DIR}/references/executor-base.md # REQUIRED: flat/shared execution core ``` **Planning context**: follow [`executor-base.md`](../references/executor-base.md) §2.1. Reuse the complete Design Spec and lock in an unchanged, uncompacted context. Fresh/resumed/restarted, compacted/summary-only, or externally/unknown changed execution reads both once and reloads triggered inputs. For a local question, consult the retained lock first, then only the owning Design Spec fragment; do not poll files merely to prove validity. @@ -608,13 +612,14 @@ Read the exact execution references named by this deck's retained `spec_lock.md`; do not reopen the planning indexes. Load the remaining fixed construction block plus the resolved mode/style detail files as one batch: ``` -Read references/shared-standards-core.md # REQUIRED: SVG compatibility + shared aesthetic/leading baseline -Read references/svg-effects.md # REQUIRED: Visual Job Router + effects/construction vocabulary -Read references/native-shape-authoring.md # REQUIRED: native-shape selection and Boolean construction -Read references/executor-structure.md # REQUIRED: qualitative relationship and topology grammar -Read references/semantic-svg.md # REQUIRED: semantic metadata boundary -Read references/modes/.md # one preset id, or each `mode_references` id -Read references/visual-styles/.md # one preset id, or each `visual_style_references` id +Read ${SKILL_DIR}/references/shared-standards-core.md # REQUIRED: SVG compatibility + shared aesthetic/leading baseline +Read ${SKILL_DIR}/references/svg-effects.md # REQUIRED: Visual Job Router + effects/construction vocabulary +Read ${SKILL_DIR}/references/native-shape-authoring.md # REQUIRED: native-shape selection and Boolean construction +Read ${SKILL_DIR}/references/preset-shape-vocabulary.md # REQUIRED: complete 187-name authoring vocabulary +Read ${SKILL_DIR}/references/executor-structure.md # REQUIRED: qualitative relationship and topology grammar +Read ${SKILL_DIR}/references/semantic-svg.md # REQUIRED: semantic metadata boundary +Read ${SKILL_DIR}/references/modes/.md # one preset id, or each `mode_references` id +Read ${SKILL_DIR}/references/visual-styles/.md # one preset id, or each `visual_style_references` id ``` Keep the core's shared visual-quality defaults and `svg-effects.md` §6.1 Visual Job Router active during page authoring; they are not passive compatibility reading. Explicit user/template requirements and the locked style override compatible aesthetic defaults, never technical Required / Forbidden boundaries. @@ -672,7 +677,7 @@ sidecars, or guessed family paths. **Visual Construction Phase**: generate SVG pages sequentially, one at a time, in one continuous pass → `/svg_output/` -Each completed SVG MUST be a standalone, complete representation of that slide's visible design. Template SVGs and locked planning artifacts may guide construction, but export must not reach back to them to add visible objects omitted from `svg_output/`. Speaker notes, animation, narration, transitions, and direct native-PPTX workflows remain separately owned artifacts/capabilities. Native shapes are Executor-local authoring capabilities, not planned resources: follow [`native-shape-authoring.md`](../references/native-shape-authoring.md), load its complete current preset inventory before the first page, choose page-fit contours before their authoring forms, keep exact native atoms independent when possible, materialize a Merge Shapes Boolean result only where contour semantics require it, and use necessary freeform last. Diagram relationships follow the same Shape-first gate; do not infer a preset from contour similarity. +Each completed SVG MUST be a standalone, complete representation of that slide's visible design. Template SVGs and locked planning artifacts may guide construction, but export must not reach back to them to add visible objects omitted from `svg_output/`. Speaker notes, animation, narration, transitions, and direct native-PPTX workflows remain separately owned artifacts/capabilities. Native shapes are Executor-local authoring capabilities, not planned resources: follow [`native-shape-authoring.md`](../references/native-shape-authoring.md), read the complete current preset vocabulary before the first page, choose page-fit contours before their authoring forms, keep exact native atoms independent when possible, materialize a Merge Shapes Boolean result only where contour semantics require it, and use necessary freeform last. Diagram relationships follow the same Shape-first gate; do not infer a preset from contour similarity. **Motion-ready image composition**: Only when an explicit user motion instruction, the effective Custom Animations outcome in `design_spec.md §I` is @@ -707,7 +712,7 @@ Run the command unfiltered—do not pipe it through `tail`, `head`, `grep`, or a | Signal | Reading | |---|---| -| Two or more issues share a category and direction | Method-level bias — resolve it to the authoritative rule before P02; a correction fitted to the observed offset only patches this sample. For text extents that rule is `svg_to_pptx.drawingml.elements.estimate_single_line_text_frame_width(runs)`, with `skills/ppt-master/scripts` on `sys.path` and every run key present — `text`, `font_size`, `font_family`, `font_weight`, `letter_spacing` — since omissions under-measure | +| Two or more issues share a category and direction | Method-level bias — resolve it to the authoritative rule before P02; a correction fitted to the observed offset only patches this sample. For text extents that rule is `svg_to_pptx.drawingml.elements.estimate_single_line_text_frame_width(runs)`, with `${SKILL_DIR}/scripts` on `sys.path` and every run key present — `text`, `font_size`, `font_family`, `font_weight`, `letter_spacing` — since omissions under-measure | | One isolated issue tied to this page's structure | Page-local — fix and continue | | A recurring element appears for the first time (page furniture, caption format, section numbering, accent discipline) | It will be copied to every later page — confirm its semantics now | diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/workflows/profiles/quick-generate.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/workflows/profiles/quick-generate.md index a98b809d..0fd040a1 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/workflows/profiles/quick-generate.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/workflows/profiles/quick-generate.md @@ -13,6 +13,10 @@ description: One-pass Generate profile for agent-decided preparation, direct SVG strategy/confirmation, or directs the agent to proceed to SVG and export. Page count alone never activates or blocks this profile. +**Hard rule — Quick paths**: Apply the entry-time `SKILL_DIR` anchor to every +linked or abbreviated package path below. Expand it inside each tool call; +never change CWD or inherit a prior shell working directory. + --- ## 1. Profile Boundary @@ -248,15 +252,15 @@ Before resolving the one-pass design, read this fixed planning-capability batch in one pass: ``` -Read references/canvas-formats.md -Read references/image-layout-spec.md -Read references/image-layout-patterns.md -Read references/modes/_index.md -Read references/visual-styles/_index.md -Read references/image-renderings/_index.md -Read templates/icons/README.md -Read templates/charts/charts_index.json -Read templates/tables/tables_index.json +Read ${SKILL_DIR}/references/canvas-formats.md +Read ${SKILL_DIR}/references/image-layout-spec.md +Read ${SKILL_DIR}/references/image-layout-patterns.md +Read ${SKILL_DIR}/references/modes/_index.md +Read ${SKILL_DIR}/references/visual-styles/_index.md +Read ${SKILL_DIR}/references/image-renderings/_index.md +Read ${SKILL_DIR}/templates/icons/README.md +Read ${SKILL_DIR}/templates/charts/chart-vocabulary.md +Read ${SKILL_DIR}/templates/tables/table-vocabulary.md ``` This batch is the complete capability map for planning, not a usage checklist: @@ -348,7 +352,7 @@ or easier syntax never skips it. **Hard rule**: Credentials do not decide image need or the initial carrier plan. Do not inspect backend configuration or probe a provider before planning. Web acquisition retains zero-config providers; actual AI generation capability is resolved only during resource preparation, where the declared Quick no-AI replan below owns automated exhaustion. -**Default — visual grounding before a zero-image deck (may override when the user forbids images or charts / native SVG fully carry the visual burden)**: When the audience must recognize, experience, compare, or choose an externally verifiable subject, place, product, or setting, plan supplied/extracted or web images. Prepare AI imagery proactively where invented or deliberately stylized expression materially improves a planned visual job; this may be a complete image or transparent elements composed with other page carriers. This is a semantic decision, not an image-count quota. +**Default — visual grounding before a zero-image deck (may override when the full-roster carrier review finds no useful image job)**: Honor an explicit no-image requirement. When the audience must recognize, experience, compare, or choose an externally verifiable subject, place, product, or setting, plan supplied/extracted or web images. Prepare AI imagery proactively where invented or deliberately stylized expression materially improves a planned visual job; this may be a complete image or transparent elements composed with other page carriers. A zero-image result remains valid when no image job improves communication. This is a semantic decision, not an image-count quota. **Mandatory — materialize a selected composable illustration family**: When the carrier resolution selects one, resolve the family before SVG authoring. @@ -365,24 +369,26 @@ with SVG icons to the page and deck fit under [`image-generator.md`](../../references/image-generator.md) §4.3; apply no coverage quota and never treat the slices as SVG inventory. -**Mandatory — proactive AI decorative lettering**: During that same one-pass +**Mandatory — proactive decorative-lettering capability scan**: During that same one-pass carrier resolution, when the user has not forbidden AI, scan the frozen roster -for display strings anywhere in the deck. Exactly two questions decide -eligibility: is that wording stable, and would an artistic treatment -communicate better than native type? -Page role, string length, line count, and kind of noun never filter candidates — +for display strings anywhere in the deck. Two questions expose candidates: is +that wording stable, and could an artistic treatment plausibly communicate +better than native type? Passing both exposes a possible AI visual job; it does +not select lettering or add AI by itself. Page role, string length, line count, +kind of noun, and resolved style never pre-filter candidates — a cover hook, chapter word, place or product name, dish or exhibit name, year, hero number, pull quote, or recurring motif word all qualify when both answers are yes. Read any such list as examples, never as the set of allowed cases; a two-character mark, an eight-character phrase, and a two-line lockup are equally valid, and a phrase is never trimmed toward one or two characters to feel more "wordmark-like". Set over photography or a busy field is often exactly where -native type reads pasted-on. Eligibility is wide but use stays selective: build -one small coherent set for the deck rather than lettering every heading, and -keep a native title wherever the page needs a searchable, selectable, or -outline-visible heading, with the lettering as its display layer. -If a suitable set exists, prepare it without -a separate request: preserve the exact approved strings, use one ordinary AI +native type reads pasted-on. Compare every candidate inside the complete page +and deck carrier mix, then select any coherent set whose treatment wins that +fit; selecting none remains valid and needs no skip explanation or coverage +quota. For every selected mark, keep a native title wherever the page needs a +searchable, selectable, or outline-visible heading, with the lettering as its +display layer. Prepare the selected set without a separate request: preserve +the exact approved strings, use one ordinary AI item for a single mark or group compatible marks through Illustration Sheets and transparent slices. Let the intended character and treatment guide grouping. Give the model the marks' role, placement/background relationship, relative @@ -394,10 +400,9 @@ and an editable title are not mutually exclusive: one page may carry the wordmark as its display layer while its subtitle, chrome, and body stay native text, so a wish to keep that wording editable is answered by the native layer rather than by dropping the lettering. AI permission is not -coverage: never invent or alter copy, or create lettering merely -to justify AI usage. Once an existing string passes both eligibility questions, -skip it only when the user forbade AI; do not add another disqualifier. Actual -generation capability is resolved during resource preparation, not eligibility. +coverage: never invent or alter copy, or create lettering merely to justify AI +usage. Actual generation capability is resolved during resource preparation, +after selection rather than during candidate discovery. | Communication job | Available carrier | |---|---| @@ -420,14 +425,16 @@ This carrier menu does not satisfy or replace the per-page Structure decision in Resolving one visual style, `Illus.` propensity, or generated-image rendering resolves how imagery **looks**; it resolves the source for no page. A named place, building, product, artwork, person, or other externally verifiable subject stays a web/supplied candidate no matter how illustrative the deck looks. When such a subject is deliberately not shown as itself, state that choice and its reason in the final report rather than leaving it implicit. **Mandatory — complete Chart/Table capability review**: During that same -carrier resolution, compare every page's information model against every -`Pick` / `Skip` rule in the two already-loaded live registries. The registries -expose the possibility space; they are neither usage quotas nor whitelists. Do -not select a catalog reference for qualitative shape composition. Choose at -most one primary Chart/Table `family/key` for a page, validate it with -`visualization_recall.py validate`, and keep its short purpose only in active -context. Retain `no-template-match` when none fits. The reference remains -flexible: it does not lock final type, geometry, style, or native output. +carrier resolution, compare every page's information model against every entry +in the already-loaded Chart and Table expression vocabularies. These +complete capability maps expose what exists; their descriptions do not rank +candidates or replace judgment from the actual information, and they are +neither usage quotas nor whitelists. Do not select a catalog reference for +qualitative shape composition. Choose at most one primary Chart/Table +`family/key` for a page, validate it with `visualization_recall.py validate`, +and keep its short purpose only in active context. Retain `no-template-match` +when none fits. The reference remains flexible: it does not lock final type, +geometry, style, or native output. Describe an embedded child Chart/Table and every qualitative relationship in the page's active decision rather than selecting another primary reference. Actual information models determine the loaded execution branches. Give every independent @@ -448,7 +455,7 @@ Prepare only the resource paths needed by the decided pages: | Web image | Follow `image-base.md` + `image-searcher.md`; keep query/status data and `image_sources.json`, including any required on-slide attribution | | Composable illustration / illustrated-icon / lettering slice | Generate or obtain the parent sheet, run `slice_images.py --trim --alpha --bg KEY_HEX_FROM_PROMPT --strict-alpha`, and place only outputs from a successful strict cut. Slices remain under `images/` and may serve several pages; each lettering sheet still names every exact stable string assigned to it | | Registered reconstruction group | Follow `image-generator.md` §4.4; keep full-canvas members registered with `crop=no-crop`, and materialize every required shared-plate member as an independent picture object | -| Visualization | Keep Chart values, Table cell topology, and chosen treatment in active context; load the applicable Chart/Table authority in §3 and write native replacement metadata only for an independently selected native-ready object | +| Visualization | Keep Chart values, Table cell topology, and chosen treatment in active context; load the applicable Chart/Table authority in §3 and write native replacement metadata for every supported chart and pure text grid, which are native-ready by default | **Hard rule — planned slice closure**: Every placeable-element sheet carries `slice_grid` plus comma-separated `slice_names` in `image_prompts.json`. Deterministically enumerate those basenames and require every `images/.png` after an exit-0 `slice_images.py --strict-alpha` run before SVG authoring; a `Generated` parent sheet never satisfies its named outputs. A nonzero slice run returns the parent to image preparation: correct only an evidenced key/tolerance mismatch, then enlarge cells or split incompatible shape families and regenerate when content reaches a cell edge. Repeating the same failing grid is not recovery. An explicitly selected manual path retains the marker, sets the affected item to `Needs-Manual` with `last_error`, and blocks Quick SVG/export until every named output is supplied and validated. Exhausted automated AI generation or dependent slicing instead follows the no-AI replan below; never retain an unresolved AI/slice row merely to continue. @@ -495,6 +502,7 @@ not route among them one file at a time: [`shared-standards-core.md`](../../references/shared-standards-core.md), [`svg-effects.md`](../../references/svg-effects.md), [`native-shape-authoring.md`](../../references/native-shape-authoring.md), +[`preset-shape-vocabulary.md`](../../references/preset-shape-vocabulary.md), [`semantic-svg.md`](../../references/semantic-svg.md), and [`executor-structure.md`](../../references/executor-structure.md). Retain only the mode/style detail files selected during one-pass design resolution and @@ -517,8 +525,8 @@ Reread only after a known file change or context invalidation. `Structure=yes` result can apply its qualitative topology grammar. `native-shape-authoring.md` independently owns contour selection and compound page geometry for both Structure results. Reuse both throughout the valid -execution context; before P01, complete its unfiltered full-registry discovery, -then reread only after a known file change or context invalidation. +execution context; before P01, read the complete preset vocabulary once, then +reread only after a known file change or context invalidation. **Mandatory — per-image-page composition decision**: For every page with one or more images, after its content and communication move are @@ -562,15 +570,13 @@ This decision is mandatory on every page and cannot be satisfied by the capability menu, visualization recall, template geometry, or a later check. **Mandatory — independent per-page geometry move**: after the Structure result -and any applicable topology resolve, but before choosing any contour, run the -page-local direct `recommend --compact --limit 6` invocation defined by -[`native-shape-authoring.md`](../../references/native-shape-authoring.md) from -the actual job, then invoke `describe --compact` directly only for serious -candidates. Registry discovery followed by direct `describe` without -`recommend` does not satisfy this recall. Apply §2.1 to the transient geometry -job, actual content, resolved style, and complete native vocabulary before -writing coordinates. It owns the exact-fit geometry gate, independent -relationship / carrier fit, +and any applicable topology resolve, apply +[`native-shape-authoring.md`](../../references/native-shape-authoring.md) §2.1 +to the transient geometry job, actual content, resolved style, and complete +loaded native vocabulary before writing coordinates. Select through direct +semantic comparison; use `describe --compact` only when objective geometry +facts could change a serious candidate decision. This move owns the exact-fit +geometry gate, independent relationship / carrier fit, contour-family / exact-result choice, reader effect for a generic or undrawn result, running actual-geometry signature, and materialization boundary. A primitive remains valid when it wins this comparison; there is no preset quota. @@ -584,7 +590,7 @@ context and never change the Structure result. | Any actual row × column fact grid | [`executor-table.md`](../../references/executor-table.md) | | Any mathematical notation that may require native math | [`native-formula.md`](../../references/native-formula.md) before choosing ordinary text, inline native math, or block native math | | Any external or same-deck click hyperlink | [`native-hyperlinks.md`](../../references/native-hyperlinks.md) before authoring its inline or whole-object SVG anchor | -| A used preset pattern fill, or one independent Chart/Table object selected as native-ready in active context | [`native-data-interface.md`](../../references/native-data-interface.md) before drawing that object | +| A used preset pattern fill, or one independent Chart/Table object resolved as `=yes` in active context | [`native-data-interface.md`](../../references/native-data-interface.md) before drawing that object | | Any data-driven chart geometry | [`verify-charts.md`](../stages/verify-charts.md) after the complete roster and before the one final checker | Chart/Table reference and final information model are independent loading @@ -743,11 +749,11 @@ or lock. - [x] All required source/resource preparation is complete - [x] The fixed planning-capability batch was read before the roster, and every selected detail source was read -- [x] The complete native preset registry was read unfiltered before P01; every page entering ordinary contour selection ran job-derived `recommend` before choosing a contour and described only serious candidates +- [x] The complete 187-name native preset vocabulary was read before P01; each page chose from that full capability surface, with objective candidate details inspected only when needed - [x] Every page considered suitable carrier combinations without a coverage quota or single-carrier assumption -- [x] The proactive decorative-lettering scan ran before capability resolution; every exact string passing both eligibility questions entered an AI item or lettering sheet/slice job unless the user forbade AI +- [x] The proactive decorative-lettering capability scan ran before carrier selection; every selected lettering job entered an AI item or lettering sheet/slice job, and zero selected jobs remained valid - [x] Every page not bound to literal supplied geometry carried its geometry job into authoring, resolved each drawn contour from its exact family and job, retained the reader effect for any generic or undrawn result, and compared its actual geometry signature before the next page; repetition served the same page job / relationship or continuity motif -- [x] Image need was decided independently of credentials; any zero-image deck is backed by an explicit no-image requirement or a roster whose visual burden is fully carried by charts / native SVG +- [x] Image need was decided independently of credentials; any zero-image deck followed a complete roster review in which no image job improved communication or the selected non-image carriers fully carried it - [x] Every `slice_names` output exists after an exit-0 strict-alpha run, and no page whose chosen composition depends on a slice was authored or exported without it - [x] Every image-bearing page made its one pre-geometry composition decision - [x] Every image decided its own source from that page's subject and job — not inherited from the resolved visual style — and every externally verifiable subject deliberately not shown as itself was stated with its reason diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/workflows/stages/customize-animations.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/workflows/stages/customize-animations.md index db9f476b..74126e21 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/workflows/stages/customize-animations.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/workflows/stages/customize-animations.md @@ -313,10 +313,11 @@ post-processing state: do not recover it from or write it back to | Need | Action | |---|---| | No resolved cue needs sound | Omit every `sound` field; do not create `/sounds/` | -| A bundled cue fits one resolved transition or animation row | Discover with `sound_sync.py list [--query ]`, then sync only the chosen namespaced id(s) into the project | +| A bundled cue fits one resolved transition or animation row | Read the complete [`sound-vocabulary.md`](../../templates/sounds/sound-vocabulary.md), choose from the resolved auditory job, then sync only the selected namespaced id(s) into the project | | The project already contains user-provided audio | Use its project-relative path when its format is valid; no library sync is required | ```bash +# Optional exact filtering after reviewing the complete vocabulary python3 skills/ppt-master/scripts/sound_sync.py list --query python3 skills/ppt-master/scripts/sound_sync.py \ / [/ ...] diff --git a/plugins/codex/plugins/shadcn/THIRD_PARTY_SOURCE.json b/plugins/codex/plugins/shadcn/THIRD_PARTY_SOURCE.json index 1cbffd59..55ea1bb0 100644 --- a/plugins/codex/plugins/shadcn/THIRD_PARTY_SOURCE.json +++ b/plugins/codex/plugins/shadcn/THIRD_PARTY_SOURCE.json @@ -2,8 +2,8 @@ "sourceId": "shadcn", "repo": "https://github.com/shadcn-ui/ui.git", "ref": "main", - "commit": "5c8f5b06746ac445e97a50cbeb63253d657d7541", + "commit": "25be24cca34d06eed29a4779c3f48c4816aa812c", "adapter": "claude-skill", "sourcePath": "skills/shadcn", - "syncedAt": "2026-08-18T16:00:00Z" + "syncedAt": "2026-08-19T16:00:01Z" } diff --git a/plugins/codex/plugins/ui-ux-pro-max/README.md b/plugins/codex/plugins/ui-ux-pro-max/README.md index 66d989b7..bcf78f66 100755 --- a/plugins/codex/plugins/ui-ux-pro-max/README.md +++ b/plugins/codex/plugins/ui-ux-pro-max/README.md @@ -652,7 +652,7 @@ python3 .claude/skills/ui-ux-pro-max/scripts/search.py "SaaS" --domain style --j ## Star History -[![Star History Chart](https://api.star-history.com/svg?repos=nextlevelbuilder/ui-ux-pro-max-skill&type=Date)](https://star-history.com/#nextlevelbuilder/ui-ux-pro-max-skill&Date) +[![Star History Chart](https://star-history.dera.page/svg?repos=nextlevelbuilder/ui-ux-pro-max-skill&type=Date)](https://star-history.dera.page/#nextlevelbuilder/ui-ux-pro-max-skill&Date) ## License diff --git a/plugins/codex/plugins/ui-ux-pro-max/THIRD_PARTY_SOURCE.json b/plugins/codex/plugins/ui-ux-pro-max/THIRD_PARTY_SOURCE.json index 0ec9427b..f77e3a91 100644 --- a/plugins/codex/plugins/ui-ux-pro-max/THIRD_PARTY_SOURCE.json +++ b/plugins/codex/plugins/ui-ux-pro-max/THIRD_PARTY_SOURCE.json @@ -2,8 +2,8 @@ "sourceId": "ui-ux-pro-max", "repo": "https://github.com/nextlevelbuilder/ui-ux-pro-max-skill.git", "ref": "main", - "commit": "a38d04c3d5c298c851dbe5e6ee1965ee3de42cb5", + "commit": "8a1a6d857332da32252d77365da90c3f6293b47b", "adapter": "claude-skill", "sourcePath": ".claude/skills/ui-ux-pro-max", - "syncedAt": "2026-08-14T16:00:00Z" + "syncedAt": "2026-08-19T16:00:01Z" }