Skill Tracer
Skills › Scientific Agent Skills › clinical-decision-support › security_validation.md

security_validation.md

64 lines · skills/clinical-decision-support/references/security_validation.md at 5f2bc03

Open on GitHub

Most marks come from matching words in the file, so treat them as pointers.

1# Security Validation Record
2
3Validation date: **2026-07-23** (local project date).
4

Security Validation Record

Validation date: 2026-07-23 (local project date).

Raw lines 1 to 4
5## Baseline
6
7The repository `SECURITY.md` section recorded 11 findings:
8
9- 3 CRITICAL findings for cross-file environment-variable/network exfiltration behavior;
10- 1 HIGH finding for transmitting a credential to an external service;
11- 5 MEDIUM findings for command chaining, credential flow, undeclared network use, and environment harvesting;
12- 2 LOW findings for mandatory cross-skill invocation and dependency concerns.
14The affected external schematic wrappers were the now-deleted files
15`generate_schematic.py` and `generate_schematic_ai.py`.

Baseline

The repository SECURITY.md section recorded 11 findings:

  • 3 CRITICAL findings for cross-file environment-variable/network exfiltration behavior;
  • 1 HIGH finding for transmitting a credential to an external service;
  • 5 MEDIUM findings for command chaining, credential flow, undeclared network use, and environment harvesting;
  • 2 LOW findings for mandatory cross-skill invocation and dependency concerns.

The affected external schematic wrappers were the now-deleted files generate_schematic.py and generate_schematic_ai.py.

Raw lines 5 to 16
17## Remediation
19- Deleted both schematic-generation scripts.
20- Removed all external service, LLM, image, credential, and environment-variable behavior.
21- Removed mandatory figures and cross-skill calls.
22- Replaced unsafe person-level classification and care-pathway helpers with aggregate or planning-only tools.
23- Added bounded local JSON handling, person-level-key rejection, output limits, and deterministic schemas.
24- Added static AST tests that reject network libraries, dynamic code execution, credential access, and executable serialization.

Remediation

  • Deleted both schematic-generation scripts.
  • Removed all external service, LLM, image, credential, and environment-variable behavior.
  • Removed mandatory figures and cross-skill calls.
  • Replaced unsafe person-level classification and care-pathway helpers with aggregate or planning-only tools.
  • Added bounded local JSON handling, person-level-key rejection, output limits, and deterministic schemas.
  • Added static AST tests that reject network libraries, dynamic code execution, credential access, and executable serialization.
Raw lines 17 to 25
26## Historical July 2026 Scan Results
28- Direct behavioral scan: **SAFE, 0 findings**.
29- Pull-request gate with `--fail-on HIGH`: **passed** with 0 CRITICAL and
30 0 HIGH. Repeated LLM-assisted runs returned 2–3 LOW findings because the
31 analyzer is nondeterministic.

Historical July 2026 Scan Results

  • Direct behavioral scan: SAFE, 0 findings.
  • Pull-request gate with --fail-on HIGH: passed with 0 CRITICAL and 0 HIGH. Repeated LLM-assisted runs returned 2–3 LOW findings because the analyzer is nondeterministic.
Raw lines 26 to 32
33## Accepted LOW Findings
35Across repeated runs, the nondeterministic analyzer reported different subsets of
36these LOW observations:
381. **Optional `allowed-tools` field absent** — accepted as informational. The
39 Agent Skills specification does not require it; compatibility and runtime
40 instructions explicitly prohibit network and credential access.
412. **Broad description** — accepted. The scope intentionally covers the related research-evaluation artifacts requested for this safety refresh, while the frontmatter and first body section explicitly exclude care and live operation.
423. **Person-level key filtering uses a denylist** — accepted as a documented limitation, not a privacy guarantee. Input is contractually restricted to synthetic or aggregate schemas, common person-level fields are rejected as defense in depth, and the documentation repeatedly requires qualified privacy review. The filter cannot detect every identifier name or sensitive value and is never presented as de-identification.
434. **Occasional missing-file report** — accepted as an analyzer false
44 positive. Some runs invented a `templates/` directory and nonexistent
45 `assets/*.md` references. The deterministic
46 `test_documented_local_paths_exist` check resolves every documented local
47 path and passes.
49None of the accepted findings permits network access, sensitive-data handling, or clinical action.

Accepted LOW Findings

Across repeated runs, the nondeterministic analyzer reported different subsets of these LOW observations:

  1. **Optional allowed-tools field absent** — accepted as informational. The Agent Skills specification does not require it; compatibility and runtime instructions explicitly prohibit network and credential access.
  2. Broad description — accepted. The scope intentionally covers the related research-evaluation artifacts requested for this safety refresh, while the frontmatter and first body section explicitly exclude care and live operation.
  3. Person-level key filtering uses a denylist — accepted as a documented limitation, not a privacy guarantee. Input is contractually restricted to synthetic or aggregate schemas, common person-level fields are rejected as defense in depth, and the documentation repeatedly requires qualified privacy review. The filter cannot detect every identifier name or sensitive value and is never presented as de-identification.
  4. Occasional missing-file report — accepted as an analyzer false positive. Some runs invented a templates/ directory and nonexistent assets/*.md references. The deterministic test_documented_local_paths_exist check resolves every documented local path and passes.

None of the accepted findings permits network access, sensitive-data handling, or clinical action.

Raw lines 33 to 50
51## September 2026 Maintenance
53The 2.4 refresh keeps all runtime helpers offline. Invalid aggregate/matrix inputs now withhold results or exports; denominator checks run before suppression; undefined balanced accuracy stays null; CSV text is escaped and dangling output symlinks are rejected. Synthetic regression tests cover these cases and the updated GRADE imprecision label. The July scanner results above are historical, not a claim about a new scan of version 2.4.

September 2026 Maintenance

The 2.4 refresh keeps all runtime helpers offline. Invalid aggregate/matrix inputs now withhold results or exports; denominator checks run before suppression; undefined balanced accuracy stays null; CSV text is escaped and dangling output symlinks are rejected. Synthetic regression tests cover these cases and the updated GRADE imprecision label. The July scanner results above are historical, not a claim about a new scan of version 2.4.

Raw lines 51 to 54
55## Reproduction
57```bash
58uv run skill-scanner scan skills/clinical-decision-support --use-behavioral
60uv run python scan_pr_skills.py \
61 --fail-on HIGH \
62 --output /tmp/clinical-decision-support-pr-scan.md \
63 skills/clinical-decision-support
64```

Reproduction

uv run skill-scanner scan skills/clinical-decision-support --use-behavioral

uv run python scan_pr_skills.py \
  --fail-on HIGH \
  --output /tmp/clinical-decision-support-pr-scan.md \
  skills/clinical-decision-support
Raw lines 55 to 64
Runs code python scan_pr_skills.py :60