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,76 @@
1
+ """The D38 conversion router: raw bytes → Markdown, one pluggable route per MIME.
2
+
3
+ The router is the per-deployment routing table; converters are interchangeable
4
+ implementations of one protocol. The route taken and the converter's identity
5
+ are recorded on every representation (D65), so a converter change is always a
6
+ version bump, never a silent difference.
7
+ """
8
+
9
+ from collections.abc import Mapping
10
+ from typing import Final
11
+ from typing import Protocol
12
+ from typing import runtime_checkable
13
+
14
+ from rememberstack.model import ConversionError
15
+ from rememberstack.model import ConversionResult
16
+ from rememberstack.model import UnroutableMimeError
17
+
18
+ PASSTHROUGH_CONVERTER_VERSION: Final = "passthrough-2026.07"
19
+ """Pins the passthrough route's behavior (strict UTF-8 decode, no rewriting)."""
20
+
21
+
22
+ @runtime_checkable
23
+ class Converter(Protocol):
24
+ """One conversion route: raw bytes of a supported MIME type → Markdown."""
25
+
26
+ @property
27
+ def name(self) -> str:
28
+ """The route name recorded on representations (e.g. ``markitdown``)."""
29
+ ...
30
+
31
+ @property
32
+ def version(self) -> str:
33
+ """The converter version (D38): a bump creates new representations."""
34
+ ...
35
+
36
+ def convert(self, *, content: bytes, mime: str) -> ConversionResult:
37
+ """Produce the Markdown reading; raise ``ConversionError`` on bad input."""
38
+ ...
39
+
40
+
41
+ class ConversionRouter:
42
+ """Route an input MIME type to its configured converter (D38 routing table)."""
43
+
44
+ def __init__(self, *, routes: Mapping[str, Converter]) -> None:
45
+ """Bind the deployment's MIME → converter table."""
46
+ self._routes = dict(routes)
47
+
48
+ def converter_for(self, *, mime: str) -> Converter:
49
+ """Return the route for a MIME type; an unrouted type is a typed error."""
50
+ converter = self._routes.get(mime)
51
+ if converter is None:
52
+ raise UnroutableMimeError(f"no conversion route accepts mime {mime!r}")
53
+ return converter
54
+
55
+
56
+ class MarkdownPassthroughConverter:
57
+ """The identity route for inputs that already are Markdown or plain text."""
58
+
59
+ @property
60
+ def name(self) -> str:
61
+ """The route name recorded on representations."""
62
+ return "passthrough"
63
+
64
+ @property
65
+ def version(self) -> str:
66
+ """The pinned passthrough behavior version."""
67
+ return PASSTHROUGH_CONVERTER_VERSION
68
+
69
+ def convert(self, *, content: bytes, mime: str) -> ConversionResult:
70
+ """Decode the bytes as UTF-8 text; undecodable input is a typed failure."""
71
+ try:
72
+ return ConversionResult(document_md=content.decode("utf-8"))
73
+ except UnicodeDecodeError as err:
74
+ raise ConversionError(
75
+ f"input declared {mime!r} is not valid UTF-8 text"
76
+ ) from err
@@ -0,0 +1,598 @@
1
+ """Immutable, dependency-safe transcription of the normative core-v1 registry."""
2
+
3
+ from dataclasses import dataclass
4
+ from typing import Literal
5
+ from uuid import UUID
6
+
7
+ OntologyTier = Literal["core"]
8
+ OntologyStatus = Literal["active"]
9
+
10
+
11
+ @dataclass(frozen=True, slots=True)
12
+ class EntityTypeDefinition:
13
+ """One immutable universal-core entity-type definition."""
14
+
15
+ type: str
16
+ parent_type: None
17
+ description: str
18
+ examples: tuple[str, ...]
19
+ schema_org_ref: str | None
20
+ tier: OntologyTier
21
+ pack_id: None
22
+ scope_id: UUID | None
23
+ status: OntologyStatus
24
+
25
+
26
+ @dataclass(frozen=True, slots=True)
27
+ class PredicateDefinition:
28
+ """One immutable universal-core predicate definition."""
29
+
30
+ predicate: str
31
+ parent_predicate: str | None
32
+ description: str
33
+ examples: tuple[str, ...]
34
+ synonyms: tuple[str, ...]
35
+ schema_org_ref: str | None
36
+ tier: OntologyTier
37
+ pack_id: None
38
+ scope_id: UUID | None
39
+ usage_count: int
40
+ is_change_prone: bool
41
+ exclude_from_graph_distance: bool
42
+ status: OntologyStatus
43
+
44
+
45
+ @dataclass(frozen=True, slots=True)
46
+ class PredicateSignatureDefinition:
47
+ """One immutable concrete universal-core domain/range signature."""
48
+
49
+ predicate: str
50
+ subject_type: str
51
+ object_type: str
52
+
53
+
54
+ @dataclass(frozen=True, slots=True)
55
+ class CoreManifest:
56
+ """Complete immutable universal-core registry manifest."""
57
+
58
+ manifest_version: str
59
+ entity_types: tuple[EntityTypeDefinition, ...]
60
+ predicates: tuple[PredicateDefinition, ...]
61
+ predicate_signatures: tuple[PredicateSignatureDefinition, ...]
62
+
63
+
64
+ _CORE_TYPE_NAMES: tuple[str, ...] = (
65
+ "Person",
66
+ "Organization",
67
+ "Place",
68
+ "Document",
69
+ "Event",
70
+ "Concept",
71
+ "Project",
72
+ "Product",
73
+ )
74
+ """The eight universal-core roots in display order — also the `any` expansion order."""
75
+
76
+
77
+ @dataclass(frozen=True, slots=True)
78
+ class PredicateDomainRange:
79
+ """Compact domain/range unions for one predicate — the normative signature source.
80
+
81
+ Product form pairs every subject type with every object type; the same-kind
82
+ form (`part_of`) pairs each core type with itself. The concrete signature
83
+ rows are always derived by `_expand_signatures`, never hand-listed (D69,
84
+ refined 2026-07-18).
85
+ """
86
+
87
+ predicate: str
88
+ subject_types: tuple[str, ...]
89
+ object_types: tuple[str, ...]
90
+ same_kind: bool = False
91
+
92
+
93
+ _ANY: tuple[str, ...] = _CORE_TYPE_NAMES
94
+
95
+ _PREDICATE_DOMAIN_RANGES: tuple[PredicateDomainRange, ...] = (
96
+ PredicateDomainRange(
97
+ predicate="works_for", subject_types=("Person",), object_types=("Organization",)
98
+ ),
99
+ PredicateDomainRange(
100
+ predicate="member_of", subject_types=("Person",), object_types=("Organization",)
101
+ ),
102
+ PredicateDomainRange(
103
+ predicate="affiliated_with",
104
+ subject_types=("Person", "Organization"),
105
+ object_types=("Organization",),
106
+ ),
107
+ PredicateDomainRange(
108
+ predicate="founded",
109
+ subject_types=("Person", "Organization"),
110
+ object_types=("Organization",),
111
+ ),
112
+ PredicateDomainRange(
113
+ predicate="located_in",
114
+ subject_types=("Organization", "Place", "Event"),
115
+ object_types=("Place",),
116
+ ),
117
+ PredicateDomainRange(
118
+ predicate="part_of", subject_types=_ANY, object_types=_ANY, same_kind=True
119
+ ),
120
+ PredicateDomainRange(
121
+ predicate="authored",
122
+ subject_types=("Person", "Organization"),
123
+ object_types=("Document",),
124
+ ),
125
+ PredicateDomainRange(
126
+ predicate="created",
127
+ subject_types=("Person", "Organization"),
128
+ object_types=("Product", "Concept"),
129
+ ),
130
+ PredicateDomainRange(
131
+ predicate="about", subject_types=("Document", "Event"), object_types=_ANY
132
+ ),
133
+ PredicateDomainRange(
134
+ predicate="knows_about", subject_types=("Person",), object_types=("Concept",)
135
+ ),
136
+ PredicateDomainRange(
137
+ predicate="knows", subject_types=("Person",), object_types=("Person",)
138
+ ),
139
+ PredicateDomainRange(
140
+ predicate="participated_in",
141
+ subject_types=("Person", "Organization"),
142
+ object_types=("Event", "Project"),
143
+ ),
144
+ PredicateDomainRange(
145
+ predicate="works_on",
146
+ subject_types=("Person", "Organization"),
147
+ object_types=("Project", "Product"),
148
+ ),
149
+ PredicateDomainRange(
150
+ predicate="uses",
151
+ subject_types=("Person", "Organization"),
152
+ object_types=("Product",),
153
+ ),
154
+ PredicateDomainRange(
155
+ predicate="reports_to", subject_types=("Person",), object_types=("Person",)
156
+ ),
157
+ PredicateDomainRange(predicate="related_to", subject_types=_ANY, object_types=_ANY),
158
+ )
159
+
160
+
161
+ def _expand_signatures(
162
+ *, domain_ranges: tuple[PredicateDomainRange, ...]
163
+ ) -> tuple[PredicateSignatureDefinition, ...]:
164
+ """Expand the compact domain/range unions into concrete signature rows.
165
+
166
+ Product rows pair every subject type with every object type in subject-major
167
+ order; same-kind rows pair each core type with itself in display order. The
168
+ expansion is deterministic and yields exactly the 116 core-v1 rows, asserted
169
+ by `_assert_manifest_integrity`.
170
+ """
171
+ signatures: list[PredicateSignatureDefinition] = []
172
+ for domain_range in domain_ranges:
173
+ pairs = (
174
+ tuple((name, name) for name in domain_range.subject_types)
175
+ if domain_range.same_kind
176
+ else tuple(
177
+ (subject, obj)
178
+ for subject in domain_range.subject_types
179
+ for obj in domain_range.object_types
180
+ )
181
+ )
182
+ signatures.extend(
183
+ PredicateSignatureDefinition(
184
+ predicate=domain_range.predicate, subject_type=subject, object_type=obj
185
+ )
186
+ for subject, obj in pairs
187
+ )
188
+ return tuple(signatures)
189
+
190
+
191
+ CORE_MANIFEST = CoreManifest(
192
+ manifest_version="core-v1",
193
+ entity_types=(
194
+ EntityTypeDefinition(
195
+ type="Person",
196
+ parent_type=None,
197
+ description="A human individual, living, deceased, or fictional.",
198
+ examples=("Ada Lovelace", "Grace Hopper"),
199
+ schema_org_ref="https://schema.org/Person",
200
+ tier="core",
201
+ pack_id=None,
202
+ scope_id=None,
203
+ status="active",
204
+ ),
205
+ EntityTypeDefinition(
206
+ type="Organization",
207
+ parent_type=None,
208
+ description=(
209
+ "A structured group or legal or social entity that acts collectively."
210
+ ),
211
+ examples=("Acme Corporation", "Open Source Initiative"),
212
+ schema_org_ref="https://schema.org/Organization",
213
+ tier="core",
214
+ pack_id=None,
215
+ scope_id=None,
216
+ status="active",
217
+ ),
218
+ EntityTypeDefinition(
219
+ type="Place",
220
+ parent_type=None,
221
+ description="A physical, geographic, or named location.",
222
+ examples=("Prague", "Building 5"),
223
+ schema_org_ref="https://schema.org/Place",
224
+ tier="core",
225
+ pack_id=None,
226
+ scope_id=None,
227
+ status="active",
228
+ ),
229
+ EntityTypeDefinition(
230
+ type="Document",
231
+ parent_type=None,
232
+ description=(
233
+ "An informational creative work that may be ingested, cited, authored, "
234
+ "or discussed."
235
+ ),
236
+ examples=("Quarterly report", "Research paper"),
237
+ schema_org_ref="https://schema.org/CreativeWork",
238
+ tier="core",
239
+ pack_id=None,
240
+ scope_id=None,
241
+ status="active",
242
+ ),
243
+ EntityTypeDefinition(
244
+ type="Event",
245
+ parent_type=None,
246
+ description="An occurrence bounded by time, place, or participants.",
247
+ examples=("Product launch", "Annual conference"),
248
+ schema_org_ref="https://schema.org/Event",
249
+ tier="core",
250
+ pack_id=None,
251
+ scope_id=None,
252
+ status="active",
253
+ ),
254
+ EntityTypeDefinition(
255
+ type="Concept",
256
+ parent_type=None,
257
+ description=(
258
+ "An abstract idea, topic, category, method, or field of knowledge."
259
+ ),
260
+ examples=("Machine learning", "Supply-chain resilience"),
261
+ schema_org_ref="https://schema.org/DefinedTerm",
262
+ tier="core",
263
+ pack_id=None,
264
+ scope_id=None,
265
+ status="active",
266
+ ),
267
+ EntityTypeDefinition(
268
+ type="Project",
269
+ parent_type=None,
270
+ description="A coordinated effort with an intended outcome.",
271
+ examples=("ERP migration", "Project Atlas"),
272
+ schema_org_ref="https://schema.org/Project",
273
+ tier="core",
274
+ pack_id=None,
275
+ scope_id=None,
276
+ status="active",
277
+ ),
278
+ EntityTypeDefinition(
279
+ type="Product",
280
+ parent_type=None,
281
+ description=(
282
+ "A good, system, service offering, or tool that people or "
283
+ "organizations create or use."
284
+ ),
285
+ examples=("Beacon CRM", "Industrial sensor"),
286
+ schema_org_ref="https://schema.org/Product",
287
+ tier="core",
288
+ pack_id=None,
289
+ scope_id=None,
290
+ status="active",
291
+ ),
292
+ ),
293
+ predicates=(
294
+ PredicateDefinition(
295
+ predicate="related_to",
296
+ parent_predicate=None,
297
+ description=(
298
+ "A permissive relationship used only when no more specific governed "
299
+ "predicate fits."
300
+ ),
301
+ examples=("Project Atlas related_to Beacon CRM",),
302
+ synonyms=("connected_to",),
303
+ schema_org_ref=None,
304
+ tier="core",
305
+ pack_id=None,
306
+ scope_id=None,
307
+ usage_count=0,
308
+ is_change_prone=False,
309
+ exclude_from_graph_distance=True,
310
+ status="active",
311
+ ),
312
+ PredicateDefinition(
313
+ predicate="works_for",
314
+ parent_predicate="related_to",
315
+ description=(
316
+ "Employment or ongoing work relationship from a person to an "
317
+ "organization."
318
+ ),
319
+ examples=("Ada works_for Acme",),
320
+ synonyms=("works_at", "employed_by", "employee_of"),
321
+ schema_org_ref="https://schema.org/worksFor",
322
+ tier="core",
323
+ pack_id=None,
324
+ scope_id=None,
325
+ usage_count=0,
326
+ is_change_prone=True,
327
+ exclude_from_graph_distance=False,
328
+ status="active",
329
+ ),
330
+ PredicateDefinition(
331
+ predicate="member_of",
332
+ parent_predicate="related_to",
333
+ description=(
334
+ "Formal or informal membership of a person in an organization."
335
+ ),
336
+ examples=("Ada member_of Standards Council",),
337
+ synonyms=("belongs_to", "is_member_of"),
338
+ schema_org_ref="https://schema.org/memberOf",
339
+ tier="core",
340
+ pack_id=None,
341
+ scope_id=None,
342
+ usage_count=0,
343
+ is_change_prone=True,
344
+ exclude_from_graph_distance=False,
345
+ status="active",
346
+ ),
347
+ PredicateDefinition(
348
+ predicate="affiliated_with",
349
+ parent_predicate="related_to",
350
+ description=(
351
+ "A looser advisory, partner, alumni, or institutional affiliation "
352
+ "with an organization."
353
+ ),
354
+ examples=(
355
+ "Ada affiliated_with University Lab",
356
+ "Acme affiliated_with Trade Alliance",
357
+ ),
358
+ synonyms=("associated_with", "connected_with"),
359
+ schema_org_ref=None,
360
+ tier="core",
361
+ pack_id=None,
362
+ scope_id=None,
363
+ usage_count=0,
364
+ is_change_prone=True,
365
+ exclude_from_graph_distance=False,
366
+ status="active",
367
+ ),
368
+ PredicateDefinition(
369
+ predicate="founded",
370
+ parent_predicate="related_to",
371
+ description=(
372
+ "Creation or establishment of an organization by a person or "
373
+ "organization."
374
+ ),
375
+ examples=("Ada founded Beacon Labs", "Acme founded Acme Research"),
376
+ synonyms=("established", "started"),
377
+ schema_org_ref=None,
378
+ tier="core",
379
+ pack_id=None,
380
+ scope_id=None,
381
+ usage_count=0,
382
+ is_change_prone=False,
383
+ exclude_from_graph_distance=False,
384
+ status="active",
385
+ ),
386
+ PredicateDefinition(
387
+ predicate="located_in",
388
+ parent_predicate="related_to",
389
+ description=(
390
+ "Physical or operational location of an organization, place, or "
391
+ "event within a place."
392
+ ),
393
+ examples=("Acme located_in Prague", "Keynote located_in Hall A"),
394
+ synonyms=("based_in", "situated_in"),
395
+ schema_org_ref=None,
396
+ tier="core",
397
+ pack_id=None,
398
+ scope_id=None,
399
+ usage_count=0,
400
+ is_change_prone=True,
401
+ exclude_from_graph_distance=False,
402
+ status="active",
403
+ ),
404
+ PredicateDefinition(
405
+ predicate="part_of",
406
+ parent_predicate="related_to",
407
+ description="Same-kind containment or component relationship.",
408
+ examples=("Division A part_of Acme", "Prague part_of Czechia"),
409
+ synonyms=("component_of", "contained_in"),
410
+ schema_org_ref=None,
411
+ tier="core",
412
+ pack_id=None,
413
+ scope_id=None,
414
+ usage_count=0,
415
+ is_change_prone=True,
416
+ exclude_from_graph_distance=False,
417
+ status="active",
418
+ ),
419
+ PredicateDefinition(
420
+ predicate="authored",
421
+ parent_predicate="related_to",
422
+ description="Authorship of a document by a person or organization.",
423
+ examples=("Ada authored Quarterly report",),
424
+ synonyms=("wrote", "written_by"),
425
+ schema_org_ref=None,
426
+ tier="core",
427
+ pack_id=None,
428
+ scope_id=None,
429
+ usage_count=0,
430
+ is_change_prone=False,
431
+ exclude_from_graph_distance=False,
432
+ status="active",
433
+ ),
434
+ PredicateDefinition(
435
+ predicate="created",
436
+ parent_predicate="related_to",
437
+ description=(
438
+ "Creation of a product or concept by a person or organization, "
439
+ "excluding document authorship."
440
+ ),
441
+ examples=("Ada created Beacon CRM", "Acme created Resilience method"),
442
+ synonyms=("made", "developed"),
443
+ schema_org_ref=None,
444
+ tier="core",
445
+ pack_id=None,
446
+ scope_id=None,
447
+ usage_count=0,
448
+ is_change_prone=False,
449
+ exclude_from_graph_distance=False,
450
+ status="active",
451
+ ),
452
+ PredicateDefinition(
453
+ predicate="about",
454
+ parent_predicate="related_to",
455
+ description="The entity or topic that a document or event concerns.",
456
+ examples=("Quarterly report about Acme", "Workshop about Machine learning"),
457
+ synonyms=("concerns", "regarding"),
458
+ schema_org_ref="https://schema.org/about",
459
+ tier="core",
460
+ pack_id=None,
461
+ scope_id=None,
462
+ usage_count=0,
463
+ is_change_prone=False,
464
+ exclude_from_graph_distance=False,
465
+ status="active",
466
+ ),
467
+ PredicateDefinition(
468
+ predicate="knows_about",
469
+ parent_predicate="related_to",
470
+ description="A person's familiarity or expertise concerning a concept.",
471
+ examples=("Ada knows_about Compiler design",),
472
+ synonyms=("expert_in", "familiar_with"),
473
+ schema_org_ref="https://schema.org/knowsAbout",
474
+ tier="core",
475
+ pack_id=None,
476
+ scope_id=None,
477
+ usage_count=0,
478
+ is_change_prone=False,
479
+ exclude_from_graph_distance=False,
480
+ status="active",
481
+ ),
482
+ PredicateDefinition(
483
+ predicate="knows",
484
+ parent_predicate="related_to",
485
+ description=("A social or professional acquaintance between two people."),
486
+ examples=("Ada knows Grace",),
487
+ synonyms=("acquainted_with",),
488
+ schema_org_ref="https://schema.org/knows",
489
+ tier="core",
490
+ pack_id=None,
491
+ scope_id=None,
492
+ usage_count=0,
493
+ is_change_prone=False,
494
+ exclude_from_graph_distance=False,
495
+ status="active",
496
+ ),
497
+ PredicateDefinition(
498
+ predicate="participated_in",
499
+ parent_predicate="related_to",
500
+ description=(
501
+ "Participation by a person or organization in an event or project."
502
+ ),
503
+ examples=(
504
+ "Ada participated_in Annual conference",
505
+ "Acme participated_in Project Atlas",
506
+ ),
507
+ synonyms=("took_part_in", "joined"),
508
+ schema_org_ref=None,
509
+ tier="core",
510
+ pack_id=None,
511
+ scope_id=None,
512
+ usage_count=0,
513
+ is_change_prone=False,
514
+ exclude_from_graph_distance=False,
515
+ status="active",
516
+ ),
517
+ PredicateDefinition(
518
+ predicate="works_on",
519
+ parent_predicate="related_to",
520
+ description=(
521
+ "Active work or contribution by a person or organization on a "
522
+ "project or product."
523
+ ),
524
+ examples=("Ada works_on Project Atlas", "Acme works_on Beacon CRM"),
525
+ synonyms=("contributes_to", "develops"),
526
+ schema_org_ref=None,
527
+ tier="core",
528
+ pack_id=None,
529
+ scope_id=None,
530
+ usage_count=0,
531
+ is_change_prone=True,
532
+ exclude_from_graph_distance=False,
533
+ status="active",
534
+ ),
535
+ PredicateDefinition(
536
+ predicate="uses",
537
+ parent_predicate="related_to",
538
+ description=(
539
+ "Adoption or use of a product, system, or tool by a person or "
540
+ "organization."
541
+ ),
542
+ examples=("Ada uses Beacon CRM", "Acme uses Industrial sensor"),
543
+ synonyms=("utilizes", "operates_with"),
544
+ schema_org_ref=None,
545
+ tier="core",
546
+ pack_id=None,
547
+ scope_id=None,
548
+ usage_count=0,
549
+ is_change_prone=True,
550
+ exclude_from_graph_distance=False,
551
+ status="active",
552
+ ),
553
+ PredicateDefinition(
554
+ predicate="reports_to",
555
+ parent_predicate="related_to",
556
+ description=(
557
+ "An organizational reporting line from one person to another person."
558
+ ),
559
+ examples=("Ada reports_to Grace",),
560
+ synonyms=("managed_by", "answers_to"),
561
+ schema_org_ref=None,
562
+ tier="core",
563
+ pack_id=None,
564
+ scope_id=None,
565
+ usage_count=0,
566
+ is_change_prone=True,
567
+ exclude_from_graph_distance=False,
568
+ status="active",
569
+ ),
570
+ ),
571
+ predicate_signatures=_expand_signatures(domain_ranges=_PREDICATE_DOMAIN_RANGES),
572
+ )
573
+
574
+
575
+ def _assert_manifest_integrity(manifest: CoreManifest) -> None:
576
+ """Fail import if the packaged manifest loses a binding core-v1 invariant."""
577
+ entity_keys = tuple(entity.type for entity in manifest.entity_types)
578
+ predicate_keys = tuple(predicate.predicate for predicate in manifest.predicates)
579
+ signature_keys = tuple(
580
+ (signature.predicate, signature.subject_type, signature.object_type)
581
+ for signature in manifest.predicate_signatures
582
+ )
583
+
584
+ assert manifest.manifest_version == "core-v1"
585
+ assert len(entity_keys) == len(set(entity_keys)) == 8
586
+ assert len(predicate_keys) == len(set(predicate_keys)) == 16
587
+ assert len(signature_keys) == len(set(signature_keys)) == 116
588
+ assert all(entity.parent_type is None for entity in manifest.entity_types)
589
+ assert predicate_keys[0] == "related_to"
590
+ assert set(
591
+ signature.predicate for signature in manifest.predicate_signatures
592
+ ) <= set(predicate_keys)
593
+ assert {signature.subject_type for signature in manifest.predicate_signatures} | {
594
+ signature.object_type for signature in manifest.predicate_signatures
595
+ } <= set(entity_keys)
596
+
597
+
598
+ _assert_manifest_integrity(manifest=CORE_MANIFEST)