Install
$ agentstack add skill-reversinglabs-rl-protect-skills-rl-protect-edit-profile ✓ scanned · ✓ verified — works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ✓ Network access No
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
About
Profile editing (rl-protect)
Use this skill when the user wants to create a new profile or change an existing one. Profiles are JSON files that control how rl-protect evaluates packages — what counts as a failure, which packages are always allowed or blocked, and which policy rules are overridden.
Profile location
The profile is loaded from a file passed to rl-protect scan via --profile={path}. If the user does not specify a path, rl-protect will use its default profile. Read the file before making any changes if it already exists.
Schema reference
rl-profile
.schema — always 1, do not change
.name — human-readable profile name
.info — description string (free text)
.timestamp — ISO-8601, set to current time on every save
.configuration.policy
.min_catalogue — minimum required catalogue level (integer, 1–10)
.rl_scan_level — scan depth level (integer, 1–10)
.rl_auto_approval — auto-approve packages that pass (boolean)
.assessments{} — one entry per check category (see below)
.governance.community — age gates and allow/block pattern lists
.overrides{} — keyed by policy rule ID (SQ-prefixed)
Assessment configuration
Each assessment can be ignored entirely or configured with per-detection-type severity levels.
Valid severity values: pass | warning | fail
assessments.secrets
.ignored — true suppresses the entire check
assessments.licenses
.ignored — true suppresses the entire check
assessments.vulnerabilities
.ignored
.detections
.mandate — CVEs under active government mandate
.exploit — CVEs with known exploits
.malware — CVEs used in malware campaigns
.critical — CVEs with CVSS ≥ 9.0
assessments.hardening
.ignored
assessments.tampering
.ignored
.ml_hunting — ML-based anomaly detections
assessments.malware
.ignored
.rl_analyst — findings from RL analyst vetting
.rl_scanner — findings from RL scanner
.suspicious — suspicious (unconfirmed) detections
.dependency
.develop — malicious dependency in dev context
.release — malicious dependency in release context
.detections — affects specified malware types
.adware
.riskware
.protestware
.spam
Governance configuration
Governance rules control package-level allow and block decisions independently of assessment findings.
governance.community
.min_package_age — minimum days since first package release (integer)
.min_version_age — minimum days since this version was published (integer)
.allow[] — packages always approved regardless of findings
.pattern — PURL pattern (exact or wildcard, e.g. pkg:npm/lodash@*)
.audit.author — who added the rule
.audit.timestamp — when the rule was added
.audit.reason — stated justification
.block[] — packages always rejected regardless of findings
.pattern — PURL pattern
.audit.author — who added the rule
.audit.timestamp — when the rule was added
.audit.reason — stated justification
PURL pattern matching:
- Exact version:
pkg:npm/lodash@4.17.21 - Wildcard version range:
pkg:npm/ua-parser-js@0.7.* - All package versions:
pkg:gem/rack@* - Specific artifact:
pkg:pypi/flask@3.1.2?artifact=flask-3.1.2-py3-none-any.whl
Policy overrides
Overrides change the effective status of specific policy rule violations by their rule ID.
overrides.{SQxxxxx | THxxxxx}
.enabled — true to activate the override
.blocker — the status to apply instead: pass | fail
.apply_to[] — scope: "organization" | "group" | "any"
.audit.author
.audit.timestamp — must use current timestamp in ISO-8601 format
.audit.reason
Setting blocker to pass means the rule never blocks a scan. Setting it to fail elevates a warning to a failure.
Tasks
Create a new profile
Trigger: user wants to create a profile from scratch, or no profile file exists.
Steps:
- Ask the user for a profile name and any initial settings they want to configure.
- Generate a valid profile JSON with
schema: 1and the current timestamp. - Set sensible defaults for any fields the user did not specify (see defaults below).
- Write the file and confirm the path.
Default values for new profiles:
| Field | Default | |---|---| | min_catalogue | 5 | | rl_scan_level | 5 | | rl_auto_approval | false | | All assessment .ignored | false | | vulnerabilities.detections.mandate | fail | | vulnerabilities.detections.exploit | fail | | vulnerabilities.detections.malware | fail | | vulnerabilities.detections.critical | fail | | malware.rl_analyst | fail | | malware.rl_scanner | fail | | malware.suspicious | warning | | malware.dependency.release | fail | | malware.dependency.develop | warning | | min_package_age | 90 | | min_version_age | 3 |
Configure assessment severity
Trigger: user wants to change what counts as a failure or warning for a specific check, or wants to ignore a check entirely.
Steps:
- Identify which assessment and detection type the user wants to change.
- Confirm the new severity value (
pass,warning, orfail). - Update only the affected field. Do not alter other assessments.
- Update
.timestampto the current time in ISO-8601 format. - Write the file and show a summary of what changed.
Output summary format:
### Profile updated — {profile name}
| Assessment | Detection | Previous | New |
|---|---|---|---|
| {assessment name} | {detection type or "ignored"} | {old value} | {new value} |
Add a governance rule
Trigger: user wants to always allow or always block a specific package or version range.
Steps:
- Ask for: the PURL pattern, whether it is an allow or block rule, and a reason.
- Check whether a rule for the same pattern already exists. If so, warn the user and ask whether to replace it.
- Populate
audit.authorfrom context if known, otherwise ask. Prefer emails. Setaudit.timestampto the current time in ISO-8601 format. - Append the rule to the appropriate list (
allow[]orblock[]). - Update
.timestampand write the file.
Output summary format:
### Governance rule added — {profile name}
| Field | Value |
|---|---|
| Action | {Allow / Block} |
| Pattern | {purl pattern} |
| Reason | {reason} |
| Author | {author} |
Remove a governance rule
Trigger: user wants to remove an existing allow or block rule.
Steps:
- List all current rules in the relevant list and ask the user to confirm which to remove.
- Remove the matching entry by pattern.
- Update
.timestampand write the file.
Add or update a policy override
Trigger: user wants to suppress or downgrade a specific policy rule violation by its SQ rule ID.
Steps:
- Ask for: the SQ rule ID, the target status (
passorwarning), the scope (organization,group, orany), and a reason. - If an override for that rule ID already exists, show the current values and ask the user to confirm the update.
- Set
enabled: true, populate the audit fields, and update.timestampin ISO-8601 format. - Write the file and confirm.
Output summary format:
### Policy override saved — {profile name}
| Field | Value |
|---|---|
| Rule | {SQxxxxx} |
| Overridden to | {pass / warning} |
| Scope | {organization / group / any} |
| Reason | {reason} |
| Author | {author} |
Show current profile
Trigger: user wants to review what is currently configured in the profile.
Read the profile file and present it in this format:
### Profile — {name}
**Scan settings**
| Setting | Value |
|---|---|
| Min catalogue level | {min_catalogue} |
| Scan level | {rl_scan_level} |
| Auto-approval | {Yes / No} |
**Assessment configuration**
| Assessment | Ignored | Detection severities |
|---|---|---|
| Secrets | {Yes/No} | — |
| Licenses | {Yes/No} | — |
| Vulnerabilities | {Yes/No} | mandate: {v} · exploit: {v} · malware: {v} · critical: {v} |
| Hardening | {Yes/No} | — |
| Tampering | {Yes/No} | ml_hunting: {v} |
| Malware | {Yes/No} | analyst: {v} · scanner: {v} · suspicious: {v} · dep/release: {v} · dep/develop: {v} |
**Governance**
- Min package age: {N} days · Min version age: {N} days
- Allow rules: {N} · Block rules: {N}
**Policy overrides:** {N} active
Follow with a table of governance rules and overrides if any exist.
General rules
- Always read the existing profile before making changes. Never overwrite fields the user did not ask to change.
- Always update
.timestampto the current ISO-8601 time on every write. - Never set
.schemato any value other than1. - When adding audit entries, always require a
reason. Do not allow empty reason strings. - If the user tries to set a severity value other than
pass,warning, orfail, reject it and list the valid options. - If the user tries to ignore all six assessments simultaneously, warn them that this would result in every package passing regardless of content.
- After every write, confirm the file path and summarize only the fields that were changed.
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: reversinglabs
- Source: reversinglabs/rl-protect-skills
- License: MIT
- Homepage: https://secure.software/
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet — be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.