c2c8f7e424
Not scanner stubs — the scanners exist. The Silent Pass needs only their UNIFIED output. This adds the
small common DATA FORMAT (not a new module/framework) the user asked for, exactly the Requirement-
Source / MCAP / regulation-alias pattern: many inputs, one language.
Producer A / B / C -> normalize_signals (vocabulary: id + aliases) -> canonical IntakeSignal -> Silent Pass
- ProducedSignal {signal_id, source_type, confidence, evidence, provenance} = what ANY source emits
(website scanner, repo scanner, PDF parser, tender parser, API, the user).
- knowledge/onboarding/signal_vocabulary.yaml reduces producer dialects to a canonical signal: "SBOM
present" arrives as cyclonedx_found / spdx_found / sbom_uploaded / requires_sbom (tender) — all become
`sbom_file_found`. The Silent Pass cannot tell where it came from -> no per-scanner special logic, ever.
- Unknown signals pass through (a new producer stays visible). confidence/evidence/provenance flow to
the detected capability for the audit trail.
A tender that "requires SBOM" now produces the same effect as a repo that HAS one — fits Vision V2
(Requirement Source over Regulation). Endpoint (#58) then has its final shape: POST -> Producers ->
Normalizer -> Silent Pass -> Profile -> Delta -> Questions -> Roadmap. Non-runtime -> no deploy. mypy
--strict clean, 14 onboarding tests pass, check-loc 0.
73 lines
1.8 KiB
Python
73 lines
1.8 KiB
Python
"""Smart Onboarding Advisor — the onboarding runtime step (orchestration over existing engines).
|
|
|
|
Turns (company + products + certifications + target) into inferred assumptions, the next best questions
|
|
(<=5, each self-explaining), the capability delta, top measures, evidence requests and completeness —
|
|
with NO sales interpretation and NO regulation picking. Orchestrator only: no new engine/registry/
|
|
meta-model; certificate->capability hypotheses and target requirements are INJECTED.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
from .engine import advisor_start, apply_answer
|
|
from .hypotheses import (
|
|
CapabilityHypothesis,
|
|
inferred_hypotheses,
|
|
resolve_for_certifications,
|
|
)
|
|
from .observations import (
|
|
Observation,
|
|
ObservationType,
|
|
empirical_confidence,
|
|
empirical_distribution,
|
|
reviewed,
|
|
)
|
|
from .signals import (
|
|
ProducedSignal,
|
|
SignalVocabularyEntry,
|
|
normalize_signals,
|
|
)
|
|
from .silent_intake import (
|
|
DetectedCapability,
|
|
IntakeSignal,
|
|
ProductFact,
|
|
SignalMapping,
|
|
SilentIntakeResult,
|
|
silent_intake,
|
|
)
|
|
from .schemas import (
|
|
AdvisorMeasure,
|
|
AdvisorQuestion,
|
|
AdvisorResult,
|
|
InferredAssumption,
|
|
OnboardingInput,
|
|
RejectedAssumption,
|
|
)
|
|
|
|
__all__ = [
|
|
"advisor_start",
|
|
"apply_answer",
|
|
"OnboardingInput",
|
|
"AdvisorResult",
|
|
"AdvisorQuestion",
|
|
"AdvisorMeasure",
|
|
"InferredAssumption",
|
|
"RejectedAssumption",
|
|
"CapabilityHypothesis",
|
|
"inferred_hypotheses",
|
|
"resolve_for_certifications",
|
|
"Observation",
|
|
"ObservationType",
|
|
"empirical_distribution",
|
|
"empirical_confidence",
|
|
"reviewed",
|
|
"silent_intake",
|
|
"IntakeSignal",
|
|
"SignalMapping",
|
|
"DetectedCapability",
|
|
"ProductFact",
|
|
"SilentIntakeResult",
|
|
"ProducedSignal",
|
|
"SignalVocabularyEntry",
|
|
"normalize_signals",
|
|
]
|