File size: 1,819 Bytes
f109bf8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
"""WorkItem / AgentResult / EvidenceBundle contracts for sparse execution."""

from __future__ import annotations

from dataclasses import asdict, dataclass, field
from typing import Any


@dataclass(frozen=True)
class Evidence:
    evidence_id: str
    source_id: str
    source_type: str
    document_id: str
    location: str
    content_hash: str
    embedding_id: str | None = None
    retrieved_by: str | None = None
    retrieval_score: float | None = None
    source_authority: str | None = None
    timestamp: str | None = None
    parent_evidence: tuple[str, ...] = ()
    content: str | None = None  # never delivered without the fields above


@dataclass(frozen=True)
class EvidenceBundle:
    facts: tuple[dict[str, Any], ...] = ()
    sources: tuple[Evidence, ...] = ()
    provenance: tuple[dict[str, Any], ...] = ()
    retrieval_metadata: tuple[dict[str, Any], ...] = ()


@dataclass(frozen=True)
class WorkItem:
    request_id: str
    work_id: str
    agent_id: str
    task: str
    evidence_bundle: EvidenceBundle
    required_outputs: tuple[str, ...]
    permissions: frozenset[str]
    deadline: str | None
    risk_policy: str

    def to_dict(self) -> dict[str, Any]:
        d = asdict(self)
        d["permissions"] = sorted(self.permissions)
        return d


@dataclass(frozen=True)
class AgentResult:
    agent_id: str
    facts: tuple[dict[str, Any], ...] = ()
    conclusions: tuple[dict[str, Any], ...] = ()
    assumptions: tuple[str, ...] = ()
    uncertainty: tuple[str, ...] = ()
    evidence_refs: tuple[str, ...] = ()
    transformations: tuple[dict[str, Any], ...] = ()
    risk_signals: tuple[str, ...] = ()
    provenance_root: str | None = None
    status: str = "ok"  # ok | failed | escalated | skipped

    def to_dict(self) -> dict[str, Any]:
        return asdict(self)