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 @@
1
+ """Alembic environment for the authoritative Postgres schema."""
@@ -0,0 +1,153 @@
1
+ """Small migration helpers for faithful explicit Postgres DDL."""
2
+
3
+ from collections.abc import Iterable
4
+ import re
5
+
6
+ from alembic import op
7
+
8
+ _TABLE_START = re.compile(r"^CREATE TABLE (?P<table>[a-z_][a-z0-9_]*) \($")
9
+ _COLUMN_START = re.compile(r"^(?P<column>[a-z_][a-z0-9_]*)\s+")
10
+
11
+
12
+ def apply_ddl(*, sql: str) -> None:
13
+ """Execute explicit DDL statements and materialize inline column comments."""
14
+ for statement in _split_sql(sql=sql):
15
+ op.execute(statement)
16
+ for table, column, comment in _column_comments(sql=sql):
17
+ escaped_comment = comment.replace("'", "''")
18
+ op.execute(f"COMMENT ON COLUMN {table}.{column} IS '{escaped_comment}'")
19
+
20
+
21
+ def drop_tables(*, table_names: Iterable[str]) -> None:
22
+ """Drop only the named UGM tables in dependency-safe reverse order."""
23
+ for table_name in table_names:
24
+ op.execute(f"DROP TABLE IF EXISTS {table_name} CASCADE")
25
+
26
+
27
+ def drop_types(*, type_names: Iterable[str]) -> None:
28
+ """Drop only the named UGM enum types after their tables are gone."""
29
+ for type_name in type_names:
30
+ op.execute(f"DROP TYPE IF EXISTS {type_name}")
31
+
32
+
33
+ def _column_comments(*, sql: str) -> tuple[tuple[str, str, str], ...]:
34
+ """Extract every inline source column description from CREATE TABLE DDL."""
35
+ result: list[tuple[str, str, str]] = []
36
+ current_table: str | None = None
37
+
38
+ for raw_line in sql.splitlines():
39
+ table_match = _TABLE_START.match(raw_line)
40
+ if table_match is not None:
41
+ current_table = table_match.group("table")
42
+ continue
43
+ if current_table is None:
44
+ continue
45
+ if raw_line.startswith(");") or raw_line.startswith(") PARTITION"):
46
+ current_table = None
47
+ continue
48
+ definition, marker, comment = raw_line.partition("--")
49
+ if not marker:
50
+ continue
51
+ for segment in _split_top_level_commas(value=definition.strip().rstrip(",")):
52
+ column_match = _COLUMN_START.match(segment.strip())
53
+ if column_match is not None:
54
+ result.append(
55
+ (current_table, column_match.group("column"), comment.strip())
56
+ )
57
+
58
+ return tuple(dict.fromkeys(result))
59
+
60
+
61
+ def _split_top_level_commas(*, value: str) -> tuple[str, ...]:
62
+ """Split same-line column declarations without splitting numeric type arguments."""
63
+ parts: list[str] = []
64
+ start = 0
65
+ depth = 0
66
+ quote: str | None = None
67
+ for index, character in enumerate(value):
68
+ if quote is not None:
69
+ if character == quote:
70
+ quote = None
71
+ continue
72
+ if character in {"'", '"'}:
73
+ quote = character
74
+ elif character == "(":
75
+ depth += 1
76
+ elif character == ")":
77
+ depth -= 1
78
+ elif character == "," and depth == 0:
79
+ parts.append(value[start:index])
80
+ start = index + 1
81
+ parts.append(value[start:])
82
+ return tuple(part for part in parts if part.strip())
83
+
84
+
85
+ def _split_sql(*, sql: str) -> tuple[str, ...]:
86
+ """Split PostgreSQL SQL on top-level semicolons, preserving dollar bodies."""
87
+ statements: list[str] = []
88
+ start = 0
89
+ index = 0
90
+ quote: str | None = None
91
+ dollar_tag: str | None = None
92
+ line_comment = False
93
+ block_comment = False
94
+
95
+ while index < len(sql):
96
+ pair = sql[index : index + 2]
97
+ character = sql[index]
98
+ if line_comment:
99
+ if character == "\n":
100
+ line_comment = False
101
+ index += 1
102
+ continue
103
+ if block_comment:
104
+ if pair == "*/":
105
+ block_comment = False
106
+ index += 2
107
+ else:
108
+ index += 1
109
+ continue
110
+ if dollar_tag is not None:
111
+ if sql.startswith(dollar_tag, index):
112
+ index += len(dollar_tag)
113
+ dollar_tag = None
114
+ else:
115
+ index += 1
116
+ continue
117
+ if quote is not None:
118
+ if character == quote:
119
+ if index + 1 < len(sql) and sql[index + 1] == quote:
120
+ index += 2
121
+ continue
122
+ quote = None
123
+ index += 1
124
+ continue
125
+ if pair == "--":
126
+ line_comment = True
127
+ index += 2
128
+ continue
129
+ if pair == "/*":
130
+ block_comment = True
131
+ index += 2
132
+ continue
133
+ if character in {"'", '"'}:
134
+ quote = character
135
+ index += 1
136
+ continue
137
+ if character == "$":
138
+ tag_match = re.match(r"\$[A-Za-z_0-9]*\$", sql[index:])
139
+ if tag_match is not None:
140
+ dollar_tag = tag_match.group(0)
141
+ index += len(dollar_tag)
142
+ continue
143
+ if character == ";":
144
+ statement = sql[start : index + 1].strip()
145
+ if statement:
146
+ statements.append(statement)
147
+ start = index + 1
148
+ index += 1
149
+
150
+ tail = sql[start:].strip()
151
+ if tail:
152
+ statements.append(tail)
153
+ return tuple(statements)
@@ -0,0 +1,58 @@
1
+ """Alembic runtime configured through the typed spine settings boundary."""
2
+
3
+ from logging.config import fileConfig
4
+
5
+ from alembic import context
6
+ from sqlalchemy import engine_from_config
7
+ from sqlalchemy import pool
8
+
9
+ from rememberstack.spine.settings import load_database_settings
10
+
11
+ config = context.config
12
+
13
+ if config.config_file_name is not None:
14
+ fileConfig(config.config_file_name)
15
+
16
+ target_metadata = None
17
+
18
+
19
+ def _database_url() -> str:
20
+ """Resolve an explicit Alembic URL or the validated application setting."""
21
+ configured_url = config.get_main_option("sqlalchemy.url")
22
+ if configured_url:
23
+ return configured_url
24
+ return load_database_settings().sqlalchemy_url()
25
+
26
+
27
+ def run_migrations_offline() -> None:
28
+ """Run migrations without creating a database engine."""
29
+ context.configure(
30
+ url=_database_url(),
31
+ target_metadata=target_metadata,
32
+ literal_binds=True,
33
+ dialect_opts={"paramstyle": "named"},
34
+ )
35
+
36
+ with context.begin_transaction():
37
+ context.run_migrations()
38
+
39
+
40
+ def run_migrations_online() -> None:
41
+ """Run migrations through a non-pooled SQLAlchemy connection."""
42
+ configuration = config.get_section(config.config_ini_section) or {}
43
+ configuration["sqlalchemy.url"] = _database_url()
44
+ connectable = engine_from_config(
45
+ configuration, prefix="sqlalchemy.", poolclass=pool.NullPool
46
+ )
47
+
48
+ with connectable.connect() as connection:
49
+ context.configure(connection=connection, target_metadata=target_metadata)
50
+
51
+ with context.begin_transaction():
52
+ context.run_migrations()
53
+
54
+
55
+ if context.is_offline_mode():
56
+ run_migrations_offline()
57
+ else:
58
+ run_migrations_online()
@@ -0,0 +1,27 @@
1
+ """${message}
2
+
3
+ Revision ID: ${up_revision}
4
+ Revises: ${down_revision | comma,n}
5
+ Create Date: ${create_date}
6
+ """
7
+
8
+ from collections.abc import Sequence
9
+
10
+ from alembic import op
11
+ import sqlalchemy as sa
12
+ ${imports if imports else ""}
13
+
14
+ revision: str = ${repr(up_revision)}
15
+ down_revision: str | None = ${repr(down_revision)}
16
+ branch_labels: str | Sequence[str] | None = ${repr(branch_labels)}
17
+ depends_on: str | Sequence[str] | None = ${repr(depends_on)}
18
+
19
+
20
+ def upgrade() -> None:
21
+ """Apply this schema revision."""
22
+ ${upgrades if upgrades else "pass"}
23
+
24
+
25
+ def downgrade() -> None:
26
+ """Revert this schema revision."""
27
+ ${downgrades if downgrades else "pass"}
@@ -0,0 +1 @@
1
+ """Linear revision chain for the Postgres spine."""
@@ -0,0 +1,189 @@
1
+ """Create required extensions and authoritative enum types."""
2
+
3
+ from collections.abc import Sequence
4
+
5
+ from rememberstack.spine.migrations._helpers import apply_ddl
6
+ from rememberstack.spine.migrations._helpers import drop_tables
7
+ from rememberstack.spine.migrations._helpers import drop_types
8
+
9
+ revision: str = "p0_02_0001"
10
+ down_revision: str | None = None
11
+ branch_labels: str | Sequence[str] | None = None
12
+ depends_on: str | Sequence[str] | None = None
13
+
14
+ _DDL = r"""CREATE EXTENSION IF NOT EXISTS pgcrypto; -- gen_random_uuid fallback; digests
15
+ CREATE EXTENSION IF NOT EXISTS pg_trgm; -- T1 fuzzy blocking: trigram GIN on names (D17)
16
+ CREATE EXTENSION IF NOT EXISTS fuzzystrmatch; -- T2 phonetic: daitch_mokotoff() (D17, NOT soundex)
17
+ CREATE EXTENSION IF NOT EXISTS unaccent; -- accent-fold names before trigram/phonetic (registries §5)
18
+ CREATE EXTENSION IF NOT EXISTS btree_gist; -- composite GiST: relations bi-temporal EXCLUDE constraint (§9)
19
+ CREATE EXTENSION IF NOT EXISTS pg_partman; -- monthly RANGE partition automation (D23, §12)
20
+ CREATE TYPE deployment_status AS ENUM ('active','suspended','archived');
21
+
22
+ -- Every non-deterministic producer that stamps a *_version resolving to pipeline_component_versions
23
+ -- has a value here (so a version string can always resolve to a catalog row, D1/D12):
24
+ CREATE TYPE pipeline_component AS ENUM (
25
+ 'ingester','converter','blockizer','structurer','crossreferencer','chunker','context_prefixer',
26
+ 'extractor','grounder','resolver','normalizer','adjudicator','embedder','fact_labeler',
27
+ 'profile_summarizer','community_detector','snapshot_builder','knowledge_planner',
28
+ 'knowledge_writer','knowledge_reflector','knowledge_linter','judge');
29
+ CREATE TYPE processing_target AS ENUM ('document','document_section','chunk','claim','relation','observation','entity','snapshot','knowledge_artifact');
30
+ CREATE TYPE pipeline_stage AS ENUM ('ingest','convert','structure','crossref','chunk','embed_chunk','extract_claims','embed_claim','ground_claims','resolve_entities','normalize_relations','adjudicate_supersession','adjudicate_observations','embed_relation','label_relation','embed_observation','label_observation','refresh_profile','build_snapshot','detect_communities','compile_knowledge','reflect_knowledge','lint_knowledge');
31
+ CREATE TYPE processing_status AS ENUM ('pending','running','succeeded','failed','dead_letter','skipped');
32
+ -- D67: only plane-E routes use operational lanes. K/P (and other scheduled aggregate) jobs
33
+ -- represent their single unlaned route with SQL NULL, never a synthetic third enum value.
34
+ CREATE TYPE processing_lane AS ENUM ('steady','backfill');
35
+ CREATE TYPE processing_defer_reason AS ENUM ('scheduled','retry_backoff','budget');
36
+
37
+ CREATE TYPE ontology_tier AS ENUM ('core','extension','other','deprecated');
38
+ CREATE TYPE ontology_status AS ENUM ('active','deprecated');
39
+ CREATE TYPE scope_interest_kind AS ENUM ('entity_type','predicate','metadata','keyword');
40
+
41
+ CREATE TYPE entity_status AS ENUM ('active','merged','retired');
42
+ CREATE TYPE alias_provenance AS ENUM ('source','llm_canonical');
43
+ CREATE TYPE resolution_tier AS ENUM ('T0','T1','T2','T3','T4_small','T4_frontier','human');
44
+ CREATE TYPE decision_actor AS ENUM ('auto','human');
45
+
46
+ CREATE TYPE review_item_kind AS ENUM ('merge_cluster','split_cluster','type_conflict','generic_identifier','contradiction','support_withdrawn');
47
+ CREATE TYPE review_status AS ENUM ('pending','accepted','rejected','deferred','auto_resolved');
48
+ -- Covers all review_item_kinds (D24), not just merges: pick_a/pick_b/both_stand for contradictions,
49
+ -- downweight/keep_signal for generic_identifier, retype for type_conflict.
50
+ CREATE TYPE review_verdict AS ENUM ('merge','not_merge','split','retype','downweight','keep_signal','pick_a','pick_b','both_stand','uncertain','restore_support','invalidate_fact');
51
+ -- restore_support / invalidate_fact are the two terminal verdicts of the support_withdrawn kind
52
+ -- (D54): restore = old claim regains currency ('review_restored' event) + the case is planted as
53
+ -- a D35 canary; invalidate = the fact's invalidated_at is set with a recorded adjudication.
54
+ -- 'uncertain' leaves the fact standing with its support:withdrawn marker (visibly unresolved).
55
+ CREATE TYPE golden_label AS ENUM ('match','no_match');
56
+ CREATE TYPE golden_hardness AS ENUM ('hard_positive','hard_negative','easy');
57
+ CREATE TYPE eval_suite AS ENUM ('resolution','selection','grounding','retrieval','contradiction');
58
+ CREATE TYPE selection_outcome AS ENUM ('keep','rewrite','drop','kept_flagged');
59
+
60
+ CREATE TYPE document_status AS ENUM ('ingesting','converting','structuring','ready','failed','deleted');
61
+ CREATE TYPE document_origin AS ENUM ('external','system_generated'); -- D42, stamped at E0 ingest per lineage
62
+ -- D55 lineage semantics: snapshot = every version is independent dated testimony forever;
63
+ -- living = the current version is the source's standing statement (currency follows it, D54):
64
+ CREATE TYPE versioning_mode AS ENUM ('snapshot','living');
65
+ -- D54 testimony-currency transitions (append-only ledger; bookkeeping, never validity):
66
+ CREATE TYPE currency_reason AS ENUM ('reextracted','version_superseded','version_deleted','review_restored');
67
+ -- 'review_restored' = the support_withdrawn triage's verdict A (became_current=true): a reviewer
68
+ -- judged the old claim correct and the new extractor regressed — the old claim stands as the
69
+ -- chunk's current transcription until a fixed extractor re-derives it (lifecycle §4).
70
+ CREATE TYPE section_role AS ENUM ('body','abstract','introduction','results','methods','discussion','conclusion','references','appendix','table','figure_caption','nav','boilerplate','legal');
71
+ CREATE TYPE crossref_kind AS ENUM ('cites','links_to','attaches','replies_to');
72
+
73
+ CREATE TYPE claim_temporal_class AS ENUM ('static','dynamic','atemporal');
74
+ -- D41 source-asserted validity on claims (immutable; never a relation-style revisable window):
75
+ CREATE TYPE claim_valid_precision AS ENUM ('unknown','instant','day','month','quarter','year','open');
76
+ CREATE TYPE claim_valid_kind AS ENUM ('proposition_validity','event_time','measurement_period','effective_period');
77
+ CREATE TYPE grounding_audit_status AS ENUM ('unaudited','sampled_pass','sampled_fail','escalated');
78
+ -- The ledger records DROPs, low-confidence keeps (flags), and decontextualization EDITs.
79
+ -- Plain keeps are NOT persisted (they ARE the claims row); see §8.
80
+ CREATE TYPE extraction_decision_type AS ENUM ('selection_drop','selection_keep_flagged','decontext_edit');
81
+ CREATE TYPE selection_drop_reason AS ENUM ('opinion','advice','hypothetical','generic','question','intro','conclusion','no_info','ambiguous','references_boilerplate');
82
+
83
+ CREATE TYPE evidence_stance AS ENUM ('supports','contradicts');
84
+ CREATE TYPE relation_status AS ENUM ('active','invalidated'); -- generated mirror of invalidated_at; retirement (zero-evidence GC, §13) = setting invalidated_at
85
+ CREATE TYPE adjudication_outcome AS ENUM ('add','noop','supersede','contradict','same_as_merge_proposal','retracted_source_removal');
86
+ -- 'retracted_source_removal' = D54/D55 source-acted closure: a living lineage's removal, OR
87
+ -- any deletion (version / lineage / source-observed), withdrew a fact's sole current support →
88
+ -- adjudicated closed per shape (states: valid_until cap; measurements: invalidated_at — the
89
+ -- D43 no-cap rule); the adjudication row is the audit record. (support_withdrawn is
90
+ -- exclusively the RE-EXTRACTION zero-support flag, D54 — never removal, never deletion.)
91
+ CREATE TYPE adjudication_method AS ENUM ('novelty_gate','exact','fuzzy','embedding','small_model','frontier_llm');
92
+
93
+ CREATE TYPE projection_plane AS ENUM ('P1_search','P2_graph','P3_corpusfs');
94
+ CREATE TYPE snapshot_status AS ENUM ('building','validating','published','superseded','failed');
95
+ CREATE TYPE community_algorithm AS ENUM ('leiden','louvain'); -- external detection pass (D11)
96
+
97
+ CREATE TYPE knowledge_layer AS ENUM ('K1','K2','K3'); -- content TIERS of one mechanism (D47), not separate machinery
98
+ CREATE TYPE knowledge_page_kind AS ENUM ('compiled','authored'); -- D46: machine-owned body vs human/agent-owned body
99
+ -- 'quarantined' = a compiled body was human-edited directly; excluded from recompile until the
100
+ -- diff is triaged — into the curation sidecar, or by adopting the page as authored
101
+ -- (plan_action 'convert_kind'; D46 quarantine rule):
102
+ CREATE TYPE knowledge_artifact_status AS ENUM ('active','stale','quarantined','tombstoned');
103
+ CREATE TYPE knowledge_evidence_role AS ENUM ('supports','contradicts','cites');
104
+ -- D45 routing rules — the closed, mechanically-evaluable kind set (k_layers_design.md §5):
105
+ CREATE TYPE knowledge_rule_kind AS ENUM ('entity','entity_subtree','predicate_beat','community','doc_set','scope_interests','manual');
106
+ CREATE TYPE rule_key_kind AS ENUM ('entity','predicate','community','doc_source');
107
+ -- convert_kind = D46 adoption (compiled→authored, via quarantine triage) / handover
108
+ -- (authored→compiled — the one action that NEVER auto-applies; requires author confirmation):
109
+ CREATE TYPE plan_action AS ENUM ('create_page','split_page','merge_pages','move_page','retire_page','adjust_rule','convert_kind');
110
+ CREATE TYPE plan_trigger AS ENUM ('orphan_evidence','size_overflow','community_change','reflection','writer_suggestion','human');
111
+ CREATE TYPE plan_decision_status AS ENUM ('proposed','applied','rejected');
112
+ CREATE TYPE subscription_status AS ENUM ('active','paused','retired'); -- dispatch consumers (k_layers §5)
113
+ -- 'authored_review' = cited/watched evidence changed under an AUTHORED page → review flag for
114
+ -- the page's author (human or agent), never an auto-recompile (D46):
115
+ CREATE TYPE knowledge_trigger AS ENUM ('evidence_changed','community_changed','debounce_timer','manual','tombstone','authored_review');
116
+ CREATE TYPE refresh_status AS ENUM ('pending','running','done','failed');
117
+
118
+ -- D50 retrieval recipe registry (§11.A) — the two enums the grain linter checks mechanically:
119
+ CREATE TYPE recipe_output_grain AS ENUM ('fact','evidence','compiled','composite');
120
+ CREATE TYPE recipe_answer_intent AS ENUM ('current_facts','assertion_history','orientation','audit','change_feed');
121
+ """
122
+ _TABLES = ()
123
+ _TYPES = (
124
+ "deployment_status",
125
+ "pipeline_component",
126
+ "processing_target",
127
+ "pipeline_stage",
128
+ "processing_status",
129
+ "processing_lane",
130
+ "processing_defer_reason",
131
+ "ontology_tier",
132
+ "ontology_status",
133
+ "scope_interest_kind",
134
+ "entity_status",
135
+ "alias_provenance",
136
+ "resolution_tier",
137
+ "decision_actor",
138
+ "review_item_kind",
139
+ "review_status",
140
+ "review_verdict",
141
+ "golden_label",
142
+ "golden_hardness",
143
+ "eval_suite",
144
+ "selection_outcome",
145
+ "document_status",
146
+ "document_origin",
147
+ "versioning_mode",
148
+ "currency_reason",
149
+ "section_role",
150
+ "crossref_kind",
151
+ "claim_temporal_class",
152
+ "claim_valid_precision",
153
+ "claim_valid_kind",
154
+ "grounding_audit_status",
155
+ "extraction_decision_type",
156
+ "selection_drop_reason",
157
+ "evidence_stance",
158
+ "relation_status",
159
+ "adjudication_outcome",
160
+ "adjudication_method",
161
+ "projection_plane",
162
+ "snapshot_status",
163
+ "community_algorithm",
164
+ "knowledge_layer",
165
+ "knowledge_page_kind",
166
+ "knowledge_artifact_status",
167
+ "knowledge_evidence_role",
168
+ "knowledge_rule_kind",
169
+ "rule_key_kind",
170
+ "plan_action",
171
+ "plan_trigger",
172
+ "plan_decision_status",
173
+ "subscription_status",
174
+ "knowledge_trigger",
175
+ "refresh_status",
176
+ "recipe_output_grain",
177
+ "recipe_answer_intent",
178
+ )
179
+
180
+
181
+ def upgrade() -> None:
182
+ """Apply create required extensions and authoritative enum types."""
183
+ apply_ddl(sql=_DDL)
184
+
185
+
186
+ def downgrade() -> None:
187
+ """Revert create required extensions and authoritative enum types."""
188
+ drop_tables(table_names=reversed(_TABLES))
189
+ drop_types(type_names=reversed(_TYPES))