ciris-server 0.5.87__tar.gz → 0.5.89__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 (270) hide show
  1. {ciris_server-0.5.87 → ciris_server-0.5.89}/Cargo.lock +11 -11
  2. {ciris_server-0.5.87 → ciris_server-0.5.89}/Cargo.toml +12 -12
  3. {ciris_server-0.5.87 → ciris_server-0.5.89}/PKG-INFO +1 -1
  4. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/Cargo.toml +4 -4
  5. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/src/ffi/pyo3.rs +15 -9
  6. {ciris_server-0.5.87 → ciris_server-0.5.89}/src/compose.rs +93 -50
  7. ciris_server-0.5.89/src/federation_delivery.rs +428 -0
  8. {ciris_server-0.5.87 → ciris_server-0.5.89}/src/lib.rs +41 -0
  9. {ciris_server-0.5.87 → ciris_server-0.5.89}/tests/release_gates/support.rs +3 -3
  10. {ciris_server-0.5.87 → ciris_server-0.5.89}/.cargo/config.toml +0 -0
  11. {ciris_server-0.5.87 → ciris_server-0.5.89}/.claude/workflows/localize-ui.js +0 -0
  12. {ciris_server-0.5.87 → ciris_server-0.5.89}/.github/workflows/bench.yml +0 -0
  13. {ciris_server-0.5.87 → ciris_server-0.5.89}/.github/workflows/build-wheels.yml +0 -0
  14. {ciris_server-0.5.87 → ciris_server-0.5.89}/.github/workflows/ci.yml +0 -0
  15. {ciris_server-0.5.87 → ciris_server-0.5.89}/.github/workflows/client-artifacts.yml +0 -0
  16. {ciris_server-0.5.87 → ciris_server-0.5.89}/.github/workflows/conformance.yml +0 -0
  17. {ciris_server-0.5.87 → ciris_server-0.5.89}/.github/workflows/localization.yml +0 -0
  18. {ciris_server-0.5.87 → ciris_server-0.5.89}/.github/workflows/publish-pypi.yml +0 -0
  19. {ciris_server-0.5.87 → ciris_server-0.5.89}/.github/workflows/release.yml +0 -0
  20. {ciris_server-0.5.87 → ciris_server-0.5.89}/.gitignore +0 -0
  21. {ciris_server-0.5.87 → ciris_server-0.5.89}/CHANGELOG.md +0 -0
  22. {ciris_server-0.5.87 → ciris_server-0.5.89}/LICENSE +0 -0
  23. {ciris_server-0.5.87 → ciris_server-0.5.89}/MISSION.md +0 -0
  24. {ciris_server-0.5.87 → ciris_server-0.5.89}/README.md +0 -0
  25. {ciris_server-0.5.87 → ciris_server-0.5.89}/WIRE_VOCABULARY_KINDS.md +0 -0
  26. {ciris_server-0.5.87 → ciris_server-0.5.89}/bench-site/bench_results.json +0 -0
  27. {ciris_server-0.5.87 → ciris_server-0.5.89}/bench-site/index.html +0 -0
  28. {ciris_server-0.5.87 → ciris_server-0.5.89}/bench_results.json +0 -0
  29. {ciris_server-0.5.87 → ciris_server-0.5.89}/benches/alm_chain.rs +0 -0
  30. {ciris_server-0.5.87 → ciris_server-0.5.89}/benches/erasure_survival.rs +0 -0
  31. {ciris_server-0.5.87 → ciris_server-0.5.89}/benches/n_eff_scoring.rs +0 -0
  32. {ciris_server-0.5.87 → ciris_server-0.5.89}/benches/pqc_av_streaming.rs +0 -0
  33. {ciris_server-0.5.87 → ciris_server-0.5.89}/benches/replication_ingest.rs +0 -0
  34. {ciris_server-0.5.87 → ciris_server-0.5.89}/benches/sig_overhead.rs +0 -0
  35. {ciris_server-0.5.87 → ciris_server-0.5.89}/benches/stream_fanout.rs +0 -0
  36. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/.github/workflows/bench.yml +0 -0
  37. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/.github/workflows/ci.yml +0 -0
  38. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/.gitignore +0 -0
  39. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/.pre-commit-config.yaml +0 -0
  40. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/FSD/CIRIS_LENS_CORE.md +0 -0
  41. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/FSD/LENS_CORE_V0_5.md +0 -0
  42. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/FSD/OPEN_QUESTIONS.md +0 -0
  43. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/LICENSE +0 -0
  44. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/MISSION.md +0 -0
  45. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/README.md +0 -0
  46. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/benches/aggregate.rs +0 -0
  47. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/benches/canonicalize.rs +0 -0
  48. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/benches/project.rs +0 -0
  49. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/deny.toml +0 -0
  50. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/docs/BENCHMARKS.md +0 -0
  51. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/docs/COHABITATION.md +0 -0
  52. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/docs/PRE_COMMIT.md +0 -0
  53. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/docs/PUBLIC_SCHEMA_CONTRACT.md +0 -0
  54. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/docs/PYPI_PUBLISH.md +0 -0
  55. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/docs/RELEASE_NOTES.md +0 -0
  56. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/docs/STANDARDS_COMPARISON.md +0 -0
  57. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/docs/THREAT_MODEL.md +0 -0
  58. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/patterns_from_cirislens_core/extraction/json_path.rs +0 -0
  59. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/patterns_from_cirislens_core/extraction/metadata.rs +0 -0
  60. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/patterns_from_cirislens_core/extraction/mod.rs +0 -0
  61. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/patterns_from_cirislens_core/scrubber/distilbert_loader.rs +0 -0
  62. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/patterns_from_cirislens_core/scrubber/fields.rs +0 -0
  63. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/patterns_from_cirislens_core/scrubber/mod.rs +0 -0
  64. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/patterns_from_cirislens_core/scrubber/ner.rs +0 -0
  65. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/patterns_from_cirislens_core/scrubber/ort_loader.rs +0 -0
  66. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/patterns_from_cirislens_core/scrubber/proptests.rs +0 -0
  67. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/patterns_from_cirislens_core/scrubber/regex.rs +0 -0
  68. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/patterns_from_cirislens_core/scrubber/walker.rs +0 -0
  69. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/patterns_from_cirislens_core/scrubber/xlm_r_loader.rs +0 -0
  70. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/pyproject.toml +0 -0
  71. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/python/ciris_lens_core/__init__.py +0 -0
  72. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/src/audit/api.rs +0 -0
  73. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/src/audit/delegate.rs +0 -0
  74. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/src/audit/mod.rs +0 -0
  75. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/src/audit/pyo3.rs +0 -0
  76. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/src/canonical/ceg_egress.rs +0 -0
  77. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/src/canonical/mod.rs +0 -0
  78. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/src/capacity/attestation.rs +0 -0
  79. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/src/capacity/mod.rs +0 -0
  80. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/src/capacity/score.rs +0 -0
  81. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/src/capture/batch.rs +0 -0
  82. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/src/capture/client.rs +0 -0
  83. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/src/capture/consent.rs +0 -0
  84. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/src/capture/correlation.rs +0 -0
  85. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/src/capture/event.rs +0 -0
  86. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/src/capture/mod.rs +0 -0
  87. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/src/capture/partial.rs +0 -0
  88. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/src/capture/py_engine.rs +0 -0
  89. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/src/capture/seal.rs +0 -0
  90. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/src/cohort/declared.rs +0 -0
  91. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/src/cohort/mod.rs +0 -0
  92. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/src/cohort/resourcing.rs +0 -0
  93. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/src/config/egress.rs +0 -0
  94. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/src/config/mod.rs +0 -0
  95. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/src/config/node.rs +0 -0
  96. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/src/config/retention.rs +0 -0
  97. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/src/config/upstream.rs +0 -0
  98. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/src/detector/axis_metrics.rs +0 -0
  99. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/src/detector/coherence_ratchet.rs +0 -0
  100. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/src/detector/correlated_action.rs +0 -0
  101. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/src/detector/distributive_access.rs +0 -0
  102. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/src/detector/manifold.rs +0 -0
  103. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/src/detector/mod.rs +0 -0
  104. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/src/extract/mod.rs +0 -0
  105. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/src/extract/projection.rs +0 -0
  106. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/src/ffi/mod.rs +0 -0
  107. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/src/lib.rs +0 -0
  108. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/src/observability/mod.rs +0 -0
  109. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/src/pipeline/lifecycle.rs +0 -0
  110. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/src/pipeline/mod.rs +0 -0
  111. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/src/retention/eviction.rs +0 -0
  112. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/src/retention/mod.rs +0 -0
  113. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/src/retention/summary.rs +0 -0
  114. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/src/role/handler.rs +0 -0
  115. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/src/role/mod.rs +0 -0
  116. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/src/role/node.rs +0 -0
  117. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/src/role/relay.rs +0 -0
  118. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/src/role/ret_relay.rs +0 -0
  119. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/src/scores/aggregate.rs +0 -0
  120. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/src/scores/mod.rs +0 -0
  121. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/src/scores/oracle.rs +0 -0
  122. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/src/scoring/assembly.rs +0 -0
  123. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/src/scoring/axis_calibration.rs +0 -0
  124. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/src/scoring/calibration.rs +0 -0
  125. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/src/scoring/capacity.rs +0 -0
  126. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/src/scoring/mod.rs +0 -0
  127. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/src/scoring/n_eff.rs +0 -0
  128. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/src/scoring/result.rs +0 -0
  129. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/src/signing/event.rs +0 -0
  130. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/src/signing/mod.rs +0 -0
  131. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/src/wire/mod.rs +0 -0
  132. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/src/wire/signer.rs +0 -0
  133. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/tests/parity/README.md +0 -0
  134. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/tests/parity/canonical_fixtures.json +0 -0
  135. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/tests/parity/generate_canonical_fixtures.py +0 -0
  136. {ciris_server-0.5.87 → ciris_server-0.5.89}/crates/ciris-lens-core/tests/sovereign_rlib.rs +0 -0
  137. {ciris_server-0.5.87 → ciris_server-0.5.89}/data/live_mesh_2026-06-22.json +0 -0
  138. {ciris_server-0.5.87 → ciris_server-0.5.89}/docs/SCOPE_PRIVACY.md +0 -0
  139. {ciris_server-0.5.87 → ciris_server-0.5.89}/evidence/README.md +0 -0
  140. {ciris_server-0.5.87 → ciris_server-0.5.89}/evidence/cc_impl.tsv +0 -0
  141. {ciris_server-0.5.87 → ciris_server-0.5.89}/examples/mesh_propagation/main.rs +0 -0
  142. {ciris_server-0.5.87 → ciris_server-0.5.89}/examples/qa_runner/accord.rs +0 -0
  143. {ciris_server-0.5.87 → ciris_server-0.5.89}/examples/qa_runner/canonical.rs +0 -0
  144. {ciris_server-0.5.87 → ciris_server-0.5.89}/examples/qa_runner/common.rs +0 -0
  145. {ciris_server-0.5.87 → ciris_server-0.5.89}/examples/qa_runner/family.rs +0 -0
  146. {ciris_server-0.5.87 → ciris_server-0.5.89}/examples/qa_runner/main.rs +0 -0
  147. {ciris_server-0.5.87 → ciris_server-0.5.89}/examples/qa_runner/verify.rs +0 -0
  148. {ciris_server-0.5.87 → ciris_server-0.5.89}/installers/windows/README.md +0 -0
  149. {ciris_server-0.5.87 → ciris_server-0.5.89}/installers/windows/bundle-jre.ps1 +0 -0
  150. {ciris_server-0.5.87 → ciris_server-0.5.89}/installers/windows/ciris-server-entry.py +0 -0
  151. {ciris_server-0.5.87 → ciris_server-0.5.89}/installers/windows/ciris-server-installer.iss +0 -0
  152. {ciris_server-0.5.87 → ciris_server-0.5.89}/installers/windows/ciris-server.spec +0 -0
  153. {ciris_server-0.5.87 → ciris_server-0.5.89}/pyproject.toml +0 -0
  154. {ciris_server-0.5.87 → ciris_server-0.5.89}/python/ciris_server/__init__.py +0 -0
  155. {ciris_server-0.5.87 → ciris_server-0.5.89}/python/ciris_server/__main__.py +0 -0
  156. {ciris_server-0.5.87 → ciris_server-0.5.89}/python/ciris_server/cli.py +0 -0
  157. {ciris_server-0.5.87 → ciris_server-0.5.89}/python/ciris_server/desktop_launcher.py +0 -0
  158. {ciris_server-0.5.87 → ciris_server-0.5.89}/rust-toolchain.toml +0 -0
  159. {ciris_server-0.5.87 → ciris_server-0.5.89}/scripts/bench_report.py +0 -0
  160. {ciris_server-0.5.87 → ciris_server-0.5.89}/src/accord.rs +0 -0
  161. {ciris_server-0.5.87 → ciris_server-0.5.89}/src/accord_custody.rs +0 -0
  162. {ciris_server-0.5.87 → ciris_server-0.5.89}/src/accord_halt.rs +0 -0
  163. {ciris_server-0.5.87 → ciris_server-0.5.89}/src/accord_pki/yubico_attestation_root_1.der +0 -0
  164. {ciris_server-0.5.87 → ciris_server-0.5.89}/src/accord_pki/yubico_attestation_root_1.pem +0 -0
  165. {ciris_server-0.5.87 → ciris_server-0.5.89}/src/accord_provision.rs +0 -0
  166. {ciris_server-0.5.87 → ciris_server-0.5.89}/src/accord_reactivate.rs +0 -0
  167. {ciris_server-0.5.87 → ciris_server-0.5.89}/src/adapter.rs +0 -0
  168. {ciris_server-0.5.87 → ciris_server-0.5.89}/src/auth/ABSORPTION.md +0 -0
  169. {ciris_server-0.5.87 → ciris_server-0.5.89}/src/auth/api_keys.rs +0 -0
  170. {ciris_server-0.5.87 → ciris_server-0.5.89}/src/auth/attestation.rs +0 -0
  171. {ciris_server-0.5.87 → ciris_server-0.5.89}/src/auth/bootstrap.rs +0 -0
  172. {ciris_server-0.5.87 → ciris_server-0.5.89}/src/auth/consent.rs +0 -0
  173. {ciris_server-0.5.87 → ciris_server-0.5.89}/src/auth/device_auth.rs +0 -0
  174. {ciris_server-0.5.87 → ciris_server-0.5.89}/src/auth/device_grant.rs +0 -0
  175. {ciris_server-0.5.87 → ciris_server-0.5.89}/src/auth/erasure.rs +0 -0
  176. {ciris_server-0.5.87 → ciris_server-0.5.89}/src/auth/gate.rs +0 -0
  177. {ciris_server-0.5.87 → ciris_server-0.5.89}/src/auth/loopback.rs +0 -0
  178. {ciris_server-0.5.87 → ciris_server-0.5.89}/src/auth/mod.rs +0 -0
  179. {ciris_server-0.5.87 → ciris_server-0.5.89}/src/auth/oauth.rs +0 -0
  180. {ciris_server-0.5.87 → ciris_server-0.5.89}/src/auth/occurrence.rs +0 -0
  181. {ciris_server-0.5.87 → ciris_server-0.5.89}/src/auth/ownership.rs +0 -0
  182. {ciris_server-0.5.87 → ciris_server-0.5.89}/src/auth/portable_occurrence.rs +0 -0
  183. {ciris_server-0.5.87 → ciris_server-0.5.89}/src/auth/roles.rs +0 -0
  184. {ciris_server-0.5.87 → ciris_server-0.5.89}/src/auth/self_login.rs +0 -0
  185. {ciris_server-0.5.87 → ciris_server-0.5.89}/src/auth/session.rs +0 -0
  186. {ciris_server-0.5.87 → ciris_server-0.5.89}/src/auth/store.rs +0 -0
  187. {ciris_server-0.5.87 → ciris_server-0.5.89}/src/auth/verify.rs +0 -0
  188. {ciris_server-0.5.87 → ciris_server-0.5.89}/src/benchmarks/bench_results.rs +0 -0
  189. {ciris_server-0.5.87 → ciris_server-0.5.89}/src/benchmarks/mesh.rs +0 -0
  190. {ciris_server-0.5.87 → ciris_server-0.5.89}/src/benchmarks/mod.rs +0 -0
  191. {ciris_server-0.5.87 → ciris_server-0.5.89}/src/benchmarks/scoreboard.rs +0 -0
  192. {ciris_server-0.5.87 → ciris_server-0.5.89}/src/claim_remote.rs +0 -0
  193. {ciris_server-0.5.87 → ciris_server-0.5.89}/src/config.rs +0 -0
  194. {ciris_server-0.5.87 → ciris_server-0.5.89}/src/config_api.rs +0 -0
  195. {ciris_server-0.5.87 → ciris_server-0.5.89}/src/config_reconcile.rs +0 -0
  196. {ciris_server-0.5.87 → ciris_server-0.5.89}/src/delegation_transparency.rs +0 -0
  197. {ciris_server-0.5.87 → ciris_server-0.5.89}/src/family.rs +0 -0
  198. {ciris_server-0.5.87 → ciris_server-0.5.89}/src/federation_admin.rs +0 -0
  199. {ciris_server-0.5.87 → ciris_server-0.5.89}/src/federation_nodecode.rs +0 -0
  200. {ciris_server-0.5.87 → ciris_server-0.5.89}/src/federation_peers.rs +0 -0
  201. {ciris_server-0.5.87 → ciris_server-0.5.89}/src/graph_config.rs +0 -0
  202. {ciris_server-0.5.87 → ciris_server-0.5.89}/src/health.rs +0 -0
  203. {ciris_server-0.5.87 → ciris_server-0.5.89}/src/holonomic.rs +0 -0
  204. {ciris_server-0.5.87 → ciris_server-0.5.89}/src/http_log.rs +0 -0
  205. {ciris_server-0.5.87 → ciris_server-0.5.89}/src/identity.rs +0 -0
  206. {ciris_server-0.5.87 → ciris_server-0.5.89}/src/ids.rs +0 -0
  207. {ciris_server-0.5.87 → ciris_server-0.5.89}/src/import.rs +0 -0
  208. {ciris_server-0.5.87 → ciris_server-0.5.89}/src/ingest_http.rs +0 -0
  209. {ciris_server-0.5.87 → ciris_server-0.5.89}/src/main.rs +0 -0
  210. {ciris_server-0.5.87 → ciris_server-0.5.89}/src/memory_api.rs +0 -0
  211. {ciris_server-0.5.87 → ciris_server-0.5.89}/src/mesh_relay.rs +0 -0
  212. {ciris_server-0.5.87 → ciris_server-0.5.89}/src/nodecode.rs +0 -0
  213. {ciris_server-0.5.87 → ciris_server-0.5.89}/src/peer.rs +0 -0
  214. {ciris_server-0.5.87 → ciris_server-0.5.89}/src/proxy.rs +0 -0
  215. {ciris_server-0.5.87 → ciris_server-0.5.89}/src/py_adapter.rs +0 -0
  216. {ciris_server-0.5.87 → ciris_server-0.5.89}/src/quorum.rs +0 -0
  217. {ciris_server-0.5.87 → ciris_server-0.5.89}/src/radio.rs +0 -0
  218. {ciris_server-0.5.87 → ciris_server-0.5.89}/src/replication_reconcile.rs +0 -0
  219. {ciris_server-0.5.87 → ciris_server-0.5.89}/src/safety/age.rs +0 -0
  220. {ciris_server-0.5.87 → ciris_server-0.5.89}/src/safety/infohazard.rs +0 -0
  221. {ciris_server-0.5.87 → ciris_server-0.5.89}/src/safety/mod.rs +0 -0
  222. {ciris_server-0.5.87 → ciris_server-0.5.89}/src/safety/moderation.rs +0 -0
  223. {ciris_server-0.5.87 → ciris_server-0.5.89}/src/safety/named.rs +0 -0
  224. {ciris_server-0.5.87 → ciris_server-0.5.89}/src/safety/watchlist.rs +0 -0
  225. {ciris_server-0.5.87 → ciris_server-0.5.89}/src/scorer/n_eff.rs +0 -0
  226. {ciris_server-0.5.87 → ciris_server-0.5.89}/src/scorer.rs +0 -0
  227. {ciris_server-0.5.87 → ciris_server-0.5.89}/src/system_data.rs +0 -0
  228. {ciris_server-0.5.87 → ciris_server-0.5.89}/src/telemetry_logs.rs +0 -0
  229. {ciris_server-0.5.87 → ciris_server-0.5.89}/src/yubico_attestation_ca.pem +0 -0
  230. {ciris_server-0.5.87 → ciris_server-0.5.89}/tests/accord.rs +0 -0
  231. {ciris_server-0.5.87 → ciris_server-0.5.89}/tests/accord_admit_node.rs +0 -0
  232. {ciris_server-0.5.87 → ciris_server-0.5.89}/tests/alm_chain.rs +0 -0
  233. {ciris_server-0.5.87 → ciris_server-0.5.89}/tests/audit_chain.rs +0 -0
  234. {ciris_server-0.5.87 → ciris_server-0.5.89}/tests/capacity_scorer.rs +0 -0
  235. {ciris_server-0.5.87 → ciris_server-0.5.89}/tests/ceg_graph_projection.rs +0 -0
  236. {ciris_server-0.5.87 → ciris_server-0.5.89}/tests/chaos_mesh.rs +0 -0
  237. {ciris_server-0.5.87 → ciris_server-0.5.89}/tests/claim_remote.rs +0 -0
  238. {ciris_server-0.5.87 → ciris_server-0.5.89}/tests/config_reconcile.rs +0 -0
  239. {ciris_server-0.5.87 → ciris_server-0.5.89}/tests/device_grant.rs +0 -0
  240. {ciris_server-0.5.87 → ciris_server-0.5.89}/tests/federation_admin.rs +0 -0
  241. {ciris_server-0.5.87 → ciris_server-0.5.89}/tests/federation_session_kex.rs +0 -0
  242. {ciris_server-0.5.87 → ciris_server-0.5.89}/tests/graph_config.rs +0 -0
  243. {ciris_server-0.5.87 → ciris_server-0.5.89}/tests/ingest_http.rs +0 -0
  244. {ciris_server-0.5.87 → ciris_server-0.5.89}/tests/mesh_seed_e2e.rs +0 -0
  245. {ciris_server-0.5.87 → ciris_server-0.5.89}/tests/mesh_seed_keyplane_e2e.rs +0 -0
  246. {ciris_server-0.5.87 → ciris_server-0.5.89}/tests/nat_traversal.rs +0 -0
  247. {ciris_server-0.5.87 → ciris_server-0.5.89}/tests/nodecode.rs +0 -0
  248. {ciris_server-0.5.87 → ciris_server-0.5.89}/tests/noise_floor.rs +0 -0
  249. {ciris_server-0.5.87 → ciris_server-0.5.89}/tests/noise_floor_verdicts.rs +0 -0
  250. {ciris_server-0.5.87 → ciris_server-0.5.89}/tests/occurrence.rs +0 -0
  251. {ciris_server-0.5.87 → ciris_server-0.5.89}/tests/ownership.rs +0 -0
  252. {ciris_server-0.5.87 → ciris_server-0.5.89}/tests/peer_replication.rs +0 -0
  253. {ciris_server-0.5.87 → ciris_server-0.5.89}/tests/portable_occurrence.rs +0 -0
  254. {ciris_server-0.5.87 → ciris_server-0.5.89}/tests/release_gates/stage1.rs +0 -0
  255. {ciris_server-0.5.87 → ciris_server-0.5.89}/tests/release_gates/stage2.rs +0 -0
  256. {ciris_server-0.5.87 → ciris_server-0.5.89}/tests/release_gates/stage3.rs +0 -0
  257. {ciris_server-0.5.87 → ciris_server-0.5.89}/tests/release_gates/stage4.rs +0 -0
  258. {ciris_server-0.5.87 → ciris_server-0.5.89}/tests/release_gates/stage5.rs +0 -0
  259. {ciris_server-0.5.87 → ciris_server-0.5.89}/tests/release_gates/stage6.rs +0 -0
  260. {ciris_server-0.5.87 → ciris_server-0.5.89}/tests/release_gates/stage7.rs +0 -0
  261. {ciris_server-0.5.87 → ciris_server-0.5.89}/tests/release_gates/stage8.rs +0 -0
  262. {ciris_server-0.5.87 → ciris_server-0.5.89}/tests/release_gates.rs +0 -0
  263. {ciris_server-0.5.87 → ciris_server-0.5.89}/tests/replication.rs +0 -0
  264. {ciris_server-0.5.87 → ciris_server-0.5.89}/tests/replication_reconcile.rs +0 -0
  265. {ciris_server-0.5.87 → ciris_server-0.5.89}/tests/root_bootstrap.rs +0 -0
  266. {ciris_server-0.5.87 → ciris_server-0.5.89}/tests/safety.rs +0 -0
  267. {ciris_server-0.5.87 → ciris_server-0.5.89}/tests/stream_sth_consistency.rs +0 -0
  268. {ciris_server-0.5.87 → ciris_server-0.5.89}/tests/wire_vocabulary_gate.rs +0 -0
  269. {ciris_server-0.5.87 → ciris_server-0.5.89}/tools/audit_cohort_scope_callers.py +0 -0
  270. {ciris_server-0.5.87 → ciris_server-0.5.89}/tools/check_evidence.py +0 -0
@@ -766,8 +766,8 @@ dependencies = [
766
766
 
767
767
  [[package]]
768
768
  name = "ciris-crypto"
769
- version = "8.9.0"
770
- source = "git+https://github.com/CIRISAI/CIRISVerify?tag=v8.9.0#31a3a6fd1dc50f77b39bd388fce004f9ec41bf7f"
769
+ version = "8.10.0"
770
+ source = "git+https://github.com/CIRISAI/CIRISVerify?tag=v8.10.0#a64c08996edd0e9c4c0fd27c1fae72dcedc4474f"
771
771
  dependencies = [
772
772
  "chacha20poly1305",
773
773
  "ed25519-dalek",
@@ -793,8 +793,8 @@ dependencies = [
793
793
 
794
794
  [[package]]
795
795
  name = "ciris-edge"
796
- version = "9.1.6"
797
- source = "git+https://github.com/CIRISAI/CIRISEdge?tag=v9.1.6#1c1f1f02329e9b47330660f33ea284193689cb96"
796
+ version = "9.2.0"
797
+ source = "git+https://github.com/CIRISAI/CIRISEdge?tag=v9.2.0#365424cec7e897aa5a5199c30d22caef4d528a2a"
798
798
  dependencies = [
799
799
  "async-trait",
800
800
  "axum",
@@ -847,8 +847,8 @@ dependencies = [
847
847
 
848
848
  [[package]]
849
849
  name = "ciris-keyring"
850
- version = "8.9.0"
851
- source = "git+https://github.com/CIRISAI/CIRISVerify?tag=v8.9.0#31a3a6fd1dc50f77b39bd388fce004f9ec41bf7f"
850
+ version = "8.10.0"
851
+ source = "git+https://github.com/CIRISAI/CIRISVerify?tag=v8.10.0#a64c08996edd0e9c4c0fd27c1fae72dcedc4474f"
852
852
  dependencies = [
853
853
  "aes-gcm",
854
854
  "async-trait",
@@ -911,8 +911,8 @@ dependencies = [
911
911
 
912
912
  [[package]]
913
913
  name = "ciris-persist"
914
- version = "13.4.1"
915
- source = "git+https://github.com/CIRISAI/CIRISPersist?tag=v13.4.1#e0370aade3acdbc6ce26feb235f7ae69a1405114"
914
+ version = "13.4.2"
915
+ source = "git+https://github.com/CIRISAI/CIRISPersist?tag=v13.4.2#ac214bf3df87693a13fca9f62e2a021d4eefb19e"
916
916
  dependencies = [
917
917
  "async-trait",
918
918
  "base64 0.22.1",
@@ -949,7 +949,7 @@ dependencies = [
949
949
 
950
950
  [[package]]
951
951
  name = "ciris-server"
952
- version = "0.5.87"
952
+ version = "0.5.89"
953
953
  dependencies = [
954
954
  "anyhow",
955
955
  "async-trait",
@@ -991,8 +991,8 @@ dependencies = [
991
991
 
992
992
  [[package]]
993
993
  name = "ciris-verify-core"
994
- version = "8.9.0"
995
- source = "git+https://github.com/CIRISAI/CIRISVerify?tag=v8.9.0#31a3a6fd1dc50f77b39bd388fce004f9ec41bf7f"
994
+ version = "8.10.0"
995
+ source = "git+https://github.com/CIRISAI/CIRISVerify?tag=v8.10.0#a64c08996edd0e9c4c0fd27c1fae72dcedc4474f"
996
996
  dependencies = [
997
997
  "android_system_properties",
998
998
  "async-trait",
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "ciris-server"
3
- version = "0.5.87" # 0.5.87 = PYO3-SEED FIX ADOPTION. Substrate bump persist v13.4.0→v13.4.1 / edge v9.1.5→v9.1.6 (verify v8.9.0 unchanged). CIRISPersist#392: the pyo3/wheel ctor PyEngine::new hand-rolled its own genesis seed and stopped at the accord holders — it never ran the #386 entrenched-family (v13.3.0) or #390 canonical (v13.4.0) bakes that Engine::with_signer does. So EVERY wheel consumer (the server's own py_main boot + agent-embedded engines, CIRISServer#191 / CIRISAgent#896) got A1/B1/C1 but NO HUMANITY_ACCORD family row and list_canonical_servers()==[] — the canonical bake never reached the installs it was meant to light up. v13.4.1 factors the full post-holders sequence (verify anchor → family #386 → canonical #390) into ONE shared genesis::seed_family_and_canonical(dir) called by BOTH ctors, so pyo3 + Rust engines are seed-identical. edge v9.1.6 = coherence re-pin of persist v13.4.1. NO server source change — pure substrate adoption; a fresh wheel Engine now returns ciris-canonical-1 + an entrenched family. 0.5.86 = GENESIS-BAKE + GRAPH-FIX. Substrate bump persist v13.3.1→v13.4.0 / edge v9.1.4→v9.1.5 (verify v8.9.0 unchanged). (1) CIRISPersist#390/#391: the 2-of-3 canonical genesis server (ciris-canonical-1-d7bdeu223k) is now BAKED at genesis — the operator's live accord-co-scrubbed record (A1 primary + B1 in additional_scrubs, field-conferred this session) restores the seed #383 deferred (a 1-of-N founding record was a first-strike weakness; canonical ADD is 2-of-3, so the baked genesis is too). A FRESH install boots already trusting ciris-canonical-1 (adopt_scrub_upgrade seeds/upgrades every node's row incl. Node A's own → A self-roots on upgrade), nodes addressable by key_id — no ceremony. edge v9.1.5 = coherence re-pin of persist v13.4.0 (same-repo [patch] gotcha). (2) GRAPH-VIEW FIX: the memory graph crashed loading (JsonConvertException: NodeType has no 'attestation') — 0.5.85's seed_ceg_graph projects CEG trust-root kinds (owner/owned_node/canonical_server/family/holder/delegation/attestation/peer) the client's strict NodeType enum didn't know, so ONE unknown value failed the whole /v1/memory/timeline payload. Fix (client): added the 8 CEG variants + a TOLERANT NodeTypeSerializer (unknown→UNKNOWN, never throws again) + distinct CEG-plane colors. 0.5.85 = SEED-UX cut (no substrate change; edge v9.1.4 / persist v13.3.1 / verify v8.9.0). The fixes that let the operator + a second holder seed the canonical mesh cleanly from the desktop UI: (1) OS-AWARE ykcs11 module path — the node's default PKCS#11 module now resolves per-OS (macOS Homebrew .dylib Apple-Silicon/Intel; Windows Yubico PIV Tool .dll / PATH; Linux .so) via identity.rs::default_ykcs11_module, wired into Pkcs11Options + the accord propose/cosign/admit paths, so a macOS/Windows holder's YubiKey cosign works (was hardcoded Linux → dlopen failure). Optional per-request "PKCS#11 module path (advanced)" field in the hardware-scrub sheet as an override. (2) COPY/EXPORT the co-scrub partial + finished record from the Trust Root card (Propose/Cosign/Pending) — Copy-to-clipboard + Save-to-file; no more pulling JSON off disk. (3) NAV label "Accord" → "Trust Root". (4) CIRISServer#127++ — the memory graph now PROJECTS persist's CEG state (seed_ceg_graph): ~40+ nodes (identity, owner, owned nodes, HUMANITY_ACCORD family + holders, canonical servers, config:*, delegations/consent/structural attestations) with CEG-native typed edges (delegates_to owner-binding, has_member family→holder seat, scrub_conferral holder→canonical, has_config, replicates_to, authored, supersedes/withdraws/recants); each node carries kind·subject·status·record so the client can render it as an AttestationCard. Follow-ups: wire the Trust Root ⋮ hamburger onto graph nodes (client); 28-language fan-out for the 7 new strings; pending-co-scrub graph node. 0.5.84 = THE FULL SAFE-MESH-SEED CUT. Substrate lockstep bumped edge v9.1.2→v9.1.4 / persist v13.2.0→v13.3.1 (v13.3.1 #387 adds the test-only with_signer_no_genesis_seed seam so the accord ceremony tests get a clean engine) (verify v8.9.0 unchanged). (1) CIRISPersist#386: the HUMANITY_ACCORD federation_families row (quorum:2/3, A1/B1/C1) is now SEEDED at boot on every node (idempotent) — lookup_family resolves durably, so the 0.5.83 baked-genesis fallbacks are RETIRED (recognized_family_from_baked_genesis + family_quorum_m fallback deleted; get_family reads the real entrenched row; V097 drops the family_key_id→federation_keys FK — a constitutional family is keyless). (2) CIRISServer#181 producer hook: POST /v1/safety/flag (duty-gated: verify_request + admit_moderation_action(Moderate)) emits the substrate-reserved content_class:{infohazard|reported} flag via a NEW node-scoped substrate_persist identity (sealed Ed25519 <alias>-substrate + software ML-DSA seed, registered through register_federation_key) — the duty-holder authorizes, the substrate signs; action:clear supersedes. This makes the #161 infohazard reveal gate actually FIRE (flag → GET /v1/safety/reveal 403 interstitial for a non-consented viewer). (3) CIRISServer#161 (already on main): POST /v1/safety/reveal — the CC 4.5.13 consent gate. #378 single-owner marker gate rides the persist bump (no server action). Follow-ups: retire ensure_accord_family_anchor throwaway key (low-risk, legacy assemble path); infohazard consent lifecycle + interstitial UX (#180 umbrella / #182-#185). 0.5.83 = BAKED-FAMILY RECOGNITION + RAISE-A-HALT. Same substrate (edge v9.1.2 / persist v13.2.0 / verify v8.9.0). Fixes "No accord family established on this node yet" on a node that has the BAKED genesis but no entrenched federation_families row (persist seeds the 3 holder KEY rows, not the family row — durable fix filed CIRISPersist#386): GET /v1/accord/family + the co-scrub quorum_needed now fall back to verify's baked humanity_accord_genesis() (the 2/3 family + 3 seats, entrenched=false, recognized_via=baked-genesis) — the same recognition resolve_kill_switch_roster already uses. PLUS raise-a-halt: POST /v1/accord/halt (initiate_halt, the binding twin of /drill — one opener signature is sub-quorum and cannot latch; 2-of-3 concur latches) + the client "Halt the mesh" action (was a disabled placeholder). 0.5.82 = CO-SCRUB END-TO-END. Same substrate lockstep edge v9.1.2 / persist v13.2.0 / verify v8.9.0 (no triple change). The cross-device m-of-n seed now works from the app: the co-scrub partial GOSSIPS over the accord peer-plane (the same HTTP set the kill-switch uses) — propose on A1's box → the partial surfaces under "Pending co-signs (canonical)" on B1's box → cosign → conferred, no manual transfer. Server (src/accord_provision.rs): ProvisionState gains an ephemeral bounded pending store + a (target,scrub-count) seen-set; ingest_partial validates structurally + upserts + gossips; NEW open (non-loopback) POST /v1/accord/canonical/gossip-partial peer-receive + GET /v1/accord/canonical/pending; router() split into build()→{loopback,gossip}. Client (#174): proposeCanonical/cosignCanonical/listPendingCoscrubs, the "Pending co-signs (canonical)" section + CanonicalCosignSheet (pending-entry or pasted-partial fallback), "[+ New] Add"→"Propose a canonical server". Bundled: #117 (Delegations loads on screen entry, not VM init → no pre-login 401) + #134 (existing-key offer no longer gated on a typed label; label auto-populates from the picked key_id). 0.5.81 = M-OF-N TRUST ROOT. Substrate lockstep edge v9.1.2 / persist v13.2.0 / verify v8.9.0 (CIRISPersist#383: KeyRecord.additional_scrubs + the DYNAMIC m-of-n admission gate via verify's verify_quorum_policy — canonical is conferred iff distinct_scrub_count() ≥ the family's entrenched quorum:M/N, NOT a hardcoded 2; the 1-of-N genesis is no longer auto-baked). Trust Root co-scrub ceremony (server-side, hardware-signed via the shared open_holder_identity custody path): POST /v1/accord/canonical/{propose,cosign} (scrub #1 → gossip/transfer the partial → append_scrub over the byte-identical envelope → adopt_scrub_upgrade lets the m-of-n gate confer/hold), plus /withdraw + /supersede (#377, 2-of-3 via proposal_digest) and IP-in-envelope TransportHint. Accord ops drill + announce (/v1/accord/{drill,announce}, node-synth'd invocation, gossiped, recorded pre-latch) + /halt-status. DRY audit landed (recipes routed through the substrate: build_self_key_record→produce_self_key_record, CANONICAL_BOOTSTRAP_PEERS→Engine::canonical_bootstrap_hints, owner_binding consts aliased). CEG-native Trust Root card redesign (one AttestationCard + ⋮ hamburger; concur now hardware-signs). KNOWN → 0.5.82 (#174): the client "Add canonical" still posts /add (1-scrub partial under m-of-n) — wire the propose→cosign buttons. 0.5.80 = THE MESH-SEED RELEASE. Substrate lockstep edge v9.1.0 / persist v13.0.1 / verify v8.7.0 (CC 1.0 RC1: KeyRecord.consent_role, the accord-conferred `canonical` identity_type role + admission gate CIRISPersist#372, single-owner owner_of #162, CIRISEdge#277 upgrade-aware Key-plane apply → KERI publish-own end-to-end). Trust Root canonical ops (#164): POST /v1/accord/canonical/add — the 1-of-N hardware-scrub SEED op (scrub-sign w/ the canonical role + adopt onto own row + publish address) + GET /v1/accord/canonical/servers + the client "Canonical servers" card (update-address shipped #165; supersede/withdraw → 0.5.81, need a persist role-removal primitive). ci.yml revived (my #155 evidence-step colon had broken the Rust gate repo-wide). 0.5.79 = substrate triple edge v8.7.2 / persist v12.5.0 / verify v8.7.0 (cross-cdylib block_on-deadlock/SIGABRT fix + CC 0.9.3 gates + dep-trims landed: hickory 0.25 de-dup, dead openssl/qrcodegen/bip39 gone) + REMOTE adopt-scrubbed endpoint (#150 — POST /v1/federation/adopt-scrubbed applies an A1-scrubbed record onto a node's own row so it roots; the seed producer's remote leg, keys live off-node) + server-local dep-trims (#152: drop hmac/pyo3-async-runtimes, lens-core async-trait/opentelemetry, base64 0.21→0.22). 0.5.78 = edge v8.6.1 / persist v12.2.0 adoption — the COMPLETE admit-node → mesh-seed loop. (1) #144 KEY-PLANE replication (KERI publish-own): the ReplicationRuntime converges an EnvelopeKind::Key coordinator per consent peer + a key_selector publishing the node's OWN key_id. (2) #150 PRODUCER: admit-node now calls persist v12.2.0 Engine::adopt_scrub_upgrade (CIRISPersist#351) to upgrade the node's own self-signed row to the accord-holder-scrubbed record — so the Key plane publishes an ANCHORED, rootable record → peers root it. Producer (server upgrades the row) + publish-own (edge advertises it) = the seed closes in place, no wipe. (3) #147 §Q B5: persist FountainHeldMeta.{content_bytes,cohort_scope} adopted (server has no fountain-content admit path; import.rs already sets cohort_scope). Verify unchanged v8.5.0. 0.5.77 = persist v12.0.2 anchor seed + accord-card UX.
3
+ version = "0.5.89" # 0.5.89 = FEDERATION DELIVERY (#205, subsumes #204). edge v9.1.7→v9.2.0 (CIRISEdge#289: current_edge() downstream-public + require_local_signer attested-announce; persist v13.4.2 / verify v8.10.0 unchanged) + `ffi-uniffi` on the edge dep so ciris_edge::current_edge() links into the controller. NEW pyo3 entry `start_federation_delivery(cadence_seconds=None, announce_logger=True) -> int` (src/federation_delivery.rs + src/lib.rs): the bare AGENT edge, after init_edge_runtime, calls ONE thing that runs the compose delivery controller in-process against current_rust_engine()+current_edge() — reads the baked canonical transport_hints→targets (subsumes #204's read), authors this node's directed consent:replication grant per admitted canonical peer, starts the ONE ReplicationRuntime seeding the canonical key_ids, installs inbound routing (safe post-boot — Edge::run reads the routing OnceLock live per frame), spawns the consent reconcile loop (set_peers) + announce logger. Compose boot UNCHANGED — factored setup_peer_replication's core into compose::start_replication_runtime(engine,edge,node_key_id,extra_targets) (compose passes &[], the controller passes canonical key_ids) + a shared build_replication_peers. CONTRACT: init_edge_runtime(engine=from_shared_with_local(...), disable_reticulum=False, require_local_signer=True, announce_interval_seconds=15) → start_federation_delivery(). CAVEAT: the Reticulum transport only adds a TCP *dial* peer at BUILD time (no runtime add-peer), so the canonical IP MUST be in the edge init bootstrap_peers (agent-side, the user's peers=1 path) — the controller drives everything downstream of the dial. Live delivery is the agent live-lens QA (not unit-testable: needs a live edge + Node A); 4 new unit tests cover peer-set assembly / dedup / empty sets / uninitialized-guard. 0.5.88 = NODE-A BOOT FIX (triple adoption). Substrate bump persist v13.4.1→v13.4.2 / edge v9.1.6→v9.1.7 / verify v8.9.0→v8.10.0. CIRISPersist#394: the #390 canonical bake made seed_canonical_servers `put_public_key` the baked 2-of-3 record — but on the CANONICAL NODE ITSELF (ciris-canonical-1-d7bdeu223k already exists as its own self-signed `node` row, same pubkeys, minted at first registration), put_public_key saw same-key/different-content → Err → EngineError::GenesisSeed → BOOT ABORT. The one node the bake was meant to serve couldn't boot on v13.4.0/v13.4.1 (RCA'd here; bisected 0.5.85✅/0.5.86❌). v13.4.2 seeds via adopt_scrub_upgrade instead: absent→insert, self-signed same-pubkey→UPGRADE to the scrubbed canonical record (A self-roots), already-scrubbed→no-op, drift→reject. verify v8.9.0→v8.10.0 (persist v13.4.2 requires it): additive — the new `ciris-verify manifest sign` CLI (#176/#177, the canonical build-manifest producer emitting SignedCegObject/build_manifest_contribution scoped infra:attest); no server consumer break. edge v9.1.7 = coherence re-pin of persist v13.4.2 + verify v8.10.0. NO server source change — pure substrate adoption; unblocks Node A's upgrade off 0.5.85. 0.5.87 = PYO3-SEED FIX ADOPTION. Substrate bump persist v13.4.0→v13.4.1 / edge v9.1.5→v9.1.6 (verify v8.9.0 unchanged). CIRISPersist#392: the pyo3/wheel ctor PyEngine::new hand-rolled its own genesis seed and stopped at the accord holders — it never ran the #386 entrenched-family (v13.3.0) or #390 canonical (v13.4.0) bakes that Engine::with_signer does. So EVERY wheel consumer (the server's own py_main boot + agent-embedded engines, CIRISServer#191 / CIRISAgent#896) got A1/B1/C1 but NO HUMANITY_ACCORD family row and list_canonical_servers()==[] — the canonical bake never reached the installs it was meant to light up. v13.4.1 factors the full post-holders sequence (verify anchor → family #386 → canonical #390) into ONE shared genesis::seed_family_and_canonical(dir) called by BOTH ctors, so pyo3 + Rust engines are seed-identical. edge v9.1.6 = coherence re-pin of persist v13.4.1. NO server source change — pure substrate adoption; a fresh wheel Engine now returns ciris-canonical-1 + an entrenched family. 0.5.86 = GENESIS-BAKE + GRAPH-FIX. Substrate bump persist v13.3.1→v13.4.0 / edge v9.1.4→v9.1.5 (verify v8.9.0 unchanged). (1) CIRISPersist#390/#391: the 2-of-3 canonical genesis server (ciris-canonical-1-d7bdeu223k) is now BAKED at genesis — the operator's live accord-co-scrubbed record (A1 primary + B1 in additional_scrubs, field-conferred this session) restores the seed #383 deferred (a 1-of-N founding record was a first-strike weakness; canonical ADD is 2-of-3, so the baked genesis is too). A FRESH install boots already trusting ciris-canonical-1 (adopt_scrub_upgrade seeds/upgrades every node's row incl. Node A's own → A self-roots on upgrade), nodes addressable by key_id — no ceremony. edge v9.1.5 = coherence re-pin of persist v13.4.0 (same-repo [patch] gotcha). (2) GRAPH-VIEW FIX: the memory graph crashed loading (JsonConvertException: NodeType has no 'attestation') — 0.5.85's seed_ceg_graph projects CEG trust-root kinds (owner/owned_node/canonical_server/family/holder/delegation/attestation/peer) the client's strict NodeType enum didn't know, so ONE unknown value failed the whole /v1/memory/timeline payload. Fix (client): added the 8 CEG variants + a TOLERANT NodeTypeSerializer (unknown→UNKNOWN, never throws again) + distinct CEG-plane colors. 0.5.85 = SEED-UX cut (no substrate change; edge v9.1.4 / persist v13.3.1 / verify v8.9.0). The fixes that let the operator + a second holder seed the canonical mesh cleanly from the desktop UI: (1) OS-AWARE ykcs11 module path — the node's default PKCS#11 module now resolves per-OS (macOS Homebrew .dylib Apple-Silicon/Intel; Windows Yubico PIV Tool .dll / PATH; Linux .so) via identity.rs::default_ykcs11_module, wired into Pkcs11Options + the accord propose/cosign/admit paths, so a macOS/Windows holder's YubiKey cosign works (was hardcoded Linux → dlopen failure). Optional per-request "PKCS#11 module path (advanced)" field in the hardware-scrub sheet as an override. (2) COPY/EXPORT the co-scrub partial + finished record from the Trust Root card (Propose/Cosign/Pending) — Copy-to-clipboard + Save-to-file; no more pulling JSON off disk. (3) NAV label "Accord" → "Trust Root". (4) CIRISServer#127++ — the memory graph now PROJECTS persist's CEG state (seed_ceg_graph): ~40+ nodes (identity, owner, owned nodes, HUMANITY_ACCORD family + holders, canonical servers, config:*, delegations/consent/structural attestations) with CEG-native typed edges (delegates_to owner-binding, has_member family→holder seat, scrub_conferral holder→canonical, has_config, replicates_to, authored, supersedes/withdraws/recants); each node carries kind·subject·status·record so the client can render it as an AttestationCard. Follow-ups: wire the Trust Root ⋮ hamburger onto graph nodes (client); 28-language fan-out for the 7 new strings; pending-co-scrub graph node. 0.5.84 = THE FULL SAFE-MESH-SEED CUT. Substrate lockstep bumped edge v9.1.2→v9.1.4 / persist v13.2.0→v13.3.1 (v13.3.1 #387 adds the test-only with_signer_no_genesis_seed seam so the accord ceremony tests get a clean engine) (verify v8.9.0 unchanged). (1) CIRISPersist#386: the HUMANITY_ACCORD federation_families row (quorum:2/3, A1/B1/C1) is now SEEDED at boot on every node (idempotent) — lookup_family resolves durably, so the 0.5.83 baked-genesis fallbacks are RETIRED (recognized_family_from_baked_genesis + family_quorum_m fallback deleted; get_family reads the real entrenched row; V097 drops the family_key_id→federation_keys FK — a constitutional family is keyless). (2) CIRISServer#181 producer hook: POST /v1/safety/flag (duty-gated: verify_request + admit_moderation_action(Moderate)) emits the substrate-reserved content_class:{infohazard|reported} flag via a NEW node-scoped substrate_persist identity (sealed Ed25519 <alias>-substrate + software ML-DSA seed, registered through register_federation_key) — the duty-holder authorizes, the substrate signs; action:clear supersedes. This makes the #161 infohazard reveal gate actually FIRE (flag → GET /v1/safety/reveal 403 interstitial for a non-consented viewer). (3) CIRISServer#161 (already on main): POST /v1/safety/reveal — the CC 4.5.13 consent gate. #378 single-owner marker gate rides the persist bump (no server action). Follow-ups: retire ensure_accord_family_anchor throwaway key (low-risk, legacy assemble path); infohazard consent lifecycle + interstitial UX (#180 umbrella / #182-#185). 0.5.83 = BAKED-FAMILY RECOGNITION + RAISE-A-HALT. Same substrate (edge v9.1.2 / persist v13.2.0 / verify v8.9.0). Fixes "No accord family established on this node yet" on a node that has the BAKED genesis but no entrenched federation_families row (persist seeds the 3 holder KEY rows, not the family row — durable fix filed CIRISPersist#386): GET /v1/accord/family + the co-scrub quorum_needed now fall back to verify's baked humanity_accord_genesis() (the 2/3 family + 3 seats, entrenched=false, recognized_via=baked-genesis) — the same recognition resolve_kill_switch_roster already uses. PLUS raise-a-halt: POST /v1/accord/halt (initiate_halt, the binding twin of /drill — one opener signature is sub-quorum and cannot latch; 2-of-3 concur latches) + the client "Halt the mesh" action (was a disabled placeholder). 0.5.82 = CO-SCRUB END-TO-END. Same substrate lockstep edge v9.1.2 / persist v13.2.0 / verify v8.9.0 (no triple change). The cross-device m-of-n seed now works from the app: the co-scrub partial GOSSIPS over the accord peer-plane (the same HTTP set the kill-switch uses) — propose on A1's box → the partial surfaces under "Pending co-signs (canonical)" on B1's box → cosign → conferred, no manual transfer. Server (src/accord_provision.rs): ProvisionState gains an ephemeral bounded pending store + a (target,scrub-count) seen-set; ingest_partial validates structurally + upserts + gossips; NEW open (non-loopback) POST /v1/accord/canonical/gossip-partial peer-receive + GET /v1/accord/canonical/pending; router() split into build()→{loopback,gossip}. Client (#174): proposeCanonical/cosignCanonical/listPendingCoscrubs, the "Pending co-signs (canonical)" section + CanonicalCosignSheet (pending-entry or pasted-partial fallback), "[+ New] Add"→"Propose a canonical server". Bundled: #117 (Delegations loads on screen entry, not VM init → no pre-login 401) + #134 (existing-key offer no longer gated on a typed label; label auto-populates from the picked key_id). 0.5.81 = M-OF-N TRUST ROOT. Substrate lockstep edge v9.1.2 / persist v13.2.0 / verify v8.9.0 (CIRISPersist#383: KeyRecord.additional_scrubs + the DYNAMIC m-of-n admission gate via verify's verify_quorum_policy — canonical is conferred iff distinct_scrub_count() ≥ the family's entrenched quorum:M/N, NOT a hardcoded 2; the 1-of-N genesis is no longer auto-baked). Trust Root co-scrub ceremony (server-side, hardware-signed via the shared open_holder_identity custody path): POST /v1/accord/canonical/{propose,cosign} (scrub #1 → gossip/transfer the partial → append_scrub over the byte-identical envelope → adopt_scrub_upgrade lets the m-of-n gate confer/hold), plus /withdraw + /supersede (#377, 2-of-3 via proposal_digest) and IP-in-envelope TransportHint. Accord ops drill + announce (/v1/accord/{drill,announce}, node-synth'd invocation, gossiped, recorded pre-latch) + /halt-status. DRY audit landed (recipes routed through the substrate: build_self_key_record→produce_self_key_record, CANONICAL_BOOTSTRAP_PEERS→Engine::canonical_bootstrap_hints, owner_binding consts aliased). CEG-native Trust Root card redesign (one AttestationCard + ⋮ hamburger; concur now hardware-signs). KNOWN → 0.5.82 (#174): the client "Add canonical" still posts /add (1-scrub partial under m-of-n) — wire the propose→cosign buttons. 0.5.80 = THE MESH-SEED RELEASE. Substrate lockstep edge v9.1.0 / persist v13.0.1 / verify v8.7.0 (CC 1.0 RC1: KeyRecord.consent_role, the accord-conferred `canonical` identity_type role + admission gate CIRISPersist#372, single-owner owner_of #162, CIRISEdge#277 upgrade-aware Key-plane apply → KERI publish-own end-to-end). Trust Root canonical ops (#164): POST /v1/accord/canonical/add — the 1-of-N hardware-scrub SEED op (scrub-sign w/ the canonical role + adopt onto own row + publish address) + GET /v1/accord/canonical/servers + the client "Canonical servers" card (update-address shipped #165; supersede/withdraw → 0.5.81, need a persist role-removal primitive). ci.yml revived (my #155 evidence-step colon had broken the Rust gate repo-wide). 0.5.79 = substrate triple edge v8.7.2 / persist v12.5.0 / verify v8.7.0 (cross-cdylib block_on-deadlock/SIGABRT fix + CC 0.9.3 gates + dep-trims landed: hickory 0.25 de-dup, dead openssl/qrcodegen/bip39 gone) + REMOTE adopt-scrubbed endpoint (#150 — POST /v1/federation/adopt-scrubbed applies an A1-scrubbed record onto a node's own row so it roots; the seed producer's remote leg, keys live off-node) + server-local dep-trims (#152: drop hmac/pyo3-async-runtimes, lens-core async-trait/opentelemetry, base64 0.21→0.22). 0.5.78 = edge v8.6.1 / persist v12.2.0 adoption — the COMPLETE admit-node → mesh-seed loop. (1) #144 KEY-PLANE replication (KERI publish-own): the ReplicationRuntime converges an EnvelopeKind::Key coordinator per consent peer + a key_selector publishing the node's OWN key_id. (2) #150 PRODUCER: admit-node now calls persist v12.2.0 Engine::adopt_scrub_upgrade (CIRISPersist#351) to upgrade the node's own self-signed row to the accord-holder-scrubbed record — so the Key plane publishes an ANCHORED, rootable record → peers root it. Producer (server upgrades the row) + publish-own (edge advertises it) = the seed closes in place, no wipe. (3) #147 §Q B5: persist FountainHeldMeta.{content_bytes,cohort_scope} adopted (server has no fountain-content admit path; import.rs already sets cohort_scope). Verify unchanged v8.5.0. 0.5.77 = persist v12.0.2 anchor seed + accord-card UX.
4
4
  edition = "2021"
5
5
  # MSRV floor is set by the substrate: ciris-verify v5.2.0 requires 1.86
6
6
  # (persist v6.0.1 is 1.83). Build with the higher of the two.
@@ -122,8 +122,8 @@ ciris-lens-core = { path = "crates/ciris-lens-core" } # ABSORBED in-tree (wo
122
122
  # `cirislens_wa_cert` + `cirislens_service_token_revocation` expose the auth
123
123
  # substrate the fabric absorbs (CIRISServer#9, src/auth): the agent's `wa_cert`
124
124
  # table (users/WA/OAuth/api-keys) + the `revoked_service_tokens` table.
125
- ciris-persist = { git = "https://github.com/CIRISAI/CIRISPersist", tag = "v13.4.1", features = ["sqlite", "cirisgraph", "cirislens_wa_cert", "cirislens_service_token_revocation", "cirisaudit", "cirislens_tasks", "cirislens_thoughts", "cirislens_tickets", "cirislens_correlations", "cirislens_deferral_reports", "cirislens_maintenance_locks", "cirislens_creation_ceremonies", "cirislens_legacy_migration", "cirisincident", "telemetry", "secrets"] }
126
- ciris-edge = { git = "https://github.com/CIRISAI/CIRISEdge", tag = "v9.1.6", features = ["transport-reticulum", "transport-http", "transport-packet-radio"] }
125
+ ciris-persist = { git = "https://github.com/CIRISAI/CIRISPersist", tag = "v13.4.2", features = ["sqlite", "cirisgraph", "cirislens_wa_cert", "cirislens_service_token_revocation", "cirisaudit", "cirislens_tasks", "cirislens_thoughts", "cirislens_tickets", "cirislens_correlations", "cirislens_deferral_reports", "cirislens_maintenance_locks", "cirislens_creation_ceremonies", "cirislens_legacy_migration", "cirisincident", "telemetry", "secrets"] }
126
+ ciris-edge = { git = "https://github.com/CIRISAI/CIRISEdge", tag = "v9.2.0", features = ["transport-reticulum", "transport-http", "transport-packet-radio", "ffi-uniffi"] }
127
127
  # Founder-quorum verification + key-id fingerprint at the composition root
128
128
  # (threshold:: module path — NOT re-exported at the crate root).
129
129
  # LOCKSTEP: persist v9.4.0 transitively pins verify-core v6.6.x — the whole
@@ -132,16 +132,16 @@ ciris-edge = { git = "https://github.com/CIRISAI/CIRISEdge", tag = "v9.1.
132
132
  # types. v6.6.1 (CIRISVerify#89) adds the create_federation_identity `seal_alias`
133
133
  # arg the #247 user-key-derived fix consumes. (6.4–6.6 are HUMANITY_ACCORD + STH
134
134
  # stack — the accord-genesis surface CIRISServer#41 consumes.)
135
- ciris-verify-core = { git = "https://github.com/CIRISAI/CIRISVerify", tag = "v8.9.0" }
135
+ ciris-verify-core = { git = "https://github.com/CIRISAI/CIRISVerify", tag = "v8.10.0" }
136
136
  # The hybrid crypto primitives (Ed25519 + ML-DSA-65 software signers) — used by
137
137
  # the portable software identity occurrence to build a `HybridSigningIdentity`
138
138
  # over two software seeds. Same tag as the rest of the verify family.
139
- ciris-crypto = { git = "https://github.com/CIRISAI/CIRISVerify", tag = "v8.9.0", version = "8", features = ["pqc-ml-dsa", "self-enc"] }
139
+ ciris-crypto = { git = "https://github.com/CIRISAI/CIRISVerify", tag = "v8.10.0", version = "8", features = ["pqc-ml-dsa", "self-enc"] }
140
140
  # Hardware-backed transport-identity keystore (verify v5.2.0 #68 / edge #99).
141
141
  # Base = software keystore + byte-identical migration of an existing .rid (works
142
142
  # everywhere, no libtss2). The real TPM-2.0 / SE / StrongBox backend rides the
143
143
  # `tpm` feature; runtime auto-detects hardware and falls back to software.
144
- ciris-keyring = { git = "https://github.com/CIRISAI/CIRISVerify", tag = "v8.9.0", version = "8", features = ["software", "pqc-ml-dsa"] }
144
+ ciris-keyring = { git = "https://github.com/CIRISAI/CIRISVerify", tag = "v8.10.0", version = "8", features = ["software", "pqc-ml-dsa"] }
145
145
 
146
146
  # PyO3 bindings for the abi3 wheel — optional, gated behind the `python` feature
147
147
  # so the binary never links them. 0.29 matches the persist/edge family floor.
@@ -204,16 +204,16 @@ tracing-appender = "0.2"
204
204
  # - keyring `tpm` (tss-esapi / TPM 2.0) — the real hardware backend; needs
205
205
  # libtss2 (Linux build dep). Other targets keep the software keystore.
206
206
  [target.'cfg(target_os = "linux")'.dependencies]
207
- ciris-persist = { git = "https://github.com/CIRISAI/CIRISPersist", tag = "v13.4.1", features = ["postgres", "cirisgraph", "cirislens_wa_cert", "cirislens_service_token_revocation", "cirisaudit", "cirislens_tasks", "cirislens_thoughts", "cirislens_tickets", "cirislens_correlations", "cirislens_deferral_reports", "cirislens_maintenance_locks", "cirislens_creation_ceremonies", "cirislens_legacy_migration", "cirisincident", "telemetry", "secrets"] }
207
+ ciris-persist = { git = "https://github.com/CIRISAI/CIRISPersist", tag = "v13.4.2", features = ["postgres", "cirisgraph", "cirislens_wa_cert", "cirislens_service_token_revocation", "cirisaudit", "cirislens_tasks", "cirislens_thoughts", "cirislens_tickets", "cirislens_correlations", "cirislens_deferral_reports", "cirislens_maintenance_locks", "cirislens_creation_ceremonies", "cirislens_legacy_migration", "cirisincident", "telemetry", "secrets"] }
208
208
  # keyring `tpm` (TPM-at-rest, Linux-only via tss-esapi). `pkcs11` is no longer
209
209
  # per-target — it rides the global `pkcs11` feature now that cryptoki builds on all
210
210
  # targets (CIRISVerify v6.12.0).
211
- ciris-keyring = { git = "https://github.com/CIRISAI/CIRISVerify", tag = "v8.9.0", version = "8", features = ["tpm-plugin"] }
211
+ ciris-keyring = { git = "https://github.com/CIRISAI/CIRISVerify", tag = "v8.10.0", version = "8", features = ["tpm-plugin"] }
212
212
 
213
213
  # Android (arm64/arm32/x86_64): the keyring `android` backend (JNI → Android
214
214
  # Keystore/StrongBox); sqlite bundles, no postgres/tpm. Mirrors persist/edge.
215
215
  [target.'cfg(target_os = "android")'.dependencies]
216
- ciris-keyring = { git = "https://github.com/CIRISAI/CIRISVerify", tag = "v8.9.0", version = "8", features = ["android"] }
216
+ ciris-keyring = { git = "https://github.com/CIRISAI/CIRISVerify", tag = "v8.10.0", version = "8", features = ["android"] }
217
217
 
218
218
  # serialport (the RNode LoRa driver dep, src/radio.rs) pulls libudev-sys on Linux,
219
219
  # which only resolves where libudev exists: desktop/server Linux (gnu, x86_64 or
@@ -264,20 +264,20 @@ http-body-util = "0.1"
264
264
  # The PQC primitives the realtime-A/V E2E bench drives directly: hybrid KEX
265
265
  # (X25519 + ML-KEM-768) for the per-Link transit key, AES-256-GCM for the
266
266
  # two-layer chunk seal. Same pin/features edge composes (tag parity).
267
- ciris-crypto = { git = "https://github.com/CIRISAI/CIRISVerify", tag = "v8.9.0", version = "8", features = ["hybrid-kex", "aes-gcm", "pqc-ml-dsa", "self-enc"] }
267
+ ciris-crypto = { git = "https://github.com/CIRISAI/CIRISVerify", tag = "v8.10.0", version = "8", features = ["hybrid-kex", "aes-gcm", "pqc-ml-dsa", "self-enc"] }
268
268
  # Enable edge's OWN fountain codec (`codec-fountain`, L1-A) for the survival-floor
269
269
  # proof — dev/test ONLY (feature unification applies to test/bench builds; the
270
270
  # shipped wheel stays codec-free, since a relay forwards sealed symbols opaquely
271
271
  # and never encodes/decodes). This lets tests/chaos_mesh.rs exercise the SUBSTRATE
272
272
  # codec (`fountain_encode`/`fountain_decode`) directly — a real MEASURED proof,
273
273
  # not a reference stand-in.
274
- ciris-edge = { git = "https://github.com/CIRISAI/CIRISEdge", tag = "v9.1.6", features = ["codec-fountain"] }
274
+ ciris-edge = { git = "https://github.com/CIRISAI/CIRISEdge", tag = "v9.2.0", features = ["codec-fountain"] }
275
275
  # Enable persist's TEST-ONLY genesis-seam (`test-genesis-seam`, CIRISPersist#387) for the
276
276
  # accord ceremony tests (tests/accord.rs): `Engine::with_signer_no_genesis_seed` yields a
277
277
  # clean engine with the baked HUMANITY_ACCORD family seed SKIPPED, so those tests can stand
278
278
  # up their OWN custom-holder family via the assemble ceremony. Dev/test ONLY — resolver-2
279
279
  # keeps this feature out of the shipped lib/bin/wheel (prod always seeds the baked family).
280
- ciris-persist = { git = "https://github.com/CIRISAI/CIRISPersist", tag = "v13.4.1", features = ["test-genesis-seam"] }
280
+ ciris-persist = { git = "https://github.com/CIRISAI/CIRISPersist", tag = "v13.4.2", features = ["test-genesis-seam"] }
281
281
 
282
282
  # PQC realtime-A/V streaming E2E benchmark (CIRISEdge#62 realtime_av profile).
283
283
  [[bench]]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ciris-server
3
- Version: 0.5.87
3
+ Version: 0.5.89
4
4
  License-File: LICENSE
5
5
  Summary: The fabric node — the federation's headless cohabitation runtime (registry + lens [+ node] over one shared substrate), as the abi3 wheel CIRISAgent consumes. agent = fabric node + brain.
6
6
  Author-email: Eric Moore <eric@ciris.ai>
@@ -26,8 +26,8 @@ crate-type = ["cdylib", "rlib"]
26
26
  #
27
27
  # OQ-01 closure 2026-05-03: rlib primary, PyO3 cdylib via `python`
28
28
  # feature for the deployed-lens cutover.
29
- ciris-persist = { git = "https://github.com/CIRISAI/CIRISPersist", tag = "v13.4.1", version = "13", features = ["extract", "sqlite"] }
30
- ciris-edge = { git = "https://github.com/CIRISAI/CIRISEdge", tag = "v9.1.6", version = "9", features = ["transport-http", "transport-reticulum"] }
29
+ ciris-persist = { git = "https://github.com/CIRISAI/CIRISPersist", tag = "v13.4.2", version = "13", features = ["extract", "sqlite"] }
30
+ ciris-edge = { git = "https://github.com/CIRISAI/CIRISEdge", tag = "v9.2.0", version = "9", features = ["transport-http", "transport-reticulum"] }
31
31
 
32
32
  # Keyring — relay mode (CIRISLensCore#10) loads its Edge transport-
33
33
  # signing identity via `ciris_keyring::load_local_seed`. Edge's
@@ -37,12 +37,12 @@ ciris-edge = { git = "https://github.com/CIRISAI/CIRISEdge", tag = "v9.1.6
37
37
  # CIRISVerify tag persist + edge pin (v5.0.0 — CEG 1.0 / Agent 3.0 substrate
38
38
  # release; MAJOR 4→5 but additive for lens-core) — single verify version.
39
39
  # features mirror edge's keyring pin exactly.
40
- ciris-keyring = { git = "https://github.com/CIRISAI/CIRISVerify", tag = "v8.9.0", version = "8", features = ["software", "pqc-ml-dsa"] }
40
+ ciris-keyring = { git = "https://github.com/CIRISAI/CIRISVerify", tag = "v8.10.0", version = "8", features = ["software", "pqc-ml-dsa"] }
41
41
  # verify-core for `fedcode::derive_key_id` — the lens seal path must stamp the
42
42
  # DERIVED federation key_id (`derive_key_id(<alias>, <ed25519 pubkey>)`), the id
43
43
  # `receive_and_persist` verifies against, NOT the bare `local_key_id` alias
44
44
  # (CIRISServer#118; same class as the closed CIRISEdge#203). Single verify version.
45
- ciris-verify-core = { git = "https://github.com/CIRISAI/CIRISVerify", tag = "v8.9.0", version = "8" }
45
+ ciris-verify-core = { git = "https://github.com/CIRISAI/CIRISVerify", tag = "v8.10.0", version = "8" }
46
46
 
47
47
  # persist's `sqlite` feature: relay mode persists inbound batches via
48
48
  # `Engine::receive_and_persist` + reads `Engine::sqlite_backend()` for
@@ -563,9 +563,12 @@ enum LensClientInner {
563
563
  /// )
564
564
  /// ```
565
565
  ///
566
- /// The cohabitation path calls these engine Python methods:
566
+ /// The cohabitation path calls these engine Python methods (the seal is HYBRID —
567
+ /// CIRISServer#121 — so both signing halves are invoked):
567
568
  /// - `engine.local_key_id()` → str — key ID stamped onto the trace
568
569
  /// - `engine.local_sign(canonical_bytes: bytes)` → 64-byte Ed25519 sig
570
+ /// - `engine.local_pqc_sign(canonical ‖ ed25519_sig: bytes)` → ML-DSA-65 sig
571
+ /// - `engine.local_pqc_public_key_b64()` → str — the producer's ML-DSA-65 pubkey
569
572
  /// - `engine.receive_and_persist(batch_bytes: bytes, pre_verified=False)` →
570
573
  /// `{"envelopes_processed": N, "trace_events_inserted": N, ...,
571
574
  /// "signatures_verified": N}` — persists via the host engine's
@@ -607,7 +610,7 @@ enum LensClientInner {
607
610
  /// cohabiting in the same process) cannot be tested in-repo — it requires
608
611
  /// two separately-built wheels. This is a CIRISConformance `requires_lens`
609
612
  /// cohabitation cell (not faked here). The Rust side of the cohabitation path
610
- /// (`PyEngineCapture::prepare` → `canonical_bytes_for` → `apply_signature_and_batch`)
613
+ /// (`PyEngineCapture::prepare` → `canonical_bytes_for` → `apply_hybrid_signature_and_batch`)
611
614
  /// IS tested in `src/capture/py_engine.rs` via `py_engine_path_bytes_round_trip_through_persist`.
612
615
  #[pyclass(name = "LensClient")]
613
616
  struct PyLensClient {
@@ -863,18 +866,21 @@ impl PyLensClient {
863
866
 
864
867
  // ── Cohabitation path (CIRISLensCore#43.1 P0 fix) ────────
865
868
  //
866
- // Orchestration:
869
+ // Orchestration (HYBRID seal — CIRISServer#121; an Ed25519-only seal is
870
+ // rejected by persist's hybrid-strict floor with verify_hybrid_required):
867
871
  // 1. PyEngineCapture::prepare (Rust) — store, consent, provenance,
868
872
  // stamp deployment_profile + trace_level. Sync, no tokio needed.
869
873
  // 2. For non-sealing outcomes → return immediately.
870
874
  // 3. For ReadyToSeal:
871
875
  // a. canonical_bytes_for (Rust — JCS / V2Jcs dispatch)
872
- // b. engine.local_key_id() (Python)
873
- // c. engine.local_sign(canonical_bytes) (Python) → 64-byte sig
874
- // d. PyEngineCapture::apply_signature_and_batch (Rust)
875
- // e. tee_write_if_configured (Rust)
876
- // f. engine.receive_and_persist(batch_bytes) (Python) → summary
877
- // g. Extract trace_events_inserted + signatures_verified from summary
876
+ // b. engine_federation_key_id (Python) — the DERIVED key_id (#118)
877
+ // c. engine.local_sign(canonical) (Python) → 64-byte Ed25519 sig
878
+ // d. engine.local_pqc_sign(canonical ‖ ed25519_sig) (Python) → ML-DSA-65
879
+ // e. engine.local_pqc_public_key_b64() (Python) — rides the envelope
880
+ // f. PyEngineCapture::apply_hybrid_signature_and_batch (Rust)
881
+ // g. tee_write_if_configured (Rust)
882
+ // h. engine.receive_and_persist(batch_bytes) (Python) → summary
883
+ // i. Extract trace_events_inserted + signatures_verified from summary
878
884
  LensClientInner::Cohabitation { capture, py_engine } => {
879
885
  let cap = Arc::clone(capture);
880
886
  let engine = py_engine.bind(py);
@@ -1468,9 +1468,77 @@ async fn setup_peer_replication(
1468
1468
  edge: &Edge,
1469
1469
  cfg: &ServerConfig,
1470
1470
  ) -> Result<Option<Arc<ciris_edge::replication::ReplicationRuntime>>> {
1471
- use ciris_edge::replication::{
1472
- EnvelopeKind, ReplicationPeer, ReplicationRuntime, ReplicationRuntimeConfig,
1473
- };
1471
+ // Server 0.5 (zero env): there is NO env peer-bootstrap branch. The replication
1472
+ // topology is owner-authored consent ONLY — a peer is admitted + a
1473
+ // consent:replication object emitted via the owner-gated POST
1474
+ // /v1/federation/peering. The prior CIRIS_PEER_B_* env-seed branch is deleted.
1475
+ tracing::info!(
1476
+ "replication topology is owner-authored consent only (POST /v1/federation/peering) — \
1477
+ zero env (Server 0.5)"
1478
+ );
1479
+ // Compose seeds NO extra targets: the boot topology is exactly the corpus's
1480
+ // consent:replication set. The agent-embedded delivery controller
1481
+ // (crate::federation_delivery) is the caller that seeds the baked canonical
1482
+ // key_ids as extra_targets — the ONLY behavioural difference between the two.
1483
+ start_replication_runtime(engine, edge, &cfg.key_id, &[]).await
1484
+ }
1485
+
1486
+ /// Assemble the per-peer [`ReplicationPeer`] coordinator set from a set of
1487
+ /// admitted peer `key_id`s. Two coordinators per peer:
1488
+ /// - [`EnvelopeKind::Attestation`] — capacity:* / trace out, health:liveness in.
1489
+ /// - [`EnvelopeKind::Key`] (#144, CIRISEdge#257) — the KERI publish-own key plane.
1490
+ ///
1491
+ /// Pure (no I/O) so both the compose boot path and the agent-embedded delivery
1492
+ /// controller share ONE assembly, and it is unit-testable without an engine.
1493
+ pub(crate) fn build_replication_peers(
1494
+ desired: &[String],
1495
+ ) -> Vec<ciris_edge::replication::ReplicationPeer> {
1496
+ use ciris_edge::replication::{EnvelopeKind, ReplicationPeer};
1497
+ desired
1498
+ .iter()
1499
+ .flat_map(|p| {
1500
+ [
1501
+ ReplicationPeer {
1502
+ peer_key_id: p.clone(),
1503
+ kind: EnvelopeKind::Attestation,
1504
+ },
1505
+ ReplicationPeer {
1506
+ peer_key_id: p.clone(),
1507
+ kind: EnvelopeKind::Key,
1508
+ },
1509
+ ]
1510
+ })
1511
+ .collect()
1512
+ }
1513
+
1514
+ /// Core replication-runtime bring-up, shared by the compose boot path
1515
+ /// ([`setup_peer_replication`], `extra_targets = &[]`) AND the agent-embedded
1516
+ /// federation-delivery controller ([`crate::federation_delivery`], `extra_targets`
1517
+ /// = the baked canonical `key_id`s). Factoring the body here keeps the two callers
1518
+ /// byte-identical except for the extra seed set, so compose's boot behaviour is
1519
+ /// unchanged when `extra_targets` is empty.
1520
+ ///
1521
+ /// `node_key_id` is the local federation signing key (the consent AUTHOR + the
1522
+ /// KERI publish-own selector); compose passes `cfg.key_id`, the delivery
1523
+ /// controller passes `edge.signer_key_id()`.
1524
+ ///
1525
+ /// Returns `Ok(None)` when the Edge carries no Reticulum transport — the read API
1526
+ /// still writes CEG (consent objects), there is just no runtime to converge.
1527
+ ///
1528
+ /// MUST run BEFORE `edge.run()` consumes the Edge on the COMPOSE path (so
1529
+ /// `install_replication_routing` + `reticulum_transport()` are wired before the
1530
+ /// inbound loop starts). On the agent-embedded path the Edge is ALREADY running;
1531
+ /// this is safe because `Edge::run` clones the `Arc<OnceLock>` replication-registry
1532
+ /// and reads `.get()` LIVE per inbound frame (edge.rs `run`), so a post-boot
1533
+ /// `install_replication_routing` is observed on the next frame — see
1534
+ /// [`crate::federation_delivery`] for the full ordering note.
1535
+ pub(crate) async fn start_replication_runtime(
1536
+ engine: &Arc<Engine>,
1537
+ edge: &Edge,
1538
+ node_key_id: &str,
1539
+ extra_targets: &[String],
1540
+ ) -> Result<Option<Arc<ciris_edge::replication::ReplicationRuntime>>> {
1541
+ use ciris_edge::replication::{ReplicationRuntime, ReplicationRuntimeConfig};
1474
1542
  use ciris_persist::federation::FederationDirectory;
1475
1543
 
1476
1544
  // Require a Reticulum transport to run replication at all. Without it the read
@@ -1487,19 +1555,19 @@ async fn setup_peer_replication(
1487
1555
  .context("replication runtime requires a SQLite-backed Engine")?
1488
1556
  .clone();
1489
1557
 
1490
- // Server 0.5 (zero env): there is NO env peer-bootstrap branch. The replication
1491
- // topology is owner-authored consent ONLY a peer is admitted + a
1492
- // consent:replication object emitted via the owner-gated POST
1493
- // /v1/federation/peering. The prior CIRIS_PEER_B_* env-seed branch is deleted.
1494
- tracing::info!(
1495
- "replication topology is owner-authored consent only (POST /v1/federation/peering) — \
1496
- zero env (Server 0.5)"
1497
- );
1498
-
1499
- // 1. Desired Initiator set from CEG — admitted consent:replication subjects.
1500
- let consented = crate::peer::replication_peers_from_consent(engine, &cfg.key_id).await?;
1501
- let mut desired: Vec<String> = Vec::with_capacity(consented.len());
1502
- for peer in consented {
1558
+ // 1. Desired Initiator set from CEG admitted consent:replication subjects,
1559
+ // UNIONED with any caller-seeded `extra_targets` (the delivery controller's
1560
+ // baked canonical key_ids). Every candidate is admission-filtered against the
1561
+ // federation directory (an unknown key has no record to route/verify).
1562
+ let consented = crate::peer::replication_peers_from_consent(engine, node_key_id).await?;
1563
+ let mut candidates: Vec<String> = consented;
1564
+ for t in extra_targets {
1565
+ if !candidates.contains(t) {
1566
+ candidates.push(t.clone());
1567
+ }
1568
+ }
1569
+ let mut desired: Vec<String> = Vec::with_capacity(candidates.len());
1570
+ for peer in candidates {
1503
1571
  match directory.lookup_public_key(&peer).await {
1504
1572
  Ok(Some(_)) => desired.push(peer),
1505
1573
  Ok(None) => tracing::warn!(
@@ -1517,28 +1585,10 @@ async fn setup_peer_replication(
1517
1585
 
1518
1586
  // 2. Always start the ONE long-lived runtime (even with an empty desired set)
1519
1587
  // so the registry + routing exist for the reconciler's runtime hot-add.
1520
- // EnvelopeKind::Attestation carries BOTH directions: capacity:* out,
1521
- // health:liveness in. v5.1.0 `start` installs the scheduler control channel
1522
- // unconditionally, so the runtime accepts `set_peers` mutation with no
1523
- // extra opt-in (CIRISEdge#173 resolved).
1524
- // Two coordinators per consent peer: Attestation (capacity:* / health:liveness)
1525
- // AND Key (#144, CIRISEdge#257 — the KERI publish-own key plane). The reconciler
1526
- // (replication_reconcile.rs) converges the same pair set at runtime.
1527
- let peers: Vec<ReplicationPeer> = desired
1528
- .iter()
1529
- .flat_map(|p| {
1530
- [
1531
- ReplicationPeer {
1532
- peer_key_id: p.clone(),
1533
- kind: EnvelopeKind::Attestation,
1534
- },
1535
- ReplicationPeer {
1536
- peer_key_id: p.clone(),
1537
- kind: EnvelopeKind::Key,
1538
- },
1539
- ]
1540
- })
1541
- .collect();
1588
+ // v5.1.0 `start` installs the scheduler control channel unconditionally, so
1589
+ // the runtime accepts `set_peers` mutation with no extra opt-in
1590
+ // (CIRISEdge#173 resolved).
1591
+ let peers = build_replication_peers(&desired);
1542
1592
 
1543
1593
  // Key-plane publish selector (CIRISEdge#257 / edge v8.6.0): the Key plane's
1544
1594
  // `list_keys` advertises the key_ids THIS selector yields — the node's OWN
@@ -1547,7 +1597,7 @@ async fn setup_peer_replication(
1547
1597
  // record (scrub_key_id = an accord holder), the NEXT anti-entropy round
1548
1598
  // publishes the scrubbed, ANCHORED record to consent peers → they root it.
1549
1599
  // (KERI publish-own: the controller publishes its own establishment record.)
1550
- let own_key_id = cfg.key_id.clone();
1600
+ let own_key_id = node_key_id.to_string();
1551
1601
  let key_selector: ciris_edge::replication::CohortProvider =
1552
1602
  Arc::new(move || vec![own_key_id.clone()]);
1553
1603
 
@@ -1562,16 +1612,9 @@ async fn setup_peer_replication(
1562
1612
 
1563
1613
  // Wire the runtime's registry into the Edge's inbound dispatch (CIRISEdge#119) —
1564
1614
  // EXACTLY ONCE on the single long-lived runtime (set-once OnceLock; never
1565
- // rebuild the runtime).
1615
+ // rebuild the runtime). Safe post-boot on the embedded path (see the fn doc).
1566
1616
  edge.install_replication_routing(&runtime);
1567
1617
 
1568
- // OPT-IN to the v5.1.0 scheduler control channel so the reconciler can mutate
1569
- // the live Initiator set at runtime (register_initiator_peer / remove_peer /
1570
- // set_peers). In edge v5.1.0 `ReplicationRuntime::start` already installs the
1571
- // control channel unconditionally — the runtime exposes no separate public
1572
- // `install_control_channel`; the orchestrator is always-on after `start`, so
1573
- // there is nothing further to call here (CIRISEdge#173 resolved).
1574
-
1575
1618
  tracing::info!(
1576
1619
  initiator_peers = desired.len(),
1577
1620
  "CEG-driven replication runtime started + routed into the shared Edge ({} consent-derived \
@@ -1597,7 +1640,7 @@ async fn setup_peer_replication(
1597
1640
  /// (transport teardown) or on a closed channel. A lagged receiver logs the
1598
1641
  /// drop count rather than aborting — announces are periodic, so a missed batch
1599
1642
  /// is re-emitted on the next `ANNOUNCE_INTERVAL`.
1600
- fn spawn_announce_logger(bus: Arc<ciris_edge::events::EventBus>) {
1643
+ pub(crate) fn spawn_announce_logger(bus: Arc<ciris_edge::events::EventBus>) {
1601
1644
  use ciris_edge::events::EventSeverity;
1602
1645
  use tokio::sync::broadcast::error::RecvError;
1603
1646
  let mut rx = bus.subscribe_announces();
@@ -1887,7 +1930,7 @@ async fn open_engine_for_cli(cfg: &ServerConfig) -> Result<(Arc<Engine>, ServerC
1887
1930
  /// pubkey-derived overlay address (not an internet bootstrap target) and is skipped.
1888
1931
  /// Returns empty on a substrate whose canonical records carry no `transport_hints`
1889
1932
  /// yet (forward-compatible: a pre-#381 record simply has no such envelope key).
1890
- async fn canonical_bootstrap_addrs(engine: &Engine) -> Vec<std::net::SocketAddr> {
1933
+ pub(crate) async fn canonical_bootstrap_addrs(engine: &Engine) -> Vec<std::net::SocketAddr> {
1891
1934
  match engine.canonical_bootstrap_hints().await {
1892
1935
  Ok(hints) => ip_addrs_from_hints(&hints),
1893
1936
  Err(e) => {
@@ -1902,7 +1945,7 @@ async fn canonical_bootstrap_addrs(engine: &Engine) -> Vec<std::net::SocketAddr>
1902
1945
  /// canonical records' signed envelopes (CIRISPersist#381). Split out so the filter is
1903
1946
  /// unit-testable without an engine. Skips non-`ip` kinds (a `reticulum` hint is a
1904
1947
  /// pubkey-derived overlay address, not a TCP bootstrap target) + un-parseable dests.
1905
- fn ip_addrs_from_hints(
1948
+ pub(crate) fn ip_addrs_from_hints(
1906
1949
  hints: &[(String, ciris_persist::federation::types::TransportHint)],
1907
1950
  ) -> Vec<std::net::SocketAddr> {
1908
1951
  let mut out = Vec::new();