Back to skill

Security audit

Dataify Github Builder

Security checks for vulnerabilities and agentic risk

Overview

The skill's stated GitHub repository purpose is understandable, but its artifacts include broader scraping workflows and several scoping and credential-handling risks that warrant review before installation.

Install only if you are comfortable sending repository targets and task results through Dataify with your API token. Prefer a narrowed version that removes unrelated business/search/unlocker scripts, validates GitHub repository URLs, fixes the import path and curl quoting issues, and avoids putting reusable API tokens in URLs.

Vulnerability Patterns
  • Tool Hijacking and SpoofingModifies or replaces tools so legitimate-looking calls execute attacker logic
  • 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
  • Agent Memory PoisoningWrites attacker-controlled rules into memory that affect later sessions
  • Remote Payload Retrieval and ExecutionFetches external code whose behavior can change after review
Findings (5)

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/wait_for_task.py:34
Finding
Dataify API Token Exposed in URL Query Parameters<![CDATA[ ## Vulnerability Details **File Location**: `scripts/wait_for_task.py:34-39`, with sensitive parameters supplied at `scripts/wait_for_task.py:102-107` and `scripts/wait_for_task.py:127-132` **Vulnerability Type**: Credential exposure through URL query strings **Risk Level**: Medium ### Vulnerable Code ```python def request_json(endpoint, params, api_key, timeout): url = endpoint + "?" + urllib.parse.urlencode(params) request = urllib.request.Request(url, method="GET") try: with urllib.request.urlopen(request, timeout=timeout) as response: content = response.read() ``` The function is called with the API token included in `params`: ```python payload = request_json( STATUS_ENDPOINT, {"api_key": api_key, "task_id": task_id}, api_key, request_timeout, ) ``` The same behavior occurs when downloading results: ```python return request_json( DOWNLOAD_ENDPOINT, {"api_key": api_key, "task_id": task_id, "type": "json"}, api_key, request_timeout, ) ``` ### Technical Analysis The Dataify API token is encoded into the request URL as an `api_key` query parameter. Although HTTPS protects the request while it is in transit, URLs are commonly captured by reverse-proxy logs, application access logs, network monitoring products, exception telemetry, debugging tools, and process diagnostics. The response redaction performed later by the script does not protect the outbound request URL. The token can therefore be exposed outside the intended authentication boundary. Authentication is necessary for task monitoring, but transmitting a reusable account credential in the URL is not the minimum-risk implementation. Authentication should be placed in an HTTP header whenever the service supports it. ### Attack Path 1. A user invokes the normal task-completion workflow with `DATAIFY_API_TOKEN` configured. 2. The script creates a URL such as `/task_status?api_key=SECRET&task_id=...`. 3. A server, proxy, tele ...[truncated 615 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Send the credential through an authorization header: ```python request = urllib.request.Request( url, headers={"Authorization": f"Bearer {api_key}"}, method="GET", ) ``` 2. Keep only non-secret values such as `task_id` and `type` in the query string. 3. If the Dataify API currently requires query authentication, change the API contract or use a short-lived, task-scoped download token instead of the reusable account token. 4. Configure clients, proxies, and application servers to suppress query-string logging. 5. Ensure exception messages and telemetry never serialize request objects containing credentials. 6. Rotate any token that may already have appeared in URL or proxy logs. ]]>

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/catalog_builder.py:88
Finding
Shell Command Injection in Generated Curl Preview<![CDATA[ ## Vulnerability Details **File Location**: `scripts/catalog_builder.py:88-99` **Vulnerability Type**: Shell command injection through unsafe command generation **Risk Level**: Medium ### Vulnerable Code ```python def build_curl(tool, spider_parameters_json): return " \\\n".join([ "curl -X POST '{}'".format(BUILDER_URL), " -H 'Authorization: Bearer $DATAIFY_API_TOKEN'", " -H 'Content-Type: application/x-www-form-urlencoded'", " -d 'spider_name={}'".format(tool["spider_name"]), " -d 'spider_id={}'".format(tool["tool_sign"]), " -d 'spider_parameters={}'".format(spider_parameters_json), " -d 'spider_errors=true'", " -d 'file_name={{TasksID}}'", ]) ``` The user-controlled JSON is incorporated into the command here: ```python payload_json = json.dumps(rows, ensure_ascii=False, separators=(",", ":")) if args.preview: print(build_curl(tool, payload_json)) return 0 ``` ### Technical Analysis `spider_parameters_json` contains user-controlled parameter values. It is inserted into a shell command inside single quotes without escaping embedded single-quote characters. JSON encoding does not make a value safe for shell interpretation. A single quote in a repository URL or another parameter can terminate the shell argument. Shell operators placed after that quote can then be interpreted as additional commands when a user or agent executes the generated curl command. The risk is particularly relevant because the Skill documentation explicitly instructs the agent to return a curl command, making execution of generated shell text part of the expected workflow. ### Attack Path 1. An attacker supplies a crafted parameter containing a single quote followed by shell syntax. 2. The value passes into `rows` and is serialized as JSON. 3. `build_curl()` places the serialized value inside an unescaped single-quoted shell argument. 4. The Skill prints or returns the generated command ...[truncated 586 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Prefer direct HTTP submission and avoid generating executable shell commands from untrusted values. 2. If POSIX curl output is required, quote each complete argument with `shlex.quote()`: ```python import shlex arguments = [ "curl", "-X", "POST", BUILDER_URL, "-H", "Authorization: Bearer $DATAIFY_API_TOKEN", "-H", "Content-Type: application/x-www-form-urlencoded", "-d", f"spider_parameters={spider_parameters_json}", ] command = " ".join(shlex.quote(value) for value in arguments) ``` 3. Do not use POSIX quoting rules for PowerShell. Generate a separate PowerShell representation with PowerShell-appropriate escaping. 4. Clearly label preview output as executable and warn users not to run commands built from untrusted parameters. 5. Add tests containing single quotes, newlines, command substitutions, semicolons, and shell metacharacters. ]]>

other

Note
Location
scripts/catalog_builder.py:71
Finding
Repository Target Validation Does Not Enforce the Declared GitHub Scope<![CDATA[ ## Vulnerability Details **File Location**: `scripts/catalog_builder.py:71-82`; related catalog definition at `references/tool-params.json:1` **Vulnerability Type**: Insufficient target validation and excessive collection scope **Risk Level**: Low ### Vulnerable Code ```python def validate_required(tool, rows): definitions = {item["param"]: item for item in tool.get("params", [])} required = [key for key, item in definitions.items() if item.get("required") is True] for index, row in enumerate(rows, 1): missing = [key for key in required if row.get(key) in (None, "", [])] if missing: examples = [definitions[key].get("url_example") for key in missing] hint = next((value for value in examples if value), None) suffix = " For example: {}".format(hint) if hint else "" raise ValueError("Parameter set {} is missing required values: {}.{}".format(index, ", ".join(missing), suffix)) for key, definition in definitions.items(): if row.get(key) not in (None, "", []) and definition.get("format") == "url": row[key] = normalize_http_url(row[key], key, definition.get("url_example")) ``` The catalog does not mark `repo_url` with `format: "url"`: ```json [ { "tool_name_cn": "通过仓库URL采集", "tool_sign": "github_repository_by-repo-url", "spider_name": "github.com", "params": [ { "param": "repo_url", "required": true, "input_mode": "user_input", "description": "Public GitHub repository URL" } ] } ] ``` Even when `normalize_http_url()` is called for another definition, it accepts any HTTP or HTTPS host: ```python def normalize_http_url(value, parameter="url", example=None): text = str(value or "").strip() parsed = urllib.parse.urlsplit(text) if parsed.scheme not in {"http", "https"} or not parsed.netloc: raise ValueError(...) return text ``` ### Technical Analysis The S ...[truncated 1507 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Add `"format": "url"` to the `repo_url` catalog definition. 2. Implement a repository-specific validator that: - Requires `https`. - Requires the normalized hostname to be exactly `github.com`. - Rejects usernames and passwords in the URL. - Rejects unexpected ports. - Requires a valid owner/repository path. - Removes or rejects fragments and unnecessary query parameters. 3. Apply validation based on the selected tool and parameter name rather than relying only on optional catalog metadata. 4. Reject unknown input keys to prevent undeclared parameters from being transmitted. 5. Document explicitly that submitted repository URLs are transferred to Dataify. ]]>

T07 · Tool Hijacking and Spoofing

Warning
Location
scripts/build-dataify-request.py:1
Finding
Unverified External Directory Can Override the Bundled Catalog Builder<![CDATA[ ## Vulnerability Details **File Location**: `scripts/build-dataify-request.py:1-9` **Vulnerability Type**: Python module hijacking through unsafe import-path precedence **Risk Level**: Medium ### Vulnerable Code ```python #!/usr/bin/env python3 import os import sys TASK_RUNTIME_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..", "dataify-task-operations", "scripts")) if TASK_RUNTIME_DIR not in sys.path: sys.path.insert(0, TASK_RUNTIME_DIR) from catalog_builder import build_curl, run_catalog_builder ``` ### Technical Analysis The documented entrypoint prepends a sibling directory outside the audited Skill to `sys.path`. It then imports `catalog_builder` by its unqualified module name. Because the external path is inserted at index zero, a `catalog_builder.py` located there takes precedence over the bundled `scripts/catalog_builder.py`. The effective implementation can therefore differ from the code shipped and reviewed in this Skill. Python executes top-level module code during import. A malicious or compromised external module can consequently execute before command-line argument validation and can access process privileges and environment variables, including `DATAIFY_API_TOKEN`. ### Attack Path 1. An attacker obtains write access to the calculated `dataify-task-operations/scripts` sibling directory, or causes an untrusted package to be installed there. 2. The attacker creates a malicious `catalog_builder.py`. 3. A user invokes the documented `scripts/build-dataify-request.py` entrypoint. 4. The script places the attacker-controlled directory first in `sys.path`. 5. Python imports and executes the attacker's module instead of the bundled implementation. 6. The malicious module accesses credentials, changes request targets, or executes arbitrary local actions. ### Impact Assessment Exploitation grants arbitrary Python code execution with the privileges of the process invoking the Skill. The malicious module can rea ...[truncated 253 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Import the bundled implementation through a package-relative import rather than modifying `sys.path`. 2. If shared code is required, distribute it as a versioned package with integrity-pinned installation and import it under a unique package namespace. 3. Do not prepend unverified filesystem locations to `sys.path`. 4. Resolve the expected module file and verify that it remains inside an approved directory before importing it. 5. Remove the external path manipulation if the bundled `catalog_builder.py` is intended to be authoritative. 6. Add a regression test asserting the imported module's `__file__` is inside the Skill package. ]]>

other

Note
Location
scripts/business_workflow.py:25
Finding
Bundled Business Intelligence and Web-Unlocking Capabilities Exceed the Declared Skill Purpose<![CDATA[ ## Vulnerability Details **File Location**: `scripts/business_workflow.py:25-48`, `scripts/business_workflow.py:143-168`; related endpoints in `scripts/dataify_client.py:18-19` **Vulnerability Type**: Excessive packaged capability and unnecessary external data transmission **Risk Level**: Low ### Vulnerable Code ```python CONFIG = { "price": { "title": "Price Intelligence", "input_flag": "--product", "input_help": "Product or service to compare.", }, "review": { "title": "Review Intelligence", "input_flag": "--subject", "input_help": "Product, brand, app, or place whose reviews should be analyzed.", }, "lead": { "title": "Lead Intelligence", "input_flag": "--ideal-customer-profile", "input_help": "Ideal customer profile or target-company description.", }, "brand": { "title": "Brand Monitoring", "input_flag": "--brand", "input_help": "Brand to monitor.", }, } ``` The fallback sends search terms or arbitrary target URLs to Dataify: ```python if action["type"] == "search": engines = {"dataify-google-search": "google", "dataify-google-shopping": "google_shopping", "dataify-google-news": "google_news"} params = {"engine": engines[capability], "q": action["query"], "json": "1"} request = urllib.request.Request( "https://scraperapi.dataify.com/request", data=urllib.parse.urlencode(params).encode("utf-8"), headers={"Authorization": "Bearer {}".format(token), "Content-Type": "application/x-www-form-urlencoded"}, method="POST", ) else: payload = { "url": action["url"], "type": "html", "js_render": "True", "clean_content": "true", "country": str(action.get("geography", "us")).lower(), "follow_redirect": "True", "isjson": "1" } request = urllib.request.Request( "https://webunlocker.dataify.com/request", d ...[truncated 2009 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Remove unrelated price, review, lead, brand, search, and web-unlocker modules from this Skill. 2. Package those capabilities as separate Skills with accurate names, descriptions, privacy notices, and parameter constraints. 3. Restrict the GitHub Skill's network allowlist to only the Dataify Builder, status, and download endpoints required for its declared operation. 4. Add explicit user confirmation before transmitting business-sensitive subjects or arbitrary URLs to an external service. 5. Document what information is transmitted, where it is stored, and how account credits are consumed. 6. Apply capability-based entrypoint restrictions so unrelated modules cannot be invoked implicitly by the GitHub collection workflow. ]]>
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • YARA SignaturesMalware Match, Webshell Match, Cryptominer Match
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (36)

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding
The ability to monitor generic Dataify tasks and download generic JSON results is broader than the declared GitHub-repository-only purpose. If an agent can operate on arbitrary prior task IDs, the skill may become a general retrieval interface for external data unrelated to the stated use case.

Tp4

High
Category
MCP Tool Poisoning
Confidence
90% confidence
Finding
The ability to monitor generic Dataify tasks and download generic JSON results is broader than the declared GitHub-repository-only purpose. If an agent can operate on arbitrary prior task IDs, the skill may become a general retrieval interface for external data unrelated to the stated use case.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding
The ability to monitor generic Dataify tasks and download generic JSON results is broader than the declared GitHub-repository-only purpose. If an agent can operate on arbitrary prior task IDs, the skill may become a general retrieval interface for external data unrelated to the stated use case.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding
The ability to monitor generic Dataify tasks and download generic JSON results is broader than the declared GitHub-repository-only purpose. If an agent can operate on arbitrary prior task IDs, the skill may become a general retrieval interface for external data unrelated to the stated use case.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding
The ability to monitor generic Dataify tasks and download generic JSON results is broader than the declared GitHub-repository-only purpose. If an agent can operate on arbitrary prior task IDs, the skill may become a general retrieval interface for external data unrelated to the stated use case.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding
The ability to monitor generic Dataify tasks and download generic JSON results is broader than the declared GitHub-repository-only purpose. If an agent can operate on arbitrary prior task IDs, the skill may become a general retrieval interface for external data unrelated to the stated use case.

YARA rule 'backdoor_persistence': Backdoor persistence with malicious payloads (shell commands, SSH key injection, hidden root users) [malware]

High
Category
YARA Match
Content
量,而不是只在当前终端临时设置。

Windows PowerShell,当前用户永久设置:

```powershell
[Environment]::SetEnvironmentVariable("DATAIFY_API_TOKEN", "your_token_here", "User")
```

然后重新打开 PowerShell。如果当前会话也要立即生效,再执行:

```powershell
$env:DATAIFY_API_TOKEN = "your_token_here"
```

macOS 或 Linux,bash 永久设置:

```bash
echo 'export DATAIFY_API_TOKEN="your_token_here"' >> ~/.bashrc
source ~/.bashrc
```

macOS 或 Linux,zsh 永久设置:

```bash
echo 'export DATAIFY_API_TOKEN="your_token_here"' >> ~/.zshrc
source ~/.zshrc
```

## 脚本用法

Python:

```bash
python scripts/build-dataify-request.py --tool-sign <selected_tool_sign> --values-file values.json
```

PowerShell:

```powershell
& ".\scripts\build-dataify-request.ps1" -ToolSign "<selected_tool_sign>" -ValuesFile ".\values.json"
```

`values.json` 可以是单个对象,也可以是对象数组。

## 输出格式

最终 `curl` 命令应为
Confidence
75% confidence
Finding
YARA rule matched a known malware signature (reverse shell, backdoor, ransomware, C2 framework, or info stealer).

YARA rule 'backdoor_persistence': Backdoor persistence with malicious payloads (shell commands, SSH key injection, hidden root users) [malware]

High
Category
YARA Match
Content
量,而不是只在当前终端临时设置。

Windows PowerShell,当前用户永久设置:

```powershell
[Environment]::SetEnvironmentVariable("DATAIFY_API_TOKEN", "your_token_here", "User")
```

然后重新打开 PowerShell。如果当前会话也要立即生效,再执行:

```powershell
$env:DATAIFY_API_TOKEN = "your_token_here"
```

macOS 或 Linux,bash 永久设置:

```bash
echo 'export DATAIFY_API_TOKEN="your_token_here"' >> ~/.bashrc
source ~/.bashrc
```

macOS 或 Linux,zsh 永久设置:

```bash
echo 'export DATAIFY_API_TOKEN="your_token_here"' >> ~/.zshrc
source ~/.zshrc
```

## 脚本用法

Python:

```bash
python scripts/build-dataify-request.py --tool-sign <selected_tool_sign> --values-file values.json
```

PowerShell:

```powershell
& ".\scripts\build-dataify-request.ps1" -ToolSign "<selected_tool_sign>" -ValuesFile ".\values.json"
```

`values.json` 可以是单个对象,也可以是对象数组。

## 输出格式

最终 `curl` 命令应为
Confidence
75% confidence
Finding
YARA rule matched a known malware signature (reverse shell, backdoor, ransomware, C2 framework, or info stealer).

Description-Behavior Mismatch

High
Confidence
99% confidence
Finding
The skill metadata says it should collect structured GitHub repository information from known repository URLs only, but this file defines a generic business-intelligence workflow for price, review, lead, and brand monitoring. That mismatch indicates the skill can be repurposed to perform unrelated data collection and scraping far beyond user-expected scope, creating a capability overreach and policy-bypass risk.

Context-Inappropriate Capability

High
Confidence
98% confidence
Finding
The lead-generation logic targets LinkedIn and Crunchbase company pages, which is unrelated to GitHub repository enrichment. In the context of this skill, that constitutes unauthorized capability expansion into prospecting and external company profiling, increasing privacy, compliance, and misuse risk.

Context-Inappropriate Capability

High
Confidence
98% confidence
Finding
The command dispatcher includes shopping, review, Amazon, and Google Maps scraping capabilities that are unrelated to collecting repository information from known GitHub URLs. In this skill context, their presence materially increases the chance of misuse by enabling external scraping functions users would not expect or authorize.

Context-Inappropriate Capability

High
Confidence
99% confidence
Finding
The direct_request fallback sends search queries and arbitrary URLs to generic scraping endpoints, including a web unlocker for rendered HTML. For a repo-URL GitHub skill, this is dangerous because it provides a built-in path to broad network collection outside the advertised scope, potentially bypassing local package constraints and enabling covert capability escalation.

Description-Behavior Mismatch

High
Confidence
99% confidence
Finding
The workflow extracts links from discovery results and automatically adds new detail-fetch actions for those URLs, enabling arbitrary external browsing. For a skill explicitly restricted to known repository URLs and not arbitrary webpages, this dynamic expansion is dangerous because it defeats the declared boundary and can silently broaden collection to unrelated sites.

Description-Behavior Mismatch

High
Confidence
97% confidence
Finding
The client exposes both a generic web search primitive and an arbitrary URL fetch/unlock primitive, which is materially broader than a skill that is supposed to operate only on known GitHub repository URLs. This expands the skill into a general browsing/scraping tool, enabling off-scope data access, policy bypass, and collection of content from arbitrary external sites if an attacker can influence inputs or orchestration.

Context-Inappropriate Capability

High
Confidence
98% confidence
Finding
The unlock() function accepts any public HTTP(S) URL and sends it to a remote page-unlocking service, with no restriction to GitHub repository pages. In a skill scoped to known GitHub repository URLs, this creates an unnecessary arbitrary external fetch capability that can be abused for broad content retrieval, evasion of simple access controls, and off-scope data collection.

Lp3

Medium
Category
MCP Least Privilege
Confidence
91% confidence
Finding
The skill declares no explicit tool scope or permissions while its instructions clearly rely on environment access, file reads, shell usage, and outbound network calls. This increases the chance that a caller or agent executes broader capabilities than the metadata suggests, reducing policy enforcement and making misuse harder to contain.

Description-Behavior Mismatch

Medium
Confidence
97% confidence
Finding
The workflow asks the user to choose exactly one tool from a list that includes search-url and generic-url collection modes, directly contradicting the stated limitation to known repository URLs. This broadens the skill into search and arbitrary URL collection, increasing the likelihood of policy bypass and unintended data exfiltration to the external scraper service.

Natural-Language Policy Violations

Medium
Confidence
95% confidence
Finding
The instructions explicitly tell the user to choose exactly one tool from a Chinese list, and the listed options are presented only in Chinese. This imposes a language requirement without opt-in or an alternative locale, which is a natural-language policy violation under the language/locale rule.

External Transmission

Medium
Category
Data Exfiltration
Content
13. Set `spider_name` to `github.com`.
14. Set `spider_id` to the selected tool's `tool_sign`.
15. Always include `spider_errors=true` and `file_name={{TasksID}}`.
16. Return a curl command for `https://scraperapi.dataify.com/builder`.

## Set DATAIFY_API_TOKEN
Confidence
92% confidence
Finding
The skill instructs creation of a curl request that transmits user-supplied parameters and authenticated requests to an external service. Because the skill is framed narrowly but can select broader tools, the external transmission risk is more dangerous in context: users may unknowingly send non-repository targets or sensitive operational data to a third-party endpoint.

Description-Behavior Mismatch

Medium
Confidence
90% confidence
Finding
Stating that the parameter catalog covers every available tool in the scraper family encourages generic access beyond the declared repository-only scope. In practice, this makes the skill a launcher for a wider scraping platform, not a narrowly defined GitHub metadata collector.

External Transmission

Medium
Category
Data Exfiltration
Content
---
name: "dataify-github-repository-by-repo-url"
description: "为 github.com 上以 github_repository_by-repo-url 为根的 scraper 系列准备 Dataify builder 请求。当需要处理成功的 Dataify scraper detail 条目 github_repository_by-repo-url、让用户选择可用工具、读取已保存的 getToolParams 选项,并使用 DATAIFY_API_TOKEN 生成 scraperapi.dataify.com/builder curl 请求时,使用此 skill。"
---

# Dataify Builder Skill 中文版
Confidence
88% confidence
Finding
The skill is explicitly designed to generate a curl request that sends collected parameters to an external service, scraperapi.dataify.com/builder. Any skill that packages user-supplied repository data and transmits it off-platform creates data exfiltration and privacy risk if the destination, payload, or scope is not tightly constrained and clearly disclosed.

Description-Behavior Mismatch

Medium
Confidence
95% confidence
Finding
The skill manifest says it is for collecting GitHub repository information from known repository URLs, but the documentation expands operation to search-URL and generic-URL tools. This scope broadening can cause the agent to collect data from inputs outside the user-approved boundary, increasing the chance of unintended scraping, policy bypass, or processing of unvalidated targets.

Description-Behavior Mismatch

Medium
Confidence
93% confidence
Finding
The documentation describes multi-value search-URL handling even though the skill is supposed to be limited to repository-URL collection. That mismatch encourages broader and potentially higher-volume scraping behavior than the declared capability, which can lead to accidental overcollection, higher cost, or unauthorized use paths.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
## Account CTA policy

- Show a prominent Dataify account CTA only when the API token is missing, rejected/invalid, or the account has insufficient credits.
- For a missing token, offer https://dashboard.dataify.com/login?utm_source=skill and state: New accounts get 50 free credits, enough for about 6,000 trial results, valid for 7 days, and only successful requests are billed. Never ask the user to paste the token into chat.
- Detect the current operating system and shell. Show only the matching session-scoped setup command first (`export` for macOS/Linux shells, `$env:` for Windows PowerShell, or `set` for Windows Command Prompt). Show other platforms or persistent setup only when detection is ambiguous or the user asks.
- After the user says the token is configured, verify only whether `DATAIFY_API_TOKEN` is present; never print its value. If verification succeeds, continue the original task without asking the user to repeat it.
- Explain that persistent shell changes may require a new terminal or restarting the agent application. Do not recommend a project `.env` unless the execution path explicitly loads it, and ensure `.env` is ignored by version control.
Confidence
80% confidence
Finding
Skill enables autonomous high-impact decisions without human-in-the-loop verification. Critical operations (destructive commands, financial transactions, data deletion) should require explicit user confirmation.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
## Account CTA policy

- Show a prominent Dataify account CTA only when the API token is missing, rejected/invalid, or the account has insufficient credits.
- For a missing token, offer https://dashboard.dataify.com/login?utm_source=skill and state: New accounts get 50 free credits, enough for about 6,000 trial results, valid for 7 days, and only successful requests are billed. Never ask the user to paste the token into chat.
- Detect the current operating system and shell. Show only the matching session-scoped setup command first (`export` for macOS/Linux shells, `$env:` for Windows PowerShell, or `set` for Windows Command Prompt). Show other platforms or persistent setup only when detection is ambiguous or the user asks.
- After the user says the token is configured, verify only whether `DATAIFY_API_TOKEN` is present; never print its value. If verification succeeds, continue the original task without asking the user to repeat it.
- Explain that persistent shell changes may require a new terminal or restarting the agent application. Do not recommend a project `.env` unless the execution path explicitly loads it, and ensure `.env` is ignored by version control.
Confidence
80% confidence
Finding
Skill enables autonomous high-impact decisions without human-in-the-loop verification. Critical operations (destructive commands, financial transactions, data deletion) should require explicit user confirmation.

Static analysis

Detected: suspicious.exposed_secret_literal

File appears to expose a hardcoded API secret or token.

Critical
Code
suspicious.exposed_secret_literal
Location
scripts/task_runtime.py:38