How Findings Are Structured in reverse-skill Using the Evidence-Finding-Path Framework
Findings in reverse-skill must reference at least one Evidence record through the evidence_ids field, creating a mandatory, auditable chain from immutable observations to security conclusions.
The reverse-skill project, created by zhaoxuya520, implements a rigorous three-layer framework that structures every security and reverse-engineering deliverable. At the center of this architecture sits the Finding—a documented conclusion that derives directly from Evidence and optionally feeds into Path records that describe attack flows or exploit chains.
Evidence-Finding-Path Architecture
The framework organizes security work into three distinct layers. Each layer has a specific contract defined in skills/ops/evidence-finding-path.md.
| Layer | Description | Storage Pattern |
|---|---|---|
| Evidence | Immutable observations including commands, screenshots, logs, and file hashes. Stored as E-* markdown files. |
work/<case>/evidence/E-*.md |
| Finding | The security conclusion derived from Evidence, with mandatory traceability links. Stored as F-{nnn} entries. |
work/<case>/findings/F-*.md |
| Path | Logical flows connecting multiple Findings, such as exploit chains or CTF solve sequences. Stored as P-{nnn} entries. |
Case report or dedicated path files |
As specified in skills/ops/evidence-finding-path.md (lines 10-24, 45-60, and 64-82), this structure ensures every security claim can be reproduced and audited.
Finding Contract Structure
A compliant Finding follows a strict markdown format with eleven required fields. The contract in skills/ops/evidence-finding-path.md (lines 45-60) defines the following schema:
| Field | Purpose | Constraint |
|---|---|---|
title |
Human-readable name of the vulnerability or insight | Required |
severity |
Risk level: critical, high, medium, low, info, n/a_re |
Required |
category |
Classification: vuln, misconfig, design, reverse_algo, bypass, other |
Required |
status |
Lifecycle: candidate, validated, false_positive, accepted_risk |
Required |
evidence_ids |
List of E- identifiers proving the Finding |
Must be non-empty (line 62) |
location |
Observation point: file:line, address, URL, class.method | Required |
impact |
Narrative description of potential effect | Required |
confidence |
Assurance level: high, medium, low |
low disallowed for validated findings (lines 62-63) |
repro_steps |
Step-by-step reproduction instructions | Required |
remediation |
Recommended fix or n/a for pure reverse-engineering |
Required |
optional_attack |
MITRE ATT&CK ID or empty | Required field, optional value |
The mandatory non-empty evidence_ids rule (line 62) enforces traceability at the schema level. The validation rule preventing confidence: low for validated findings (lines 62-63) ensures quality gates are met before promotion.
Evidence-to-Finding Linkage Mechanism
Each Finding establishes bidirectional traceability through its evidence_ids list. The corresponding Evidence records provide:
repro_command: The exact command or action that produced the observationartifact_path: Location of supporting filescontent_hash: Cryptographic hash ensuring artifact integrity
The review_case.py script (referenced at lines 37-39 of the case review workflow) performs automated validation:
- Verifies all
evidence_idsexist in the case directory - Confirms artifact hashes match recorded values
- Validates status and confidence compliance with the contract
This cross-checking guarantees that no Finding can exist without verifiable, immutable backing data.
Finding Example: Complete Implementation
Below is a production-ready Finding definition that satisfies all contract requirements. This file would reside at work/<case>/findings/F-001.md:
### F-001
- title: Remote Code Execution via insecure deserialization
- severity: critical
- category: vuln
- status: validated
- evidence_ids: [E-012, E-018]
- location: src/main/java/com/example/Deserializer.java:45
- impact: attacker can execute arbitrary code on the target host
- confidence: high
- repro_steps:
1. Run the vulnerable service with the crafted payload.
2. Observe the spawned `/bin/sh` process on the target.
- remediation: Apply input validation and use a safe deserialization library.
- optional_attack: T1203
The referenced Evidence entries E-012 and E-018 would each contain:
- The payload generation command
- Network capture or process listing artifacts
- SHA-256 hashes of the malicious serialized objects
This pairing creates a complete, reproducible evidence chain from observation to conclusion.
Integration with Report Generation
Security reports generated through docs-generator must embed the Findings section with full evidence linkage. According to security-report-templates.md (lines 21-23), every F- entry must display its linked evidence_ids, ensuring the final deliverable preserves the traceability chain.
The template mandates that reviewers and stakeholders can navigate directly from any Finding to its supporting Evidence without external documentation.
Framework Governance Files
The following source files define, enforce, and validate Finding structure in reverse-skill:
| File Path | Responsibility |
|---|---|
skills/ops/evidence-finding-path.md |
Core contract: Evidence, Finding, and Path schema definitions |
skills/docs-generator/references/security-report-templates.md |
Report format requiring embedded Findings with evidence links |
skills/ops/analysis-decision-framework.md |
Evidence sufficiency rules for Finding promotion |
skills/ops/timeline-workitem.md |
Workflow tracking Finding creation and status transitions |
skills/ops/case-review/scripts/review_case.py |
Automated chain validation before case hand-off |
Summary
- Findings require at least one Evidence reference through the mandatory
evidence_idsfield, enforced by contract atevidence-finding-path.mdline 62. - Schema validation in
review_case.pycross-checks evidence existence, artifact hashes, and compliance rules. - Status-gated confidence levels prevent
validatedfindings from carryinglowconfidence without explicit residual-risk documentation. - Report templates mandate evidence linkage visibility in all generated security deliverables.
- Immutable Evidence with content hashing ensures findings remain auditable and reproducible throughout the case lifecycle.
Frequently Asked Questions
What happens if a Finding has no evidence_ids?
The review_case.py validation script will reject the case. The contract at skills/ops/evidence-finding-path.md line 62 explicitly requires evidence_ids to be non-empty, making this a blocking error that prevents report generation.
Can a Finding reference Evidence from another case?
No. The review_case.py cross-checker only validates evidence_ids against the current case's work/<case>/evidence/ directory. Cross-case evidence linkage would break isolation and traceability guarantees.
What is the difference between candidate and validated Finding status?
candidate indicates preliminary analysis requiring further verification. validated means the Finding has passed quality gates including evidence sufficiency review and cannot have confidence: low per lines 62-63 of the evidence-finding-path contract. Promotion between states is tracked via timeline-workitem.md.
How does the framework handle false positives?
Findings with status: false_positive remain in the case record with their original evidence_ids preserved. This maintains audit history and prevents re-analysis of the same evidence, while clearly flagging the conclusion as rejected.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →