NEW

Start with the pressure: sales, launch, abuse, agents, data, or guardrails

Outputs and evidence

Grounded, inferred, and analyst-controlled — kept distinct

SecEng outputs stay useful to machines and human reviewers by keeping observed fact, inferred extension, and human review as three separate, non-collapsible states.

5 min readCore engine: lib/seceng-evidence-graphContract: commercial/partner-adapters/contracts

Enforced in code, not just docs

These distinctions are structural, not stylistic — the codebase actively rejects violations.

Reading

5m

  • An inferred claim only becomes grounded when a new observed/derived item arrives — never by relabeling
  • No code path may set analyst_validated — that transition is human-only
  • Our graph is the source of truth; ATT&CK/ATLAS/OWASP are annotations, not the ontology
Output and evidence stack: findings, SARIF, evidence bundles, and path results layered above a shared evidence graph

Evidence first, grounded ≠ inferred

SecEng's evidence engine (lib/seceng-evidence-graph) answers one question: given everything SecEng actually observed about a system, what credible sequence of trust-boundary crossings leads from an untrusted source to a sensitive capability, which parts are evidenced vs. inferred, and what single intervention breaks the most paths?

  • Every grounded node/edge traces back to a concrete EvidenceItem.
  • observed/derived evidence is grounded; inferred/speculative evidence is not, and stays labeled as such through the whole pipeline.
  • Deterministic code runs before any LLM step — the evidence spine does not require an LLM to produce a result.
  • Human validation stays explicit — no code path can mark something analyst-reviewed on its own behalf.

Attack path result states

The live attack-path-result contract (commercial/partner-adapters/contracts/attack-path-result.schema.json) tracks state at three independent levels:

LevelStates
Cluster statusdraft, draft_grounded_validated, draft_extended, draft_flagged, draft_rejected, analyst_validated
Step tiergrounded, speculative
Validation verdictnot_run, sound, flagged, rejected
Retest statusnot_run, pending, passed, failed

analyst_validated is a state a human reviewer sets — it is not reachable from the automated pipeline. Rejected and flagged states are preserved rather than silently dropped, so a partner reviewing results can see what SecEng considered and ruled out, not only what it kept.

External tool run lifecycle

For external-tool invocations (scanners, linters, sandboxed checks), completion and non-completion states are tracked separately in seceng-external-tool-result.schema.json:

StatusMeaning
not_requestedThe tool was never invoked for this run.
not_installedThe tool is unavailable in this environment.
skippedThe tool was intentionally not run.
successThe tool completed normally.
failedThe tool ran and returned an error.
timeoutThe tool exceeded its time budget — kept distinct from a normal failure.

This is the current, real timeout representation in the engine. A dedicated cross-engine "canceled" state (as opposed to timeout) was not found as a separate enum value at last review — treat cancellation semantics as partner-confirmation-required until the generated error/status reference says otherwise.

SARIF and structured JSON

SARIF output supports scanner, CI, IDE, and AppSec ingestion. A consuming partner should preserve rule identifiers, finding fingerprints, severity, confidence, locations, and evidence references where supported. Exact current field names for structured JSON findings live in the generated schema reference, sourced from seceng-scan-content/schemas/ in savvy-cli.

What this page does not claim

This page describes the real state model enforced in code today. It does not assert a frozen, final schema — SecEng's contracts are pre-1.0 and evolving. Field-by-field documentation is deferred to the generated schema reference rather than duplicated here as a second, hand-maintained copy that can drift out of sync.

Field-level detail

See the generated schema reference

Exact field names for findings, evidence, and scan results are generated from live savvy-cli schemas, not hand-copied here.