rememberstack 0.1.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- rememberstack/__init__.py +9 -0
- rememberstack/adapters/__init__.py +42 -0
- rememberstack/adapters/codex_writer.py +221 -0
- rememberstack/adapters/markitdown_converter.py +42 -0
- rememberstack/adapters/openrouter.py +136 -0
- rememberstack/adapters/selfhost/__init__.py +54 -0
- rememberstack/adapters/selfhost/forget.py +66 -0
- rememberstack/adapters/selfhost/git.py +374 -0
- rememberstack/adapters/selfhost/lance.py +328 -0
- rememberstack/adapters/selfhost/minio.py +279 -0
- rememberstack/adapters/selfhost/mounts.py +249 -0
- rememberstack/adapters/selfhost/object_store.py +130 -0
- rememberstack/adapters/selfhost/projection.py +80 -0
- rememberstack/adapters/selfhost/queue.py +137 -0
- rememberstack/adapters/selfhost/telemetry.py +45 -0
- rememberstack/adapters/selfhost/watcher.py +70 -0
- rememberstack/adapters/testing/__init__.py +15 -0
- rememberstack/adapters/testing/cost_meter.py +13 -0
- rememberstack/adapters/testing/model_provider.py +83 -0
- rememberstack/adapters/testing/queue.py +43 -0
- rememberstack/adapters/testing/telemetry.py +22 -0
- rememberstack/client.py +19 -0
- rememberstack/core/__init__.py +127 -0
- rememberstack/core/blockizer.py +189 -0
- rememberstack/core/chunker.py +216 -0
- rememberstack/core/consumption_skill.py +275 -0
- rememberstack/core/conversion.py +76 -0
- rememberstack/core/core_manifest.py +598 -0
- rememberstack/core/extension_packs.py +124 -0
- rememberstack/core/forget.py +17 -0
- rememberstack/core/knowledge_authored.py +276 -0
- rememberstack/core/knowledge_compile.py +215 -0
- rememberstack/core/knowledge_fact_sheet.py +210 -0
- rememberstack/core/knowledge_hashing.py +68 -0
- rememberstack/core/knowledge_planner.py +64 -0
- rememberstack/core/knowledge_writer.py +175 -0
- rememberstack/core/ranking.py +200 -0
- rememberstack/core/recipe_linter.py +149 -0
- rememberstack/core/section_snap.py +209 -0
- rememberstack/core/storage_routing.py +27 -0
- rememberstack/eval/__init__.py +53 -0
- rememberstack/eval/consumption.py +141 -0
- rememberstack/eval/contradiction.py +184 -0
- rememberstack/eval/harness.py +136 -0
- rememberstack/eval/lifecycle.py +400 -0
- rememberstack/eval/operational_scale.py +49 -0
- rememberstack/eval/resolution.py +255 -0
- rememberstack/eval/retrieval_spikes.py +50 -0
- rememberstack/eval/skeleton.py +231 -0
- rememberstack/llm/__init__.py +1 -0
- rememberstack/model/__init__.py +589 -0
- rememberstack/model/adjudication.py +100 -0
- rememberstack/model/auth.py +27 -0
- rememberstack/model/blocks.py +30 -0
- rememberstack/model/chunks.py +190 -0
- rememberstack/model/claims.py +162 -0
- rememberstack/model/client.py +98 -0
- rememberstack/model/clustering.py +54 -0
- rememberstack/model/component_version.py +124 -0
- rememberstack/model/consumption.py +88 -0
- rememberstack/model/conversion.py +31 -0
- rememberstack/model/deployment.py +53 -0
- rememberstack/model/documents.py +168 -0
- rememberstack/model/envelope.py +513 -0
- rememberstack/model/evaluation.py +72 -0
- rememberstack/model/forget.py +143 -0
- rememberstack/model/git.py +13 -0
- rememberstack/model/knowledge.py +840 -0
- rememberstack/model/knowledge_authored.py +325 -0
- rememberstack/model/knowledge_planner.py +431 -0
- rememberstack/model/lifecycle.py +42 -0
- rememberstack/model/model_provider.py +78 -0
- rememberstack/model/mounts.py +24 -0
- rememberstack/model/object_store.py +21 -0
- rememberstack/model/operational_scale.py +59 -0
- rememberstack/model/operations.py +153 -0
- rememberstack/model/processing.py +228 -0
- rememberstack/model/queue.py +73 -0
- rememberstack/model/recipes.py +83 -0
- rememberstack/model/relations.py +79 -0
- rememberstack/model/resolution.py +83 -0
- rememberstack/model/retrieval_spikes.py +62 -0
- rememberstack/model/sections.py +120 -0
- rememberstack/model/telemetry.py +30 -0
- rememberstack/ports/__init__.py +29 -0
- rememberstack/ports/auth.py +16 -0
- rememberstack/ports/connector.py +23 -0
- rememberstack/ports/cost_meter.py +17 -0
- rememberstack/ports/forget.py +20 -0
- rememberstack/ports/git.py +20 -0
- rememberstack/ports/model_provider.py +28 -0
- rememberstack/ports/mounts.py +16 -0
- rememberstack/ports/object_store.py +27 -0
- rememberstack/ports/p1_index.py +92 -0
- rememberstack/ports/purge.py +93 -0
- rememberstack/ports/queue.py +23 -0
- rememberstack/ports/telemetry.py +21 -0
- rememberstack/profiles/__init__.py +22 -0
- rememberstack/profiles/selfhost.py +324 -0
- rememberstack/profiles/selfhost_forget.py +158 -0
- rememberstack/profiles/selfhost_operations.py +95 -0
- rememberstack/py.typed +1 -0
- rememberstack/spine/__init__.py +93 -0
- rememberstack/spine/admission.py +26 -0
- rememberstack/spine/backfill.py +168 -0
- rememberstack/spine/catalog_contract.py +742 -0
- rememberstack/spine/chunk_catalog.py +237 -0
- rememberstack/spine/claim_catalog.py +298 -0
- rememberstack/spine/clustering.py +740 -0
- rememberstack/spine/component_versions.py +208 -0
- rememberstack/spine/consumption.py +81 -0
- rememberstack/spine/deployment_bootstrap.py +445 -0
- rememberstack/spine/document_catalog.py +621 -0
- rememberstack/spine/entity_registry.py +205 -0
- rememberstack/spine/extension_packs.py +220 -0
- rememberstack/spine/fact_catalog.py +571 -0
- rememberstack/spine/forget.py +1753 -0
- rememberstack/spine/knowledge.py +5467 -0
- rememberstack/spine/lifecycle.py +1071 -0
- rememberstack/spine/migrations/__init__.py +1 -0
- rememberstack/spine/migrations/_helpers.py +153 -0
- rememberstack/spine/migrations/env.py +58 -0
- rememberstack/spine/migrations/script.py.mako +27 -0
- rememberstack/spine/migrations/versions/__init__.py +1 -0
- rememberstack/spine/migrations/versions/p0_02_0001_extensions_enums.py +189 -0
- rememberstack/spine/migrations/versions/p0_02_0002_infrastructure_registries.py +321 -0
- rememberstack/spine/migrations/versions/p0_02_0003_entities_evaluation_e0_e1.py +631 -0
- rememberstack/spine/migrations/versions/p0_02_0004_claims_facts_evidence.py +411 -0
- rememberstack/spine/migrations/versions/p0_02_0005_projection_knowledge_retrieval.py +391 -0
- rememberstack/spine/migrations/versions/p0_02_0006_partitions_views.py +158 -0
- rememberstack/spine/migrations/versions/p2_06_0007_invalidated_outcome.py +26 -0
- rememberstack/spine/migrations/versions/p3_01_0008_document_version_target.py +58 -0
- rememberstack/spine/migrations/versions/p3_05_0009_reconcile_stage.py +27 -0
- rememberstack/spine/migrations/versions/p3_07_0010_lifecycle_eval_suite.py +25 -0
- rememberstack/spine/migrations/versions/p4_01_0011_survivor_view_rewrite.py +57 -0
- rememberstack/spine/migrations/versions/p6_02_0012_knowledge_compile_recovery.py +58 -0
- rememberstack/spine/migrations/versions/p6_04_0013_knowledge_writer_ledger.py +46 -0
- rememberstack/spine/migrations/versions/p6_05_0014_knowledge_planner_runtime.py +217 -0
- rememberstack/spine/migrations/versions/p6_06_0015_authored_dispatch_runtime.py +38 -0
- rememberstack/spine/migrations/versions/p7_02_0016_operational_eval_suite.py +19 -0
- rememberstack/spine/migrations/versions/p7_05_0017_hard_forget.py +55 -0
- rememberstack/spine/observation_adjudication.py +778 -0
- rememberstack/spine/operations.py +298 -0
- rememberstack/spine/projection.py +662 -0
- rememberstack/spine/recipes.py +276 -0
- rememberstack/spine/resolver.py +763 -0
- rememberstack/spine/review.py +650 -0
- rememberstack/spine/settings.py +22 -0
- rememberstack/spine/supersession.py +510 -0
- rememberstack/spine/sync.py +128 -0
- rememberstack/spine/work_ledger.py +816 -0
- rememberstack/surfaces/__init__.py +110 -0
- rememberstack/surfaces/cli.py +447 -0
- rememberstack/surfaces/consumption_skill.py +87 -0
- rememberstack/surfaces/graph_queries.py +698 -0
- rememberstack/surfaces/http_api.py +377 -0
- rememberstack/surfaces/mcp.py +67 -0
- rememberstack/surfaces/query_engine.py +1591 -0
- rememberstack/surfaces/recipe_executor.py +185 -0
- rememberstack/surfaces/recipe_surface.py +219 -0
- rememberstack/surfaces/remote_mcp.py +133 -0
- rememberstack/surfaces/sdk.py +324 -0
- rememberstack/workers/__init__.py +155 -0
- rememberstack/workers/base.py +312 -0
- rememberstack/workers/e0.py +577 -0
- rememberstack/workers/e1.py +425 -0
- rememberstack/workers/e2.py +525 -0
- rememberstack/workers/e3.py +434 -0
- rememberstack/workers/forget.py +299 -0
- rememberstack/workers/knowledge_authored.py +146 -0
- rememberstack/workers/knowledge_driver.py +735 -0
- rememberstack/workers/knowledge_fact_sheet.py +123 -0
- rememberstack/workers/knowledge_planner.py +325 -0
- rememberstack/workers/knowledge_writer.py +393 -0
- rememberstack/workers/operations.py +42 -0
- rememberstack/workers/p1.py +234 -0
- rememberstack/workers/p2.py +513 -0
- rememberstack/workers/p2_analytics.py +276 -0
- rememberstack/workers/p3.py +673 -0
- rememberstack/workers/reconcile.py +485 -0
- rememberstack/workers/sync.py +168 -0
- rememberstack-0.1.0.dist-info/METADATA +213 -0
- rememberstack-0.1.0.dist-info/RECORD +186 -0
- rememberstack-0.1.0.dist-info/WHEEL +4 -0
- rememberstack-0.1.0.dist-info/entry_points.txt +2 -0
- rememberstack-0.1.0.dist-info/licenses/LICENSE +201 -0
|
@@ -0,0 +1,445 @@
|
|
|
1
|
+
"""Transactional D69 deployment and universal-core bootstrap."""
|
|
2
|
+
|
|
3
|
+
from collections.abc import Sequence
|
|
4
|
+
from uuid import UUID
|
|
5
|
+
|
|
6
|
+
from sqlalchemy import text
|
|
7
|
+
from sqlalchemy.engine import Connection
|
|
8
|
+
from sqlalchemy.engine import Engine
|
|
9
|
+
from sqlalchemy.engine import RowMapping
|
|
10
|
+
|
|
11
|
+
from rememberstack.core import CORE_MANIFEST
|
|
12
|
+
from rememberstack.core import EntityTypeDefinition
|
|
13
|
+
from rememberstack.core import PredicateDefinition
|
|
14
|
+
from rememberstack.core import PredicateSignatureDefinition
|
|
15
|
+
from rememberstack.model import CoreManifestConflictError
|
|
16
|
+
from rememberstack.model import DeploymentBootstrapInput
|
|
17
|
+
from rememberstack.model import DeploymentBootstrapResult
|
|
18
|
+
from rememberstack.model import DeploymentConflictError
|
|
19
|
+
|
|
20
|
+
_LOCK_DEPLOYMENT_BOOTSTRAP = "LOCK TABLE deployments IN SHARE ROW EXCLUSIVE MODE"
|
|
21
|
+
|
|
22
|
+
_SELECT_DEPLOYMENT = """
|
|
23
|
+
SELECT
|
|
24
|
+
deployment_id,
|
|
25
|
+
slug,
|
|
26
|
+
name,
|
|
27
|
+
description,
|
|
28
|
+
default_language,
|
|
29
|
+
raw_bucket,
|
|
30
|
+
artifacts_bucket,
|
|
31
|
+
corpusfs_bucket,
|
|
32
|
+
knowledge_repo_uri
|
|
33
|
+
FROM deployments
|
|
34
|
+
WHERE deployment_id = :deployment_id OR slug = :slug
|
|
35
|
+
FOR UPDATE
|
|
36
|
+
"""
|
|
37
|
+
|
|
38
|
+
_INSERT_DEPLOYMENT = """
|
|
39
|
+
INSERT INTO deployments (
|
|
40
|
+
deployment_id,
|
|
41
|
+
slug,
|
|
42
|
+
name,
|
|
43
|
+
description,
|
|
44
|
+
default_language,
|
|
45
|
+
raw_bucket,
|
|
46
|
+
artifacts_bucket,
|
|
47
|
+
corpusfs_bucket,
|
|
48
|
+
knowledge_repo_uri
|
|
49
|
+
) VALUES (
|
|
50
|
+
:deployment_id,
|
|
51
|
+
:slug,
|
|
52
|
+
:name,
|
|
53
|
+
:description,
|
|
54
|
+
:default_language,
|
|
55
|
+
:raw_bucket,
|
|
56
|
+
:artifacts_bucket,
|
|
57
|
+
:corpusfs_bucket,
|
|
58
|
+
:knowledge_repo_uri
|
|
59
|
+
)
|
|
60
|
+
"""
|
|
61
|
+
|
|
62
|
+
_INSERT_ENTITY_TYPE = """
|
|
63
|
+
INSERT INTO entity_types (
|
|
64
|
+
deployment_id,
|
|
65
|
+
type,
|
|
66
|
+
parent_type,
|
|
67
|
+
description,
|
|
68
|
+
examples,
|
|
69
|
+
schema_org_ref,
|
|
70
|
+
tier,
|
|
71
|
+
pack_id,
|
|
72
|
+
scope_id,
|
|
73
|
+
status
|
|
74
|
+
) VALUES (
|
|
75
|
+
:deployment_id,
|
|
76
|
+
:type,
|
|
77
|
+
:parent_type,
|
|
78
|
+
:description,
|
|
79
|
+
:examples,
|
|
80
|
+
:schema_org_ref,
|
|
81
|
+
:tier,
|
|
82
|
+
:pack_id,
|
|
83
|
+
:scope_id,
|
|
84
|
+
:status
|
|
85
|
+
)
|
|
86
|
+
"""
|
|
87
|
+
|
|
88
|
+
_INSERT_PREDICATE = """
|
|
89
|
+
INSERT INTO predicates (
|
|
90
|
+
deployment_id,
|
|
91
|
+
predicate,
|
|
92
|
+
parent_predicate,
|
|
93
|
+
description,
|
|
94
|
+
examples,
|
|
95
|
+
synonyms,
|
|
96
|
+
schema_org_ref,
|
|
97
|
+
tier,
|
|
98
|
+
pack_id,
|
|
99
|
+
scope_id,
|
|
100
|
+
usage_count,
|
|
101
|
+
is_change_prone,
|
|
102
|
+
exclude_from_graph_distance,
|
|
103
|
+
status
|
|
104
|
+
) VALUES (
|
|
105
|
+
:deployment_id,
|
|
106
|
+
:predicate,
|
|
107
|
+
:parent_predicate,
|
|
108
|
+
:description,
|
|
109
|
+
:examples,
|
|
110
|
+
:synonyms,
|
|
111
|
+
:schema_org_ref,
|
|
112
|
+
:tier,
|
|
113
|
+
:pack_id,
|
|
114
|
+
:scope_id,
|
|
115
|
+
:usage_count,
|
|
116
|
+
:is_change_prone,
|
|
117
|
+
:exclude_from_graph_distance,
|
|
118
|
+
:status
|
|
119
|
+
)
|
|
120
|
+
"""
|
|
121
|
+
|
|
122
|
+
_INSERT_PREDICATE_SIGNATURE = """
|
|
123
|
+
INSERT INTO predicate_signatures (
|
|
124
|
+
deployment_id,
|
|
125
|
+
predicate,
|
|
126
|
+
subject_type,
|
|
127
|
+
object_type
|
|
128
|
+
) VALUES (
|
|
129
|
+
:deployment_id,
|
|
130
|
+
:predicate,
|
|
131
|
+
:subject_type,
|
|
132
|
+
:object_type
|
|
133
|
+
)
|
|
134
|
+
"""
|
|
135
|
+
|
|
136
|
+
_SELECT_CORE_ENTITY_TYPES = """
|
|
137
|
+
SELECT
|
|
138
|
+
type,
|
|
139
|
+
parent_type,
|
|
140
|
+
description,
|
|
141
|
+
examples,
|
|
142
|
+
schema_org_ref,
|
|
143
|
+
tier,
|
|
144
|
+
pack_id,
|
|
145
|
+
scope_id,
|
|
146
|
+
status
|
|
147
|
+
FROM entity_types
|
|
148
|
+
WHERE deployment_id = :deployment_id AND tier = 'core'
|
|
149
|
+
FOR UPDATE
|
|
150
|
+
"""
|
|
151
|
+
|
|
152
|
+
_SELECT_CORE_PREDICATES = """
|
|
153
|
+
SELECT
|
|
154
|
+
predicate,
|
|
155
|
+
parent_predicate,
|
|
156
|
+
description,
|
|
157
|
+
examples,
|
|
158
|
+
synonyms,
|
|
159
|
+
schema_org_ref,
|
|
160
|
+
tier,
|
|
161
|
+
pack_id,
|
|
162
|
+
scope_id,
|
|
163
|
+
usage_count,
|
|
164
|
+
is_change_prone,
|
|
165
|
+
exclude_from_graph_distance,
|
|
166
|
+
status
|
|
167
|
+
FROM predicates
|
|
168
|
+
WHERE deployment_id = :deployment_id AND tier = 'core'
|
|
169
|
+
FOR UPDATE
|
|
170
|
+
"""
|
|
171
|
+
|
|
172
|
+
_SELECT_CORE_PREDICATE_SIGNATURES = """
|
|
173
|
+
SELECT
|
|
174
|
+
signature.predicate,
|
|
175
|
+
signature.subject_type,
|
|
176
|
+
signature.object_type
|
|
177
|
+
FROM predicate_signatures AS signature
|
|
178
|
+
JOIN predicates AS predicate
|
|
179
|
+
ON predicate.deployment_id = signature.deployment_id
|
|
180
|
+
AND predicate.predicate = signature.predicate
|
|
181
|
+
WHERE signature.deployment_id = :deployment_id AND predicate.tier = 'core'
|
|
182
|
+
FOR UPDATE OF signature
|
|
183
|
+
"""
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
class DeploymentBootstrapper:
|
|
187
|
+
"""Create or verify one D68 deployment and its exact core-v1 manifest."""
|
|
188
|
+
|
|
189
|
+
def __init__(self, *, engine: Engine) -> None:
|
|
190
|
+
"""Bind bootstrap to an explicitly composed SQLAlchemy engine."""
|
|
191
|
+
self._engine = engine
|
|
192
|
+
|
|
193
|
+
def bootstrap_deployment(
|
|
194
|
+
self, *, deployment_input: DeploymentBootstrapInput
|
|
195
|
+
) -> DeploymentBootstrapResult:
|
|
196
|
+
"""Create or verify all bootstrap state in one owned transaction."""
|
|
197
|
+
with self._engine.begin() as connection:
|
|
198
|
+
connection.execute(statement=text(_LOCK_DEPLOYMENT_BOOTSTRAP))
|
|
199
|
+
deployment_created = _create_or_compare_deployment(
|
|
200
|
+
connection=connection, deployment_input=deployment_input
|
|
201
|
+
)
|
|
202
|
+
if deployment_created:
|
|
203
|
+
_insert_core_manifest(
|
|
204
|
+
connection=connection, deployment_id=deployment_input.deployment_id
|
|
205
|
+
)
|
|
206
|
+
else:
|
|
207
|
+
_compare_core_manifest(
|
|
208
|
+
connection=connection, deployment_id=deployment_input.deployment_id
|
|
209
|
+
)
|
|
210
|
+
|
|
211
|
+
return DeploymentBootstrapResult(
|
|
212
|
+
deployment_id=deployment_input.deployment_id,
|
|
213
|
+
deployment_created=deployment_created,
|
|
214
|
+
entity_types_count=len(CORE_MANIFEST.entity_types),
|
|
215
|
+
predicates_count=len(CORE_MANIFEST.predicates),
|
|
216
|
+
predicate_signatures_count=len(CORE_MANIFEST.predicate_signatures),
|
|
217
|
+
)
|
|
218
|
+
|
|
219
|
+
|
|
220
|
+
def _create_or_compare_deployment(
|
|
221
|
+
*, connection: Connection, deployment_input: DeploymentBootstrapInput
|
|
222
|
+
) -> bool:
|
|
223
|
+
"""Insert an absent deployment or compare every mapped input field exactly."""
|
|
224
|
+
expected = _deployment_values(deployment_input=deployment_input)
|
|
225
|
+
rows = (
|
|
226
|
+
connection.execute(
|
|
227
|
+
statement=text(_SELECT_DEPLOYMENT),
|
|
228
|
+
parameters={
|
|
229
|
+
"deployment_id": deployment_input.deployment_id,
|
|
230
|
+
"slug": deployment_input.slug,
|
|
231
|
+
},
|
|
232
|
+
)
|
|
233
|
+
.mappings()
|
|
234
|
+
.all()
|
|
235
|
+
)
|
|
236
|
+
if not rows:
|
|
237
|
+
connection.execute(
|
|
238
|
+
statement=text(_INSERT_DEPLOYMENT), parameters=dict(expected)
|
|
239
|
+
)
|
|
240
|
+
return True
|
|
241
|
+
if len(rows) != 1 or dict(rows[0]) != expected:
|
|
242
|
+
raise DeploymentConflictError(
|
|
243
|
+
"deployment identity or mapped profile values conflict"
|
|
244
|
+
)
|
|
245
|
+
return False
|
|
246
|
+
|
|
247
|
+
|
|
248
|
+
def _insert_core_manifest(*, connection: Connection, deployment_id: UUID) -> None:
|
|
249
|
+
"""Insert the complete manifest in its binding foreign-key order."""
|
|
250
|
+
connection.execute(
|
|
251
|
+
statement=text(_INSERT_ENTITY_TYPE),
|
|
252
|
+
parameters=[
|
|
253
|
+
_entity_type_values(deployment_id=deployment_id, definition=definition)
|
|
254
|
+
for definition in CORE_MANIFEST.entity_types
|
|
255
|
+
],
|
|
256
|
+
)
|
|
257
|
+
connection.execute(
|
|
258
|
+
statement=text(_INSERT_PREDICATE),
|
|
259
|
+
parameters=[
|
|
260
|
+
_predicate_values(deployment_id=deployment_id, definition=definition)
|
|
261
|
+
for definition in CORE_MANIFEST.predicates
|
|
262
|
+
],
|
|
263
|
+
)
|
|
264
|
+
connection.execute(
|
|
265
|
+
statement=text(_INSERT_PREDICATE_SIGNATURE),
|
|
266
|
+
parameters=[
|
|
267
|
+
_predicate_signature_values(
|
|
268
|
+
deployment_id=deployment_id, definition=definition
|
|
269
|
+
)
|
|
270
|
+
for definition in CORE_MANIFEST.predicate_signatures
|
|
271
|
+
],
|
|
272
|
+
)
|
|
273
|
+
|
|
274
|
+
|
|
275
|
+
def _compare_core_manifest(*, connection: Connection, deployment_id: UUID) -> None:
|
|
276
|
+
"""Compare the complete stored core state without mutating a valid retry."""
|
|
277
|
+
parameters = {"deployment_id": deployment_id}
|
|
278
|
+
entity_rows = (
|
|
279
|
+
connection.execute(
|
|
280
|
+
statement=text(_SELECT_CORE_ENTITY_TYPES), parameters=parameters
|
|
281
|
+
)
|
|
282
|
+
.mappings()
|
|
283
|
+
.all()
|
|
284
|
+
)
|
|
285
|
+
predicate_rows = (
|
|
286
|
+
connection.execute(
|
|
287
|
+
statement=text(_SELECT_CORE_PREDICATES), parameters=parameters
|
|
288
|
+
)
|
|
289
|
+
.mappings()
|
|
290
|
+
.all()
|
|
291
|
+
)
|
|
292
|
+
signature_rows = (
|
|
293
|
+
connection.execute(
|
|
294
|
+
statement=text(_SELECT_CORE_PREDICATE_SIGNATURES), parameters=parameters
|
|
295
|
+
)
|
|
296
|
+
.mappings()
|
|
297
|
+
.all()
|
|
298
|
+
)
|
|
299
|
+
|
|
300
|
+
if _entity_state(rows=entity_rows) != _expected_entity_state():
|
|
301
|
+
raise CoreManifestConflictError("core entity-type state conflicts")
|
|
302
|
+
if _predicate_state(rows=predicate_rows) != _expected_predicate_state():
|
|
303
|
+
raise CoreManifestConflictError("core predicate state conflicts")
|
|
304
|
+
if _signature_state(rows=signature_rows) != _expected_signature_state():
|
|
305
|
+
raise CoreManifestConflictError("core predicate-signature state conflicts")
|
|
306
|
+
|
|
307
|
+
|
|
308
|
+
def _deployment_values(
|
|
309
|
+
*, deployment_input: DeploymentBootstrapInput
|
|
310
|
+
) -> dict[str, object]:
|
|
311
|
+
"""Map exactly the nine typed inputs to deployment columns."""
|
|
312
|
+
return {
|
|
313
|
+
"deployment_id": deployment_input.deployment_id,
|
|
314
|
+
"slug": deployment_input.slug,
|
|
315
|
+
"name": deployment_input.name,
|
|
316
|
+
"description": deployment_input.description,
|
|
317
|
+
"default_language": deployment_input.default_language,
|
|
318
|
+
"raw_bucket": deployment_input.raw_bucket,
|
|
319
|
+
"artifacts_bucket": deployment_input.artifacts_bucket,
|
|
320
|
+
"corpusfs_bucket": deployment_input.corpusfs_bucket,
|
|
321
|
+
"knowledge_repo_uri": deployment_input.knowledge_repo_uri,
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
|
|
325
|
+
def _entity_type_values(
|
|
326
|
+
*, deployment_id: UUID, definition: EntityTypeDefinition
|
|
327
|
+
) -> dict[str, object]:
|
|
328
|
+
"""Map one immutable entity definition to bound SQL values."""
|
|
329
|
+
return {"deployment_id": deployment_id, **_entity_definition_values(definition)}
|
|
330
|
+
|
|
331
|
+
|
|
332
|
+
def _entity_definition_values(definition: EntityTypeDefinition) -> dict[str, object]:
|
|
333
|
+
"""Map every behavior-bearing entity definition field."""
|
|
334
|
+
return {
|
|
335
|
+
"type": definition.type,
|
|
336
|
+
"parent_type": definition.parent_type,
|
|
337
|
+
"description": definition.description,
|
|
338
|
+
"examples": list(definition.examples),
|
|
339
|
+
"schema_org_ref": definition.schema_org_ref,
|
|
340
|
+
"tier": definition.tier,
|
|
341
|
+
"pack_id": definition.pack_id,
|
|
342
|
+
"scope_id": definition.scope_id,
|
|
343
|
+
"status": definition.status,
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
|
|
347
|
+
def _predicate_values(
|
|
348
|
+
*, deployment_id: UUID, definition: PredicateDefinition
|
|
349
|
+
) -> dict[str, object]:
|
|
350
|
+
"""Map one immutable predicate definition to bound SQL values."""
|
|
351
|
+
return {"deployment_id": deployment_id, **_predicate_definition_values(definition)}
|
|
352
|
+
|
|
353
|
+
|
|
354
|
+
def _predicate_definition_values(definition: PredicateDefinition) -> dict[str, object]:
|
|
355
|
+
"""Map every behavior-bearing predicate definition field."""
|
|
356
|
+
return {
|
|
357
|
+
"predicate": definition.predicate,
|
|
358
|
+
"parent_predicate": definition.parent_predicate,
|
|
359
|
+
"description": definition.description,
|
|
360
|
+
"examples": list(definition.examples),
|
|
361
|
+
"synonyms": list(definition.synonyms),
|
|
362
|
+
"schema_org_ref": definition.schema_org_ref,
|
|
363
|
+
"tier": definition.tier,
|
|
364
|
+
"pack_id": definition.pack_id,
|
|
365
|
+
"scope_id": definition.scope_id,
|
|
366
|
+
"usage_count": definition.usage_count,
|
|
367
|
+
"is_change_prone": definition.is_change_prone,
|
|
368
|
+
"exclude_from_graph_distance": definition.exclude_from_graph_distance,
|
|
369
|
+
"status": definition.status,
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
|
|
373
|
+
def _predicate_signature_values(
|
|
374
|
+
*, deployment_id: UUID, definition: PredicateSignatureDefinition
|
|
375
|
+
) -> dict[str, object]:
|
|
376
|
+
"""Map one immutable signature definition to bound SQL values."""
|
|
377
|
+
return {
|
|
378
|
+
"deployment_id": deployment_id,
|
|
379
|
+
"predicate": definition.predicate,
|
|
380
|
+
"subject_type": definition.subject_type,
|
|
381
|
+
"object_type": definition.object_type,
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
|
|
385
|
+
def _entity_state(*, rows: Sequence[RowMapping]) -> dict[str, dict[str, object]]:
|
|
386
|
+
"""Canonicalize stored entity definitions by their manifest key."""
|
|
387
|
+
return {
|
|
388
|
+
str(row["type"]): {key: value for key, value in row.items() if key != "type"}
|
|
389
|
+
for row in rows
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
|
|
393
|
+
def _expected_entity_state() -> dict[str, dict[str, object]]:
|
|
394
|
+
"""Canonicalize expected entity definitions by their manifest key."""
|
|
395
|
+
return {
|
|
396
|
+
definition.type: {
|
|
397
|
+
key: value
|
|
398
|
+
for key, value in _entity_definition_values(definition).items()
|
|
399
|
+
if key != "type"
|
|
400
|
+
}
|
|
401
|
+
for definition in CORE_MANIFEST.entity_types
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
|
|
405
|
+
def _predicate_state(*, rows: Sequence[RowMapping]) -> dict[str, dict[str, object]]:
|
|
406
|
+
"""Canonicalize stored predicates while validating mutable counters."""
|
|
407
|
+
state: dict[str, dict[str, object]] = {}
|
|
408
|
+
for row in rows:
|
|
409
|
+
usage_count = row["usage_count"]
|
|
410
|
+
if not isinstance(usage_count, int) or usage_count < 0:
|
|
411
|
+
raise CoreManifestConflictError("core predicate usage_count is invalid")
|
|
412
|
+
state[str(row["predicate"])] = {
|
|
413
|
+
key: value
|
|
414
|
+
for key, value in row.items()
|
|
415
|
+
if key not in {"predicate", "usage_count"}
|
|
416
|
+
}
|
|
417
|
+
return state
|
|
418
|
+
|
|
419
|
+
|
|
420
|
+
def _expected_predicate_state() -> dict[str, dict[str, object]]:
|
|
421
|
+
"""Canonicalize expected immutable predicate fields by manifest key."""
|
|
422
|
+
return {
|
|
423
|
+
definition.predicate: {
|
|
424
|
+
key: value
|
|
425
|
+
for key, value in _predicate_definition_values(definition).items()
|
|
426
|
+
if key not in {"predicate", "usage_count"}
|
|
427
|
+
}
|
|
428
|
+
for definition in CORE_MANIFEST.predicates
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
|
|
432
|
+
def _signature_state(*, rows: Sequence[RowMapping]) -> set[tuple[str, str, str]]:
|
|
433
|
+
"""Canonicalize stored signatures as their complete compound-key set."""
|
|
434
|
+
return {
|
|
435
|
+
(str(row["predicate"]), str(row["subject_type"]), str(row["object_type"]))
|
|
436
|
+
for row in rows
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
|
|
440
|
+
def _expected_signature_state() -> set[tuple[str, str, str]]:
|
|
441
|
+
"""Canonicalize expected signatures as their complete compound-key set."""
|
|
442
|
+
return {
|
|
443
|
+
(definition.predicate, definition.subject_type, definition.object_type)
|
|
444
|
+
for definition in CORE_MANIFEST.predicate_signatures
|
|
445
|
+
}
|