Review ClawHub Profile Proposal
Overview
Use this owner-side workflow for a public PR that proposes a candidate ClawHub
profile at proposals/<GHSA-ID>/clawscan.yml after a private vulnerability
report. The goal is to validate the candidate, keep sensitive details private,
and, if accepted, promote the public profile behavior into the bundled
internal/profiles/clawhub/clawscan.yml.
Safety Boundary
- Treat the GitHub private vulnerability report as the source for sensitive
malicious skill details.
- Do not paste live exploit details, private report text, private artifacts, or
suspicious skill payloads into public PR comments, public docs, commit
messages, or committed baseline summaries.
- The public proposal PR should start with only
proposals/<GHSA-ID>/clawscan.yml. Do not trust it until reviewed.
- Do not run the suspicious skill. ClawScan scans skill files as data; it should
not execute the skill's behavior.
- Do not promote a candidate unless the private report, proposal diff, and
benchmark proof all line up.
Review Workflow
Read the current repo and PR state.
- Check
git status --short --branch before editing.
- Fetch the PR branch and inspect the changed files.
- Confirm the public PR initially contains only
proposals/<GHSA-ID>/clawscan.yml plus any baseline summary commit
produced by the maintainer gate.
- Confirm the proposal file defines a
clawhub profile.
- Confirm the proposal does not edit official bundled profile files yet:
internal/profiles/clawhub/clawscan.yml,
internal/profiles/clawhub/prompt.md, or
internal/profiles/clawhub/output.schema.json.
Read the private report privately.
Use the private vulnerability report only to understand:
- what malicious behavior must be caught
- why the current built-in
clawhub profile misses or under-detects it
- what evidence should be preserved privately
- whether any proposal text or config comments leak sensitive details
Keep public comments high-level, such as "validated against the private
report" or "needs private-case follow-up"; do not quote private details.
Validate the candidate profile.
Prefer the manual GitHub Actions workflow when available:
SkillTrustBench Profile Gate
Dispatch it with the PR number and proposal path. It should run:
clawscan benchmark SkillTrustBench \
--ids https://huggingface.co/datasets/cuhk-zhuque/SkillTrustBench-results/resolve/main/data/evaluation_subset_10pct.jsonl \
--config proposals/<GHSA-ID>/clawscan.yml \
--profile clawhub \
--output ./artifacts/skilltrustbench-candidate.json
If running locally, use the same command. The --ids source is the public
SkillTrustBench leaderboard subset and is mutually exclusive with --limit
and --offset.
Review the benchmark artifact.
Check:
- the artifact is full JSON and preserved as a workflow artifact or private
maintainer artifact
benchmark.id is cuhk-zhuque/SkillTrustBench
benchmark.split is benchmark
benchmark.idsCount is 556
benchmark.idsSha256 matches the planned subset hash
903a036e4b7b16ee28e22d5d9db57a00b3764cfe41e43144acad67921e5196c2
- scanner and judge statuses are acceptable
- evaluation metrics are not an unacceptable regression
- the candidate catches the private reported behavior when private proof is
available
Update the accepted baseline summary.
Use the repo script so the compact baseline is generated from the full
candidate artifact:
go run ./scripts/update-skilltrustbench-baseline \
--artifact ./artifacts/skilltrustbench-candidate.json \
--output benchmarks/skilltrustbench-leaderboard-10pct/<YYYY-MM-DD>.json \
--profile clawhub \
--profile-source proposals/<GHSA-ID>/clawscan.yml \
--subset-case-ids-sha256 903a036e4b7b16ee28e22d5d9db57a00b3764cfe41e43144acad67921e5196c2 \
--workflow-url <workflow-url>
If the PR merges, the newest dated JSON file in
benchmarks/skilltrustbench-leaderboard-10pct/ is the latest accepted
baseline for the bundled clawhub profile. The script fails if the
candidate artifact's selected-ID hash does not match the planned subset. No
post-merge rerun is required.
Decide.
If rejected:
- leave a public PR comment with non-sensitive reasons
- keep details that identify the malicious payload in the private report
- do not edit official bundled profile files
If accepted:
- promote the accepted public
clawhub profile behavior into
internal/profiles/clawhub/clawscan.yml
- add a dated baseline under
benchmarks/skilltrustbench-leaderboard-10pct/
from the candidate artifact in the same PR
- preserve or remove
proposals/<GHSA-ID>/clawscan.yml according to the
issue/PR instruction; default to preserving it as public proposal trail
unless the maintainer explicitly chooses to remove it
- keep prompt/schema changes maintainer-owned; edit
internal/profiles/clawhub/prompt.md or
internal/profiles/clawhub/output.schema.json only when that is the
accepted change
Verify the promoted built-in profile.
Run at least:
go test -count=1 ./...
go vet ./...
go run ./cmd/clawscan profiles -v
go run ./cmd/clawscan --help
For benchmark proof after promotion, run:
clawscan benchmark SkillTrustBench \
--ids https://huggingface.co/datasets/cuhk-zhuque/SkillTrustBench-results/resolve/main/data/evaluation_subset_10pct.jsonl \
--profile clawhub \
--output ./artifacts/skilltrustbench-clawhub.json
Use a smaller proof only when explicitly accepted; the official gate uses
the subset ID source above.
Update the PR.
- Push the promotion commit to the PR branch if that is the chosen review
path.
- Keep the PR body/comments free of private exploit details.
- Add proof with commands, artifact links, and residual risk.
Promotion Patch Shape
The maintainer promotion commit usually touches:
internal/profiles/clawhub/clawscan.yml
benchmarks/skilltrustbench-leaderboard-10pct/<YYYY-MM-DD>.json
It may also touch:
internal/profiles/clawhub/prompt.md
internal/profiles/clawhub/output.schema.json
docs/
tests
Do not include private artifacts, malicious payload details, or generated
dist/ output in ordinary promotion commits unless the issue explicitly asks
for them.
Handoff Shape
End with:
- verdict: accepted, rejected, or blocked
- proposal path and PR/ref reviewed
- private report checked, without sensitive details
- benchmark command and artifact location
- baseline summary update status
- bundled profile files changed
- exact verification commands and results
- commit SHA or reason no commit was created
- residual risk and next owner action
1---2name: review-clawhub-profile-proposal3description: Use when an OpenClaw maintainer or owner is reviewing a ClawHub malicious-skill profile proposal PR: checking `proposals/<GHSA-ID>/clawscan.yml`, reading the private vulnerability context without leaking it, running the SkillTrustBench Profile Gate or equivalent local benchmark, updating the accepted baseline, and promoting an accepted candidate into `internal/profiles/clawhub/clawscan.yml`.4---56# Review ClawHub Profile Proposal78## Overview910Use this owner-side workflow for a public PR that proposes a candidate ClawHub11profile at `proposals/<GHSA-ID>/clawscan.yml` after a private vulnerability12report. The goal is to validate the candidate, keep sensitive details private,13and, if accepted, promote the public profile behavior into the bundled14`internal/profiles/clawhub/clawscan.yml`.1516## Safety Boundary1718- Treat the GitHub private vulnerability report as the source for sensitive19 malicious skill details.20- Do not paste live exploit details, private report text, private artifacts, or21 suspicious skill payloads into public PR comments, public docs, commit22 messages, or committed baseline summaries.23- The public proposal PR should start with only24 `proposals/<GHSA-ID>/clawscan.yml`. Do not trust it until reviewed.25- Do not run the suspicious skill. ClawScan scans skill files as data; it should26 not execute the skill's behavior.27- Do not promote a candidate unless the private report, proposal diff, and28 benchmark proof all line up.2930## Review Workflow31321. Read the current repo and PR state.3334 - Check `git status --short --branch` before editing.35 - Fetch the PR branch and inspect the changed files.36 - Confirm the public PR initially contains only37 `proposals/<GHSA-ID>/clawscan.yml` plus any baseline summary commit38 produced by the maintainer gate.39 - Confirm the proposal file defines a `clawhub` profile.40 - Confirm the proposal does not edit official bundled profile files yet:41 `internal/profiles/clawhub/clawscan.yml`,42 `internal/profiles/clawhub/prompt.md`, or43 `internal/profiles/clawhub/output.schema.json`.44452. Read the private report privately.4647 Use the private vulnerability report only to understand:4849 - what malicious behavior must be caught50 - why the current built-in `clawhub` profile misses or under-detects it51 - what evidence should be preserved privately52 - whether any proposal text or config comments leak sensitive details5354 Keep public comments high-level, such as "validated against the private55 report" or "needs private-case follow-up"; do not quote private details.56573. Validate the candidate profile.5859 Prefer the manual GitHub Actions workflow when available:6061 ```text62 SkillTrustBench Profile Gate63 ```6465 Dispatch it with the PR number and proposal path. It should run:6667 ```bash68 clawscan benchmark SkillTrustBench \69 --ids https://huggingface.co/datasets/cuhk-zhuque/SkillTrustBench-results/resolve/main/data/evaluation_subset_10pct.jsonl \70 --config proposals/<GHSA-ID>/clawscan.yml \71 --profile clawhub \72 --output ./artifacts/skilltrustbench-candidate.json73 ```7475 If running locally, use the same command. The `--ids` source is the public76 SkillTrustBench leaderboard subset and is mutually exclusive with `--limit`77 and `--offset`.78794. Review the benchmark artifact.8081 Check:8283 - the artifact is full JSON and preserved as a workflow artifact or private84 maintainer artifact85 - `benchmark.id` is `cuhk-zhuque/SkillTrustBench`86 - `benchmark.split` is `benchmark`87 - `benchmark.idsCount` is `556`88 - `benchmark.idsSha256` matches the planned subset hash89 `903a036e4b7b16ee28e22d5d9db57a00b3764cfe41e43144acad67921e5196c2`90 - scanner and judge statuses are acceptable91 - evaluation metrics are not an unacceptable regression92 - the candidate catches the private reported behavior when private proof is93 available94955. Update the accepted baseline summary.9697 Use the repo script so the compact baseline is generated from the full98 candidate artifact:99100 ```bash101 go run ./scripts/update-skilltrustbench-baseline \102 --artifact ./artifacts/skilltrustbench-candidate.json \103 --output benchmarks/skilltrustbench-leaderboard-10pct/<YYYY-MM-DD>.json \104 --profile clawhub \105 --profile-source proposals/<GHSA-ID>/clawscan.yml \106 --subset-case-ids-sha256 903a036e4b7b16ee28e22d5d9db57a00b3764cfe41e43144acad67921e5196c2 \107 --workflow-url <workflow-url>108 ```109110 If the PR merges, the newest dated JSON file in111 `benchmarks/skilltrustbench-leaderboard-10pct/` is the latest accepted112 baseline for the bundled `clawhub` profile. The script fails if the113 candidate artifact's selected-ID hash does not match the planned subset. No114 post-merge rerun is required.1151166. Decide.117118 If rejected:119120 - leave a public PR comment with non-sensitive reasons121 - keep details that identify the malicious payload in the private report122 - do not edit official bundled profile files123124 If accepted:125126 - promote the accepted public `clawhub` profile behavior into127 `internal/profiles/clawhub/clawscan.yml`128 - add a dated baseline under `benchmarks/skilltrustbench-leaderboard-10pct/`129 from the candidate artifact in the same PR130 - preserve or remove `proposals/<GHSA-ID>/clawscan.yml` according to the131 issue/PR instruction; default to preserving it as public proposal trail132 unless the maintainer explicitly chooses to remove it133 - keep prompt/schema changes maintainer-owned; edit134 `internal/profiles/clawhub/prompt.md` or135 `internal/profiles/clawhub/output.schema.json` only when that is the136 accepted change1371387. Verify the promoted built-in profile.139140 Run at least:141142 ```bash143 go test -count=1 ./...144 go vet ./...145 go run ./cmd/clawscan profiles -v146 go run ./cmd/clawscan --help147 ```148149 For benchmark proof after promotion, run:150151 ```bash152 clawscan benchmark SkillTrustBench \153 --ids https://huggingface.co/datasets/cuhk-zhuque/SkillTrustBench-results/resolve/main/data/evaluation_subset_10pct.jsonl \154 --profile clawhub \155 --output ./artifacts/skilltrustbench-clawhub.json156 ```157158 Use a smaller proof only when explicitly accepted; the official gate uses159 the subset ID source above.1601618. Update the PR.162163 - Push the promotion commit to the PR branch if that is the chosen review164 path.165 - Keep the PR body/comments free of private exploit details.166 - Add proof with commands, artifact links, and residual risk.167168## Promotion Patch Shape169170The maintainer promotion commit usually touches:171172```text173internal/profiles/clawhub/clawscan.yml174benchmarks/skilltrustbench-leaderboard-10pct/<YYYY-MM-DD>.json175```176177It may also touch:178179```text180internal/profiles/clawhub/prompt.md181internal/profiles/clawhub/output.schema.json182docs/183tests184```185186Do not include private artifacts, malicious payload details, or generated187`dist/` output in ordinary promotion commits unless the issue explicitly asks188for them.189190## Handoff Shape191192End with:193194- verdict: accepted, rejected, or blocked195- proposal path and PR/ref reviewed196- private report checked, without sensitive details197- benchmark command and artifact location198- baseline summary update status199- bundled profile files changed200- exact verification commands and results201- commit SHA or reason no commit was created202- residual risk and next owner action