sum-engine 0.8.0__tar.gz → 0.9.0__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 (154) hide show
  1. {sum_engine-0.8.0/sum_engine.egg-info → sum_engine-0.9.0}/PKG-INFO +52 -12
  2. {sum_engine-0.8.0 → sum_engine-0.9.0}/README.md +49 -9
  3. {sum_engine-0.8.0 → sum_engine-0.9.0}/pyproject.toml +13 -4
  4. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_cli/main.py +1526 -20
  5. {sum_engine-0.8.0 → sum_engine-0.9.0/sum_engine.egg-info}/PKG-INFO +52 -12
  6. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine.egg-info/SOURCES.txt +9 -1
  7. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine.egg-info/requires.txt +2 -2
  8. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/ensemble/automated_scientist.py +13 -0
  9. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/ensemble/autonomous_agent.py +13 -0
  10. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/ensemble/epistemic_loop.py +13 -0
  11. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/ensemble/gauge_orchestrator.py +13 -0
  12. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/ensemble/mass_semantic_engine.py +13 -0
  13. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/ensemble/ouroboros.py +13 -0
  14. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/infrastructure/canonical_codec.py +20 -3
  15. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/infrastructure/jose_envelope.py +32 -9
  16. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/render_receipt/verifier.py +2 -2
  17. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/research/frontier.py +128 -0
  18. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/research/meaning/__init__.py +43 -22
  19. sum_engine-0.9.0/sum_engine_internal/research/meaning/chain_receipt.py +215 -0
  20. sum_engine-0.9.0/sum_engine_internal/research/meaning/deterministic_judge.py +251 -0
  21. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/research/meaning/drift_budget.py +4 -1
  22. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/research/meaning/local_judge.py +72 -14
  23. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/research/meaning/perspective_receipt.py +18 -10
  24. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/research/meaning/receipt.py +67 -8
  25. sum_engine-0.9.0/sum_engine_internal/research/study.py +168 -0
  26. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/transform_receipt/verifier.py +1 -1
  27. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/trust_root/verifier.py +1 -1
  28. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_verify/__init__.py +39 -6
  29. sum_engine-0.9.0/sum_verify/__main__.py +227 -0
  30. sum_engine-0.9.0/sum_verify/_chain.py +339 -0
  31. sum_engine-0.9.0/sum_verify/_demo/__init__.py +9 -0
  32. sum_engine-0.9.0/sum_verify/_demo/jwks.json +12 -0
  33. sum_engine-0.9.0/sum_verify/_demo/losses_billsum.json +71 -0
  34. sum_engine-0.9.0/sum_verify/_demo/meaning_risk_receipt.billsum.golden.json +28 -0
  35. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_verify/_meaning.py +64 -11
  36. sum_engine-0.8.0/sum_verify/__main__.py +0 -110
  37. {sum_engine-0.8.0 → sum_engine-0.9.0}/LICENSE +0 -0
  38. {sum_engine-0.8.0 → sum_engine-0.9.0}/setup.cfg +0 -0
  39. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_cli/__init__.py +0 -0
  40. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_cli/__main__.py +0 -0
  41. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_cli/audit_log.py +0 -0
  42. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine.egg-info/dependency_links.txt +0 -0
  43. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine.egg-info/entry_points.txt +0 -0
  44. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine.egg-info/top_level.txt +0 -0
  45. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/__init__.py +0 -0
  46. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/adapters/__init__.py +0 -0
  47. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/adapters/format_pivot.py +0 -0
  48. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/agent_surface/__init__.py +0 -0
  49. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/agent_surface/bind.py +0 -0
  50. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/agent_surface/mcp_bind.py +0 -0
  51. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/algorithms/__init__.py +0 -0
  52. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/algorithms/causal_discovery.py +0 -0
  53. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/algorithms/chunked_corpus.py +0 -0
  54. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/algorithms/minhash.py +0 -0
  55. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/algorithms/predicate_canon.py +0 -0
  56. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/algorithms/semantic_arithmetic.py +0 -0
  57. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/algorithms/syntactic_sieve.py +0 -0
  58. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/algorithms/zk_semantics.py +0 -0
  59. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/compliance/__init__.py +0 -0
  60. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/compliance/_predicates.py +0 -0
  61. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/compliance/eu_ai_act_article_12.py +0 -0
  62. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/compliance/gdpr_article_30.py +0 -0
  63. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/compliance/hipaa_164_312_b.py +0 -0
  64. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/compliance/iso_27001_8_15.py +0 -0
  65. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/compliance/pci_dss_4_req_10.py +0 -0
  66. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/compliance/report.py +0 -0
  67. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/compliance/soc_2_cc_7_2.py +0 -0
  68. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/ensemble/__init__.py +0 -0
  69. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/ensemble/causal_triggers.py +0 -0
  70. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/ensemble/confidence_calibrator.py +0 -0
  71. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/ensemble/data/__init__.py +0 -0
  72. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/ensemble/data/common_english_2000.txt +0 -0
  73. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/ensemble/data/common_english_5000.txt +0 -0
  74. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/ensemble/epistemic_arbiter.py +0 -0
  75. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/ensemble/extraction_validator.py +0 -0
  76. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/ensemble/live_llm_adapter.py +0 -0
  77. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/ensemble/llm_dispatch.py +0 -0
  78. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/ensemble/llm_entailment.py +0 -0
  79. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/ensemble/s25_interventions.py +0 -0
  80. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/ensemble/semantic_dedup.py +0 -0
  81. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/ensemble/slider_renderer.py +0 -0
  82. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/ensemble/tome_generator.py +0 -0
  83. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/ensemble/tome_sliders.py +0 -0
  84. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/ensemble/vector_bridge.py +0 -0
  85. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/ensemble/venn_abers.py +0 -0
  86. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/evidence/__init__.py +0 -0
  87. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/evidence/chain.py +0 -0
  88. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/graph_store/__init__.py +0 -0
  89. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/graph_store/base.py +0 -0
  90. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/graph_store/egglog_store.py +0 -0
  91. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/graph_store/unionfind_store.py +0 -0
  92. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/infrastructure/__init__.py +0 -0
  93. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/infrastructure/akashic_ledger.py +0 -0
  94. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/infrastructure/jcs.py +0 -0
  95. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/infrastructure/key_manager.py +0 -0
  96. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/infrastructure/p2p_mesh.py +0 -0
  97. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/infrastructure/prov_o.py +0 -0
  98. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/infrastructure/provenance.py +0 -0
  99. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/infrastructure/rate_limiter.py +0 -0
  100. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/infrastructure/resource_guards.py +0 -0
  101. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/infrastructure/scheme_registry.py +0 -0
  102. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/infrastructure/state_encoding.py +0 -0
  103. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/infrastructure/telemetry.py +0 -0
  104. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/infrastructure/tome_parser.py +0 -0
  105. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/infrastructure/verifiable_credential.py +0 -0
  106. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/infrastructure/zig_bridge.py +0 -0
  107. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/mcp_server/__init__.py +0 -0
  108. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/mcp_server/__main__.py +0 -0
  109. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/mcp_server/errors.py +0 -0
  110. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/mcp_server/server.py +0 -0
  111. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/merkle_sidecar/__init__.py +0 -0
  112. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/merkle_sidecar/tree.py +0 -0
  113. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/render_receipt/__init__.py +0 -0
  114. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/research/__init__.py +0 -0
  115. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/research/bootstrap/__init__.py +0 -0
  116. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/research/bootstrap/multiplier_bootstrap.py +0 -0
  117. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/research/conformal/__init__.py +0 -0
  118. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/research/conformal/entropy_baseline.py +0 -0
  119. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/research/conformal/risk_control.py +0 -0
  120. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/research/conformal/split_conformal.py +0 -0
  121. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/research/lsh/__init__.py +0 -0
  122. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/research/lsh/bundle_index.py +0 -0
  123. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/research/meaning/conformal_meaning.py +0 -0
  124. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/research/meaning/exchangeability.py +0 -0
  125. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/research/meaning/meaning_loss.py +0 -0
  126. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/research/mmd/__init__.py +0 -0
  127. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/research/mmd/baseline.py +0 -0
  128. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/research/mmd/mmd.py +0 -0
  129. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/research/robust_pca/__init__.py +0 -0
  130. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/research/robust_pca/axiom_embedding.py +0 -0
  131. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/research/robust_pca/pcp.py +0 -0
  132. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/research/sequential/__init__.py +0 -0
  133. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/research/sequential/sprt.py +0 -0
  134. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/research/sheaf_laplacian.py +0 -0
  135. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/research/sheaf_laplacian_v2.py +0 -0
  136. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/research/sheaf_laplacian_v3.py +0 -0
  137. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/research/sheaf_laplacian_v32.py +0 -0
  138. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/research/smt_consistency/__init__.py +0 -0
  139. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/research/smt_consistency/consistency.py +0 -0
  140. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/research/smt_consistency/predicate_library.py +0 -0
  141. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/research/spectral_entropy/__init__.py +0 -0
  142. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/research/spectral_entropy/vn_entropy.py +0 -0
  143. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/transform_receipt/__init__.py +0 -0
  144. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/transform_receipt/format.py +0 -0
  145. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/transform_receipt/sign.py +0 -0
  146. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/transforms/__init__.py +0 -0
  147. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/transforms/_base.py +0 -0
  148. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/transforms/compose.py +0 -0
  149. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/transforms/extract.py +0 -0
  150. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/transforms/share.py +0 -0
  151. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/transforms/slider.py +0 -0
  152. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_engine_internal/trust_root/__init__.py +0 -0
  153. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_verify/_conformal.py +0 -0
  154. {sum_engine-0.8.0 → sum_engine-0.9.0}/sum_verify/py.typed +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sum-engine
3
- Version: 0.8.0
3
+ Version: 0.9.0
4
4
  Summary: SUM — bidirectional knowledge distillation with optional cryptographic attestation. Pipe prose, get a CanonicalBundle (HMAC / Ed25519 / W3C VC 2.0), verify anywhere.
5
5
  Author: ototao
6
6
  License: Apache-2.0
@@ -44,11 +44,11 @@ Provides-Extra: research
44
44
  Requires-Dist: numpy>=1.24.0; extra == "research"
45
45
  Requires-Dist: scipy>=1.10.0; extra == "research"
46
46
  Provides-Extra: judge
47
- Requires-Dist: transformers>=4.30.0; extra == "judge"
47
+ Requires-Dist: transformers<5,>=4.30.0; extra == "judge"
48
48
  Requires-Dist: torch>=2.0.0; extra == "judge"
49
49
  Requires-Dist: sentencepiece>=0.1.99; extra == "judge"
50
50
  Provides-Extra: omni-format
51
- Requires-Dist: markitdown==0.1.5; extra == "omni-format"
51
+ Requires-Dist: markitdown==0.1.6; extra == "omni-format"
52
52
  Provides-Extra: dev
53
53
  Requires-Dist: pytest>=7.0.0; extra == "dev"
54
54
  Requires-Dist: pytest-asyncio>=0.21.0; extra == "dev"
@@ -76,8 +76,24 @@ Dynamic: license-file
76
76
  [![Python 3.10+](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/downloads/)
77
77
  [![Apache 2.0](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](LICENSE)
78
78
 
79
+ **What it is, plainly.** SUM is a knowledge **distiller**: drop in a text and a slider renders it anywhere from a single tag to a full tome — and it hands back a *signed, offline-checkable receipt of how much of the original meaning survived*. So you can vouch for AI-transformed text to a skeptic without asking them to trust you. The distiller is the long-term aim; the signed receipt is the rung that makes lossy distillation trustworthy enough to build on.
80
+
79
81
  > **SUM lets people and agents transform knowledge without losing the ability to verify what changed, what stayed the same, who signed it, and what remains unproven.**
80
82
 
83
+ **See what an AI transform silently dropped.** `sum meaning-diff` reads out, per document, which source claims survived a rewrite and which vanished. Here it is on a shipped fixture — a four-clause lease notice rewritten as verse:
84
+
85
+ ```text
86
+ $ sum meaning-diff examples/poetry_frontier/source.txt examples/poetry_frontier/sonnet.txt --scorer nli
87
+ preservation: 55% (loss 0.450)
88
+ source claims: 4 — 1 preserved, 3 DROPPED:
89
+ ✗ Late payment after the fifth day incurs a 50 dollar fee.
90
+ ✗ The landlord must give 24 hours notice before entering the unit.
91
+ ✗ Either party may terminate this lease with 30 days written notice.
92
+ added / unsupported claims: none ✓
93
+ (measured for THIS document under the named NLI judge — a per-document MEASUREMENT,
94
+ not a guarantee; for a (1−δ) corpus bound use a signed meaning_risk receipt)
95
+ ```
96
+
81
97
  Every transformation — extract triples from prose, render a tome at a controlled slider position, compose bundles across documents, share a render — emits a cryptographically-signed receipt that any third party can verify offline. The receipt attests *that the transformation happened and what its inputs were*. Separate per-axis benchmarks attest *how much the transformation preserved meaning*. Both are kept honest by separate proof discipline — and the project never blurs the line between them.
82
98
 
83
99
  *Live trust loop:* https://sum-demo.ototao.workers.dev — three runtimes (Python, Node, modern browsers) produce byte-identical Ed25519 signatures over the same JCS-canonical bytes; verify offline against `/.well-known/jwks.json`. Mechanically proven; locked in CI on every PR.
@@ -110,14 +126,37 @@ SUM is built to be that layer **in the open**: Apache-2.0, offline-verifiable by
110
126
 
111
127
  ## Verify it yourself in 60 seconds
112
128
 
113
- The trust loop: hit the live Worker, get back a tome plus a detached Ed25519 JWS over the JCS-canonicalised receipt payload, fetch the issuer JWKS, verify.
129
+ **The differentiator replay a meaning-loss bound, fully offline.** SUM's flagship receipt is a *signed, replayable* certificate over a named meaning-loss proxy. The verifier is dependency-light (`cryptography` + `joserfc` only — no numpy / scipy / torch, no GPU, no network), and a real binding-gate golden over public-domain text (BillSum, CC0) **ships inside the wheel** — so this works straight from `pip`, no clone:
130
+
131
+ ```bash
132
+ pip install 'sum-engine[verify]' # cryptography + joserfc only
133
+ python -m sum_verify --demo # replays the bundled BillSum golden, offline
134
+ # → {"verified": true, "schema": "sum.meaning_risk_receipt.v1", "replayed": true,
135
+ # "scorer": "bidirectional-entailment[minilm-cosine-0.5]",
136
+ # "not_covered": ["arrangement","sound","connotation","implicature"],
137
+ # "proxy_caveat": "verified=true is a cryptographic fact ... the proxy
138
+ # correlated only modestly at summary level (Spearman rho ~0.27-0.33 on
139
+ # SummEval; NLI ~0.29 replicates on FRANK; the embedding judge is
140
+ # corpus-dependent, near zero on abstractive FRANK-XSum). Not a
141
+ # substitute for human review."}
142
+ ```
143
+
144
+ To verify *your own* receipt — or the source goldens from a git checkout — pass the files explicitly:
145
+
146
+ ```bash
147
+ python -m sum_verify <receipt.json> --jwks <jwks.json> --losses <losses.json>
148
+ # from a checkout, the binding-gate goldens live in fixtures/meaning_receipts_billsum/
149
+ ```
150
+
151
+ `verified: true` + `replayed: true` means the committed per-pair losses hash to the receipt's anchor and re-certify to its stated bound (≤ 0.6454 at 95%) by exact integer equality — on your machine, against the issuer's JWKS, trusting nobody. **Read the `proxy_caveat`:** that PASS is a *cryptographic* fact, not proof meaning was preserved — the bound is over a proxy that tracks human judgment only modestly. The richer readout (the bound itself, perspective cohorts) is `sum verify-meaning` (which needs the heavier `pip install "sum-engine[research,receipt-verify]"` — the no-numpy promise above is scoped to `python -m sum_verify`); for non-extractive rewrites use `--scorer nli` — [`examples/poetry_frontier/`](examples/poetry_frontier/) shows exactly where the embedding judge's blind spot is.
152
+
153
+ **The render trust loop (signed provenance).** The other receipt family attests *that* a transformation happened (issuer, inputs, slider position, model, time) — the same JWS verifiable byte-for-byte in three independent runtimes:
114
154
 
115
155
  ```bash
116
- # 1. JWKS — single Ed25519 OKP JWK, application/jwk-set+json
156
+ # JWKS — single Ed25519 OKP JWK, application/jwk-set+json
117
157
  curl -sS https://sum-demo.ototao.workers.dev/.well-known/jwks.json | jq .
118
- # → {"keys":[{"crv":"Ed25519","kty":"OKP","x":"...","alg":"EdDSA","use":"sig","kid":"sum-render-2026-04-27-1"}]}
119
158
 
120
- # 2. Render — tome + render_receipt (signed JWS over JCS payload)
159
+ # Render — tome + render_receipt (signed JWS over JCS payload)
121
160
  curl -sS -X POST https://sum-demo.ototao.workers.dev/api/render \
122
161
  -H 'content-type: application/json' \
123
162
  -d '{"triples":[["alice","graduated","2012"],["alice","born","1990"]],
@@ -125,7 +164,7 @@ curl -sS -X POST https://sum-demo.ototao.workers.dev/api/render \
125
164
  | jq '.render_receipt | {schema, kid, payload, jws_segments: (.jws | split(".") | length)}'
126
165
  ```
127
166
 
128
- A minimal Node verifier using `jose` + `canonicalize` is in [`docs/RENDER_RECEIPT_FORMAT.md`](docs/RENDER_RECEIPT_FORMAT.md) §A.5; the same format is reachable from Python (`joserfc` + `jcs`), Go, and Rust per §3.
167
+ A render receipt attests the *render*, not the truth of its content (trust scope in [`docs/RENDER_RECEIPT_FORMAT.md`](docs/RENDER_RECEIPT_FORMAT.md) §5); a minimal Node verifier using `jose` + `canonicalize` is in §A.5, and the same format is reachable from Python (`joserfc` + `jcs`), Go, and Rust per §3.
129
168
 
130
169
  ---
131
170
 
@@ -143,6 +182,7 @@ A minimal Node verifier using `jose` + `canonicalize` is in [`docs/RENDER_RECEIP
143
182
  | Replay-defense window (`signed_at_out_of_window`) | shipped | opt-in `max_age_seconds` parameter across all four verifier surfaces (Python render / Python transform / JS render / JS transform). Default-off preserves archival use; receivers opt in per use-case (agent-swarm 60s, real-time 600s, newsletter 1d, legal-discovery no window). |
144
183
  | `sum verify --explain` layered output | shipped | Per-dimension report (`sum.verify_explained.v1`): cryptographic integrity / canonical reconstruction / axiom consistency / extraction provenance / source evidence coverage / semantic preservation / truth of content. Each carries `epistemic_status` (`provable` / `certified` / `empirical-benchmark` / `not-asserted`). Truth of content is ALWAYS `not_asserted` — locked by test. |
145
184
  | Meaning-loss receipts + `sum_verify` SDK | shipped on PyPI ≥ 0.8.0 | `sum.meaning_risk_receipt.v1` — a signed, replayable, distribution-free bound on a *named meaning-loss proxy* (`pip install 'sum-engine[verify]'` → `import sum_verify` / `python -m sum_verify`, dependency-light: no numpy/scipy/torch). Plus `sum meaning-diff` (per-document "what was kept / dropped / added"), `sum drift-budget` (compose meaning-loss across a transform chain), and `sum exchangeability` (advisory: is a bound applicable to *your* text?). Research-flagged; the affirmative contribution behind arXiv Paper-1. |
185
+ | Certified chains + transparency log | on main; shipping in 0.9.0 | `sum.chain_receipt.v1` binds ordered hop receipts (by canonical hash + an order-binding `chain_id`) into an integer-exact Bonferroni budget with a joint confidence (`sum mint-chain`; verify with `python -m sum_verify … --hops`). The first REAL certified chain over public-domain text is committed at [`fixtures/chain_receipts_billsum/`](fixtures/chain_receipts_billsum/): BillSum (CC0), 2 real hops — the dataset's own reference summary, then deterministic lead-N extractive compression — under the strict NLI judge; budget ≤ 1.3546 at joint confidence 0.90. Honest by construction: the budget bounds the *sum* of per-hop expected losses, **not** the end-to-end loss (a directed loss, not a metric, so no triangle inequality holds), and the mandatory `budget_scope` field says exactly that. Every committed golden is witnessed in an append-only [`transparency/log.jsonl`](transparency/log.jsonl) (`python scripts/witness_receipt.py verify`). |
146
186
  | Negative-control corpus (T5 of bench-hardening) | shipped | 20 hand-authored documents across 5 failure modes (ambiguous coref / predicate-alias / contradictions / entity-resolution-adversarial / non-extractable). Runner exits 1 if observed failures don't match annotations. Baseline at [`fixtures/bench_receipts/negative_control_2026-05-17.json`](fixtures/bench_receipts/negative_control_2026-05-17.json). |
147
187
  | Compliance validators (six regimes) | shipped | `sum compliance check --regime <id> --audit-log <path>` — EU AI Act Article 12, GDPR Article 30, HIPAA § 164.312(b), ISO/IEC 27001 A.8.15, SOC 2 CC 7.2, PCI DSS v4.0 Req 10. All six produce the same `sum.compliance_report.v1` schema; per-regime docs at `docs/COMPLIANCE_*.md`. |
148
188
 
@@ -194,7 +234,7 @@ echo "Alice likes cats. Bob owns a dog." \
194
234
  | sum attest --extractor=sieve > bundle.json
195
235
 
196
236
  sum verify --input bundle.json
197
- # → sum: ✓ verified 2 axiom(s), state integer matches (hmac=absent, ed25519=absent)
237
+ # → sum: ✓ verified 2 axiom(s), state integer matches (hmac=absent, ed25519=absent, extractor=sieve (verifiable))
198
238
 
199
239
  sum render < bundle.json > tome.md
200
240
  # → bundle's axioms re-emitted as canonical prose; round-trips to the same state integer
@@ -216,7 +256,7 @@ Add cryptographic attestation with one flag:
216
256
  # Ed25519 / W3C VC 2.0 (eddsa-jcs-2022)
217
257
  python -m scripts.generate_did_web --domain your.example --private-key-out keys/issuer.pem
218
258
  sum attest --ed25519-key keys/issuer.pem < prose.txt | sum verify --strict
219
- # → hmac=absent, ed25519=verified
259
+ # → hmac=absent, ed25519=verified, extractor=sieve (verifiable)
220
260
  ```
221
261
 
222
262
  The same bundle bytes verify under `sum verify` (Python), `node standalone_verifier/verify.js` (WebCrypto), and the in-browser demo (SubtleCrypto). [`docs/DID_SETUP.md`](docs/DID_SETUP.md) walks the did:key / did:web issuer setup. [`docs/PROOF_BOUNDARY.md`](docs/PROOF_BOUNDARY.md) §1.3.1 documents what the cross-runtime Ed25519 contract proves.
@@ -295,7 +335,7 @@ Less-surfaced but shipped:
295
335
 
296
336
  ### Internal research surfaces (NOT shipped, present in repo)
297
337
 
298
- - **`api/quantum_router.py` + `quantum_main.py`** — FastAPI surface with 26+ endpoints (branchable knowledge graph, ZK semantic proofs, federated KG sync, JWT-tenant knowledge OS). 1,684 LOC; 58/58 tests pass; runs locally via `uvicorn quantum_main:app`. **NOT in the PyPI wheel** (`pyproject.toml` excludes `api*`), **NOT in the live Worker**, **NOT in the dogfood quickstart**. The substrate it composes is load-bearing for the shipping surfaces above; only the FastAPI HTTP layer is internal-research. Promote to a shipping `[api]` extra only if a named buyer or grant deliverable explicitly references one of the endpoint clusters. See top-of-file banner in `api/quantum_router.py` for the full triage rationale.
338
+ - **`api/quantum_router.py` + `quantum_main.py`** — FastAPI surface with 26+ endpoints (branchable knowledge graph, ZK semantic proofs, federated KG sync, JWT multi-tenant API). 1,684 LOC; 58/58 tests pass; runs locally via `uvicorn quantum_main:app`. **NOT in the PyPI wheel** (`pyproject.toml` excludes `api*`), **NOT in the live Worker**, **NOT in the dogfood quickstart**. The substrate it composes is load-bearing for the shipping surfaces above; only the FastAPI HTTP layer is internal-research. Promote to a shipping `[api]` extra only if a named buyer or grant deliverable explicitly references one of the endpoint clusters. See top-of-file banner in `api/quantum_router.py` for the full triage rationale.
299
339
 
300
340
  ---
301
341
 
@@ -332,7 +372,7 @@ This roadmap names only unshipped work. Items already landed live in [`CHANGELOG
332
372
 
333
373
  **Platform surface (post-hardening)**
334
374
 
335
- Source anchoring in the bundle schema, bundle explorer / viewer, `sum verify --explain`, `sum tutorial` onboarding, shareable bundle URLs `/b/{hash}`, PWA-installable demo, `sum attest <url>` fetch mode. Each item names its dependency in [`docs/NEXT_SESSION_PLAYBOOK.md`](docs/NEXT_SESSION_PLAYBOOK.md).
375
+ Source anchoring in the bundle schema, bundle explorer / viewer, `sum tutorial` onboarding, shareable bundle URLs `/b/{hash}`, PWA-installable demo, `sum attest <url>` fetch mode. Each item names its dependency in [`docs/NEXT_SESSION_PLAYBOOK.md`](docs/NEXT_SESSION_PLAYBOOK.md).
336
376
 
337
377
  ---
338
378
 
@@ -5,8 +5,24 @@
5
5
  [![Python 3.10+](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/downloads/)
6
6
  [![Apache 2.0](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](LICENSE)
7
7
 
8
+ **What it is, plainly.** SUM is a knowledge **distiller**: drop in a text and a slider renders it anywhere from a single tag to a full tome — and it hands back a *signed, offline-checkable receipt of how much of the original meaning survived*. So you can vouch for AI-transformed text to a skeptic without asking them to trust you. The distiller is the long-term aim; the signed receipt is the rung that makes lossy distillation trustworthy enough to build on.
9
+
8
10
  > **SUM lets people and agents transform knowledge without losing the ability to verify what changed, what stayed the same, who signed it, and what remains unproven.**
9
11
 
12
+ **See what an AI transform silently dropped.** `sum meaning-diff` reads out, per document, which source claims survived a rewrite and which vanished. Here it is on a shipped fixture — a four-clause lease notice rewritten as verse:
13
+
14
+ ```text
15
+ $ sum meaning-diff examples/poetry_frontier/source.txt examples/poetry_frontier/sonnet.txt --scorer nli
16
+ preservation: 55% (loss 0.450)
17
+ source claims: 4 — 1 preserved, 3 DROPPED:
18
+ ✗ Late payment after the fifth day incurs a 50 dollar fee.
19
+ ✗ The landlord must give 24 hours notice before entering the unit.
20
+ ✗ Either party may terminate this lease with 30 days written notice.
21
+ added / unsupported claims: none ✓
22
+ (measured for THIS document under the named NLI judge — a per-document MEASUREMENT,
23
+ not a guarantee; for a (1−δ) corpus bound use a signed meaning_risk receipt)
24
+ ```
25
+
10
26
  Every transformation — extract triples from prose, render a tome at a controlled slider position, compose bundles across documents, share a render — emits a cryptographically-signed receipt that any third party can verify offline. The receipt attests *that the transformation happened and what its inputs were*. Separate per-axis benchmarks attest *how much the transformation preserved meaning*. Both are kept honest by separate proof discipline — and the project never blurs the line between them.
11
27
 
12
28
  *Live trust loop:* https://sum-demo.ototao.workers.dev — three runtimes (Python, Node, modern browsers) produce byte-identical Ed25519 signatures over the same JCS-canonical bytes; verify offline against `/.well-known/jwks.json`. Mechanically proven; locked in CI on every PR.
@@ -39,14 +55,37 @@ SUM is built to be that layer **in the open**: Apache-2.0, offline-verifiable by
39
55
 
40
56
  ## Verify it yourself in 60 seconds
41
57
 
42
- The trust loop: hit the live Worker, get back a tome plus a detached Ed25519 JWS over the JCS-canonicalised receipt payload, fetch the issuer JWKS, verify.
58
+ **The differentiator replay a meaning-loss bound, fully offline.** SUM's flagship receipt is a *signed, replayable* certificate over a named meaning-loss proxy. The verifier is dependency-light (`cryptography` + `joserfc` only — no numpy / scipy / torch, no GPU, no network), and a real binding-gate golden over public-domain text (BillSum, CC0) **ships inside the wheel** — so this works straight from `pip`, no clone:
59
+
60
+ ```bash
61
+ pip install 'sum-engine[verify]' # cryptography + joserfc only
62
+ python -m sum_verify --demo # replays the bundled BillSum golden, offline
63
+ # → {"verified": true, "schema": "sum.meaning_risk_receipt.v1", "replayed": true,
64
+ # "scorer": "bidirectional-entailment[minilm-cosine-0.5]",
65
+ # "not_covered": ["arrangement","sound","connotation","implicature"],
66
+ # "proxy_caveat": "verified=true is a cryptographic fact ... the proxy
67
+ # correlated only modestly at summary level (Spearman rho ~0.27-0.33 on
68
+ # SummEval; NLI ~0.29 replicates on FRANK; the embedding judge is
69
+ # corpus-dependent, near zero on abstractive FRANK-XSum). Not a
70
+ # substitute for human review."}
71
+ ```
72
+
73
+ To verify *your own* receipt — or the source goldens from a git checkout — pass the files explicitly:
74
+
75
+ ```bash
76
+ python -m sum_verify <receipt.json> --jwks <jwks.json> --losses <losses.json>
77
+ # from a checkout, the binding-gate goldens live in fixtures/meaning_receipts_billsum/
78
+ ```
79
+
80
+ `verified: true` + `replayed: true` means the committed per-pair losses hash to the receipt's anchor and re-certify to its stated bound (≤ 0.6454 at 95%) by exact integer equality — on your machine, against the issuer's JWKS, trusting nobody. **Read the `proxy_caveat`:** that PASS is a *cryptographic* fact, not proof meaning was preserved — the bound is over a proxy that tracks human judgment only modestly. The richer readout (the bound itself, perspective cohorts) is `sum verify-meaning` (which needs the heavier `pip install "sum-engine[research,receipt-verify]"` — the no-numpy promise above is scoped to `python -m sum_verify`); for non-extractive rewrites use `--scorer nli` — [`examples/poetry_frontier/`](examples/poetry_frontier/) shows exactly where the embedding judge's blind spot is.
81
+
82
+ **The render trust loop (signed provenance).** The other receipt family attests *that* a transformation happened (issuer, inputs, slider position, model, time) — the same JWS verifiable byte-for-byte in three independent runtimes:
43
83
 
44
84
  ```bash
45
- # 1. JWKS — single Ed25519 OKP JWK, application/jwk-set+json
85
+ # JWKS — single Ed25519 OKP JWK, application/jwk-set+json
46
86
  curl -sS https://sum-demo.ototao.workers.dev/.well-known/jwks.json | jq .
47
- # → {"keys":[{"crv":"Ed25519","kty":"OKP","x":"...","alg":"EdDSA","use":"sig","kid":"sum-render-2026-04-27-1"}]}
48
87
 
49
- # 2. Render — tome + render_receipt (signed JWS over JCS payload)
88
+ # Render — tome + render_receipt (signed JWS over JCS payload)
50
89
  curl -sS -X POST https://sum-demo.ototao.workers.dev/api/render \
51
90
  -H 'content-type: application/json' \
52
91
  -d '{"triples":[["alice","graduated","2012"],["alice","born","1990"]],
@@ -54,7 +93,7 @@ curl -sS -X POST https://sum-demo.ototao.workers.dev/api/render \
54
93
  | jq '.render_receipt | {schema, kid, payload, jws_segments: (.jws | split(".") | length)}'
55
94
  ```
56
95
 
57
- A minimal Node verifier using `jose` + `canonicalize` is in [`docs/RENDER_RECEIPT_FORMAT.md`](docs/RENDER_RECEIPT_FORMAT.md) §A.5; the same format is reachable from Python (`joserfc` + `jcs`), Go, and Rust per §3.
96
+ A render receipt attests the *render*, not the truth of its content (trust scope in [`docs/RENDER_RECEIPT_FORMAT.md`](docs/RENDER_RECEIPT_FORMAT.md) §5); a minimal Node verifier using `jose` + `canonicalize` is in §A.5, and the same format is reachable from Python (`joserfc` + `jcs`), Go, and Rust per §3.
58
97
 
59
98
  ---
60
99
 
@@ -72,6 +111,7 @@ A minimal Node verifier using `jose` + `canonicalize` is in [`docs/RENDER_RECEIP
72
111
  | Replay-defense window (`signed_at_out_of_window`) | shipped | opt-in `max_age_seconds` parameter across all four verifier surfaces (Python render / Python transform / JS render / JS transform). Default-off preserves archival use; receivers opt in per use-case (agent-swarm 60s, real-time 600s, newsletter 1d, legal-discovery no window). |
73
112
  | `sum verify --explain` layered output | shipped | Per-dimension report (`sum.verify_explained.v1`): cryptographic integrity / canonical reconstruction / axiom consistency / extraction provenance / source evidence coverage / semantic preservation / truth of content. Each carries `epistemic_status` (`provable` / `certified` / `empirical-benchmark` / `not-asserted`). Truth of content is ALWAYS `not_asserted` — locked by test. |
74
113
  | Meaning-loss receipts + `sum_verify` SDK | shipped on PyPI ≥ 0.8.0 | `sum.meaning_risk_receipt.v1` — a signed, replayable, distribution-free bound on a *named meaning-loss proxy* (`pip install 'sum-engine[verify]'` → `import sum_verify` / `python -m sum_verify`, dependency-light: no numpy/scipy/torch). Plus `sum meaning-diff` (per-document "what was kept / dropped / added"), `sum drift-budget` (compose meaning-loss across a transform chain), and `sum exchangeability` (advisory: is a bound applicable to *your* text?). Research-flagged; the affirmative contribution behind arXiv Paper-1. |
114
+ | Certified chains + transparency log | on main; shipping in 0.9.0 | `sum.chain_receipt.v1` binds ordered hop receipts (by canonical hash + an order-binding `chain_id`) into an integer-exact Bonferroni budget with a joint confidence (`sum mint-chain`; verify with `python -m sum_verify … --hops`). The first REAL certified chain over public-domain text is committed at [`fixtures/chain_receipts_billsum/`](fixtures/chain_receipts_billsum/): BillSum (CC0), 2 real hops — the dataset's own reference summary, then deterministic lead-N extractive compression — under the strict NLI judge; budget ≤ 1.3546 at joint confidence 0.90. Honest by construction: the budget bounds the *sum* of per-hop expected losses, **not** the end-to-end loss (a directed loss, not a metric, so no triangle inequality holds), and the mandatory `budget_scope` field says exactly that. Every committed golden is witnessed in an append-only [`transparency/log.jsonl`](transparency/log.jsonl) (`python scripts/witness_receipt.py verify`). |
75
115
  | Negative-control corpus (T5 of bench-hardening) | shipped | 20 hand-authored documents across 5 failure modes (ambiguous coref / predicate-alias / contradictions / entity-resolution-adversarial / non-extractable). Runner exits 1 if observed failures don't match annotations. Baseline at [`fixtures/bench_receipts/negative_control_2026-05-17.json`](fixtures/bench_receipts/negative_control_2026-05-17.json). |
76
116
  | Compliance validators (six regimes) | shipped | `sum compliance check --regime <id> --audit-log <path>` — EU AI Act Article 12, GDPR Article 30, HIPAA § 164.312(b), ISO/IEC 27001 A.8.15, SOC 2 CC 7.2, PCI DSS v4.0 Req 10. All six produce the same `sum.compliance_report.v1` schema; per-regime docs at `docs/COMPLIANCE_*.md`. |
77
117
 
@@ -123,7 +163,7 @@ echo "Alice likes cats. Bob owns a dog." \
123
163
  | sum attest --extractor=sieve > bundle.json
124
164
 
125
165
  sum verify --input bundle.json
126
- # → sum: ✓ verified 2 axiom(s), state integer matches (hmac=absent, ed25519=absent)
166
+ # → sum: ✓ verified 2 axiom(s), state integer matches (hmac=absent, ed25519=absent, extractor=sieve (verifiable))
127
167
 
128
168
  sum render < bundle.json > tome.md
129
169
  # → bundle's axioms re-emitted as canonical prose; round-trips to the same state integer
@@ -145,7 +185,7 @@ Add cryptographic attestation with one flag:
145
185
  # Ed25519 / W3C VC 2.0 (eddsa-jcs-2022)
146
186
  python -m scripts.generate_did_web --domain your.example --private-key-out keys/issuer.pem
147
187
  sum attest --ed25519-key keys/issuer.pem < prose.txt | sum verify --strict
148
- # → hmac=absent, ed25519=verified
188
+ # → hmac=absent, ed25519=verified, extractor=sieve (verifiable)
149
189
  ```
150
190
 
151
191
  The same bundle bytes verify under `sum verify` (Python), `node standalone_verifier/verify.js` (WebCrypto), and the in-browser demo (SubtleCrypto). [`docs/DID_SETUP.md`](docs/DID_SETUP.md) walks the did:key / did:web issuer setup. [`docs/PROOF_BOUNDARY.md`](docs/PROOF_BOUNDARY.md) §1.3.1 documents what the cross-runtime Ed25519 contract proves.
@@ -224,7 +264,7 @@ Less-surfaced but shipped:
224
264
 
225
265
  ### Internal research surfaces (NOT shipped, present in repo)
226
266
 
227
- - **`api/quantum_router.py` + `quantum_main.py`** — FastAPI surface with 26+ endpoints (branchable knowledge graph, ZK semantic proofs, federated KG sync, JWT-tenant knowledge OS). 1,684 LOC; 58/58 tests pass; runs locally via `uvicorn quantum_main:app`. **NOT in the PyPI wheel** (`pyproject.toml` excludes `api*`), **NOT in the live Worker**, **NOT in the dogfood quickstart**. The substrate it composes is load-bearing for the shipping surfaces above; only the FastAPI HTTP layer is internal-research. Promote to a shipping `[api]` extra only if a named buyer or grant deliverable explicitly references one of the endpoint clusters. See top-of-file banner in `api/quantum_router.py` for the full triage rationale.
267
+ - **`api/quantum_router.py` + `quantum_main.py`** — FastAPI surface with 26+ endpoints (branchable knowledge graph, ZK semantic proofs, federated KG sync, JWT multi-tenant API). 1,684 LOC; 58/58 tests pass; runs locally via `uvicorn quantum_main:app`. **NOT in the PyPI wheel** (`pyproject.toml` excludes `api*`), **NOT in the live Worker**, **NOT in the dogfood quickstart**. The substrate it composes is load-bearing for the shipping surfaces above; only the FastAPI HTTP layer is internal-research. Promote to a shipping `[api]` extra only if a named buyer or grant deliverable explicitly references one of the endpoint clusters. See top-of-file banner in `api/quantum_router.py` for the full triage rationale.
228
268
 
229
269
  ---
230
270
 
@@ -261,7 +301,7 @@ This roadmap names only unshipped work. Items already landed live in [`CHANGELOG
261
301
 
262
302
  **Platform surface (post-hardening)**
263
303
 
264
- Source anchoring in the bundle schema, bundle explorer / viewer, `sum verify --explain`, `sum tutorial` onboarding, shareable bundle URLs `/b/{hash}`, PWA-installable demo, `sum attest <url>` fetch mode. Each item names its dependency in [`docs/NEXT_SESSION_PLAYBOOK.md`](docs/NEXT_SESSION_PLAYBOOK.md).
304
+ Source anchoring in the bundle schema, bundle explorer / viewer, `sum tutorial` onboarding, shareable bundle URLs `/b/{hash}`, PWA-installable demo, `sum attest <url>` fetch mode. Each item names its dependency in [`docs/NEXT_SESSION_PLAYBOOK.md`](docs/NEXT_SESSION_PLAYBOOK.md).
265
305
 
266
306
  ---
267
307
 
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "sum-engine"
7
- version = "0.8.0"
7
+ version = "0.9.0"
8
8
  description = "SUM — bidirectional knowledge distillation with optional cryptographic attestation. Pipe prose, get a CanonicalBundle (HMAC / Ed25519 / W3C VC 2.0), verify anywhere."
9
9
  readme = "README.md"
10
10
  license = { text = "Apache-2.0" }
@@ -117,7 +117,12 @@ research = ["numpy>=1.24.0", "scipy>=1.10.0"]
117
117
  # A local sentence-embedding model run offline in eval mode — fixes the
118
118
  # F18 lexical-scorer paraphrase misranking without any paid API. Heavy
119
119
  # (torch); strictly optional, lazy-imported.
120
- judge = ["transformers>=4.30.0", "torch>=2.0.0", "sentencepiece>=0.1.99"]
120
+ # transformers <5: the DeBERTa-v3 slow-tokenizer path the default NLI
121
+ # judge loads is not guaranteed across the next major, and this extra's
122
+ # code path never runs in the per-PR suite — a break would ship silently.
123
+ # Lift the ceiling only with a green judge-smoke run
124
+ # (.github/workflows/judge-smoke.yml).
125
+ judge = ["transformers>=4.30.0,<5", "torch>=2.0.0", "sentencepiece>=0.1.99"]
121
126
  # Omni-format adapter. Markdown is the canonical pivot for the
122
127
  # attest pipeline: any input format -> markdown -> existing
123
128
  # extract/state/bundle path. Source URI anchors to the original
@@ -129,10 +134,10 @@ judge = ["transformers>=4.30.0", "torch>=2.0.0", "sentencepiece>=0.1.99"]
129
134
  # What this base extra brings in: HTML / DOCX-via-mammoth-not-
130
135
  # included / plaintext / EPUB-without-pandoc / .ipynb / .json.
131
136
  # For PDF/DOCX/XLSX/PPTX, install the matching markitdown extra
132
- # (`pip install 'markitdown[pdf,docx,xlsx,pptx]==0.1.5'`) on top.
137
+ # (`pip install 'markitdown[pdf,docx,xlsx,pptx]==0.1.6'`) on top.
133
138
  # Pinned hard to keep markdown output byte-identical for receipts.
134
139
  omni-format = [
135
- "markitdown==0.1.5",
140
+ "markitdown==0.1.6",
136
141
  ]
137
142
  dev = [
138
143
  "pytest>=7.0.0",
@@ -207,6 +212,10 @@ exclude = ["Tests*", "Tests.*", "scripts*", "api*", "single_file_demo*"]
207
212
  # Bundled frequency-table assets used by the slider renderer's
208
213
  # audience-axis classifier (Phase E.1 STATE 5b).
209
214
  "sum_engine_internal.ensemble.data" = ["*.txt"]
215
+ # The `python -m sum_verify --demo` golden — a real binding-gate
216
+ # meaning-risk receipt (BillSum, CC0) + JWKS + losses, so a pip-only
217
+ # user can replay a bound offline with zero git clone.
218
+ "sum_verify._demo" = ["*.json"]
210
219
 
211
220
  [tool.ruff]
212
221
  line-length = 100