linkedparticles-core 1.151.18__tar.gz → 1.187.2__tar.gz

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 (222) hide show
  1. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/PKG-INFO +4 -4
  2. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/README.md +3 -3
  3. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/artifacts/conformance/README.md +6 -3
  4. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/artifacts/conformance/profile.yaml +73 -1
  5. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/artifacts/schemas/particle.schema.json +1 -0
  6. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/artifacts/schemas/shacl/ParticleShape.ttl +2 -2
  7. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/artifacts/schemas/trust_lens.schema.json +63 -4
  8. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/constraints.txt +173 -133
  9. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/particles/config.py +1015 -62
  10. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/particles/conformance/profile.py +1 -0
  11. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/particles/conformance/runner.py +2 -1
  12. linkedparticles_core-1.187.2/particles/core/closure_measure.py +176 -0
  13. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/particles/core/conflict_resolution.py +253 -35
  14. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/particles/core/conflict_review.py +115 -4
  15. linkedparticles_core-1.187.2/particles/core/consolidation_cadence.py +99 -0
  16. linkedparticles_core-1.187.2/particles/core/contradiction_disclosure.py +627 -0
  17. linkedparticles_core-1.187.2/particles/core/generics.py +337 -0
  18. linkedparticles_core-1.187.2/particles/core/held_release.py +166 -0
  19. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/particles/core/jsonld_context.py +5 -0
  20. linkedparticles_core-1.187.2/particles/core/modality.py +265 -0
  21. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/particles/core/observer_scope.py +16 -0
  22. linkedparticles_core-1.187.2/particles/core/past_value.py +46 -0
  23. linkedparticles_core-1.187.2/particles/core/predicate_profile.py +218 -0
  24. linkedparticles_core-1.187.2/particles/core/probe_verdict.py +130 -0
  25. linkedparticles_core-1.187.2/particles/core/progress.py +40 -0
  26. linkedparticles_core-1.187.2/particles/core/reanchor.py +357 -0
  27. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/particles/core/schema.py +382 -8
  28. linkedparticles_core-1.187.2/particles/core/spend_budget.py +52 -0
  29. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/particles/core/status.py +4 -0
  30. linkedparticles_core-1.187.2/particles/core/vocabulary.py +811 -0
  31. linkedparticles_core-1.187.2/particles/core/vocabulary_jsonld.py +305 -0
  32. linkedparticles_core-1.187.2/particles/core/vocabulary_report.py +294 -0
  33. linkedparticles_core-1.187.2/particles/egress.py +341 -0
  34. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/particles/embeddings.py +32 -3
  35. linkedparticles_core-1.187.2/particles/extraction/agent.py +457 -0
  36. linkedparticles_core-1.187.2/particles/extraction/append_delta.py +209 -0
  37. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/particles/extraction/calibration.py +272 -4
  38. linkedparticles_core-1.187.2/particles/extraction/components.py +252 -0
  39. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/particles/extraction/general.py +1054 -137
  40. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/particles/extraction/incremental.py +151 -40
  41. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/particles/extraction/journal.py +93 -3
  42. linkedparticles_core-1.187.2/particles/extraction/modality.py +159 -0
  43. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/particles/extraction/registry.py +9 -0
  44. linkedparticles_core-1.187.2/particles/extraction/session_state.py +144 -0
  45. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/particles/extraction/structure.py +5 -1
  46. linkedparticles_core-1.187.2/particles/extraction/subject_gate.py +302 -0
  47. linkedparticles_core-1.187.2/particles/extraction/vocabulary.py +104 -0
  48. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/particles/extraction/wikidata.py +78 -31
  49. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/particles/http.py +56 -1
  50. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/particles/interchange/codec.py +5 -2
  51. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/particles/llm/__init__.py +31 -0
  52. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/particles/llm/adapters/anthropic.py +378 -50
  53. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/particles/llm/adapters/openai_compat.py +71 -8
  54. linkedparticles_core-1.187.2/particles/llm/batch_budget.py +193 -0
  55. linkedparticles_core-1.187.2/particles/llm/breaker.py +315 -0
  56. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/particles/llm/client.py +10 -1
  57. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/particles/llm/errors.py +21 -0
  58. linkedparticles_core-1.187.2/particles/llm/logprobs.py +180 -0
  59. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/particles/llm/pool.py +65 -21
  60. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/particles/llm/registry.py +250 -18
  61. linkedparticles_core-1.187.2/particles/llm/replay.py +584 -0
  62. linkedparticles_core-1.187.2/particles/llm/spend_budget.py +106 -0
  63. linkedparticles_core-1.187.2/particles/llm/usage.py +407 -0
  64. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/particles/render/markdown.py +283 -37
  65. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/particles/secrets.py +11 -0
  66. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/particles/url_safety.py +19 -1
  67. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/pyproject.toml +1 -1
  68. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/tests/_client_fixtures.py +136 -5
  69. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/tests/conftest.py +1 -0
  70. linkedparticles_core-1.187.2/tests/test_calibration_isotonic.py +117 -0
  71. linkedparticles_core-1.187.2/tests/test_config_sample.py +85 -0
  72. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/tests/test_conformance_validator.py +4 -0
  73. linkedparticles_core-1.187.2/tests/test_core_contradiction_disclosure.py +321 -0
  74. linkedparticles_core-1.187.2/tests/test_core_held_release.py +146 -0
  75. linkedparticles_core-1.187.2/tests/test_core_vocabulary.py +467 -0
  76. linkedparticles_core-1.187.2/tests/test_egress_policy.py +198 -0
  77. linkedparticles_core-1.187.2/tests/test_extraction_agent.py +246 -0
  78. linkedparticles_core-1.187.2/tests/test_llm_batch_budget.py +548 -0
  79. linkedparticles_core-1.187.2/tests/test_llm_logprobs.py +192 -0
  80. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/tests/test_llm_pool.py +76 -2
  81. linkedparticles_core-1.187.2/tests/test_llm_replay.py +423 -0
  82. linkedparticles_core-1.187.2/tests/test_llm_usage.py +309 -0
  83. linkedparticles_core-1.151.18/particles/extraction/subject_gate.py +0 -146
  84. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/LICENSE +0 -0
  85. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/NOTICE +0 -0
  86. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/artifacts/conformance/similarity_vectors.json +0 -0
  87. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/artifacts/schemas/context.jsonld +0 -0
  88. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/artifacts/schemas/interchange.schema.json +0 -0
  89. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/artifacts/schemas/shacl/CorpusSnapshotShape.ttl +0 -0
  90. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/artifacts/schemas/shacl/ProvenanceChainShape.ttl +0 -0
  91. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/artifacts/schemas/shacl/SubjectShape.ttl +0 -0
  92. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/artifacts/schemas/shacl/TrustStatementShape.ttl +0 -0
  93. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/particles/__init__.py +0 -0
  94. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/particles/conformance/__init__.py +0 -0
  95. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/particles/conformance/_resources.py +0 -0
  96. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/particles/conformance/contract.py +0 -0
  97. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/particles/conformance/fixtures.py +0 -0
  98. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/particles/conformance/jsonschema.py +0 -0
  99. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/particles/conformance/shacl.py +0 -0
  100. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/particles/conformance/types.py +0 -0
  101. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/particles/conformance/validator.py +0 -0
  102. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/particles/core/__init__.py +0 -0
  103. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/particles/core/_resources.py +0 -0
  104. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/particles/core/cascade_gate.py +0 -0
  105. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/particles/core/claims.py +0 -0
  106. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/particles/core/duplicate_key.py +0 -0
  107. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/particles/core/equivalence.py +0 -0
  108. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/particles/core/fingerprint.py +0 -0
  109. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/particles/core/granularity.py +0 -0
  110. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/particles/core/provenance.py +0 -0
  111. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/particles/core/scoring/__init__.py +0 -0
  112. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/particles/core/scoring/confidence.py +0 -0
  113. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/particles/core/scoring/decay.py +0 -0
  114. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/particles/core/scoring/relevance.py +0 -0
  115. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/particles/core/scoring/utility.py +0 -0
  116. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/particles/core/stance.py +0 -0
  117. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/particles/extraction/__init__.py +0 -0
  118. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/particles/extraction/docstrings.py +0 -0
  119. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/particles/extraction/github/__init__.py +0 -0
  120. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/particles/extraction/github/_shared.py +0 -0
  121. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/particles/extraction/github/gist.py +0 -0
  122. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/particles/extraction/github/pages.py +0 -0
  123. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/particles/extraction/github/repo.py +0 -0
  124. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/particles/extraction/hackernews.py +0 -0
  125. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/particles/extraction/mastodon.py +0 -0
  126. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/particles/extraction/mcp_memory.py +0 -0
  127. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/particles/extraction/migration_preview.py +0 -0
  128. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/particles/extraction/nomisma.py +0 -0
  129. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/particles/extraction/numista/__init__.py +0 -0
  130. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/particles/extraction/numista/_shared.py +0 -0
  131. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/particles/extraction/numista/coin.py +0 -0
  132. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/particles/extraction/numista/issuer.py +0 -0
  133. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/particles/extraction/numista/listing.py +0 -0
  134. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/particles/extraction/polarity.py +0 -0
  135. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/particles/extraction/property_keys.py +0 -0
  136. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/particles/extraction/rdf.py +0 -0
  137. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/particles/extraction/reddit.py +0 -0
  138. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/particles/extraction/scope.py +0 -0
  139. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/particles/extraction/subject_scope.py +0 -0
  140. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/particles/extraction/taxonomy.py +0 -0
  141. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/particles/extraction/tool_turns.py +0 -0
  142. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/particles/extraction/trust_lens.py +0 -0
  143. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/particles/interchange/__init__.py +0 -0
  144. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/particles/interchange/jsonl.py +0 -0
  145. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/particles/interchange/yaml_ld.py +0 -0
  146. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/particles/llm/adapters/__init__.py +0 -0
  147. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/particles/llm/adapters/local.py +0 -0
  148. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/particles/llm/fencing.py +0 -0
  149. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/particles/py.typed +0 -0
  150. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/particles/render/__init__.py +0 -0
  151. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/particles/url_canonical.py +0 -0
  152. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/tests/__init__.py +0 -0
  153. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/tests/_upstream.py +0 -0
  154. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/tests/conformance/fixtures/MANIFEST.yaml +0 -0
  155. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/tests/conformance/fixtures/hackernews-thread-001/content.bin +0 -0
  156. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/tests/conformance/fixtures/hackernews-thread-001/manifest.yaml +0 -0
  157. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/tests/conformance/fixtures/hackernews-thread-001/snapshot.json +0 -0
  158. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/tests/conformance/fixtures/journal-entry-001/content.bin +0 -0
  159. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/tests/conformance/fixtures/journal-entry-001/manifest.yaml +0 -0
  160. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/tests/conformance/fixtures/journal-entry-001/snapshot.json +0 -0
  161. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/tests/conformance/fixtures/mastodon-thread-001/content.bin +0 -0
  162. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/tests/conformance/fixtures/mastodon-thread-001/manifest.yaml +0 -0
  163. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/tests/conformance/fixtures/mastodon-thread-001/snapshot.json +0 -0
  164. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/tests/conformance/fixtures/mcp-memory-export-001/content.bin +0 -0
  165. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/tests/conformance/fixtures/mcp-memory-export-001/manifest.yaml +0 -0
  166. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/tests/conformance/fixtures/mcp-memory-export-001/snapshot.json +0 -0
  167. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/tests/conformance/fixtures/nomisma-concept-001/content.bin +0 -0
  168. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/tests/conformance/fixtures/nomisma-concept-001/manifest.yaml +0 -0
  169. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/tests/conformance/fixtures/nomisma-concept-001/snapshot.json +0 -0
  170. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/tests/conformance/fixtures/numista-coin-001/content.bin +0 -0
  171. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/tests/conformance/fixtures/numista-coin-001/manifest.yaml +0 -0
  172. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/tests/conformance/fixtures/numista-coin-001/snapshot.json +0 -0
  173. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/tests/conformance/fixtures/numista-issuer-001/content.bin +0 -0
  174. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/tests/conformance/fixtures/numista-issuer-001/manifest.yaml +0 -0
  175. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/tests/conformance/fixtures/numista-issuer-001/snapshot.json +0 -0
  176. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/tests/conformance/fixtures/numista-listing-001/content.bin +0 -0
  177. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/tests/conformance/fixtures/numista-listing-001/manifest.yaml +0 -0
  178. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/tests/conformance/fixtures/numista-listing-001/snapshot.json +0 -0
  179. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/tests/conformance/fixtures/rdf-graph-001/content.bin +0 -0
  180. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/tests/conformance/fixtures/rdf-graph-001/manifest.yaml +0 -0
  181. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/tests/conformance/fixtures/rdf-graph-001/snapshot.json +0 -0
  182. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/tests/conformance/fixtures/reddit-thread-001/content.bin +0 -0
  183. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/tests/conformance/fixtures/reddit-thread-001/manifest.yaml +0 -0
  184. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/tests/conformance/fixtures/reddit-thread-001/snapshot.json +0 -0
  185. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/tests/conformance/fixtures/taxonomy-coins-001/content.bin +0 -0
  186. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/tests/conformance/fixtures/taxonomy-coins-001/manifest.yaml +0 -0
  187. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/tests/conformance/fixtures/taxonomy-coins-001/snapshot.json +0 -0
  188. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/tests/conformance/fixtures/trust-lens-001/content.bin +0 -0
  189. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/tests/conformance/fixtures/trust-lens-001/manifest.yaml +0 -0
  190. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/tests/conformance/fixtures/trust-lens-001/snapshot.json +0 -0
  191. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/tests/conformance/fixtures/web-article-001/content.bin +0 -0
  192. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/tests/conformance/fixtures/web-article-001/manifest.yaml +0 -0
  193. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/tests/conformance/fixtures/web-article-001/snapshot.json +0 -0
  194. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/tests/conformance/fixtures/web-article-002/content.bin +0 -0
  195. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/tests/conformance/fixtures/web-article-002/manifest.yaml +0 -0
  196. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/tests/conformance/fixtures/web-article-002/snapshot.json +0 -0
  197. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/tests/conformance/fixtures/web-essay-001/content.bin +0 -0
  198. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/tests/conformance/fixtures/web-essay-001/manifest.yaml +0 -0
  199. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/tests/conformance/fixtures/web-essay-001/snapshot.json +0 -0
  200. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/tests/conformance/fixtures/web-interview-001/content.bin +0 -0
  201. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/tests/conformance/fixtures/web-interview-001/manifest.yaml +0 -0
  202. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/tests/conformance/fixtures/web-interview-001/snapshot.json +0 -0
  203. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/tests/conformance/fixtures/wikidata-entity-001/content.bin +0 -0
  204. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/tests/conformance/fixtures/wikidata-entity-001/manifest.yaml +0 -0
  205. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/tests/conformance/fixtures/wikidata-entity-001/snapshot.json +0 -0
  206. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/tests/fixtures/scope/normative-rule-file.md +0 -0
  207. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/tests/fixtures/scope/normative-rule-file.recorded.json +0 -0
  208. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/tests/fixtures/scope/rule-file-agents-md.md +0 -0
  209. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/tests/fixtures/scope/rule-file-agents-md.recorded.json +0 -0
  210. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/tests/test_confidence.py +0 -0
  211. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/tests/test_config_client_sections.py +0 -0
  212. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/tests/test_conformance_fixture_gen.py +0 -0
  213. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/tests/test_conformance_similarity_vectors.py +0 -0
  214. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/tests/test_core_observer_scope.py +0 -0
  215. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/tests/test_core_provenance.py +0 -0
  216. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/tests/test_embeddings.py +0 -0
  217. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/tests/test_extraction_vision.py +0 -0
  218. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/tests/test_interchange_schema.py +0 -0
  219. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/tests/test_schema.py +0 -0
  220. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/tests/test_secrets.py +0 -0
  221. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/tests/test_url_canonical.py +0 -0
  222. {linkedparticles_core-1.151.18 → linkedparticles_core-1.187.2}/tests/test_validity_extraction.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: linkedparticles-core
3
- Version: 1.151.18
3
+ Version: 1.187.2
4
4
  Summary: Store-free client library for Particles: define, validate, serialize, and extract provenance-tracked belief particles
5
5
  Project-URL: Homepage, https://linkedparticles.org
6
6
  Project-URL: Documentation, https://docs.linkedparticles.org
@@ -103,9 +103,9 @@ p = Particle(
103
103
  asserted_by="iau-2006",
104
104
  )
105
105
 
106
- validate_particle_dict(p.model_dump(mode="json")) # []: valid against the normative JSON Schema
107
- unit = to_unit(p, []) # JSON-LD interchange unit
108
- from_unit(unit) # …and back again
106
+ validate_particle_dict(p.model_dump(mode="json")) # []: valid against the normative JSON Schema
107
+ unit = to_unit(p, []) # JSON-LD interchange unit
108
+ from_unit(unit) # …and back again
109
109
  ```
110
110
 
111
111
  ```json
@@ -51,9 +51,9 @@ p = Particle(
51
51
  asserted_by="iau-2006",
52
52
  )
53
53
 
54
- validate_particle_dict(p.model_dump(mode="json")) # []: valid against the normative JSON Schema
55
- unit = to_unit(p, []) # JSON-LD interchange unit
56
- from_unit(unit) # …and back again
54
+ validate_particle_dict(p.model_dump(mode="json")) # []: valid against the normative JSON Schema
55
+ unit = to_unit(p, []) # JSON-LD interchange unit
56
+ from_unit(unit) # …and back again
57
57
  ```
58
58
 
59
59
  ```json
@@ -65,11 +65,14 @@ its own types from them.
65
65
  `assertion_modality` (the §1.7 truth-apt gate; truth-apt iff `FALSIFIABLE`)
66
66
  and `uncertainty_nature` (the §1 `ALEATORY` exclusion) — plus the
67
67
  caller-resolved inputs (the replacement signal, the two supersession
68
- directions, both trust scores, the differential threshold, and whether the
69
- store has a single trust order). Omitted keys take the documented defaults.
68
+ directions, both trust scores, the differential threshold, whether the
69
+ store has a single trust order, and the rung 2.5 `update_order`). Omitted
70
+ keys take the documented defaults.
70
71
  Because the family is about *ordering*, the vectors deliberately set up rungs
71
72
  to compete: an `ALEATORY` pair with both a supersession edge and a decisive
72
- trust gap must still come out `INCONSISTENT`.
73
+ trust gap must still come out `INCONSISTENT`. Rung 2.5 reads `ALEATORY` on
74
+ the newer claim only, the side the sign of `update_order` names:
75
+ the `cl-17` vectors pin all four arrangements.
73
76
  - `context_fingerprint` carries `(id, status)` rows rather than a bare id list,
74
77
  so all three steps are pinned: the ACTIVE-only filter (step 1), the
75
78
  lexicographic sort (step 2 — one vector supplies its ids out of order), and
@@ -453,11 +453,41 @@ test_vectors:
453
453
  trust_score_new: 0.20
454
454
  update_order: 1
455
455
  expected: SUPERSEDED_BY_EXISTING
456
- # rung 1 outranks 2.5: an ALEATORY pair is never retired by a timestamp.
456
+ # a settled report retires an earlier aleatory claim: rung 2.5
457
+ # reads ALEATORY on the newer claim only. Rungs 1.5 and 2 pick between
458
+ # sources and keep the exclusion on either side; a same-lineage update
459
+ # whose newer claim states the matter as settled is how aleatory
460
+ # uncertainty is resolved.
457
461
  - id: cl-17
458
462
  existing: { assertion_modality: FALSIFIABLE, uncertainty_nature: ALEATORY }
459
463
  new: { assertion_modality: FALSIFIABLE, uncertainty_nature: EPISTEMIC }
460
464
  update_order: 1
465
+ expected: UPDATE_SUPERSEDES
466
+ # a newer ALEATORY claim (a forecast) never retires a settled one.
467
+ - id: cl-17b
468
+ existing: { assertion_modality: FALSIFIABLE, uncertainty_nature: EPISTEMIC }
469
+ new: { assertion_modality: FALSIFIABLE, uncertainty_nature: ALEATORY }
470
+ update_order: 1
471
+ expected: INCONSISTENT
472
+ # two ALEATORY claims (a revised forecast, or a BOTH_VALID pair): nothing
473
+ # has been settled, so neither retires the other.
474
+ - id: cl-17c
475
+ existing: { assertion_modality: FALSIFIABLE, uncertainty_nature: ALEATORY }
476
+ new: { assertion_modality: FALSIFIABLE, uncertainty_nature: ALEATORY }
477
+ update_order: 1
478
+ expected: INCONSISTENT
479
+ # "newer" follows the sign of update_order: an out-of-order ALEATORY new
480
+ # claim is the older one, and the settled existing claim retires it.
481
+ - id: cl-17d
482
+ existing: { assertion_modality: FALSIFIABLE, uncertainty_nature: EPISTEMIC }
483
+ new: { assertion_modality: FALSIFIABLE, uncertainty_nature: ALEATORY }
484
+ update_order: -1
485
+ expected: UPDATE_SUPERSEDED_BY_EXISTING
486
+ # the -1 mirror of cl-17b: the newer side is the ALEATORY existing claim.
487
+ - id: cl-17e
488
+ existing: { assertion_modality: FALSIFIABLE, uncertainty_nature: ALEATORY }
489
+ new: { assertion_modality: FALSIFIABLE, uncertainty_nature: EPISTEMIC }
490
+ update_order: -1
461
491
  expected: INCONSISTENT
462
492
  # the probe outranks 2.5: no contradiction, no supersession.
463
493
  - id: cl-18
@@ -472,6 +502,48 @@ test_vectors:
472
502
  new: { assertion_modality: FALSIFIABLE, uncertainty_nature: EPISTEMIC }
473
503
  update_order: 1
474
504
  expected: CORROBORATES
505
+ # rung 2.5 rests on the same-slot check: with no contradiction
506
+ # signal, a settled same-slot update still resolves to the newer claim.
507
+ # Two claims giving one slot successive values can both be true at their
508
+ # own times, so the contradiction probe is not the test of an update.
509
+ - id: cl-20
510
+ existing: { assertion_modality: FALSIFIABLE, uncertainty_nature: EPISTEMIC }
511
+ new: { assertion_modality: FALSIFIABLE, uncertainty_nature: EPISTEMIC }
512
+ has_contradiction_signal: false
513
+ update_order: 1
514
+ same_slot_update: true
515
+ expected: UPDATE_SUPERSEDES
516
+ # its mirror: an out-of-order (older) new claim is the one retired.
517
+ - id: cl-21
518
+ existing: { assertion_modality: FALSIFIABLE, uncertainty_nature: EPISTEMIC }
519
+ new: { assertion_modality: FALSIFIABLE, uncertainty_nature: EPISTEMIC }
520
+ has_contradiction_signal: false
521
+ update_order: -1
522
+ same_slot_update: true
523
+ expected: UPDATE_SUPERSEDED_BY_EXISTING
524
+ # the ALEATORY condition reads the newer claim, as at rung 2.5.
525
+ - id: cl-22
526
+ existing: { assertion_modality: FALSIFIABLE, uncertainty_nature: EPISTEMIC }
527
+ new: { assertion_modality: FALSIFIABLE, uncertainty_nature: ALEATORY }
528
+ has_contradiction_signal: false
529
+ update_order: 1
530
+ same_slot_update: true
531
+ expected: CORROBORATES
532
+ # the truth-apt gate outranks the update answer too.
533
+ - id: cl-23
534
+ existing: { assertion_modality: EVALUATIVE, uncertainty_nature: EPISTEMIC }
535
+ new: { assertion_modality: FALSIFIABLE, uncertainty_nature: EPISTEMIC }
536
+ has_contradiction_signal: false
537
+ update_order: 1
538
+ same_slot_update: true
539
+ expected: CORROBORATES
540
+ # no lineage order, no update: the answer alone retires nothing.
541
+ - id: cl-24
542
+ existing: { assertion_modality: FALSIFIABLE, uncertainty_nature: EPISTEMIC }
543
+ new: { assertion_modality: FALSIFIABLE, uncertainty_nature: EPISTEMIC }
544
+ has_contradiction_signal: false
545
+ same_slot_update: true
546
+ expected: CORROBORATES
475
547
 
476
548
  # --- §16.1 context fingerprint -----------------------------------
477
549
  # Procedure: (1) take every ACTIVE particle in the store, (2) sort the UUIDs
@@ -69,6 +69,7 @@
69
69
  "EXPLICIT_SUPERSESSION",
70
70
  "DOCUMENT_SUPERSEDED",
71
71
  "SUPERSEDED_BY_UPDATE",
72
+ "SUPERSEDED_BY_REANCHOR",
72
73
  "DUPLICATE_MERGED"
73
74
  ],
74
75
  "description": "Cause of the current non-ACTIVE status"
@@ -87,8 +87,8 @@ particles:ParticleShape
87
87
  "LOWER_TRUST_SOURCE" "SUPERSEDED_BY_REINDEX" "VALIDITY_EXPIRED"
88
88
  "CONFLICT_RESOLVED" "CONFLICT_PENDING" "EXPLICIT_RETRACTION"
89
89
  "SOURCE_RETRACTED" "EXPLICIT_SUPERSESSION" "DOCUMENT_SUPERSEDED"
90
- "SUPERSEDED_BY_UPDATE" "DUPLICATE_MERGED" ) ;
91
- sh:message "status_reason, when present, must be one of the fourteen StatusReason values." ;
90
+ "SUPERSEDED_BY_UPDATE" "SUPERSEDED_BY_REANCHOR" "DUPLICATE_MERGED" ) ;
91
+ sh:message "status_reason, when present, must be one of the fifteen StatusReason values." ;
92
92
  ] ;
93
93
 
94
94
  # particleType — optional; CLAIM default, REVIEW for review annotation
@@ -2,8 +2,19 @@
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
3
  "$id": "https://linkedparticles.org/schemas/trust_lens.schema.json",
4
4
  "$defs": {
5
+ "AssertionModality": {
6
+ "description": "What *kind* of assertion a particle makes: the default for its adjudicability.\n\nOrthogonal to ``uncertainty_nature`` (which presupposes a fact of the\nmatter) and to scope (which lives in ``properties``). The write\npath arbitrates (the \u00a76.6 conflict ladder, L-SEM-01, L-IDX-01) only pairs\nof ``FALSIFIABLE`` particles (see :func:`is_truth_apt`); the other\nmodalities co-exist and are never contradiction-checked or\ntrust-arbitrated. The value is a regenerable default, not a property of\nthe claim: it is stamped with the classifier that set it, an operator may\ncorrect it, and a lens may read it differently at read time only.\nDefault ``FALSIFIABLE`` keeps every existing particle\nunchanged. Closed enum: adding a modality is an additive minor change.",
7
+ "enum": [
8
+ "FALSIFIABLE",
9
+ "EVALUATIVE",
10
+ "EXPERIENTIAL",
11
+ "CONSTITUTIVE"
12
+ ],
13
+ "title": "AssertionModality",
14
+ "type": "string"
15
+ },
5
16
  "TrustLensDecayRule": {
6
- "description": "One portable content-age decay rule carried by a lens.\n\nSets the recency half-life / floor for content matching ``pattern`` — an\nexact ``source_type`` string (``scope=\"source_type\"``) or a trust-rule-style\nURL regex (``scope=\"url_pattern\"``, e.g. a per-subreddit half-life). Unlike\nthe URL *trust* rule's additive ``modifier``, a decay rule is an **absolute**\n``(half_life_days, floor)`` pair — half-life is not meaningfully additive.\nThe URL layer is more specific than the source_type layer (a per-subreddit\nrule overrides the source-type default in either direction); across adopted\nlenses the most-skeptical rule wins (shortest half-life / lowest floor).",
17
+ "description": "One portable content-age decay rule carried by a lens.\n\nSets the recency half-life / floor for content matching ``pattern`` \u2014 an\nexact ``source_type`` string (``scope=\"source_type\"``) or a trust-rule-style\nURL regex (``scope=\"url_pattern\"``, e.g. a per-subreddit half-life). Unlike\nthe URL *trust* rule's additive ``modifier``, a decay rule is an **absolute**\n``(half_life_days, floor)`` pair \u2014 half-life is not meaningfully additive.\nThe URL layer is more specific than the source_type layer (a per-subreddit\nrule overrides the source-type default in either direction); across adopted\nlenses the most-skeptical rule wins (shortest half-life / lowest floor).",
7
18
  "properties": {
8
19
  "scope": {
9
20
  "enum": [
@@ -39,8 +50,49 @@
39
50
  "title": "TrustLensDecayRule",
40
51
  "type": "object"
41
52
  },
53
+ "TrustLensModalityRule": {
54
+ "description": "One portable override of the adjudicability default carried by a lens.\n\n``assertion_modality`` is the extraction-time default for whether a claim\nmay be arbitrated against another; a lens may read it differently for its\nobserver. The rule applies to the claims ``scope`` + ``pattern`` select:\n\n- ``particle``: ``pattern`` is a particle id;\n- ``subject``: ``pattern`` is a subject id the claim is about;\n- ``url_pattern``: ``pattern`` is a regex searched in the claim's source\n URIs (the trust-rule regex shape);\n- ``source_type``: ``pattern`` is an exact ``source_type`` string.\n\n``when``, if set, limits the rule to claims whose stored default is that\nmodality. Particle and subject ids are store-local: an interchange import\nmints fresh ids, so such a rule ports only to a faithful restore of its own\nstore, and elsewhere matches nothing, which leaves the stored default.\n\nRead-time only. A rule decides what renders contested and what the lint\nqueue names for the operator; it never reaches a write, ranking, or\n``effective_confidence``, and an operator verdict always wins over it.\nWithin one lens the most specific matching rule decides that lens's\nreading; across adopted lenses abstention (a non-``FALSIFIABLE`` reading)\nwins at any scope, so adopting a lens can only withdraw adjudication.",
55
+ "properties": {
56
+ "scope": {
57
+ "enum": [
58
+ "particle",
59
+ "subject",
60
+ "url_pattern",
61
+ "source_type"
62
+ ],
63
+ "title": "Scope",
64
+ "type": "string"
65
+ },
66
+ "pattern": {
67
+ "minLength": 1,
68
+ "title": "Pattern",
69
+ "type": "string"
70
+ },
71
+ "modality": {
72
+ "$ref": "#/$defs/AssertionModality"
73
+ },
74
+ "when": {
75
+ "anyOf": [
76
+ {
77
+ "$ref": "#/$defs/AssertionModality"
78
+ },
79
+ {
80
+ "type": "null"
81
+ }
82
+ ],
83
+ "default": null
84
+ }
85
+ },
86
+ "required": [
87
+ "scope",
88
+ "pattern",
89
+ "modality"
90
+ ],
91
+ "title": "TrustLensModalityRule",
92
+ "type": "object"
93
+ },
42
94
  "TrustLensStatement": {
43
- "description": "One portable SOURCE_TYPE-scoped trust statement carried by a lens.\n\n``CORPUS_ENTRY``-scoped statements are excluded from lenses by design —\nthey key on store-local entry ids and are not portable.",
95
+ "description": "One portable SOURCE_TYPE-scoped trust statement carried by a lens.\n\n``CORPUS_ENTRY``-scoped statements are excluded from lenses by design \u2014\nthey key on store-local entry ids and are not portable.",
44
96
  "properties": {
45
97
  "domain": {
46
98
  "minLength": 1,
@@ -130,7 +182,7 @@
130
182
  "type": "object"
131
183
  },
132
184
  "TrustLensUtilityRule": {
133
- "description": "One portable usefulness (outcome-learning) utility rule carried by a lens.\n\nWhere a ``decay_rule`` is the *judgment* half of content-age\ndecay, a ``utility_rule`` is the judgment half of **usefulness**: it sets\n*how far* demonstrated use may reorder the projection / digest head, and\n*how fast* unreinforced utility fades. The per-belief utility *evidence*\n(the mined reinforcement count) is store-local and lives outside the lens—\nthis rule carries only the tunables.\n\n- ``half_life_uses_days`` — days for a single utility event's weight to halve\n (the reinforcement half-life; ``> 0``).\n- ``rank_lift`` — the ``λ`` in ``rank_score = effective_confidence\n + λ·ln(1 + R)`` (``≥ 0``; ``0`` disables the lift). **Promotion-only** by\n construction — the bonus is never negative, so lack of use withholds the\n lift rather than demoting.\n\nThis single knob replaced the old ``weight`` / ``floor`` / ``cap`` triple\nwhen the bounded multiplier was superseded; a lens\npublished under the old vocabulary carries no ``rank_lift`` and is treated\nas silent about utility (the store's local ``utility`` config applies).\n\nAcross adopted lenses the most-skeptical rule wins — *less* promotion:\nshortest ``half_life_uses_days``, lowest ``rank_lift`` (symmetric with the\ndecay rule). ``scope=\"default\"`` is the\nstore-wide rule; ``source_type`` / ``url_pattern`` scopes mirror the decay\nladder for finer control.",
185
+ "description": "One portable usefulness (outcome-learning) utility rule carried by a lens.\n\nWhere a ``decay_rule`` is the *judgment* half of content-age\ndecay, a ``utility_rule`` is the judgment half of **usefulness**: it sets\n*how far* demonstrated use may reorder the projection / digest head, and\n*how fast* unreinforced utility fades. The per-belief utility *evidence*\n(the mined reinforcement count) is store-local and lives outside the lens\u2014\nthis rule carries only the tunables.\n\n- ``half_life_uses_days`` \u2014 days for a single utility event's weight to halve\n (the reinforcement half-life; ``> 0``).\n- ``rank_lift`` \u2014 the ``\u03bb`` in ``rank_score = effective_confidence\n + \u03bb\u00b7ln(1 + R)`` (``\u2265 0``; ``0`` disables the lift). **Promotion-only** by\n construction \u2014 the bonus is never negative, so lack of use withholds the\n lift rather than demoting.\n\nThis single knob replaced the old ``weight`` / ``floor`` / ``cap`` triple\nwhen the bounded multiplier was superseded; a lens\npublished under the old vocabulary carries no ``rank_lift`` and is treated\nas silent about utility (the store's local ``utility`` config applies).\n\nAcross adopted lenses the most-skeptical rule wins \u2014 *less* promotion:\nshortest ``half_life_uses_days``, lowest ``rank_lift`` (symmetric with the\ndecay rule). ``scope=\"default\"`` is the\nstore-wide rule; ``source_type`` / ``url_pattern`` scopes mirror the decay\nladder for finer control.",
134
186
  "properties": {
135
187
  "scope": {
136
188
  "default": "default",
@@ -173,7 +225,7 @@
173
225
  "type": "object"
174
226
  }
175
227
  },
176
- "description": "A depositable corpus artefact bundling portable trust policy.\n\nA community publishes its view of which sources to trust by depositing a\nJSON file; the ``TrustLensExtractor`` materialises it into the\n``trust_lenses`` / ``trust_lens_entries`` tables. Viewers adopt lenses per\nstore; the query-time ``TrustPolicy`` composes the store's local\npolicy over adopted lenses, most-skeptical-wins. Adopting a lens can only\ndemote (ranks are in [0, 1] and silence stays neutral), never promote.\n\nA lens carries a fourth portable layer, ``decay_rules`` —\nper-observer content-age decay (recency half-life / floor), composed through\nthe query-time ``DecayPolicy`` the same most-skeptical-wins way as the trust\nlayers. A lens silent about decay leaves the store's global\n``content_age_decay`` config untouched.\n\nA lens also carries ``utility_rules`` — the usefulness\n(outcome-learning) judgment, composed through the query-time ``UtilityPolicy``\ninto an additive rank-lift on the projection / digest ranking path\nonly. A lens silent about utility leaves the store's local ``utility`` config\nuntouched; with no utility evidence the bonus is ``+0`` (cold-start).",
228
+ "description": "A depositable corpus artefact bundling portable trust policy.\n\nA community publishes its view of which sources to trust by depositing a\nJSON file; the ``TrustLensExtractor`` materialises it into the\n``trust_lenses`` / ``trust_lens_entries`` tables. Viewers adopt lenses per\nstore; the query-time ``TrustPolicy`` composes the store's local\npolicy over adopted lenses, most-skeptical-wins. Adopting a lens can only\ndemote (ranks are in [0, 1] and silence stays neutral), never promote.\n\nA lens carries a fourth portable layer, ``decay_rules`` \u2014\nper-observer content-age decay (recency half-life / floor), composed through\nthe query-time ``DecayPolicy`` the same most-skeptical-wins way as the trust\nlayers. A lens silent about decay leaves the store's global\n``content_age_decay`` config untouched.\n\nA lens also carries ``utility_rules`` \u2014 the usefulness\n(outcome-learning) judgment, composed through the query-time ``UtilityPolicy``\ninto an additive rank-lift on the projection / digest ranking path\nonly. A lens silent about utility leaves the store's local ``utility`` config\nuntouched; with no utility evidence the bonus is ``+0`` (cold-start).\n\nA lens may also carry ``modality_rules``: a per-observer reading\nof the adjudicability default, applied at read time to the contested badge\nand the lint queue only. A lens silent about modality reads every claim as\nits stored default.",
177
229
  "properties": {
178
230
  "kind": {
179
231
  "const": "TrustLensDefinition",
@@ -254,6 +306,13 @@
254
306
  "title": "Utility Rules",
255
307
  "type": "array"
256
308
  },
309
+ "modality_rules": {
310
+ "items": {
311
+ "$ref": "#/$defs/TrustLensModalityRule"
312
+ },
313
+ "title": "Modality Rules",
314
+ "type": "array"
315
+ },
257
316
  "corpus_entry_id": {
258
317
  "anyOf": [
259
318
  {