Back to skill

Security audit

Engram Evomap

Security checks for vulnerabilities and agentic risk

Overview

This skill is a long-term agent memory system, but it can store session-derived advice and later inject it as high-authority guidance, including one bundled unsafe Git TLS workaround.

Review this before installing in an agent that can run commands, access secrets, or edit repositories. Treat stored capsules as untrusted suggestions, avoid enabling system-role injection, remove or quarantine the bundled Git SSL seed, and require explicit consent before sending conversation history to any LLM provider.

Vulnerability Patterns
  • Agent Memory PoisoningWrites attacker-controlled rules into memory that affect later sessions
  • Insecure Skill Coding PracticesFinds exploitable flaws such as hardcoded secrets or command injection
  • Skill Instruction HijackingAlters the agent's session goals or safety constraints when the skill loads
  • Remote Payload Retrieval and ExecutionFetches external code whose behavior can change after review
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
Findings (2)

T02 · Agent Memory Poisoning

Error
Location
src/core/gene-processor.js:19
Finding
Persistent memory content can be elevated to system-message authority<![CDATA[ ## Vulnerability Details **File Location**: `src/core/gene-processor.js:19-59`; `src/core/distill-manager.js:34-55`; `src/core/context-injector.js:14-52`; `src/storage/capsule-store.js:76-100`; `src/hooks/exception-hook.js:20-60` **Vulnerability Type**: Persistent prompt injection through untrusted memory content **Risk Level**: High ### Vulnerable Code `src/core/gene-processor.js:19-59`: ```js async distill(sessionHistory) { const context = sessionHistory.slice(-12); // 取最近 12 轮对话 const rawText = context.map(m => `[${m.role}]: ${m.content}`).join('\n'); const prompt = ` 你是一位资深软件架构师,负责将具体的调试经验“基因化(GeneDistillation)”。 请分析以下对话中的问题解决过程: ${rawText} --- 提炼任务要求: 1. **去变量化**:剔除具体的项目路径、服务器IP、用户名、具体的仓库URL(用 <PATH>, <URL>, <USER> 代替)。 2. **逻辑抽象**:描述问题的本质原因,而非表现。例如:“NPM权限错误”而非“安装 axios 报错”。 3. **步骤分解**:将方案分解为 diagnosis(诊断)、patch(修复)、config(配置) 或 workaround(临时规避)。 4. **反模式警告**:指出用户容易踩坑的错误尝试(如有)。 请严格按照以下 JSON 格式输出,不要包含任何 Markdown 标记: { "category": "分类标签", "triggerPattern": "触发该场景的通用特征描述", "rootCause": "本质原因的抽象描述", "actionSequence": [ { "step": 1, "type": "diagnosis/patch/config/workaround", "instruction": "明确的指令", "rationale": "为什么要这么做" } ], "verificationCriterion": "验证问题已解决的标准", "antipatternWarning": "可选的警告信息", "tags": ["标签1", "标签2"] } `; const response = await this.llmClient.ask(prompt); // 清理 LLM 可能输出的 Markdown 块 const cleanJson = response.replace(/```json|```/g, '').trim(); const distilled = JSON.parse(cleanJson); // 为“触发特征”生成向量索引 const searchKey = `${distilled.triggerPattern} ${distilled.rootCause}`; const embedding = await this.embed.vectorize(searchKey); return { ...distilled, embedding }; } ``` `src/core/distill-manager.js:34-55`: ```js async _processTask(history, taskId) { try { console.log(`[EvoMap-Distill] Starting task ${taskId}...`); // 1. 提炼并生成向量 (LLM 1次消耗) const distilled = await this.processor.distill(history); const env = EnvChecker.getF ...[truncated 4612 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Never inject retrieved memory as a `system` message. Use a lower-authority `tool` or `user` message and explicitly label the content as untrusted reference material. 2. Store capsules only after verification has completed successfully. Introduce explicit states such as `draft`, `verified`, `quarantined`, and `rejected`, and restrict retrieval to `verified` records. 3. Do not rely solely on a numeric trust score. Require a separate approval flag and provenance metadata before a capsule can influence the agent. 4. Delimit untrusted session history in the distillation prompt and explicitly instruct the model to treat it as data rather than instructions. 5. Validate all LLM-produced fields against a restrictive policy. Reject content that attempts to override instructions, disclose secrets, contact unrelated endpoints, execute destructive commands, or change security controls. 6. Escape or quote capsule fields when rendering them. Do not interpolate arbitrary memory text into an authoritative instruction template. 7. Add a second independent validation layer rather than asking the same class of model to self-assess its own generated content. 8. Bind capsules to provenance, creator identity, creation session, verification status, and audit history. 9. Raise retrieval requirements for newly created entries and prevent draft capsules from being retrieved during the asynchronous verification window. 10. Add adversarial tests covering indirect prompt injection, persistent memory poisoning, malicious JSON fields, verification failure, and retrieval before verification. ]]>

T09 · Insecure Skill Coding Practices

Warning
Location
data/seeds/seeds.json:62
Finding
Bundled seed advice disables Git TLS verification globally<![CDATA[ ## Vulnerability Details **File Location**: `data/seeds/seeds.json:62-70` **Vulnerability Type**: Unsafe global TLS configuration **Risk Level**: Medium ### Vulnerable Code ```json { "step": 2, "type": "workaround", "instruction": "Disable git's global strict SSL validation.", "codeDiff": "git config --global http.sslVerify false", "rationale": "Bypass validation for local proxy routing." } ``` The same capsule includes the following warning: ```json "antipatternWarning": "This suppresses certificate verification globally. Revert when moving out of intranet!" ``` ### Technical Analysis The bundled seed capsule recommends: ```bash git config --global http.sslVerify false ``` This command disables certificate verification for Git HTTPS operations at the global user configuration level. It does not limit the change to a single repository or server and does not install or configure the correct corporate certificate authority. The seed is automatically inserted during `npx engram init`. When a matching SSL error is detected, the advice can be presented through the Skill's elevated advice mechanism. Although the capsule contains a warning, the primary action remains an insecure global configuration change, and the project provides no automatic rollback. TLS certificate verification is what authenticates the remote Git server. Disabling it allows a network attacker or compromised proxy to impersonate repositories without generating a certificate validation failure. ### Attack Path 1. The user runs `npx engram init`. 2. The CLI imports the bundled Git SSL seed into the local capsule database. 3. The user or agent encounters a Git certificate validation error. 4. The exception hook retrieves the matching seed and presents the global-disable command as a workaround. 5. The user or an automation-capable agent executes the command. 6. Subsequent Git HTTPS operations no longer authenticate server certificates. 7. An attacker with control over ...[truncated 732 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Remove the seed that recommends globally disabling TLS certificate verification. 2. Recommend installing the correct organizational root or intermediate CA in the operating-system trust store. 3. Where system trust-store modification is unsuitable, configure Git with the proper CA file: ```bash git config --global http.sslCAInfo /path/to/approved-corporate-ca.pem ``` 4. Prefer server-specific or repository-scoped configuration over global security reductions. 5. Provide diagnostic steps for certificate-chain problems, proxy interception, incorrect system time, and outdated CA bundles. 6. If disabling verification is mentioned for isolated debugging, clearly prohibit its use as a solution and require immediate rollback. It should not be emitted as actionable system advice. 7. Add a safety policy that rejects capsules recommending disabled TLS verification, disabled signature verification, unrestricted permissions, or comparable security-control bypasses. 8. Review all bundled and newly distilled capsules for commands that modify global security settings. ]]>
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Memory PoisoningPersistent Context Injection, Context Window Stuffing, Memory Manipulation
Findings (32)

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding
The skill claims to be a memory hub but also uses external LLM interaction for capsule evaluation and trust scoring. Undisclosed outbound model calls can expose session-derived content to third parties and create prompt-injection or data leakage risks inconsistent with the stated behavior.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding
The skill claims to be a memory hub but also uses external LLM interaction for capsule evaluation and trust scoring. Undisclosed outbound model calls can expose session-derived content to third parties and create prompt-injection or data leakage risks inconsistent with the stated behavior.

Tp4

High
Category
MCP Tool Poisoning
Confidence
94% confidence
Finding
The skill claims to be a memory hub but also uses external LLM interaction for capsule evaluation and trust scoring. Undisclosed outbound model calls can expose session-derived content to third parties and create prompt-injection or data leakage risks inconsistent with the stated behavior.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding
The skill claims to be a memory hub but also uses external LLM interaction for capsule evaluation and trust scoring. Undisclosed outbound model calls can expose session-derived content to third parties and create prompt-injection or data leakage risks inconsistent with the stated behavior.

Context-Inappropriate Capability

High
Confidence
98% confidence
Finding
The seeded memory capsule explicitly recommends `git config --global http.sslVerify false`, which disables TLS certificate validation for all Git HTTPS traffic on the host. In a long-term memory hub, this is especially dangerous because the unsafe workaround can be repeatedly surfaced and normalized, enabling man-in-the-middle interception of credentials, code, and repository contents.

Missing User Warnings

High
Confidence
97% confidence
Finding
The instruction to disable Git SSL verification is presented as the direct workaround, while the warning appears only later in `antipatternWarning`. Users or agents following the `actionSequence` may execute the insecure command without understanding that it removes certificate validation globally, creating systemic exposure to spoofed Git servers and credential theft.

Rp1

Medium
Category
MCP Rug Pull
Confidence
86% confidence
Finding
The README instructs users to run `npx engram` without a pinned version, which causes execution of whatever package version is current at install time. In an agent-oriented package that initializes models and injects seed data, this increases supply-chain risk because future compromised or unexpected releases could be executed automatically by users or automation.

Vague Triggers

Medium
Confidence
88% confidence
Finding
The auto-interception behavior is described as triggering on generic error strings like `EACCES`, `404`, and `SSL`, which are common across many unrelated contexts. In a long-term memory skill that injects advice into agent workflows, such broad triggers can cause unintended instruction injection, workflow corruption, or unsafe remediation suggestions in situations where the matched text is incidental or adversarially introduced.

Lp3

Medium
Category
MCP Least Privilege
Confidence
88% confidence
Finding
The skill declares runtime capabilities via `env`/`node` usage but does not explicitly declare tool scope or permissions, which weakens reviewability and allows broader execution assumptions than the manifest communicates. In a skill that invokes external tooling, missing permission boundaries increases the chance of unintended environment access or privilege creep.

Rp1

Medium
Category
MCP Rug Pull
Confidence
95% confidence
Finding
Using `npx engram` without a pinned version allows whatever package version is current at execution time to be fetched and run, creating a supply-chain risk. If the upstream package is compromised or a breaking update is published, the skill may execute attacker-controlled code.

Vague Triggers

Medium
Confidence
92% confidence
Finding
The automatic trigger rules are broad enough that common terms like `error`, `404`, or `timeout` can cause unsolicited memory lookups and advice injection. In an adversarial setting, this can be abused to manipulate agent behavior, surface poisoned historical content, or cause unintended data flow into the memory subsystem.

Intent-Code Divergence

Medium
Confidence
96% confidence
Finding
The code comment says remote model sending/access is disabled, but 'preheat()' explicitly downloads 'Xenova/all-MiniLM-L6-v2' over the network. This mismatch can mislead users and reviewers into believing initialization is fully offline/local, creating trust and supply-chain exposure during install-time behavior.

Rp1

Medium
Category
MCP Rug Pull
Confidence
70% confidence
Finding
npx commands without a version suffix (e.g. @1.0.0) create a rug-pull risk if the upstream server is compromised and publishes a malicious update.

Context Window Stuffing

Medium
Category
Memory Poisoning
Content
"triggerSignature": {
      "errorPattern": "ERR! ERESOLVE unable to resolve dependency tree",
      "taskIntent": "Installing npm packages on an old project or strict modern env",
      "embedding": [0.1012, -0.0456, 0.0890, 0.334, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.
...[truncated 25 chars]
Confidence
80% confidence
Finding
Skill attempts to fill the context window with filler content, displacing legitimate instructions and safety constraints. This can degrade agent performance or bypass safety boundaries.

Context Window Stuffing

Medium
Category
Memory Poisoning
Content
"triggerSignature": {
      "errorPattern": "ERR! ERESOLVE unable to resolve dependency tree",
      "taskIntent": "Installing npm packages on an old project or strict modern env",
      "embedding": [0.1012, -0.0456, 0.0890, 0.334, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.
...[truncated 25 chars]
Confidence
80% confidence
Finding
Skill attempts to fill the context window with filler content, displacing legitimate instructions and safety constraints. This can degrade agent performance or bypass safety boundaries.

Natural-Language Policy Violations

Medium
Confidence
95% confidence
Finding
The commit command returns a hard-coded Chinese status message ('经验已存储') while the rest of the file uses English. This imposes a specific language on users without offering a choice or documenting a justified locale constraint, which is a natural-language policy issue.

Vague Triggers

Medium
Confidence
88% confidence
Finding
The schema permits very loose trigger definitions: both `errorPattern` and `taskIntent` are arbitrary strings, and `embedding` is an unconstrained numeric array with no size, range, or semantic validation. In a long-term memory/agent activation system, this can cause overly broad or malformed capsules to match unexpectedly, leading the agent to retrieve and apply incorrect action sequences or memory entries in inappropriate contexts.

Natural-Language Policy Violations

Medium
Confidence
97% confidence
Finding
The file's user-facing strings and comments indicate the injected advice is rendered in Chinese, including headings such as "已发现已知解决方案", "诊断结论", and "分步解法". This imposes a specific language on the skill output without offering user choice or documenting a justified region-specific constraint, which matches the language/locale policy violation criteria.

Natural-Language Policy Violations

Medium
Confidence
92% confidence
Finding
The file contains user-visible text such as the enqueue return message entirely in Chinese, and the surrounding comments indicate the skill is designed around that locale. There is no indication that users can opt into this language or that the skill is intentionally limited to a Chinese-language or region-specific context.

Missing User Warnings

Medium
Confidence
92% confidence
Finding
The code immediately launches background processing on conversation history and the returned user-facing message does not clearly warn that the history will be distilled, stored, and sent through an LLM-based reflection/verification pipeline. In a long-term memory skill, this creates a real privacy and consent risk because sensitive conversation content may be persisted or transmitted without informed user awareness.

Natural-Language Policy Violations

Medium
Confidence
96% confidence
Finding
The class description and multiple user-facing outputs in this file are written in Chinese, indicating the skill is designed to communicate in a fixed language. The policy requires not forcing a specific language without user opt-in, and this file shows no mechanism for language selection or documented locale justification.

Natural-Language Policy Violations

Medium
Confidence
90% confidence
Finding
The prompt content is written entirely in Chinese and instructs the model to produce specific structured output in that language context, with no indication that the user can choose another language. This can violate language/locale policy when a skill imposes a language without explicit opt-in or documented justification.

Missing User Warnings

Medium
Confidence
93% confidence
Finding
The code sends recent session conversation content directly to an external LLM via `this.llmClient.ask(prompt)` after embedding raw dialogue into the prompt. Even though the prompt asks the model to replace paths, URLs, and usernames, that sanitization happens only after transmission, so sensitive data may already be disclosed to a third party without visible consent, minimization, or policy enforcement.

Natural-Language Policy Violations

Medium
Confidence
91% confidence
Finding
The file's comments and embedded prompt are written exclusively in Chinese, including the evaluation instructions sent to the model. This imposes a specific language/locale without any opt-in, fallback, or justification that the skill is region-specific.

Missing User Warnings

Medium
Confidence
91% confidence
Finding
The code sends capsule-derived content to an LLM via `llmClient.ask(prompt)` with no visible disclosure, consent flow, minimization, or redaction controls in this file. Because capsule contents may include sensitive operational history, error patterns, task intent, or solution steps, this can leak internal data to an external model provider or logging layer and create prompt-injection/privacy risks.

Static analysis

No suspicious patterns detected.