Reasoning never sees raw stdout

· systems ·

The cognitive plane has one currency: the universal Evidence object in tcsf/evidence/models.py. Scanners may produce stdout. Nothing above storage is allowed to reason on it.

What an evidence node is

  • evidence_type — port state, vuln match, hypothesis_support, experiment_result, llm_extraction, …
  • observations[] — keyed values with extractor + confidence
  • relationshipssupports / contradicts / derived_from
  • content_hash — SHA-256 of type + target + observations + metadata

LLM output is not a finding

LLM_EXTRACTION is a typed evidence class. The model may propose hypotheses; it cannot mint confirmed findings. AntiHallucinationGuard downgrades unsupported claims to hypothesis — it never deletes history.

Customer-facing rule

No confirmed finding without at least one non-LLM evidence node. Integrity is queryable via GET /api/tcsf/investigations/<id>/integrity. Persist path: tcsf_evidence in the TCSF SQLite store.

Why this matters

Autonomous security research only earns trust when the runtime can refuse to overclaim. This note documents a shipped invariant in Nexus / TCSF — the kind of detail practitioners and search engines both need to evaluate the system honestly.

FAQ

Why not reason on scanner stdout?

Layer A invariant: scanners emit normalised findings; engines above storage consume Evidence — typed, hashed, relational — not raw tool dumps.

Is LLM output a confirmed finding?

No. LLM_EXTRACTION is a typed evidence class. AntiHallucinationGuard downgrades unsupported claims to hypothesis.

Further reading