feat: project scaffold, unified Pydantic schema, scope gating

This commit is contained in:
2026-06-29 17:35:50 -04:00
commit 1f531e4948
9 changed files with 1239 additions and 0 deletions
@@ -0,0 +1,709 @@
{
"$defs": {
"ExploitDBMatch": {
"additionalProperties": false,
"description": "An Exploit-DB candidate returned verbatim by ``searchsploit``.\n\nThese are ALWAYS unverified references. We never fabricate or infer EDB-IDs or\npaths; only what searchsploit actually returned is emitted.",
"properties": {
"edb_id": {
"description": "Exploit-DB id, e.g. '50383'.",
"title": "Edb Id",
"type": "string"
},
"title": {
"title": "Title",
"type": "string"
},
"path": {
"description": "Local path within the Exploit-DB checkout.",
"title": "Path",
"type": "string"
},
"url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "exploit-db.com URL.",
"title": "Url"
},
"query": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "The searchsploit query that produced this hit.",
"title": "Query"
},
"source": {
"default": "exploit-db",
"title": "Source",
"type": "string"
},
"verified": {
"default": false,
"description": "Always false: candidate reference only.",
"title": "Verified",
"type": "boolean"
}
},
"required": [
"edb_id",
"title",
"path"
],
"title": "ExploitDBMatch",
"type": "object"
},
"Host": {
"additionalProperties": false,
"properties": {
"hostname": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Hostname"
},
"ips": {
"items": {
"type": "string"
},
"title": "Ips",
"type": "array"
},
"cnames": {
"items": {
"type": "string"
},
"title": "Cnames",
"type": "array"
},
"ports": {
"items": {
"$ref": "#/$defs/Port"
},
"title": "Ports",
"type": "array"
}
},
"title": "Host",
"type": "object"
},
"HttpInfo": {
"additionalProperties": false,
"properties": {
"url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Url"
},
"status": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"title": "Status"
},
"title": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Title"
},
"webserver": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Webserver"
},
"technologies": {
"items": {
"type": "string"
},
"title": "Technologies",
"type": "array"
},
"tls": {
"anyOf": [
{
"$ref": "#/$defs/TlsInfo"
},
{
"type": "null"
}
],
"default": null
}
},
"title": "HttpInfo",
"type": "object"
},
"NucleiFinding": {
"additionalProperties": false,
"properties": {
"template_id": {
"title": "Template Id",
"type": "string"
},
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Name"
},
"severity": {
"$ref": "#/$defs/Severity",
"default": "unknown"
},
"matched_at": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Matched At"
},
"host": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Host"
},
"reference": {
"items": {
"type": "string"
},
"title": "Reference",
"type": "array"
}
},
"required": [
"template_id"
],
"title": "NucleiFinding",
"type": "object"
},
"Port": {
"additionalProperties": false,
"properties": {
"number": {
"maximum": 65535,
"minimum": 0,
"title": "Number",
"type": "integer"
},
"protocol": {
"default": "tcp",
"title": "Protocol",
"type": "string"
},
"state": {
"default": "open",
"title": "State",
"type": "string"
},
"service": {
"anyOf": [
{
"$ref": "#/$defs/Service"
},
{
"type": "null"
}
],
"default": null
}
},
"required": [
"number"
],
"title": "Port",
"type": "object"
},
"ScopeUsed": {
"additionalProperties": false,
"properties": {
"in_scope_domains": {
"items": {
"type": "string"
},
"title": "In Scope Domains",
"type": "array"
},
"in_scope_cidrs": {
"items": {
"type": "string"
},
"title": "In Scope Cidrs",
"type": "array"
},
"out_of_scope": {
"items": {
"type": "string"
},
"title": "Out Of Scope",
"type": "array"
}
},
"title": "ScopeUsed",
"type": "object"
},
"Service": {
"additionalProperties": false,
"properties": {
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Service name, e.g. 'http'.",
"title": "Name"
},
"product": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Product, e.g. 'Apache httpd'.",
"title": "Product"
},
"version": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Version string, e.g. '2.4.49'.",
"title": "Version"
},
"cpe": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Cpe"
},
"http": {
"anyOf": [
{
"$ref": "#/$defs/HttpInfo"
},
{
"type": "null"
}
],
"default": null
},
"exploitdb_candidates": {
"items": {
"$ref": "#/$defs/ExploitDBMatch"
},
"title": "Exploitdb Candidates",
"type": "array"
}
},
"title": "Service",
"type": "object"
},
"Severity": {
"enum": [
"info",
"low",
"medium",
"high",
"critical",
"unknown"
],
"title": "Severity",
"type": "string"
},
"StageResult": {
"additionalProperties": false,
"properties": {
"name": {
"title": "Name",
"type": "string"
},
"status": {
"$ref": "#/$defs/StageStatus",
"default": "skipped"
},
"detail": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Detail"
},
"started_at": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Started At"
},
"finished_at": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Finished At"
}
},
"required": [
"name"
],
"title": "StageResult",
"type": "object"
},
"StageStatus": {
"description": "Per-tool stage outcome. The pipeline fails soft: a tool that crashes, times\nout, or returns nothing is recorded here and the run continues.",
"enum": [
"ok",
"empty",
"failed",
"skipped"
],
"title": "StageStatus",
"type": "string"
},
"TlsInfo": {
"additionalProperties": false,
"properties": {
"subject_cn": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Subject Cn"
},
"issuer": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Issuer"
},
"not_after": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Not After"
}
},
"title": "TlsInfo",
"type": "object"
},
"ToolVersion": {
"additionalProperties": false,
"properties": {
"name": {
"title": "Name",
"type": "string"
},
"version": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Version"
}
},
"required": [
"name"
],
"title": "ToolVersion",
"type": "object"
},
"TriageItem": {
"additionalProperties": false,
"description": "One prioritized finding from the LLM stage. All references must point at ids\npresent in the ReconReport \u2014 see triage.llm for the acceptance gate.",
"properties": {
"summary": {
"title": "Summary",
"type": "string"
},
"rationale": {
"title": "Rationale",
"type": "string"
},
"severity": {
"$ref": "#/$defs/Severity",
"default": "unknown"
},
"evidence_refs": {
"description": "ids/keys present in the ReconReport (host:port, edb_id, template_id).",
"items": {
"type": "string"
},
"title": "Evidence Refs",
"type": "array"
},
"suggested_next_step": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Must reference a real edb_id / nuclei template / host:port from input.",
"title": "Suggested Next Step"
},
"confidence": {
"default": 0.0,
"maximum": 1.0,
"minimum": 0.0,
"title": "Confidence",
"type": "number"
}
},
"required": [
"summary",
"rationale"
],
"title": "TriageItem",
"type": "object"
},
"TriageReport": {
"additionalProperties": false,
"properties": {
"prioritized_findings": {
"items": {
"$ref": "#/$defs/TriageItem"
},
"title": "Prioritized Findings",
"type": "array"
},
"model": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Model"
},
"generated_by": {
"default": "deterministic",
"description": "'llm' or 'deterministic'.",
"title": "Generated By",
"type": "string"
}
},
"title": "TriageReport",
"type": "object"
}
},
"additionalProperties": false,
"description": "Top-level run artifact. Schema-valid instances are written to report.json.",
"properties": {
"run_id": {
"title": "Run Id",
"type": "string"
},
"target": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Target"
},
"started_at": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Started At"
},
"finished_at": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Finished At"
},
"tool_versions": {
"items": {
"$ref": "#/$defs/ToolVersion"
},
"title": "Tool Versions",
"type": "array"
},
"scope": {
"$ref": "#/$defs/ScopeUsed"
},
"stages": {
"items": {
"$ref": "#/$defs/StageResult"
},
"title": "Stages",
"type": "array"
},
"hosts": {
"items": {
"$ref": "#/$defs/Host"
},
"title": "Hosts",
"type": "array"
},
"nuclei_findings": {
"items": {
"$ref": "#/$defs/NucleiFinding"
},
"title": "Nuclei Findings",
"type": "array"
},
"triage": {
"anyOf": [
{
"$ref": "#/$defs/TriageReport"
},
{
"type": "null"
}
],
"default": null
},
"notice": {
"default": "Authorized use only. Recon-and-triage scope: this report enumerates and references findings; it does not run or generate exploits.",
"title": "Notice",
"type": "string"
}
},
"required": [
"run_id"
],
"title": "ReconReport",
"type": "object"
}