NeoGraph 0.16.0
A C++20 Graph Agent Engine Library — LangGraph for C++
Loading...
Searching...
No Matches
contract.h
Go to the documentation of this file.
1
10#pragma once
11
12#include <neograph/api.h>
13#include <neograph/json.h>
14
15#include <cstdint>
16#include <memory>
17#include <optional>
18#include <string>
19#include <string_view>
20#include <vector>
21
22namespace neograph::program {
23
24enum class ContractManifestLifecycle : std::uint8_t {
25 Proposed,
26 Reviewed,
27 Frozen,
28};
29
30NEOGRAPH_PROGRAM_API std::string_view to_string(ContractManifestLifecycle state) noexcept;
31NEOGRAPH_PROGRAM_API ContractManifestLifecycle
32contract_manifest_lifecycle_from_string(std::string_view value);
33
34struct NEOGRAPH_PROGRAM_API ContractItem {
35 std::string id;
36 std::string description;
37
38 bool operator==(const ContractItem&) const = default;
39};
40
41struct NEOGRAPH_PROGRAM_API ContractAcceptance {
42 std::string id;
43 std::string description;
44 bool required = true;
45 json expected = json::object();
46
47 bool operator==(const ContractAcceptance&) const = default;
48};
49
50struct NEOGRAPH_PROGRAM_API ContractRisk {
51 std::string id;
52 std::string description;
53 std::string mitigation;
54 bool blocking = true;
55
56 bool operator==(const ContractRisk&) const = default;
57};
58
59struct NEOGRAPH_PROGRAM_API ContractTestVector {
60 std::string id;
61 json input = json::object();
62 json expected = json::object();
63
64 bool operator==(const ContractTestVector&) const = default;
65};
66
67struct NEOGRAPH_PROGRAM_API ContractRetryPolicy {
68 std::uint32_t max_attempts = 1;
69 std::uint64_t max_program_operations = 1;
70 std::uint64_t max_wall_time_ms = 1;
71
72 bool operator==(const ContractRetryPolicy&) const = default;
73};
74
76struct NEOGRAPH_PROGRAM_API ContractManifestSpec {
77 std::uint32_t schema_version = 1;
78 std::string manifest_id;
79 std::string owner_scope;
80 std::string scope;
81 std::vector<std::string> assumptions;
82 std::vector<ContractItem> requirements;
83 std::vector<std::string> non_goals;
84 std::vector<ContractAcceptance> acceptance;
85 std::vector<ContractTestVector> fixed_test_vectors;
86 std::vector<std::string> independent_oracles;
87 std::vector<ContractRisk> risk_register;
88 std::vector<std::string> permissions;
89 ContractRetryPolicy retry_policy;
90
91 bool operator==(const ContractManifestSpec&) const = default;
92};
93
95struct NEOGRAPH_PROGRAM_API ContractReview {
96 std::string reviewer_id;
97 std::string notes;
98 bool approved = false;
99
100 bool operator==(const ContractReview&) const = default;
101};
102
107class NEOGRAPH_PROGRAM_API ContractManifest final {
108public:
109 static constexpr std::uint32_t STORAGE_SCHEMA_VERSION = 1;
110
111 static ContractManifest propose(ContractManifestSpec spec);
112 static ContractManifest parse(std::string_view stored_bytes);
113
114 ContractManifest review(ContractReview review) const;
115 ContractManifest freeze() const;
116
117 ContractManifestLifecycle lifecycle() const noexcept;
118 const ContractManifestSpec& spec() const noexcept;
119 const std::optional<ContractReview>& review_record() const noexcept;
120 const std::string& content_hash() const noexcept;
121 std::string serialize_canonical() const;
122
123private:
124 struct Impl;
125 explicit ContractManifest(std::shared_ptr<const Impl> impl);
126
127 std::shared_ptr<const Impl> impl_;
128};
129
130enum class ContractEvidenceKind : std::uint8_t {
131 WorkerReport,
132 DeterministicRun,
133 IndependentOracle,
134};
135
136NEOGRAPH_PROGRAM_API std::string_view to_string(ContractEvidenceKind kind) noexcept;
137NEOGRAPH_PROGRAM_API ContractEvidenceKind contract_evidence_kind_from_string(std::string_view value);
138
139struct NEOGRAPH_PROGRAM_API ContractEvidence {
140 std::string evidence_id;
141 std::string acceptance_id;
142 ContractEvidenceKind kind = ContractEvidenceKind::WorkerReport;
143 std::string manifest_hash;
144 std::string program_version_id;
146 std::string run_id;
147 std::string workspace_revision;
148 std::string command;
149 std::string toolchain;
150 std::string artifact_hash;
151 bool executed = false;
152 bool passed = false;
153 std::vector<std::string> diagnostics;
154 json details = json::object();
155
156 bool operator==(const ContractEvidence&) const = default;
157};
158
159struct NEOGRAPH_PROGRAM_API ContractDiagnostic {
160 std::string code;
161 std::string message;
162 bool blocking = true;
163
164 bool operator==(const ContractDiagnostic&) const = default;
165};
166
167enum class ContractRunStatus : std::uint8_t {
168 Frozen,
169 Running,
170 Verified,
171 Published,
172 Blocked,
173 Failed,
174};
175
176NEOGRAPH_PROGRAM_API std::string_view to_string(ContractRunStatus status) noexcept;
177NEOGRAPH_PROGRAM_API ContractRunStatus contract_run_status_from_string(std::string_view value);
178
179struct NEOGRAPH_PROGRAM_API ContractVerification {
180 bool publishable = false;
181 ContractRunStatus status = ContractRunStatus::Blocked;
182 std::vector<std::string> missing_acceptance_ids;
183 std::vector<std::string> blocking_diagnostics;
184 std::vector<std::string> failed_evidence_ids;
185
186 bool operator==(const ContractVerification&) const = default;
187};
188
194class NEOGRAPH_PROGRAM_API ContractRun final {
195public:
196 static constexpr std::uint32_t STORAGE_SCHEMA_VERSION = 2;
197
198 explicit ContractRun(ContractManifest frozen_manifest);
199 static ContractRun parse(std::string_view stored_bytes);
200
201 const ContractManifest& manifest() const noexcept;
202 ContractRunStatus status() const noexcept;
203 std::uint32_t attempt() const noexcept;
204 const std::vector<ContractEvidence>& evidence() const noexcept;
205 const std::vector<ContractDiagnostic>& diagnostics() const noexcept;
206 const std::optional<ContractVerification>& verification() const noexcept;
207
210
212 void record_worker_report(std::string report, bool claims_success);
213
215 void record_evidence(ContractEvidence evidence);
216 void record_diagnostic(ContractDiagnostic diagnostic);
217
219 ContractVerification verify(std::string_view program_version_id,
220 std::string_view run_id,
221 std::string_view workspace_revision);
222
224 void publish();
225
227 std::string serialize_canonical() const;
228
229private:
230 struct Impl;
231 explicit ContractRun(std::shared_ptr<Impl> impl);
232
233 std::shared_ptr<Impl> impl_;
234};
235
236} // namespace neograph::program
NEOGRAPH_API export/import macro for shared-library builds.
Durable-boundary state machine for one implementation attempt.
Definition contract.h:194
void record_worker_report(std::string report, bool claims_success)
Store a worker claim without granting it verification authority.
void begin_attempt()
Start one bounded worker attempt. Only a frozen manifest may run.
void publish()
Mark the run publishable only after a successful verification.
ContractVerification verify(std::string_view program_version_id, std::string_view run_id, std::string_view workspace_revision)
Evaluate all required gates against one exact Program run lineage.
std::string serialize_canonical() const
Canonical checkpoint/recovery representation.
void record_evidence(ContractEvidence evidence)
Record independently observed evidence bound to this manifest.
Thin C++ RAII wrapper around yyjson with nlohmann-compatible API.
Mutable planner proposal accepted by ContractManifest::propose().
Definition contract.h:76
Immutable manifest review recorded before a proposal can be frozen.
Definition contract.h:95