Skills › Scientific Agent Skills › pptx-posters › security_validation.md
security_validation.md
101 lines · skills/pptx-posters/references/security_validation.md at 5f2bc03
Most marks come from matching words in the file, so treat them as pointers.
5## 2026-10-01 maintenance validation
7- Exact generation pins are now python-pptx 1.0.2, Pillow 12.3.0, and lxml 6.1.3.
8- The isolated per-skill suite passed **52 tests**, including generation/reopen,
9 deterministic bytes, UTC conversion across day boundaries, metadata limits,
10 in-directory final-symlink rejection, and distinct canvas/artboard PDF dimensions.
11- The spec validator passed. New aggregate security scan results are tracked by the
12 repository refresh; the historical scan findings below are not a new scan.
13- No native PowerPoint, PDF export, accessibility, or physical printer validation was
14 performed in this maintenance pass.
2026-10-01 maintenance validation
- Exact generation pins are now python-pptx 1.0.2, Pillow 12.3.0, and lxml 6.1.3.
- The isolated per-skill suite passed 52 tests, including generation/reopen, deterministic bytes, UTC conversion across day boundaries, metadata limits, in-directory final-symlink rejection, and distinct canvas/artboard PDF dimensions.
- The spec validator passed. New aggregate security scan results are tracked by the repository refresh; the historical scan findings below are not a new scan.
- No native PowerPoint, PDF export, accessibility, or physical printer validation was performed in this maintenance pass.
16## Baseline
18The repository `SECURITY.md` snapshot records **10 findings** for the former v1.2
19skill, with maximum severity **CRITICAL**:
21- three CRITICAL cross-file/environment/network transmission findings;
22- four MEDIUM credential, prompt, and environment-harvesting findings;
23- three LOW dependency, environment-file, and broken-reference findings.
25The affected implementation used two external schematic-generation scripts plus
26network, credential, environment-file, subprocess, and model behavior.
Baseline
The repository SECURITY.md snapshot records 10 findings for the former v1.2 skill, with maximum severity CRITICAL:
- three CRITICAL cross-file/environment/network transmission findings;
- four MEDIUM credential, prompt, and environment-harvesting findings;
- three LOW dependency, environment-file, and broken-reference findings.
The affected implementation used two external schematic-generation scripts plus network, credential, environment-file, subprocess, and model behavior.
Raw lines 16 to 2728## Remediation
30- Deleted both external schematic scripts and the unused HTML template.
31- Removed network/model calls, credentials, environment access, subprocesses, external
32 templates, mandatory figures, and cross-skill behavior.
33- Replaced the workflow with strict local JSON, exact source IDs, author approval
34 binding, optional hashed PNG/JPEG assets, and deterministic one-slide generation.
35- Added bounded ZIP central-directory, part-path, content-type, relationship, XML,
36 image-signature, macro, OLE, ActiveX, embedded-file, and external-link checks.
37- Added safe no-overwrite publication, lazy optional imports, exact dependency pins,
38 and AST policy tests that prohibit network, process, environment, executable
39 deserialization, and dynamic-code behavior.
Remediation
- Deleted both external schematic scripts and the unused HTML template.
- Removed network/model calls, credentials, environment access, subprocesses, external templates, mandatory figures, and cross-skill behavior.
- Replaced the workflow with strict local JSON, exact source IDs, author approval binding, optional hashed PNG/JPEG assets, and deterministic one-slide generation.
- Added bounded ZIP central-directory, part-path, content-type, relationship, XML, image-signature, macro, OLE, ActiveX, embedded-file, and external-link checks.
- Added safe no-overwrite publication, lazy optional imports, exact dependency pins, and AST policy tests that prohibit network, process, environment, executable deserialization, and dynamic-code behavior.
41## Validation results
43- Agent Skills reference validator: **PASS**
44- Dependency-free CLI help checks: **PASS**
45- Synthetic tests with standard library only: **47 passed, 2 exact-pin tests skipped**
46- Exact-pinned round trip (`python-pptx==1.0.2`, `Pillow==12.3.0`,
47 `lxml==6.1.1`): **49 passed**
48- Generated PPTX reopen, deterministic hash, package reinspection, alt text, title,
49 language, layout, image inventory, and no-overwrite checks: **PASS**
50- Explicit AST parse with bytecode disabled: **14 Python files parsed**
51- Bytecode artifacts: **0**
52- IDE lints: **0**
53- Diff whitespace check: **PASS**
54- Documented local-path check: **PASS**
55- External Markdown links checked: **39, no failures**
56- Direct behavioral security scan: **SAFE, 0 findings**
57- Pull-request gate with `--fail-on HIGH`: **PASS**
58 - CRITICAL: 0
59 - HIGH: 0
60 - LOW: 2
Validation results
- Agent Skills reference validator: PASS
- Dependency-free CLI help checks: PASS
- Synthetic tests with standard library only: 47 passed, 2 exact-pin tests skipped
- Exact-pinned round trip (
python-pptx==1.0.2,Pillow==12.3.0,lxml==6.1.1): 49 passed - Generated PPTX reopen, deterministic hash, package reinspection, alt text, title, language, layout, image inventory, and no-overwrite checks: PASS
- Explicit AST parse with bytecode disabled: 14 Python files parsed
- Bytecode artifacts: 0
- IDE lints: 0
- Diff whitespace check: PASS
- Documented local-path check: PASS
- External Markdown links checked: 39, no failures
- Direct behavioral security scan: SAFE, 0 findings
- Pull-request gate with
--fail-on HIGH: PASS - CRITICAL: 0
- HIGH: 0
- LOW: 2
62## Residual LOW findings
64The LLM-assisted pull-request scan reported:
661. **Bounded resource use.** Full image decoding is capped at 100 million pixels;
67 archives are capped at 512 MiB compressed, 1 GiB expanded, 4,096 members, 128 MiB
68 per member, and 100:1 expansion. Repeated maximum-size local inputs can still use
69 material CPU/memory. These documented limits are accepted; callers should apply
70 an execution timeout appropriate to their environment.
712. **Invented broken-path variants.** The scan claimed `templates/` paths and swapped
72 `assets/`/`references/` variants that do not occur in the skill. The deterministic
73 local-path test resolves every actual documented path and passes.
75Neither finding permits network access, credential access, code execution, macro
76activation, or overwrite. No CRITICAL or HIGH issue remains. The repository-level
77`SECURITY.md` is intentionally unchanged; its generated snapshot can update through
78the repository's normal scan process.
Residual LOW findings
The LLM-assisted pull-request scan reported:
- Bounded resource use. Full image decoding is capped at 100 million pixels; archives are capped at 512 MiB compressed, 1 GiB expanded, 4,096 members, 128 MiB per member, and 100:1 expansion. Repeated maximum-size local inputs can still use material CPU/memory. These documented limits are accepted; callers should apply an execution timeout appropriate to their environment.
- Invented broken-path variants. The scan claimed
templates/paths and swappedassets//references/variants that do not occur in the skill. The deterministic local-path test resolves every actual documented path and passes.
Neither finding permits network access, credential access, code execution, macro activation, or overwrite. No CRITICAL or HIGH issue remains. The repository-level SECURITY.md is intentionally unchanged; its generated snapshot can update through the repository's normal scan process.
80## Reproduction
82```bash
83PYTHONDONTWRITEBYTECODE=1 python3 -B -m unittest discover \
84 -s tests/pptx-posters -p "test_*.py" -v
86PYTHONDONTWRITEBYTECODE=1 uv run --no-project \
87 --with "python-pptx==1.0.2" \
88 --with "Pillow==12.3.0" \
89 --with "lxml==6.1.3" \
90 python -B -m unittest discover \
91 -s tests/pptx-posters -p "test_*.py" -v
93uv run skills-ref validate skills/pptx-posters
95uv run skill-scanner scan skills/pptx-posters --use-behavioral
97uv run python scan_pr_skills.py \
98 --fail-on HIGH \
99 --output /tmp/pptx-posters-pr-scan.md \
100 skills/pptx-posters
101```
Reproduction
PYTHONDONTWRITEBYTECODE=1 python3 -B -m unittest discover \
-s tests/pptx-posters -p "test_*.py" -v
PYTHONDONTWRITEBYTECODE=1 uv run --no-project \
--with "python-pptx==1.0.2" \
--with "Pillow==12.3.0" \
--with "lxml==6.1.3" \
python -B -m unittest discover \
-s tests/pptx-posters -p "test_*.py" -v
uv run skills-ref validate skills/pptx-posters
uv run skill-scanner scan skills/pptx-posters --use-behavioral
uv run python scan_pr_skills.py \
--fail-on HIGH \
--output /tmp/pptx-posters-pr-scan.md \
skills/pptx-postersRaw lines 80 to 101Runs code python scan_pr_skills.py :97