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.
Files changed (186) hide show
  1. rememberstack/__init__.py +9 -0
  2. rememberstack/adapters/__init__.py +42 -0
  3. rememberstack/adapters/codex_writer.py +221 -0
  4. rememberstack/adapters/markitdown_converter.py +42 -0
  5. rememberstack/adapters/openrouter.py +136 -0
  6. rememberstack/adapters/selfhost/__init__.py +54 -0
  7. rememberstack/adapters/selfhost/forget.py +66 -0
  8. rememberstack/adapters/selfhost/git.py +374 -0
  9. rememberstack/adapters/selfhost/lance.py +328 -0
  10. rememberstack/adapters/selfhost/minio.py +279 -0
  11. rememberstack/adapters/selfhost/mounts.py +249 -0
  12. rememberstack/adapters/selfhost/object_store.py +130 -0
  13. rememberstack/adapters/selfhost/projection.py +80 -0
  14. rememberstack/adapters/selfhost/queue.py +137 -0
  15. rememberstack/adapters/selfhost/telemetry.py +45 -0
  16. rememberstack/adapters/selfhost/watcher.py +70 -0
  17. rememberstack/adapters/testing/__init__.py +15 -0
  18. rememberstack/adapters/testing/cost_meter.py +13 -0
  19. rememberstack/adapters/testing/model_provider.py +83 -0
  20. rememberstack/adapters/testing/queue.py +43 -0
  21. rememberstack/adapters/testing/telemetry.py +22 -0
  22. rememberstack/client.py +19 -0
  23. rememberstack/core/__init__.py +127 -0
  24. rememberstack/core/blockizer.py +189 -0
  25. rememberstack/core/chunker.py +216 -0
  26. rememberstack/core/consumption_skill.py +275 -0
  27. rememberstack/core/conversion.py +76 -0
  28. rememberstack/core/core_manifest.py +598 -0
  29. rememberstack/core/extension_packs.py +124 -0
  30. rememberstack/core/forget.py +17 -0
  31. rememberstack/core/knowledge_authored.py +276 -0
  32. rememberstack/core/knowledge_compile.py +215 -0
  33. rememberstack/core/knowledge_fact_sheet.py +210 -0
  34. rememberstack/core/knowledge_hashing.py +68 -0
  35. rememberstack/core/knowledge_planner.py +64 -0
  36. rememberstack/core/knowledge_writer.py +175 -0
  37. rememberstack/core/ranking.py +200 -0
  38. rememberstack/core/recipe_linter.py +149 -0
  39. rememberstack/core/section_snap.py +209 -0
  40. rememberstack/core/storage_routing.py +27 -0
  41. rememberstack/eval/__init__.py +53 -0
  42. rememberstack/eval/consumption.py +141 -0
  43. rememberstack/eval/contradiction.py +184 -0
  44. rememberstack/eval/harness.py +136 -0
  45. rememberstack/eval/lifecycle.py +400 -0
  46. rememberstack/eval/operational_scale.py +49 -0
  47. rememberstack/eval/resolution.py +255 -0
  48. rememberstack/eval/retrieval_spikes.py +50 -0
  49. rememberstack/eval/skeleton.py +231 -0
  50. rememberstack/llm/__init__.py +1 -0
  51. rememberstack/model/__init__.py +589 -0
  52. rememberstack/model/adjudication.py +100 -0
  53. rememberstack/model/auth.py +27 -0
  54. rememberstack/model/blocks.py +30 -0
  55. rememberstack/model/chunks.py +190 -0
  56. rememberstack/model/claims.py +162 -0
  57. rememberstack/model/client.py +98 -0
  58. rememberstack/model/clustering.py +54 -0
  59. rememberstack/model/component_version.py +124 -0
  60. rememberstack/model/consumption.py +88 -0
  61. rememberstack/model/conversion.py +31 -0
  62. rememberstack/model/deployment.py +53 -0
  63. rememberstack/model/documents.py +168 -0
  64. rememberstack/model/envelope.py +513 -0
  65. rememberstack/model/evaluation.py +72 -0
  66. rememberstack/model/forget.py +143 -0
  67. rememberstack/model/git.py +13 -0
  68. rememberstack/model/knowledge.py +840 -0
  69. rememberstack/model/knowledge_authored.py +325 -0
  70. rememberstack/model/knowledge_planner.py +431 -0
  71. rememberstack/model/lifecycle.py +42 -0
  72. rememberstack/model/model_provider.py +78 -0
  73. rememberstack/model/mounts.py +24 -0
  74. rememberstack/model/object_store.py +21 -0
  75. rememberstack/model/operational_scale.py +59 -0
  76. rememberstack/model/operations.py +153 -0
  77. rememberstack/model/processing.py +228 -0
  78. rememberstack/model/queue.py +73 -0
  79. rememberstack/model/recipes.py +83 -0
  80. rememberstack/model/relations.py +79 -0
  81. rememberstack/model/resolution.py +83 -0
  82. rememberstack/model/retrieval_spikes.py +62 -0
  83. rememberstack/model/sections.py +120 -0
  84. rememberstack/model/telemetry.py +30 -0
  85. rememberstack/ports/__init__.py +29 -0
  86. rememberstack/ports/auth.py +16 -0
  87. rememberstack/ports/connector.py +23 -0
  88. rememberstack/ports/cost_meter.py +17 -0
  89. rememberstack/ports/forget.py +20 -0
  90. rememberstack/ports/git.py +20 -0
  91. rememberstack/ports/model_provider.py +28 -0
  92. rememberstack/ports/mounts.py +16 -0
  93. rememberstack/ports/object_store.py +27 -0
  94. rememberstack/ports/p1_index.py +92 -0
  95. rememberstack/ports/purge.py +93 -0
  96. rememberstack/ports/queue.py +23 -0
  97. rememberstack/ports/telemetry.py +21 -0
  98. rememberstack/profiles/__init__.py +22 -0
  99. rememberstack/profiles/selfhost.py +324 -0
  100. rememberstack/profiles/selfhost_forget.py +158 -0
  101. rememberstack/profiles/selfhost_operations.py +95 -0
  102. rememberstack/py.typed +1 -0
  103. rememberstack/spine/__init__.py +93 -0
  104. rememberstack/spine/admission.py +26 -0
  105. rememberstack/spine/backfill.py +168 -0
  106. rememberstack/spine/catalog_contract.py +742 -0
  107. rememberstack/spine/chunk_catalog.py +237 -0
  108. rememberstack/spine/claim_catalog.py +298 -0
  109. rememberstack/spine/clustering.py +740 -0
  110. rememberstack/spine/component_versions.py +208 -0
  111. rememberstack/spine/consumption.py +81 -0
  112. rememberstack/spine/deployment_bootstrap.py +445 -0
  113. rememberstack/spine/document_catalog.py +621 -0
  114. rememberstack/spine/entity_registry.py +205 -0
  115. rememberstack/spine/extension_packs.py +220 -0
  116. rememberstack/spine/fact_catalog.py +571 -0
  117. rememberstack/spine/forget.py +1753 -0
  118. rememberstack/spine/knowledge.py +5467 -0
  119. rememberstack/spine/lifecycle.py +1071 -0
  120. rememberstack/spine/migrations/__init__.py +1 -0
  121. rememberstack/spine/migrations/_helpers.py +153 -0
  122. rememberstack/spine/migrations/env.py +58 -0
  123. rememberstack/spine/migrations/script.py.mako +27 -0
  124. rememberstack/spine/migrations/versions/__init__.py +1 -0
  125. rememberstack/spine/migrations/versions/p0_02_0001_extensions_enums.py +189 -0
  126. rememberstack/spine/migrations/versions/p0_02_0002_infrastructure_registries.py +321 -0
  127. rememberstack/spine/migrations/versions/p0_02_0003_entities_evaluation_e0_e1.py +631 -0
  128. rememberstack/spine/migrations/versions/p0_02_0004_claims_facts_evidence.py +411 -0
  129. rememberstack/spine/migrations/versions/p0_02_0005_projection_knowledge_retrieval.py +391 -0
  130. rememberstack/spine/migrations/versions/p0_02_0006_partitions_views.py +158 -0
  131. rememberstack/spine/migrations/versions/p2_06_0007_invalidated_outcome.py +26 -0
  132. rememberstack/spine/migrations/versions/p3_01_0008_document_version_target.py +58 -0
  133. rememberstack/spine/migrations/versions/p3_05_0009_reconcile_stage.py +27 -0
  134. rememberstack/spine/migrations/versions/p3_07_0010_lifecycle_eval_suite.py +25 -0
  135. rememberstack/spine/migrations/versions/p4_01_0011_survivor_view_rewrite.py +57 -0
  136. rememberstack/spine/migrations/versions/p6_02_0012_knowledge_compile_recovery.py +58 -0
  137. rememberstack/spine/migrations/versions/p6_04_0013_knowledge_writer_ledger.py +46 -0
  138. rememberstack/spine/migrations/versions/p6_05_0014_knowledge_planner_runtime.py +217 -0
  139. rememberstack/spine/migrations/versions/p6_06_0015_authored_dispatch_runtime.py +38 -0
  140. rememberstack/spine/migrations/versions/p7_02_0016_operational_eval_suite.py +19 -0
  141. rememberstack/spine/migrations/versions/p7_05_0017_hard_forget.py +55 -0
  142. rememberstack/spine/observation_adjudication.py +778 -0
  143. rememberstack/spine/operations.py +298 -0
  144. rememberstack/spine/projection.py +662 -0
  145. rememberstack/spine/recipes.py +276 -0
  146. rememberstack/spine/resolver.py +763 -0
  147. rememberstack/spine/review.py +650 -0
  148. rememberstack/spine/settings.py +22 -0
  149. rememberstack/spine/supersession.py +510 -0
  150. rememberstack/spine/sync.py +128 -0
  151. rememberstack/spine/work_ledger.py +816 -0
  152. rememberstack/surfaces/__init__.py +110 -0
  153. rememberstack/surfaces/cli.py +447 -0
  154. rememberstack/surfaces/consumption_skill.py +87 -0
  155. rememberstack/surfaces/graph_queries.py +698 -0
  156. rememberstack/surfaces/http_api.py +377 -0
  157. rememberstack/surfaces/mcp.py +67 -0
  158. rememberstack/surfaces/query_engine.py +1591 -0
  159. rememberstack/surfaces/recipe_executor.py +185 -0
  160. rememberstack/surfaces/recipe_surface.py +219 -0
  161. rememberstack/surfaces/remote_mcp.py +133 -0
  162. rememberstack/surfaces/sdk.py +324 -0
  163. rememberstack/workers/__init__.py +155 -0
  164. rememberstack/workers/base.py +312 -0
  165. rememberstack/workers/e0.py +577 -0
  166. rememberstack/workers/e1.py +425 -0
  167. rememberstack/workers/e2.py +525 -0
  168. rememberstack/workers/e3.py +434 -0
  169. rememberstack/workers/forget.py +299 -0
  170. rememberstack/workers/knowledge_authored.py +146 -0
  171. rememberstack/workers/knowledge_driver.py +735 -0
  172. rememberstack/workers/knowledge_fact_sheet.py +123 -0
  173. rememberstack/workers/knowledge_planner.py +325 -0
  174. rememberstack/workers/knowledge_writer.py +393 -0
  175. rememberstack/workers/operations.py +42 -0
  176. rememberstack/workers/p1.py +234 -0
  177. rememberstack/workers/p2.py +513 -0
  178. rememberstack/workers/p2_analytics.py +276 -0
  179. rememberstack/workers/p3.py +673 -0
  180. rememberstack/workers/reconcile.py +485 -0
  181. rememberstack/workers/sync.py +168 -0
  182. rememberstack-0.1.0.dist-info/METADATA +213 -0
  183. rememberstack-0.1.0.dist-info/RECORD +186 -0
  184. rememberstack-0.1.0.dist-info/WHEEL +4 -0
  185. rememberstack-0.1.0.dist-info/entry_points.txt +2 -0
  186. 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
+ }