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,26 @@
1
+ """Shared SQL check for D74's deployment-wide ordinary-work barrier."""
2
+
3
+ from uuid import UUID
4
+
5
+ from sqlalchemy import text
6
+ from sqlalchemy.engine import Connection
7
+
8
+
9
+ def active_forget_id_on(*, connection: Connection, deployment_id: UUID) -> UUID | None:
10
+ """Return the deployment's one blocking forget identity on an open connection."""
11
+ value = connection.execute(
12
+ _ACTIVE_FORGET, {"deployment_id": deployment_id}
13
+ ).scalar_one_or_none()
14
+ return value if isinstance(value, UUID) else None
15
+
16
+
17
+ _ACTIVE_FORGET = text(
18
+ """
19
+ SELECT forget_id
20
+ FROM forget_manifests
21
+ WHERE deployment_id = :deployment_id
22
+ AND status <> 'complete'
23
+ ORDER BY prepared_at, forget_id
24
+ LIMIT 1
25
+ """
26
+ )
@@ -0,0 +1,168 @@
1
+ """Bounded version-bump enumeration over the authoritative work ledger."""
2
+
3
+ from uuid import UUID
4
+
5
+ from pydantic import Field
6
+ from pydantic_settings import BaseSettings
7
+ from pydantic_settings import SettingsConfigDict
8
+ from sqlalchemy import text
9
+ from sqlalchemy.engine import Engine
10
+
11
+ from rememberstack.model import BackfillNotDrainedError
12
+ from rememberstack.model import BackfillSeedRequest
13
+ from rememberstack.model import BackfillSeedResult
14
+ from rememberstack.model import EnqueueWork
15
+ from rememberstack.model import LaneRouteError
16
+ from rememberstack.model import ProcessingLane
17
+ from rememberstack.ports.p1_index import P1IndexMaintenancePort
18
+ from rememberstack.spine.catalog_contract import lane_is_valid
19
+ from rememberstack.spine.work_ledger import enqueue_on
20
+
21
+
22
+ class BackfillSeederSettings(BaseSettings):
23
+ """Bounded database work performed by each seeder transaction."""
24
+
25
+ model_config = SettingsConfigDict(
26
+ env_prefix="REMEMBERSTACK_BACKFILL_", extra="ignore"
27
+ )
28
+
29
+ batch_size: int = Field(default=500, ge=1, le=10_000)
30
+
31
+
32
+ class BackfillSeeder:
33
+ """Seed a stage's new component version from its prior ledger targets.
34
+
35
+ ``processing_state`` already records the generic target, input hash, and
36
+ immutable handler payload for every stage execution. Reusing that ledger
37
+ avoids a second stage-to-table registry and keeps a version bump independent
38
+ of provider-specific catalogs. Rows for the requested version are excluded,
39
+ so calling ``seed_batch`` again is both the cursor and the recovery path.
40
+ """
41
+
42
+ def __init__(self, *, engine: Engine, settings: BackfillSeederSettings) -> None:
43
+ """Bind the seeder to the shared ledger database and explicit batch size."""
44
+ self._engine = engine
45
+ self._settings = settings
46
+
47
+ def seed_batch(self, *, request: BackfillSeedRequest) -> BackfillSeedResult:
48
+ """Insert at most one configured batch for a version-bump campaign.
49
+
50
+ The latest prior row for each target supplies the immutable input
51
+ payload. Every insert uses the ordinary ledger path and its D12 key;
52
+ concurrent seeders therefore converge without duplicate work.
53
+ """
54
+ if not lane_is_valid(stage=request.stage, lane=ProcessingLane.BACKFILL.value):
55
+ raise LaneRouteError(
56
+ f"stage {request.stage} is not a plane-E stage and cannot be backfilled"
57
+ )
58
+
59
+ with self._engine.begin() as connection:
60
+ candidates = (
61
+ connection.execute(
62
+ _SELECT_CANDIDATES,
63
+ {
64
+ "deployment_id": request.deployment_id,
65
+ "stage": request.stage.value,
66
+ "component_version": request.component_version,
67
+ "batch_size": self._settings.batch_size,
68
+ },
69
+ )
70
+ .mappings()
71
+ .all()
72
+ )
73
+ outcomes = tuple(
74
+ enqueue_on(
75
+ connection=connection,
76
+ work=EnqueueWork(
77
+ deployment_id=request.deployment_id,
78
+ target_kind=row["target_kind"],
79
+ target_id=row["target_id"],
80
+ stage=request.stage,
81
+ component_version=request.component_version,
82
+ content_hash=row["content_hash"],
83
+ lane=ProcessingLane.BACKFILL,
84
+ payload=row["payload"],
85
+ ),
86
+ )
87
+ for row in candidates
88
+ )
89
+
90
+ created = sum(outcome.created for outcome in outcomes)
91
+ return BackfillSeedResult(
92
+ selected=len(candidates),
93
+ created=created,
94
+ already_present=len(outcomes) - created,
95
+ complete=len(candidates) < self._settings.batch_size,
96
+ )
97
+
98
+
99
+ class BackfillFinalizer:
100
+ """Run explicit P1 index maintenance only after backfill work has drained."""
101
+
102
+ def __init__(
103
+ self, *, engine: Engine, search_index_maintenance: P1IndexMaintenancePort
104
+ ) -> None:
105
+ """Bind the completion barrier to the ledger and configured P1 adapter."""
106
+ self._engine = engine
107
+ self._search_index_maintenance = search_index_maintenance
108
+
109
+ def build_search_indexes(self, *, deployment_id: UUID) -> None:
110
+ """Build P1 indexes after the caller has finished seeding and work is terminal.
111
+
112
+ The seeder needs no campaign table: its final empty/short batch tells the
113
+ caller enumeration is complete. This method supplies the second barrier,
114
+ refusing maintenance while any row on the deployment's backfill routes is
115
+ pending, running, failed, or dead-lettered.
116
+ """
117
+ with self._engine.connect() as connection:
118
+ unresolved = connection.execute(
119
+ _COUNT_UNRESOLVED, {"deployment_id": deployment_id}
120
+ ).scalar_one()
121
+ if unresolved:
122
+ raise BackfillNotDrainedError(
123
+ f"deployment {deployment_id} has {unresolved} unresolved backfill rows"
124
+ )
125
+ self._search_index_maintenance.build_search_indexes()
126
+
127
+
128
+ _SELECT_CANDIDATES = text(
129
+ """
130
+ SELECT target_kind::text AS target_kind, target_id, content_hash, payload
131
+ FROM (
132
+ SELECT DISTINCT ON (source.target_kind, source.target_id)
133
+ source.target_kind,
134
+ source.target_id,
135
+ source.content_hash,
136
+ source.payload,
137
+ source.enqueued_at,
138
+ source.processing_id
139
+ FROM processing_state AS source
140
+ WHERE source.deployment_id = :deployment_id
141
+ AND source.stage = :stage
142
+ AND source.component_version <> :component_version
143
+ AND NOT EXISTS (
144
+ SELECT 1
145
+ FROM processing_state AS seeded
146
+ WHERE seeded.deployment_id = source.deployment_id
147
+ AND seeded.target_kind = source.target_kind
148
+ AND seeded.target_id = source.target_id
149
+ AND seeded.stage = source.stage
150
+ AND seeded.component_version = :component_version
151
+ )
152
+ ORDER BY source.target_kind, source.target_id,
153
+ source.enqueued_at DESC, source.processing_id DESC
154
+ ) AS candidates
155
+ ORDER BY target_kind, target_id
156
+ LIMIT :batch_size
157
+ """
158
+ )
159
+
160
+ _COUNT_UNRESOLVED = text(
161
+ """
162
+ SELECT count(*)
163
+ FROM processing_state
164
+ WHERE deployment_id = :deployment_id
165
+ AND lane = 'backfill'
166
+ AND status NOT IN ('succeeded', 'skipped')
167
+ """
168
+ )