mantis-report
この Skill は、複雑で技術的な脆弱性検出ログを、開発者や関係者向けの読みやすいセキュリティレビューパケットに統合します。今回と過去のパスで確認された脆弱性やエクスプロイトチェーン、スナップショットの来歴をまとめ、パス別タグ付き Markdown レポートと常に最新のコピーを生成して、修正対応や関係者への共有を支援します。
npx skills add https://github.com/google/mantis --skill mantis-reportBefore / After 効果比較
1 组開発者が複数の JSON ログに散らばる脆弱性を手作業で抜き出し、重複を除いてエクスプロイトチェーンを組み立て、書式も何度も直すため、過去の検出が抜けやすい。
この Skill は今回と過去のパスで確認された検出を自動で統合し、最新状態に重複排除してスナップショットの来歴を付け、構造化された Markdown レポートパケットと最新版コピーを出力します。
Reporter (/mantis-report)
System Goal
Security Reporting Expert. Synthesizes complex, technical finding logs into a high-quality, human-readable review packet for developers and stakeholders.
Command Definition
- Command:
/mantis-report - Description: Generates a human-readable security review packet containing confirmed findings and exploit chains.
Input/Output Contract
- Reads:
workspace/findings/*.json(all active finding files for this pass).workspace/archive/findings_pass_*/*.json(archived findings from prior passes) and legacyworkspace/archive/loop*_findings/*.json. The report is a campaign-wide view: this pass's full findings plus carried-forward findings that prior passes stopped retrying (e.g. hit the retry cap) so they do not vanish from the report.workspace/.mantis_state.json(to track current loop pass, and to readvcs_infoandactive_snapshot{root,snapshot_id,snapshot_pinned} for provenance).- Per-finding snapshot provenance fields, all OPTIONAL:
discovery_commit,repro_snapshot_id,patch_base_snapshot. When any is absent/empty it is rendered as "(not recorded)" — never a reason to drop a finding.
- Writes:
workspace/report/review_packet_pass_<N>_<snapshot_tag>.md(pass- and snapshot-tagged markdown report). Falls back to the unsuffixedreview_packet_pass_<N>.mdon a legacy pass with no recorded snapshot.- Updates copy/symlink at
workspace/report/review_packet-latest.md.
- Preconditions:
- Calibrated and reproduced findings exist in
workspace/findings/orworkspace/archive/. The report is a campaign-wide view: it reports the current state of every unresolved finding discovered in this or any prior pass, de-duplicated to each finding's latest state. A confirmed-but-unfixed finding that plan stopped carrying back (e.g. it hit the 2-attempt retry cap) does NOT vanish — it appears here at its most recent archived state.
- Calibrated and reproduced findings exist in
- Idempotency Guarantee:
- Writes to pass-and-snapshot-tagged files. In-place overwrite of
review_packet-latest.md. Re-running the SAME pass on the SAME snapshot updates the same tagged file. Re-running the same pass number on a DIFFERENT snapshot writes a DISTINCT file (the<snapshot_tag>suffix prevents cross-snapshot overwrite). Legacy passes with no recorded snapshot keep the unsuffixedreview_packet_pass_<N>.mdname and overwrite in place, exactly as before.
- Writes to pass-and-snapshot-tagged files. In-place overwrite of
Instructions
Step 0 — Locator Resolution.
LOCATOR RESOLUTION (before reading ANY target code or artifact):
0. ROLE: If this skill NEVER reads target source (report, calibrate, reflect),
you are a FINDINGS-ONLY stage: skip steps 2-6; still read active_snapshot from
state for provenance/annotation; NEVER stop merely because a code root is unset.
1. Determine CODE_ROOT, in this priority order:
a. If --target_root is passed on THIS invocation, CODE_ROOT = --target_root.
It is AUTHORITATIVE and OVERRIDES SNAPSHOT_ROOT and the state fallback
(used when a caller hands you a prepared tree, e.g. a patched shadow).
b. Else if --snapshot_root (or SNAPSHOT_ROOT) is passed, use it.
c. Else read state_root/workspace/.mantis_state.json (state_root from
--state_root if passed, else ./workspace/... relative to the current dir)
-> active_snapshot.root / .snapshot_id / .snapshot_pinned.
d. Else (no arg AND no readable active_snapshot): CODE_ROOT = current directory,
treat snapshot_pinned = false (MODE-OFF). Do NOT stop.
2. SENTINEL CHECK (only if snapshot_pinned is true AND you did NOT take path 1a):
verify CODE_ROOT/.mantis_snapshot_id exists and equals SNAPSHOT_ID. If missing
or different -> STOP "snapshot sentinel mismatch". (A --target_root tree (1a) is
deliberately mutated and is sentinel-EXEMPT.)
3. PATH FIELDS:
- SNAPSHOT-RELATIVE (read under CODE_ROOT): code_paths entries; plan target_files
that are file paths. Strip ONLY a trailing ":<digits>". A code_paths entry
containing "://" is a URL/endpoint, NOT a file read. A code_paths entry that is
NOT of the form <existing-path>:<integer> is a non-source LOCATOR
(symbol/offset/endpoint): only check that the artifact/symbol exists; skip ALL
line-range and line-existence logic.
- STATE-RELATIVE (read/write under state_root/workspace, NEVER prefix CODE_ROOT):
kb_references, repro_file_path, reattack_file_path, helper scripts, report
files, and all state/findings JSON.
4. Never WRITE under CODE_ROOT when snapshot_pinned is true. Any command that
compiles, generates, or writes artifacts MUST run in a PRIVATE SHADOW copy
(mktemp -d from CODE_ROOT), never with cwd=CODE_ROOT. Read-only inspection may
cd into CODE_ROOT.
5. VCS-METADATA CARVE-OUT: history-log extraction and any VCS diff/blame command
run in the LIVE repository root (which still has .git/.hg/.repo), NOT CODE_ROOT
(the snapshot copy strips VCS metadata). Do NOT stop merely because CODE_ROOT
lacks .git/.hg/.repo.
6. Every shell command uses ABSOLUTE paths and sets its own working directory on
that call. Do NOT assume the working directory persists between calls.
Then the following FINDINGS-ONLY notes apply to the Reporter:
- The Reporter is a FINDINGS-ONLY stage (Block A, ROLE step 0): it SKIPS locator steps 2–6, does NOT require or resolve a CODE_ROOT, and NEVER stops because a code root or sentinel is unset.
- It STILL reads
active_snapshot(root,snapshot_id,snapshot_pinned) andvcs_infofromworkspace/.mantis_state.jsonfor provenance — used to build the header, the top banners, and the output file name. - Every path the Reporter touches (
workspace/findings/*.json,workspace/.mantis_state.json,workspace/report/*,workspace/archive/*) is STATE-RELATIVE and is NEVER prefixed with CODE_ROOT.
Compile a professional Markdown report detailing the verified/reproduced vulnerabilities and exploit chains.
Execute the reporting stage as follows:
-
Load findings — this pass in full, plus carried-forward open findings (newest-first fold; no script). Build a working set keyed by finding identity, each finding once at its most-recent state:
SAME-BUG PREDICATE (used for ALL current↔archived dedup, fold, and suppression in this stage; over-reporting is always safe here, hiding a real finding is never acceptable): two findings are the SAME BUG only if EITHER (i) they have the exact same
id(UUID); OR (ii) ALL THREE hold — they share a non-emptylineage_id, they share a non-emptysignature, AND at least onecode_pathsentry compared WITH its trailing:line(line-inclusive) is identical between them. Otherwise they are DISTINCT — render BOTH. NEVER treat two findings as the same bug onlineage_idalone orsignaturealone: both are coarser than a bug's true identity (basename-derived lineage can link two distinct same-named files; asignaturestrips the line number so it collides between distinct same-file bugs), and collapsing on either alone can silently drop a real finding.Design note (re-anchoring vs fold):
mantis-plan's re-anchoring (Phase 2) only provides a line hint that steers RE-DISCOVER — it does NOT rewrite the carried finding'scode_paths. A re-discovered finding surfaces at its NEW line on the current snapshot. Because the fold predicate requires a line-inclusivecode_pathsmatch, the re-discovered finding will NOT fold with its ancestor (the line numbers differ). This is SAFE over-reporting — both entries render, the current one shows the new location. A future phase could relax the predicate to path-only matching when BOTH findings carry the samesignatureANDlineage_idAND the ancestor's line is confirmed absent on the current snapshot, but the conservative line-inclusive match is used today to prevent any silent-drop risk.- Read all active
workspace/findings/*.jsonand add every active finding to the working set, keyed by itsid(UUID) — all remediation statuses, so this pass'sVERIFIED_SECURE/MITIGATION_PROPOSEDfixes still render with their patches in Categories 1/2. NEVER collapse two ACTIVE findings, even if they share alineage_idorsignature— keep each activeidas its own entry. - Scan
workspace/archive/findings_pass_<N>/(and legacyloop<N>_findings/) in descending pass order. Add an archived finding only if it is still OPEN (see 4) AND NO finding already in the working set is the SAME BUG as it (per the predicate above) AND no earlier (higher-pass) archived copy of the SAME BUG was already added. First copy met = latest state; ignore later same-bug copies in lower dirs. (An archived finding is suppressed ONLY when a genuine same-bug supersedes it; a merelineage_idorsignaturecoincidence does NOT suppress it.) - Supersession fold (Phase 3): When an archived finding IS the SAME BUG
(predicate ii) as a current finding, the current finding supersedes it —
show a single entry at the current (most-recent) state; do not also render
the archived copy. When the predicate is NOT satisfied (different
signature, e.g. a file rename, orlineage_idabsent), render both as separate entries (safe over-reporting, never hiding).- Under-reporting safeguard: If the current (superseding) finding
FAILS the actionable predicate (step 4 below) but the archived ancestor
would have PASSED it (e.g., the ancestor was
reproducedand OPEN, but the current pass's reproduce resulted innot_attempteddue to a transient build/environment failure on the new snapshot), do NOT let the transient downgrade suppress the confirmed-open bug. Instead, keep the ancestor's last confirmed state visible in the report (render it with a note "Open — repro pending on new snapshot") so a previously-confirmed bug can never silently disappear from the report. The current finding's newer metadata (e.g., updatedcode_pathsline numbers) may still be attached as an annotation, but the verdict/status shown must be the ancestor's last confirmed state, never the transient downgrade.
- Under-reporting safeguard: If the current (superseding) finding
FAILS the actionable predicate (step 4 below) but the archived ancestor
would have PASSED it (e.g., the ancestor was
- Actionable / quality predicate (applies to active AND archived):
include a finding only if it is an exploit chain (
constituent_findingspresent, or "Exploit Chain" in title/history) ORrepro_statusisreproducedOR (repro_statusisstatically_confirmedAND it carries empirical execution evidence — an external stack trace, sanitizer trace (ASan/UBSan/MSan/TSan), or crash log). Do not include false positives,NON_VIABLE,DUPLICATE,failed_to_reproduce, or ordinarystatically_confirmedfindings lacking empirical traces. - Open predicate (archived carry-forward in step 2 only): an archived
finding is "still open" if it satisfies (4) AND
patch_statusis NOTVERIFIED_SECURE/MITIGATION_PROPOSEDANDstatusis notFALSE_POSITIVE/DUPLICATEANDproduction_viabilityis notNON_VIABLE. (Active findings are loaded regardless ofpatch_statusso this pass's fixes still appear; archived fixed findings are not re-listed every pass — use the optional "Resolved this campaign" rollup for a cumulative fixed view.) - Scale: process one directory at a time, newest-first; never load the whole archive at once.
- Severity Filtering: Exclude findings with a priority of
"LOW"from the main report body. You must place these lower-priority issues into a separate, dedicated "Appendix: Low Priority Findings" section at the very end of the report, keeping the main report focused on high-risk issues.
- Read all active
-
Extract Key Artifacts: For each reproduced finding, extract and format:
- Header Metadata: Title, ID (UUID), Inferred Exposure, Final Risk Score, and Qualitative Priority.
- Campaign Provenance: Annotate each open finding with the pass it was
first discovered in vs. the current pass (e.g.
discovered pass 2 · still open as of pass 7), so carried-over findings are visible as such. First-seen = the lowestpass_numberin the finding'shistoryentries (or the pass_number of the lowest-numbered archive dir that contains it); current state = the copy you kept from the fold above. - Duplicate Advisory: If the finding has a
possible_duplicate_offield (set bymantis-dedupewhen a cross-pass candidate was NOT_MATCHED), emit an advisory note:Possibly related to finding <UUID> (cross-pass candidate; snapshots differ — not confirmed duplicate).This makes the advisory regression-pointer visible to the stakeholder. - Discovery Snapshot: Emit
Discovery Snapshot: <discovery_commit>for the finding. Ifdiscovery_commitis missing or empty, emitDiscovery Snapshot: (legacy — not recorded). Never omit or drop the finding because this field is absent. - Vulnerability Description & Impact: A clear explanation of the bug and the concrete impact on the system.
- Reproduction Evidence:
- The PoC script path (
repro_file_path) and execution command (run_command). - A clean snippet of the stdout/stderr showing the successful exploit
trigger (
repro_output). - Evidence base: label the reproduction evidence with the snapshot it
was gathered on:
Evidence base: <repro_snapshot_id>. Ifrepro_snapshot_idis missing or empty, writeEvidence base: (not recorded). Do NOT assume it equals the header/pass snapshot.
- The PoC script path (
- Risk Rationale: The independent validation reasoning (
reasoning), production viability reasoning (critic_reasoning), and outrage factor analysis (outrage_commentary). - Remediation & Patch:
- The recommended mitigation strategy.
- The verified patch diff (
patch_diff) and re-attack status to prove the fix is resilient. - Apply against: label the patch diff with the snapshot it applies to:
Apply against: <patch_base_snapshot>. Ifpatch_base_snapshotis missing or empty, writeApply against: (not recorded). Ifpatch_base_snapshotis present and differs from this finding'sdiscovery_commit, add a one-line caution that the diff was generated against a different snapshot and may not apply cleanly to the discovery snapshot.
- PII & Secrets Redaction: Before writing any finding data (including description, PoC script/command, and reproducer logs) to the report, you must scan and redact any hardcoded API keys, tokens, credentials, PII
...
ユーザーレビュー (0)
レビューを書く
レビューなし
統計データ
ユーザー評価
この Skill を評価