Trusted — Risk Score 5/100
Last scan:2 days ago Rescan
5 /100
soul-in-sapphire
Long-term memory, state tracking, continuity review, and identity-change support for OpenClaw using Notion as a backend
soul-in-sapphire is a legitimate Notion-backed memory/state/continuity management skill with no malicious indicators — all capabilities are declared, all network calls target the official Notion API, and subprocess usage is scoped exclusively to the notionctl bridge.
Skill Namesoul-in-sapphire
Duration63.9s
Enginepi
Safe to install
No action required. The skill is safe to use as documented.

Findings 1 items

Severity Finding Location
Low
No dependency version pinning in package.json
package.json declares only {"name":"soul-in-sapphire","private":true,"type":"module"} with no dependencies. This is actually a positive security posture (no external runtime deps), but there is no protection against transitive dependency changes if notionctl.mjs or other deps evolve.
"dependencies": {}
→ Consider documenting the expected notionctl.mjs version if the skill adds a package.json deps list later.
package.json:1
ResourceDeclaredInferredStatusEvidence
Filesystem READ WRITE ✓ Aligned SKILL.md declares local mirror writes to memory/; scripts write config.json and …
Network READ READ ✓ Aligned All network calls go to Notion API via notionctl bridge (documented dependency)
Shell WRITE WRITE ✓ Aligned execFileSync spawns node notionctl.mjs; scoped and declared in SKILL.md (Require…
Environment READ READ ✓ Aligned NOTION_API_KEY and NOTIONCTL_PATH read; used only for Notion auth and path resol…
Skill Invoke WRITE WRITE ✓ Aligned SKILL.md documents dependency on notion-api-automation; subagent-spawn-plan.js d…
Clipboard NONE NONE No clipboard access in any script
Browser NONE NONE No browser automation in any script
Database WRITE WRITE ✓ Aligned Creates and writes to Notion databases (<base>-mem, events, emotions, state, jou…
1 findings
🔗
Medium External URL 外部 URL
https://www.notion.so/my-integrations
README.md:159

File Tree

23 files · 86.4 KB · 2538 lines
JavaScript 16f · 1773L Markdown 2f · 706L JSON 5f · 59L
├─ 📁 scripts
│ ├─ 📜 bootstrap_config.js JavaScript 42L · 1.5 KB
│ ├─ 📜 conflict_track.js JavaScript 80L · 2.5 KB
│ ├─ 📜 continuity_check.js JavaScript 136L · 4.7 KB
│ ├─ 📜 emostate_config.js JavaScript 26L · 803 B
│ ├─ 📜 emostate_notion.js JavaScript 92L · 3.5 KB
│ ├─ 📜 emostate_tick.js JavaScript 458L · 13.6 KB
│ ├─ 📜 identity_diff.js JavaScript 90L · 3.2 KB
│ ├─ 📋 input.json JSON 10L · 1.6 KB
│ ├─ 📜 journal_patch_schema.js JavaScript 40L · 1.4 KB
│ ├─ 📜 journal_write.js JavaScript 117L · 4.0 KB
│ ├─ 📜 ltm_common.js JavaScript 103L · 3.4 KB
│ ├─ 📜 ltm_search.js JavaScript 65L · 2.0 KB
│ ├─ 📜 ltm_write.js JavaScript 39L · 1.6 KB
│ ├─ 📜 notionctl_bridge.js JavaScript 141L · 4.6 KB
│ ├─ 📜 setup_ltm.js JavaScript 243L · 8.8 KB
│ ├─ 📜 state_recall.js JavaScript 51L · 1.7 KB
│ └─ 📜 subagent_spawn_plan.js JavaScript 50L · 1.8 KB
├─ 📁 state
│ ├─ 📋 subagent-models.json JSON 17L · 300 B
│ └─ 📋 subagent-models.template.json JSON 17L · 275 B
├─ 📋 package-lock.json JSON 10L · 147 B
├─ 📋 package.json JSON 5L · 72 B
├─ 📝 README.md Markdown 295L · 9.4 KB
└─ 📝 SKILL.md Markdown 411L · 15.6 KB

Dependencies 2 items

PackageVersionSourceKnown VulnsNotes
node (runtime binary) not declared system No Only requires Node.js runtime; no npm packages installed
notionctl.mjs not pinned sibling skill: notion-api-automation No Dependency is declared in SKILL.md metadata; called via execFileSync with fixed arguments

Security Positives

✓ All file writes (config.json, memory mirrors) are explicitly declared in SKILL.md
✓ All network requests go exclusively to the official Notion API — no direct external IP connections
✓ No credential exfiltration; NOTION_API_KEY is used only for Notion authentication
✓ No sensitive path access (~/.ssh, ~/.aws, .env files are never read)
✓ No base64/eval/atob obfuscation or hidden instructions anywhere in the codebase
✓ No remote script execution (curl|bash, wget|sh) — subprocess is scoped to local notionctl.mjs only
✓ Subprocess usage is fully declared in SKILL.md metadata (requires: bins:[node])
✓ Payload validation in emostate_tick.js rejects empty/meaningless inputs, preventing noisy artifact creation
✓ Local-analysis scripts (continuity_check.js, identity_diff.js, conflict_track.js) are pure JS with no I/O beyond declared paths
✓ The skill correctly uses JSON.parse with error handling throughout