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,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
|
+
)
|