ciris-server 0.2.6__tar.gz → 0.3.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 (354) hide show
  1. {ciris_server-0.2.6 → ciris_server-0.3.0}/.github/workflows/bench.yml +1 -1
  2. {ciris_server-0.2.6 → ciris_server-0.3.0}/.github/workflows/ci.yml +10 -0
  3. {ciris_server-0.2.6 → ciris_server-0.3.0}/.github/workflows/publish-pypi.yml +4 -0
  4. {ciris_server-0.2.6 → ciris_server-0.3.0}/.github/workflows/release.yml +17 -3
  5. {ciris_server-0.2.6 → ciris_server-0.3.0}/CHANGELOG.md +61 -0
  6. {ciris_server-0.2.6 → ciris_server-0.3.0}/Cargo.lock +45 -24
  7. {ciris_server-0.2.6 → ciris_server-0.3.0}/Cargo.toml +76 -12
  8. {ciris_server-0.2.6 → ciris_server-0.3.0}/FSD/LENS_TO_SERVER_MIGRATION.md +80 -13
  9. ciris_server-0.3.0/FSD/MESH_ANIMATION_BRIEF.md +228 -0
  10. ciris_server-0.3.0/FSD/ONE_WHEEL_REEXPORT.md +171 -0
  11. {ciris_server-0.2.6 → ciris_server-0.3.0}/FSD/PQC_AV_STREAMING_BENCH.md +53 -25
  12. ciris_server-0.3.0/FSD/QA_AGAINST_RUST.md +180 -0
  13. {ciris_server-0.2.6 → ciris_server-0.3.0}/PKG-INFO +17 -9
  14. {ciris_server-0.2.6 → ciris_server-0.3.0}/README.md +16 -8
  15. ciris_server-0.3.0/app/.gitignore +7 -0
  16. ciris_server-0.3.0/app/README.md +88 -0
  17. ciris_server-0.3.0/app/build.gradle.kts +20 -0
  18. ciris_server-0.3.0/app/fabric-client/build.gradle.kts +122 -0
  19. ciris_server-0.3.0/app/fabric-client/src/commonMain/kotlin/ai/ciris/fabric/auth/FederationSigner.kt +90 -0
  20. ciris_server-0.3.0/app/fabric-client/src/commonMain/kotlin/ai/ciris/fabric/model/federation/Erasure.kt +51 -0
  21. ciris_server-0.3.0/app/fabric-client/src/commonMain/kotlin/ai/ciris/fabric/model/federation/FederationContent.kt +28 -0
  22. ciris_server-0.3.0/app/fabric-client/src/commonMain/kotlin/ai/ciris/fabric/model/federation/FederationMetrics.kt +30 -0
  23. ciris_server-0.3.0/app/fabric-client/src/commonMain/kotlin/ai/ciris/fabric/model/federation/FederationPeer.kt +95 -0
  24. ciris_server-0.3.0/app/fabric-client/src/commonMain/kotlin/ai/ciris/fabric/model/federation/NodeCode.kt +28 -0
  25. ciris_server-0.3.0/app/fabric-client/src/commonMain/kotlin/ai/ciris/fabric/model/identity/LocalIdentityAggregate.kt +78 -0
  26. ciris_server-0.3.0/app/fabric-client/src/commonMain/kotlin/ai/ciris/fabric/net/FabricClient.kt +126 -0
  27. ciris_server-0.3.0/app/fabric-client/src/commonMain/kotlin/ai/ciris/fabric/net/FabricEndpoints.kt +112 -0
  28. ciris_server-0.3.0/app/fabric-client/src/commonMain/kotlin/ai/ciris/fabric/platform/PlatformLogger.kt +16 -0
  29. ciris_server-0.3.0/app/fabric-client/src/commonMain/kotlin/ai/ciris/fabric/ui/screens/ErasureScreen.kt +94 -0
  30. ciris_server-0.3.0/app/fabric-client/src/commonMain/kotlin/ai/ciris/fabric/ui/screens/IdentityScreen.kt +105 -0
  31. ciris_server-0.3.0/app/fabric-client/src/commonMain/kotlin/ai/ciris/fabric/viewmodel/ErasureViewModel.kt +73 -0
  32. ciris_server-0.3.0/app/fabric-client/src/commonMain/kotlin/ai/ciris/fabric/viewmodel/IdentityViewModel.kt +52 -0
  33. ciris_server-0.3.0/app/fabric-client/src/commonTest/kotlin/ai/ciris/fabric/IdentitySliceTest.kt +84 -0
  34. ciris_server-0.3.0/app/gradle/wrapper/gradle-wrapper.jar +0 -0
  35. ciris_server-0.3.0/app/gradle/wrapper/gradle-wrapper.properties +7 -0
  36. ciris_server-0.3.0/app/gradle.properties +13 -0
  37. ciris_server-0.3.0/app/gradlew +248 -0
  38. ciris_server-0.3.0/app/gradlew.bat +92 -0
  39. ciris_server-0.3.0/app/settings.gradle.kts +29 -0
  40. ciris_server-0.3.0/benches/stream_fanout.rs +75 -0
  41. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/Cargo.toml +3 -3
  42. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/src/role/node.rs +318 -26
  43. ciris_server-0.3.0/qa/README.md +70 -0
  44. ciris_server-0.3.0/qa/ciris_sdk/README.md +275 -0
  45. ciris_server-0.3.0/qa/ciris_sdk/REFACTORING_SUMMARY.md +115 -0
  46. ciris_server-0.3.0/qa/ciris_sdk/__init__.py +124 -0
  47. ciris_server-0.3.0/qa/ciris_sdk/auth_store.py +283 -0
  48. ciris_server-0.3.0/qa/ciris_sdk/client.py +261 -0
  49. ciris_server-0.3.0/qa/ciris_sdk/examples/__init__.py +0 -0
  50. ciris_server-0.3.0/qa/ciris_sdk/examples/agent_interaction.py +116 -0
  51. ciris_server-0.3.0/qa/ciris_sdk/examples/unified_telemetry_examples.py +223 -0
  52. ciris_server-0.3.0/qa/ciris_sdk/examples/wa_example.py +72 -0
  53. ciris_server-0.3.0/qa/ciris_sdk/exceptions.py +73 -0
  54. ciris_server-0.3.0/qa/ciris_sdk/model_types.py +258 -0
  55. ciris_server-0.3.0/qa/ciris_sdk/models.py +349 -0
  56. ciris_server-0.3.0/qa/ciris_sdk/pagination.py +214 -0
  57. ciris_server-0.3.0/qa/ciris_sdk/rate_limiter.py +188 -0
  58. ciris_server-0.3.0/qa/ciris_sdk/resources/CONFIG_CLIENT.md +196 -0
  59. ciris_server-0.3.0/qa/ciris_sdk/resources/WA_CLIENT_GUIDE.md +157 -0
  60. ciris_server-0.3.0/qa/ciris_sdk/resources/__init__.py +0 -0
  61. ciris_server-0.3.0/qa/ciris_sdk/resources/agent.py +298 -0
  62. ciris_server-0.3.0/qa/ciris_sdk/resources/audit.py +210 -0
  63. ciris_server-0.3.0/qa/ciris_sdk/resources/auth.py +194 -0
  64. ciris_server-0.3.0/qa/ciris_sdk/resources/billing.py +189 -0
  65. ciris_server-0.3.0/qa/ciris_sdk/resources/config.py +317 -0
  66. ciris_server-0.3.0/qa/ciris_sdk/resources/consent.py +619 -0
  67. ciris_server-0.3.0/qa/ciris_sdk/resources/emergency.py +245 -0
  68. ciris_server-0.3.0/qa/ciris_sdk/resources/jobs.py +349 -0
  69. ciris_server-0.3.0/qa/ciris_sdk/resources/memory.py +595 -0
  70. ciris_server-0.3.0/qa/ciris_sdk/resources/setup.py +265 -0
  71. ciris_server-0.3.0/qa/ciris_sdk/resources/system.py +324 -0
  72. ciris_server-0.3.0/qa/ciris_sdk/resources/telemetry.py +747 -0
  73. ciris_server-0.3.0/qa/ciris_sdk/resources/wa.py +150 -0
  74. ciris_server-0.3.0/qa/ciris_sdk/resources/websocket.py +395 -0
  75. ciris_server-0.3.0/qa/ciris_sdk/setup.py +67 -0
  76. ciris_server-0.3.0/qa/ciris_sdk/telemetry_models.py +257 -0
  77. ciris_server-0.3.0/qa/ciris_sdk/telemetry_responses.py +199 -0
  78. ciris_server-0.3.0/qa/ciris_sdk/transport.py +177 -0
  79. ciris_server-0.3.0/qa/ciris_sdk/websocket.py +400 -0
  80. ciris_server-0.3.0/qa/fabric_results.json +627 -0
  81. ciris_server-0.3.0/qa/qa_runner/BILLING_QA_README.md +321 -0
  82. ciris_server-0.3.0/qa/qa_runner/CLAUDE.md +331 -0
  83. ciris_server-0.3.0/qa/qa_runner/README.md +240 -0
  84. ciris_server-0.3.0/qa/qa_runner/SDK_MODULE_INTEGRATION.md +443 -0
  85. ciris_server-0.3.0/qa/qa_runner/__init__.py +11 -0
  86. ciris_server-0.3.0/qa/qa_runner/__main__.py +666 -0
  87. ciris_server-0.3.0/qa/qa_runner/config.py +529 -0
  88. ciris_server-0.3.0/qa/qa_runner/mcp_test_server.py +138 -0
  89. ciris_server-0.3.0/qa/qa_runner/modules/CLAUDE.md +110 -0
  90. ciris_server-0.3.0/qa/qa_runner/modules/MULTI_OCCURRENCE_README.md +122 -0
  91. ciris_server-0.3.0/qa/qa_runner/modules/__init__.py +79 -0
  92. ciris_server-0.3.0/qa/qa_runner/modules/_module_metadata.py +121 -0
  93. ciris_server-0.3.0/qa/qa_runner/modules/accord_metrics_tests.py +1340 -0
  94. ciris_server-0.3.0/qa/qa_runner/modules/accord_tests.py +853 -0
  95. ciris_server-0.3.0/qa/qa_runner/modules/adapter_autoload_tests.py +504 -0
  96. ciris_server-0.3.0/qa/qa_runner/modules/adapter_availability_tests.py +410 -0
  97. ciris_server-0.3.0/qa/qa_runner/modules/adapter_config_tests.py +790 -0
  98. ciris_server-0.3.0/qa/qa_runner/modules/adapter_manifest_tests.py +360 -0
  99. ciris_server-0.3.0/qa/qa_runner/modules/agent_mode_tests.py +252 -0
  100. ciris_server-0.3.0/qa/qa_runner/modules/air_tests.py +280 -0
  101. ciris_server-0.3.0/qa/qa_runner/modules/api_tests.py +365 -0
  102. ciris_server-0.3.0/qa/qa_runner/modules/base_test_module.py +454 -0
  103. ciris_server-0.3.0/qa/qa_runner/modules/billing_integration_tests.py +406 -0
  104. ciris_server-0.3.0/qa/qa_runner/modules/billing_tests.py +272 -0
  105. ciris_server-0.3.0/qa/qa_runner/modules/cirisnode_tests.py +554 -0
  106. ciris_server-0.3.0/qa/qa_runner/modules/cognitive_state_api_tests.py +346 -0
  107. ciris_server-0.3.0/qa/qa_runner/modules/comprehensive_api_tests.py +311 -0
  108. ciris_server-0.3.0/qa/qa_runner/modules/comprehensive_single_step_tests.py +172 -0
  109. ciris_server-0.3.0/qa/qa_runner/modules/consent_tests.py +216 -0
  110. ciris_server-0.3.0/qa/qa_runner/modules/context_enrichment_tests.py +451 -0
  111. ciris_server-0.3.0/qa/qa_runner/modules/deferral_taxonomy_tests.py +121 -0
  112. ciris_server-0.3.0/qa/qa_runner/modules/deferral_tests.py +265 -0
  113. ciris_server-0.3.0/qa/qa_runner/modules/degraded_mode_tests.py +455 -0
  114. ciris_server-0.3.0/qa/qa_runner/modules/desktop_viz.py +304 -0
  115. ciris_server-0.3.0/qa/qa_runner/modules/dream_live_tests.py +439 -0
  116. ciris_server-0.3.0/qa/qa_runner/modules/dsar_multi_source_tests.py +609 -0
  117. ciris_server-0.3.0/qa/qa_runner/modules/dsar_tests.py +177 -0
  118. ciris_server-0.3.0/qa/qa_runner/modules/dsar_ticket_workflow_tests.py +431 -0
  119. ciris_server-0.3.0/qa/qa_runner/modules/filter_test_helper.py +269 -0
  120. ciris_server-0.3.0/qa/qa_runner/modules/filter_tests.py +550 -0
  121. ciris_server-0.3.0/qa/qa_runner/modules/handler_tests.py +545 -0
  122. ciris_server-0.3.0/qa/qa_runner/modules/he300_benchmark_tests.py +647 -0
  123. ciris_server-0.3.0/qa/qa_runner/modules/homeassistant_agentic_tests.py +687 -0
  124. ciris_server-0.3.0/qa/qa_runner/modules/hosted_tools_tests.py +484 -0
  125. ciris_server-0.3.0/qa/qa_runner/modules/identity_update_tests.py +497 -0
  126. ciris_server-0.3.0/qa/qa_runner/modules/l4_attestation_tests.py +278 -0
  127. ciris_server-0.3.0/qa/qa_runner/modules/licensed_agent_tests.py +489 -0
  128. ciris_server-0.3.0/qa/qa_runner/modules/mcp_tests.py +1370 -0
  129. ciris_server-0.3.0/qa/qa_runner/modules/memory_benchmark_tests.py +413 -0
  130. ciris_server-0.3.0/qa/qa_runner/modules/message_id_debug_test.py +146 -0
  131. ciris_server-0.3.0/qa/qa_runner/modules/mobile/__init__.py +92 -0
  132. ciris_server-0.3.0/qa/qa_runner/modules/mobile/__main__.py +1562 -0
  133. ciris_server-0.3.0/qa/qa_runner/modules/mobile/adb_helper.py +691 -0
  134. ciris_server-0.3.0/qa/qa_runner/modules/mobile/device_helper.py +364 -0
  135. ciris_server-0.3.0/qa/qa_runner/modules/mobile/first_time_licensed_agent.py +703 -0
  136. ciris_server-0.3.0/qa/qa_runner/modules/mobile/ios/__init__.py +8 -0
  137. ciris_server-0.3.0/qa/qa_runner/modules/mobile/ios/build_helper.py +659 -0
  138. ciris_server-0.3.0/qa/qa_runner/modules/mobile/ios/idevice_helper.py +867 -0
  139. ciris_server-0.3.0/qa/qa_runner/modules/mobile/ios/ios_ui_automator.py +186 -0
  140. ciris_server-0.3.0/qa/qa_runner/modules/mobile/ios/vision_helper.py +208 -0
  141. ciris_server-0.3.0/qa/qa_runner/modules/mobile/ios/xcrun_helper.py +639 -0
  142. ciris_server-0.3.0/qa/qa_runner/modules/mobile/ios_physical_test_cases.py +1016 -0
  143. ciris_server-0.3.0/qa/qa_runner/modules/mobile/ios_test_cases.py +891 -0
  144. ciris_server-0.3.0/qa/qa_runner/modules/mobile/portal_registration.py +586 -0
  145. ciris_server-0.3.0/qa/qa_runner/modules/mobile/test_cases.py +1823 -0
  146. ciris_server-0.3.0/qa/qa_runner/modules/mobile/test_runner.py +595 -0
  147. ciris_server-0.3.0/qa/qa_runner/modules/mobile/ui_automator.py +370 -0
  148. ciris_server-0.3.0/qa/qa_runner/modules/mobile/verify_trust_tests.py +491 -0
  149. ciris_server-0.3.0/qa/qa_runner/modules/model_eval_tests.py +770 -0
  150. ciris_server-0.3.0/qa/qa_runner/modules/multi_occurrence_tests.py +410 -0
  151. ciris_server-0.3.0/qa/qa_runner/modules/parallel_locales_tests.py +448 -0
  152. ciris_server-0.3.0/qa/qa_runner/modules/partnership_tests.py +165 -0
  153. ciris_server-0.3.0/qa/qa_runner/modules/play_live_tests.py +329 -0
  154. ciris_server-0.3.0/qa/qa_runner/modules/reddit_tests.py +374 -0
  155. ciris_server-0.3.0/qa/qa_runner/modules/safety_battery.py +903 -0
  156. ciris_server-0.3.0/qa/qa_runner/modules/safety_interpret.py +1132 -0
  157. ciris_server-0.3.0/qa/qa_runner/modules/sdk_tests.py +114 -0
  158. ciris_server-0.3.0/qa/qa_runner/modules/secrets_encryption_tests.py +236 -0
  159. ciris_server-0.3.0/qa/qa_runner/modules/setup_e2e_tests.py +681 -0
  160. ciris_server-0.3.0/qa/qa_runner/modules/setup_tests.py +331 -0
  161. ciris_server-0.3.0/qa/qa_runner/modules/simple_single_step_tests.py +78 -0
  162. ciris_server-0.3.0/qa/qa_runner/modules/solitude_live_tests.py +395 -0
  163. ciris_server-0.3.0/qa/qa_runner/modules/sql_external_data_tests.py +858 -0
  164. ciris_server-0.3.0/qa/qa_runner/modules/state_transition_tests.py +425 -0
  165. ciris_server-0.3.0/qa/qa_runner/modules/streaming_verification.py +2053 -0
  166. ciris_server-0.3.0/qa/qa_runner/modules/system_messages_tests.py +225 -0
  167. ciris_server-0.3.0/qa/qa_runner/modules/utility_adapters_tests.py +333 -0
  168. ciris_server-0.3.0/qa/qa_runner/modules/vision_tests.py +382 -0
  169. ciris_server-0.3.0/qa/qa_runner/modules/wallet_tests.py +507 -0
  170. ciris_server-0.3.0/qa/qa_runner/modules/web_ui/CLAUDE.md +174 -0
  171. ciris_server-0.3.0/qa/qa_runner/modules/web_ui/__init__.py +89 -0
  172. ciris_server-0.3.0/qa/qa_runner/modules/web_ui/__main__.py +1676 -0
  173. ciris_server-0.3.0/qa/qa_runner/modules/web_ui/browser_helper.py +476 -0
  174. ciris_server-0.3.0/qa/qa_runner/modules/web_ui/desktop_app_helper.py +734 -0
  175. ciris_server-0.3.0/qa/qa_runner/modules/web_ui/desktop_test.py +152 -0
  176. ciris_server-0.3.0/qa/qa_runner/modules/web_ui/federation_screen_tags.py +272 -0
  177. ciris_server-0.3.0/qa/qa_runner/modules/web_ui/federation_walk_report.py +281 -0
  178. ciris_server-0.3.0/qa/qa_runner/modules/web_ui/federation_walk_test.py +942 -0
  179. ciris_server-0.3.0/qa/qa_runner/modules/web_ui/licensed_agent_flow.py +687 -0
  180. ciris_server-0.3.0/qa/qa_runner/modules/web_ui/server_manager.py +496 -0
  181. ciris_server-0.3.0/qa/qa_runner/modules/web_ui/test_cases.py +1146 -0
  182. ciris_server-0.3.0/qa/qa_runner/modules/web_ui/test_federation_walk_unit.py +299 -0
  183. ciris_server-0.3.0/qa/qa_runner/modules/web_ui/test_runner.py +515 -0
  184. ciris_server-0.3.0/qa/qa_runner/qa_api_test.py +204 -0
  185. ciris_server-0.3.0/qa/qa_runner/qa_reports/qa_report_20250825_073205.json +113 -0
  186. ciris_server-0.3.0/qa/qa_runner/qa_reports/qa_report_20250825_153259.json +221 -0
  187. ciris_server-0.3.0/qa/qa_runner/qa_reports/qa_report_20250825_154628.json +174 -0
  188. ciris_server-0.3.0/qa/qa_runner/qa_reports/qa_report_20250825_154817.json +170 -0
  189. ciris_server-0.3.0/qa/qa_runner/qa_reports/qa_report_20250825_155917.json +373 -0
  190. ciris_server-0.3.0/qa/qa_runner/qa_reports_comprehensive/qa_report_20250825_075504.json +149 -0
  191. ciris_server-0.3.0/qa/qa_runner/qa_reports_final/qa_report_20250825_092420.json +123 -0
  192. ciris_server-0.3.0/qa/qa_runner/qa_reports_test/qa_report_20250825_092452.json +35 -0
  193. ciris_server-0.3.0/qa/qa_runner/qa_scripts/README.md +118 -0
  194. ciris_server-0.3.0/qa/qa_runner/qa_scripts/qa_api_test.py +262 -0
  195. ciris_server-0.3.0/qa/qa_runner/qa_scripts/qa_v1.0_sdk_comprehensive.py +243 -0
  196. ciris_server-0.3.0/qa/qa_runner/qa_scripts/qa_v1.0_unhealthy_services_check.py +89 -0
  197. ciris_server-0.3.0/qa/qa_runner/qa_test.py +272 -0
  198. ciris_server-0.3.0/qa/qa_runner/qa_test_sdk.py +434 -0
  199. ciris_server-0.3.0/qa/qa_runner/requirements.txt +5 -0
  200. ciris_server-0.3.0/qa/qa_runner/runner.py +2717 -0
  201. ciris_server-0.3.0/qa/qa_runner/scripts/__init__.py +0 -0
  202. ciris_server-0.3.0/qa/qa_runner/scripts/he300_stream_debug.py +70 -0
  203. ciris_server-0.3.0/qa/qa_runner/server.py +1682 -0
  204. ciris_server-0.3.0/qa/qa_runner/staged_env.py +269 -0
  205. ciris_server-0.3.0/qa/qa_runner/status_tracker.py +244 -0
  206. ciris_server-0.3.0/qa/qa_runner/test_data/dsar_multi_source_privacy_schema.yaml +28 -0
  207. ciris_server-0.3.0/qa/qa_runner/test_data/qa_test.db +0 -0
  208. ciris_server-0.3.0/qa/qa_runner/test_data/qa_test_privacy_schema.yaml +40 -0
  209. ciris_server-0.3.0/qa/qa_runner/test_data/sql_config.json +9 -0
  210. ciris_server-0.3.0/qa/run_fabric.py +313 -0
  211. ciris_server-0.3.0/qa/seed_wa_cert.py +65 -0
  212. {ciris_server-0.2.6 → ciris_server-0.3.0}/scripts/bench_report.py +30 -18
  213. ciris_server-0.3.0/src/auth/ABSORPTION.md +163 -0
  214. ciris_server-0.3.0/src/auth/api_keys.rs +306 -0
  215. ciris_server-0.3.0/src/auth/attestation.rs +138 -0
  216. ciris_server-0.3.0/src/auth/consent.rs +140 -0
  217. ciris_server-0.3.0/src/auth/device_auth.rs +391 -0
  218. ciris_server-0.3.0/src/auth/erasure.rs +108 -0
  219. ciris_server-0.3.0/src/auth/gate.rs +47 -0
  220. ciris_server-0.3.0/src/auth/mod.rs +41 -0
  221. ciris_server-0.3.0/src/auth/oauth.rs +961 -0
  222. ciris_server-0.3.0/src/auth/roles.rs +508 -0
  223. ciris_server-0.3.0/src/auth/self_login.rs +167 -0
  224. ciris_server-0.3.0/src/auth/session.rs +436 -0
  225. ciris_server-0.3.0/src/auth/store.rs +121 -0
  226. ciris_server-0.3.0/src/auth/verify.rs +100 -0
  227. {ciris_server-0.2.6 → ciris_server-0.3.0}/src/compose.rs +23 -1
  228. {ciris_server-0.2.6 → ciris_server-0.3.0}/src/lib.rs +102 -1
  229. ciris_server-0.3.0/tests/chaos_mesh.rs +234 -0
  230. ciris_server-0.3.0/tests/noise_floor.rs +587 -0
  231. ciris_server-0.2.6/tests/chaos_mesh.rs +0 -111
  232. {ciris_server-0.2.6 → ciris_server-0.3.0}/.cargo/config.toml +0 -0
  233. {ciris_server-0.2.6 → ciris_server-0.3.0}/.github/workflows/conformance.yml +0 -0
  234. {ciris_server-0.2.6 → ciris_server-0.3.0}/.gitignore +0 -0
  235. {ciris_server-0.2.6 → ciris_server-0.3.0}/FSD/REGISTRY_FOLD_DERISK.md +0 -0
  236. {ciris_server-0.2.6 → ciris_server-0.3.0}/FSD/SERVER_1.0_PLAN.md +0 -0
  237. {ciris_server-0.2.6 → ciris_server-0.3.0}/LICENSE +0 -0
  238. {ciris_server-0.2.6 → ciris_server-0.3.0}/MISSION.md +0 -0
  239. {ciris_server-0.2.6 → ciris_server-0.3.0}/bench-site/data.json +0 -0
  240. {ciris_server-0.2.6 → ciris_server-0.3.0}/bench-site/index.html +0 -0
  241. {ciris_server-0.2.6 → ciris_server-0.3.0}/benches/alm_chain.rs +0 -0
  242. {ciris_server-0.2.6 → ciris_server-0.3.0}/benches/pqc_av_streaming.rs +0 -0
  243. {ciris_server-0.2.6 → ciris_server-0.3.0}/benches/replication_ingest.rs +0 -0
  244. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/.github/workflows/bench.yml +0 -0
  245. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/.github/workflows/ci.yml +0 -0
  246. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/.gitignore +0 -0
  247. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/.pre-commit-config.yaml +0 -0
  248. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/FSD/CIRIS_LENS_CORE.md +0 -0
  249. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/FSD/LENS_CORE_V0_5.md +0 -0
  250. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/FSD/OPEN_QUESTIONS.md +0 -0
  251. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/LICENSE +0 -0
  252. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/MISSION.md +0 -0
  253. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/README.md +0 -0
  254. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/benches/aggregate.rs +0 -0
  255. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/benches/canonicalize.rs +0 -0
  256. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/benches/project.rs +0 -0
  257. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/deny.toml +0 -0
  258. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/docs/BENCHMARKS.md +0 -0
  259. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/docs/COHABITATION.md +0 -0
  260. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/docs/PRE_COMMIT.md +0 -0
  261. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/docs/PUBLIC_SCHEMA_CONTRACT.md +0 -0
  262. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/docs/PYPI_PUBLISH.md +0 -0
  263. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/docs/RELEASE_NOTES.md +0 -0
  264. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/docs/STANDARDS_COMPARISON.md +0 -0
  265. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/docs/THREAT_MODEL.md +0 -0
  266. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/patterns_from_cirislens_core/extraction/json_path.rs +0 -0
  267. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/patterns_from_cirislens_core/extraction/metadata.rs +0 -0
  268. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/patterns_from_cirislens_core/extraction/mod.rs +0 -0
  269. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/patterns_from_cirislens_core/scrubber/distilbert_loader.rs +0 -0
  270. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/patterns_from_cirislens_core/scrubber/fields.rs +0 -0
  271. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/patterns_from_cirislens_core/scrubber/mod.rs +0 -0
  272. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/patterns_from_cirislens_core/scrubber/ner.rs +0 -0
  273. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/patterns_from_cirislens_core/scrubber/ort_loader.rs +0 -0
  274. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/patterns_from_cirislens_core/scrubber/proptests.rs +0 -0
  275. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/patterns_from_cirislens_core/scrubber/regex.rs +0 -0
  276. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/patterns_from_cirislens_core/scrubber/walker.rs +0 -0
  277. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/patterns_from_cirislens_core/scrubber/xlm_r_loader.rs +0 -0
  278. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/pyproject.toml +0 -0
  279. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/python/ciris_lens_core/__init__.py +0 -0
  280. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/src/audit/api.rs +0 -0
  281. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/src/audit/delegate.rs +0 -0
  282. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/src/audit/mod.rs +0 -0
  283. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/src/audit/pyo3.rs +0 -0
  284. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/src/canonical/ceg_egress.rs +0 -0
  285. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/src/canonical/mod.rs +0 -0
  286. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/src/capacity/attestation.rs +0 -0
  287. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/src/capacity/mod.rs +0 -0
  288. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/src/capacity/score.rs +0 -0
  289. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/src/capture/batch.rs +0 -0
  290. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/src/capture/client.rs +0 -0
  291. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/src/capture/consent.rs +0 -0
  292. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/src/capture/correlation.rs +0 -0
  293. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/src/capture/event.rs +0 -0
  294. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/src/capture/mod.rs +0 -0
  295. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/src/capture/partial.rs +0 -0
  296. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/src/capture/py_engine.rs +0 -0
  297. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/src/capture/seal.rs +0 -0
  298. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/src/cohort/declared.rs +0 -0
  299. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/src/cohort/mod.rs +0 -0
  300. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/src/cohort/resourcing.rs +0 -0
  301. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/src/config/egress.rs +0 -0
  302. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/src/config/mod.rs +0 -0
  303. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/src/config/node.rs +0 -0
  304. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/src/config/retention.rs +0 -0
  305. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/src/config/upstream.rs +0 -0
  306. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/src/detector/axis_metrics.rs +0 -0
  307. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/src/detector/coherence_ratchet.rs +0 -0
  308. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/src/detector/correlated_action.rs +0 -0
  309. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/src/detector/distributive_access.rs +0 -0
  310. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/src/detector/manifold.rs +0 -0
  311. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/src/detector/mod.rs +0 -0
  312. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/src/extract/mod.rs +0 -0
  313. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/src/extract/projection.rs +0 -0
  314. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/src/ffi/mod.rs +0 -0
  315. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/src/ffi/pyo3.rs +0 -0
  316. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/src/lib.rs +0 -0
  317. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/src/observability/mod.rs +0 -0
  318. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/src/pipeline/lifecycle.rs +0 -0
  319. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/src/pipeline/mod.rs +0 -0
  320. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/src/retention/eviction.rs +0 -0
  321. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/src/retention/mod.rs +0 -0
  322. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/src/retention/summary.rs +0 -0
  323. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/src/role/handler.rs +0 -0
  324. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/src/role/mod.rs +0 -0
  325. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/src/role/relay.rs +0 -0
  326. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/src/role/ret_relay.rs +0 -0
  327. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/src/scores/aggregate.rs +0 -0
  328. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/src/scores/mod.rs +0 -0
  329. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/src/scores/oracle.rs +0 -0
  330. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/src/scoring/assembly.rs +0 -0
  331. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/src/scoring/axis_calibration.rs +0 -0
  332. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/src/scoring/calibration.rs +0 -0
  333. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/src/scoring/capacity.rs +0 -0
  334. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/src/scoring/mod.rs +0 -0
  335. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/src/scoring/n_eff.rs +0 -0
  336. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/src/scoring/result.rs +0 -0
  337. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/src/signing/event.rs +0 -0
  338. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/src/signing/mod.rs +0 -0
  339. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/src/wire/mod.rs +0 -0
  340. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/src/wire/signer.rs +0 -0
  341. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/tests/parity/README.md +0 -0
  342. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/tests/parity/canonical_fixtures.json +0 -0
  343. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/tests/parity/generate_canonical_fixtures.py +0 -0
  344. {ciris_server-0.2.6 → ciris_server-0.3.0}/crates/ciris-lens-core/tests/sovereign_rlib.rs +0 -0
  345. {ciris_server-0.2.6 → ciris_server-0.3.0}/pyproject.toml +0 -0
  346. {ciris_server-0.2.6 → ciris_server-0.3.0}/rust-toolchain.toml +0 -0
  347. {ciris_server-0.2.6 → ciris_server-0.3.0}/src/benchmarks/mod.rs +0 -0
  348. {ciris_server-0.2.6 → ciris_server-0.3.0}/src/benchmarks/scoreboard.rs +0 -0
  349. {ciris_server-0.2.6 → ciris_server-0.3.0}/src/config.rs +0 -0
  350. {ciris_server-0.2.6 → ciris_server-0.3.0}/src/import.rs +0 -0
  351. {ciris_server-0.2.6 → ciris_server-0.3.0}/src/main.rs +0 -0
  352. {ciris_server-0.2.6 → ciris_server-0.3.0}/src/quorum.rs +0 -0
  353. {ciris_server-0.2.6 → ciris_server-0.3.0}/tests/alm_chain.rs +0 -0
  354. {ciris_server-0.2.6 → ciris_server-0.3.0}/tests/replication.rs +0 -0
@@ -52,7 +52,7 @@ jobs:
52
52
  with:
53
53
  python-version: "3.12"
54
54
  - name: Run benches (criterion)
55
- run: cargo bench --bench pqc_av_streaming --bench replication_ingest --bench alm_chain
55
+ run: cargo bench --bench pqc_av_streaming --bench replication_ingest --bench alm_chain --bench stream_fanout
56
56
  - name: Generate holonomic scoreboard (CIRISServer#12/#13)
57
57
  run: cargo run --release --quiet -- scoreboard > scoreboard.json
58
58
  - name: Generate interpreted page
@@ -46,6 +46,16 @@ jobs:
46
46
  # `extension-module` (libpython-no-link) into the test binary.
47
47
  - run: cargo clippy --all-targets -- -D warnings
48
48
  - run: cargo test
49
+ # The NOISE FLOOR proof (CIRISServer#14, CEG §19.7 / §19.3 N5) — provable
50
+ # individual-unrecoverability for erasure compliance, run explicitly so the
51
+ # MEASURED residual-fidelity numbers land in the CI log (Linux only — one
52
+ # canonical record; the test also runs on every OS via `cargo test` above).
53
+ # The three gated cases: (a) revocation ⇒ EjectHardDelete leaves NO
54
+ # recoverable tier, (b) the measured noise floor below n_source symbols,
55
+ # (c) N→1 aggregation erases the individual below the 1/N gist bound.
56
+ - name: Noise floor proof (MEASURED, Linux)
57
+ if: runner.os == 'Linux'
58
+ run: cargo test --test noise_floor -- --nocapture
49
59
  # The PyO3 wheel surface (Linux only; libpython linked, no extension-module).
50
60
  - name: clippy (python surface, Linux)
51
61
  if: runner.os == 'Linux'
@@ -243,3 +243,7 @@ jobs:
243
243
  packages-dir: dist/
244
244
  # Trusted Publishing: no `password:` — the OIDC identity is verified
245
245
  # against the publisher registered on PyPI.
246
+ # Idempotent re-cuts: if a tag is re-cut onto a new commit, the wheels
247
+ # for any platform already on PyPI are skipped instead of 400-ing the
248
+ # whole upload — a clean re-cut publishes only the newly-built files.
249
+ skip-existing: true
@@ -38,19 +38,26 @@ jobs:
38
38
  build-native:
39
39
  name: Build (${{ matrix.target }})
40
40
  runs-on: ${{ matrix.os }}
41
+ # Allowed-to-fail lanes (the TPM backend can't cross-compile) never block the
42
+ # release; see the armv7 entry + the build-musl job.
43
+ continue-on-error: ${{ matrix.allow_fail || false }}
41
44
  strategy:
42
45
  fail-fast: false
43
46
  matrix:
44
47
  include:
45
48
  - os: ubuntu-latest
46
49
  target: x86_64-unknown-linux-gnu
47
- - os: ubuntu-latest
50
+ # ARM64 builds NATIVELY on an ARM runner (apt libtss2-dev applies) —
51
+ # cross-compiling tss-esapi from x86 has no target libtss2.
52
+ - os: ubuntu-24.04-arm
48
53
  target: aarch64-unknown-linux-gnu
49
- cross: true
50
- # ARM32 — Raspberry Pi / embedded mesh nodes.
54
+ # ARM32 — Raspberry Pi / embedded mesh nodes. Cross-builds the TPM
55
+ # backend with no target libtss2 → allowed-to-fail (CIRISServer#7);
56
+ # never blocks the release.
51
57
  - os: ubuntu-latest
52
58
  target: armv7-unknown-linux-gnueabihf
53
59
  cross: true
60
+ allow_fail: true
54
61
  - os: macos-latest
55
62
  target: x86_64-apple-darwin
56
63
  - os: macos-latest
@@ -134,6 +141,9 @@ jobs:
134
141
  build-musl:
135
142
  name: Build (aarch64 musl)
136
143
  runs-on: ubuntu-latest
144
+ # zigbuild cross can't satisfy the TPM backend's target libtss2 — allowed to
145
+ # fail so it never blocks the release (aarch64-gnu native covers ARM64 Linux).
146
+ continue-on-error: true
137
147
  steps:
138
148
  - uses: actions/checkout@v4
139
149
  - uses: dtolnay/rust-toolchain@stable
@@ -170,6 +180,10 @@ jobs:
170
180
  create-release:
171
181
  name: Create Release
172
182
  needs: [build-native, build-musl]
183
+ # Run as long as the build stage finished (not cancelled) — the allowed-to-fail
184
+ # ARM lanes (armv7 cross, aarch64 musl) must not skip the release; it ships
185
+ # whatever built (x86_64 linux/mac/win + aarch64-linux-gnu native).
186
+ if: ${{ !cancelled() }}
173
187
  runs-on: ubuntu-latest
174
188
  steps:
175
189
  - uses: actions/checkout@v4
@@ -4,6 +4,67 @@ All notable changes to CIRISServer. Format follows [Keep a Changelog](https://ke
4
4
  this project uses [Semantic Versioning](https://semver.org/). The minor line tracks
5
5
  the fabric-node scope (0.1 lens · 0.5 +registry · 1.0 +node), paced by the CIRISAgent train.
6
6
 
7
+ ## [0.3.0] — 2026-06-16
8
+
9
+ The integrated fabric node: the **auth subsystem** absorbed, the **one-wheel**
10
+ re-export surface, and the substrate on the **v8.4.0 / v4.3.0 / v5.10.0** floor.
11
+ This is the node we replace the deployed CIRISLens with (and the wheel CIRISAgent
12
+ adopts to drop its lens-core + its own auth).
13
+
14
+ ### Added
15
+ - **Auth subsystem (`src/auth/`, CIRISServer#9) — the fabric is the single auth
16
+ authority.** The agent's entire user/WA/OAuth/api-key/service-token surface
17
+ already lived in one persist table (`wa_cert`), so this is a Python→Rust port
18
+ over the same rows — **no schema fork, 0 conflicts** (`src/auth/ABSORPTION.md`:
19
+ 33 capabilities mapped). One `x-ciris-*` hybrid request verifier (accepts the
20
+ identity **or** any admitted occurrence — the consenting user *and* the
21
+ generating agent are both valid signers); **self-at-login** (§8.1.12.7) as the
22
+ login ceremony; OAuth front-door (providers/login/callback + native
23
+ google/apple); sessions/token issuer (replaces OAuth→WA→JWT); the CEG role-set
24
+ **plus** the agent's `UserRole`/`Permission` model verbatim; api-keys +
25
+ service-token revocation; attestation; user-signed **consent**; and CEG-native
26
+ **erasure** (GDPR Art. 17 in-app path → `Engine::evict_actor`). Password KDF,
27
+ native-token JWKS, and root-signature verification are byte-compatible with the
28
+ agent's own crypto (verified against agent-produced vectors).
29
+ - **One-wheel re-export (CIRISServer#4):** `ciris_server` re-hosts the persist /
30
+ edge / lens Python surfaces under one `.so` (one PyO3 type registry —
31
+ `ciris_server.Engine is ciris_server.persist.Engine`), so CIRISAgent consumes a
32
+ single wheel and the cross-wheel type-identity bug class (CIRISPersist#109)
33
+ cannot occur. (`reset_engine` / `init_edge_runtime` re-export hooks pending
34
+ upstream: CIRISPersist#231, CIRISEdge#156; `ciris-verify` stays a standalone
35
+ ctypes wheel.)
36
+ - **Noise-floor compliance bench (CIRISServer#14, `tests/noise_floor.rs`):**
37
+ measured individual-unrecoverability — revocation → hard-delete, the
38
+ reconstruction cliff at the fountain floor, aggregation-is-erasure.
39
+ - **The fabric app (`app/`, CIRISServer#15):** the CIRISAgent KMP mesh app minus
40
+ agent cards (identity slice proven; governance/safety surfaces).
41
+
42
+ ### Changed
43
+ - Substrate floor → **persist v8.4.0 / edge v4.3.0 / verify-family v5.10.0** (the
44
+ §19.7 erasure primitives + `wa_cert` auth substrate).
45
+
46
+ ### Validated
47
+ - **Behavior-correct drop-in proof (`qa/`, `FSD/QA_AGAINST_RUST.md`).** The agent's
48
+ own Python QA-runner module definitions are run unmodified against a live Rust
49
+ `ciris-server`: **12/12 fabric-route tests pass, 0 gaps** — including the
50
+ load-bearing byte-compat proof that a password hash produced by the agent's own
51
+ `cryptography.PBKDF2HMAC` authenticates against the Rust `verify_password`. The
52
+ ~30 agent-brain modules are correctly N/A on a headless fabric node. The QA
53
+ runner stays Python (it is HTTP-driving conformance, not ported).
54
+
55
+ ### Fixed
56
+ - **api-keys / service-token routes are now authz-gated.** `POST/GET/DELETE
57
+ /v1/auth/api-keys*` and `/v1/auth/service-token/revoke` now require a live
58
+ session bearer whose role carries `manage_user_permissions` (matching the
59
+ agent's gate) — the one residual the conformance run surfaced.
60
+
61
+ ### Notes
62
+ - Companion: **CIRISStatus** becomes a fabric monitoring node (Flows A/B +
63
+ `health:liveness` `scores` + website sockets).
64
+ - GDPR erasure is **both** entry points: the DSAR endpoint on the monitor node
65
+ **and** the in-app CEG-native `withdraws`. Full lens decommission stays gated on
66
+ the DSAR-via-status endpoint landing (keep the Python DSAR reachable until then).
67
+
7
68
  ## [0.2.6] — 2026-06-16
8
69
 
9
70
  Substrate floor → **v4.2.0 family** + the **multi-tier ALM relay chain** test
@@ -812,8 +812,8 @@ dependencies = [
812
812
 
813
813
  [[package]]
814
814
  name = "ciris-crypto"
815
- version = "5.9.0"
816
- source = "git+https://github.com/CIRISAI/CIRISVerify?tag=v5.9.0#27fc6dab0fd2efa58bea8648bc241c3852d9435f"
815
+ version = "5.10.0"
816
+ source = "git+https://github.com/CIRISAI/CIRISVerify?tag=v5.10.0#be2511433a2ef14d315571655933ecf9d05699e1"
817
817
  dependencies = [
818
818
  "ed25519-dalek",
819
819
  "hex",
@@ -838,8 +838,8 @@ dependencies = [
838
838
 
839
839
  [[package]]
840
840
  name = "ciris-edge"
841
- version = "4.2.0"
842
- source = "git+https://github.com/CIRISAI/CIRISEdge?tag=v4.2.0#08d9e05a672d2978dd65230d398d78e0a6f7586b"
841
+ version = "4.3.0"
842
+ source = "git+https://github.com/CIRISAI/CIRISEdge?tag=v4.3.0#ab4f1bc49783faa470472ea577a3f4cf10b37e28"
843
843
  dependencies = [
844
844
  "async-trait",
845
845
  "axum",
@@ -863,6 +863,7 @@ dependencies = [
863
863
  "pyo3",
864
864
  "pyo3-async-runtimes",
865
865
  "qrcodegen",
866
+ "raptorq",
866
867
  "rcgen",
867
868
  "reqwest",
868
869
  "reticulum-core",
@@ -889,8 +890,8 @@ dependencies = [
889
890
 
890
891
  [[package]]
891
892
  name = "ciris-keyring"
892
- version = "5.9.0"
893
- source = "git+https://github.com/CIRISAI/CIRISVerify?tag=v5.9.0#27fc6dab0fd2efa58bea8648bc241c3852d9435f"
893
+ version = "5.10.0"
894
+ source = "git+https://github.com/CIRISAI/CIRISVerify?tag=v5.10.0#be2511433a2ef14d315571655933ecf9d05699e1"
894
895
  dependencies = [
895
896
  "aes-gcm",
896
897
  "async-trait",
@@ -953,8 +954,8 @@ dependencies = [
953
954
 
954
955
  [[package]]
955
956
  name = "ciris-persist"
956
- version = "8.2.0"
957
- source = "git+https://github.com/CIRISAI/CIRISPersist?tag=v8.2.0#0d12e232339f604a77e8ffc030eef0bccd7d5e8e"
957
+ version = "8.4.0"
958
+ source = "git+https://github.com/CIRISAI/CIRISPersist?tag=v8.4.0#7b40aae71cc17683f5cfb9553f1d484d267f1970"
958
959
  dependencies = [
959
960
  "async-trait",
960
961
  "base64 0.22.1",
@@ -993,9 +994,10 @@ dependencies = [
993
994
 
994
995
  [[package]]
995
996
  name = "ciris-server"
996
- version = "0.2.6"
997
+ version = "0.3.0"
997
998
  dependencies = [
998
999
  "anyhow",
1000
+ "async-trait",
999
1001
  "axum",
1000
1002
  "base64 0.22.1",
1001
1003
  "chrono",
@@ -1010,19 +1012,27 @@ dependencies = [
1010
1012
  "flate2",
1011
1013
  "fs2",
1012
1014
  "getrandom 0.3.4",
1015
+ "hex",
1016
+ "hmac 0.12.1",
1017
+ "jsonwebtoken",
1018
+ "pbkdf2",
1013
1019
  "pyo3",
1014
1020
  "pyo3-async-runtimes",
1021
+ "reqwest",
1015
1022
  "serde",
1016
1023
  "serde_json",
1024
+ "sha2 0.10.9",
1025
+ "subtle",
1017
1026
  "tokio",
1018
1027
  "tracing",
1019
1028
  "tracing-subscriber",
1029
+ "urlencoding",
1020
1030
  ]
1021
1031
 
1022
1032
  [[package]]
1023
1033
  name = "ciris-verify-core"
1024
- version = "5.9.0"
1025
- source = "git+https://github.com/CIRISAI/CIRISVerify?tag=v5.9.0#27fc6dab0fd2efa58bea8648bc241c3852d9435f"
1034
+ version = "5.10.0"
1035
+ source = "git+https://github.com/CIRISAI/CIRISVerify?tag=v5.10.0#be2511433a2ef14d315571655933ecf9d05699e1"
1026
1036
  dependencies = [
1027
1037
  "android_system_properties",
1028
1038
  "anyhow",
@@ -1242,7 +1252,7 @@ dependencies = [
1242
1252
  "criterion-plot",
1243
1253
  "futures",
1244
1254
  "is-terminal",
1245
- "itertools 0.10.5",
1255
+ "itertools",
1246
1256
  "num-traits",
1247
1257
  "once_cell",
1248
1258
  "oorandom",
@@ -1264,7 +1274,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
1264
1274
  checksum = "6b50826342786a51a89e2da3a28f1c32b06e387201bc2d19791f622c673706b1"
1265
1275
  dependencies = [
1266
1276
  "cast",
1267
- "itertools 0.10.5",
1277
+ "itertools",
1268
1278
  ]
1269
1279
 
1270
1280
  [[package]]
@@ -2828,15 +2838,6 @@ dependencies = [
2828
2838
  "either",
2829
2839
  ]
2830
2840
 
2831
- [[package]]
2832
- name = "itertools"
2833
- version = "0.12.1"
2834
- source = "registry+https://github.com/rust-lang/crates.io-index"
2835
- checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569"
2836
- dependencies = [
2837
- "either",
2838
- ]
2839
-
2840
2841
  [[package]]
2841
2842
  name = "itoa"
2842
2843
  version = "1.0.18"
@@ -2933,9 +2934,11 @@ checksum = "5a87cc7a48537badeae96744432de36f4be2b4a34a05a5ef32e9dd8a1c169dde"
2933
2934
  dependencies = [
2934
2935
  "base64 0.22.1",
2935
2936
  "js-sys",
2937
+ "pem",
2936
2938
  "ring",
2937
2939
  "serde",
2938
2940
  "serde_json",
2941
+ "simple_asn1",
2939
2942
  ]
2940
2943
 
2941
2944
  [[package]]
@@ -4392,7 +4395,7 @@ checksum = "22505a5c94da8e3b7c2996394d1c933236c4d743e81a410bcca4e6989fc066a4"
4392
4395
  dependencies = [
4393
4396
  "bytes",
4394
4397
  "heck",
4395
- "itertools 0.12.1",
4398
+ "itertools",
4396
4399
  "log",
4397
4400
  "multimap",
4398
4401
  "once_cell",
@@ -4412,7 +4415,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
4412
4415
  checksum = "81bddcdb20abf9501610992b6759a4c888aef7d1a7247ef75e2404275ac24af1"
4413
4416
  dependencies = [
4414
4417
  "anyhow",
4415
- "itertools 0.12.1",
4418
+ "itertools",
4416
4419
  "proc-macro2",
4417
4420
  "quote",
4418
4421
  "syn 2.0.117",
@@ -4681,6 +4684,12 @@ dependencies = [
4681
4684
  "rand_core 0.9.5",
4682
4685
  ]
4683
4686
 
4687
+ [[package]]
4688
+ name = "raptorq"
4689
+ version = "2.0.1"
4690
+ source = "registry+https://github.com/rust-lang/crates.io-index"
4691
+ checksum = "4d4215fb79ef19442a0c71616aabb0715a386e6a16ed9031775ee3e3f20e7502"
4692
+
4684
4693
  [[package]]
4685
4694
  name = "rayon"
4686
4695
  version = "1.12.0"
@@ -5583,6 +5592,18 @@ version = "0.3.9"
5583
5592
  source = "registry+https://github.com/rust-lang/crates.io-index"
5584
5593
  checksum = "703d5c7ef118737c72f1af64ad2f6f8c5e1921f818cdcb97b8fe6fc69bf66214"
5585
5594
 
5595
+ [[package]]
5596
+ name = "simple_asn1"
5597
+ version = "0.6.4"
5598
+ source = "registry+https://github.com/rust-lang/crates.io-index"
5599
+ checksum = "0d585997b0ac10be3c5ee635f1bab02d512760d14b7c468801ac8a01d9ae5f1d"
5600
+ dependencies = [
5601
+ "num-bigint",
5602
+ "num-traits",
5603
+ "thiserror 2.0.18",
5604
+ "time",
5605
+ ]
5606
+
5586
5607
  [[package]]
5587
5608
  name = "siphasher"
5588
5609
  version = "1.0.3"
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "ciris-server"
3
- version = "0.2.6" # 0.1 = lens-only (agent ~2.9.7); 0.5 = +registry (~2.9.8); 1.0 = +node (~2.9.10). Patch forward (0.1.1) on breakage.
3
+ version = "0.3.0" # 0.1 = lens-only (agent ~2.9.7); 0.3 = +auth subsystem / one-wheel; 0.5 = +registry (~2.9.8); 1.0 = +node (~2.9.10). Patch forward on breakage.
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.
@@ -37,10 +37,32 @@ path = "src/main.rs"
37
37
  default = []
38
38
  # `python` pulls the PyO3 bindings (for the wheel). The binary builds WITHOUT it,
39
39
  # so a plain `cargo build` never links libpython.
40
- python = ["dep:pyo3", "dep:pyo3-async-runtimes", "ciris-lens-core/python"]
40
+ # ONE-WHEEL RE-EXPORT (CIRISServer#4): `python` ALSO turns on the substrate
41
+ # crates' OWN pyo3 surfaces (`ciris-persist/pyo3`, `ciris-edge/pyo3`) so their
42
+ # `#[pyclass]`es compile into THIS cdylib — one `.so`, one PyO3 type registry,
43
+ # so the persist `Engine` handed to edge is the SAME type both sides see (the
44
+ # CIRISPersist#109 cross-wheel type-identity bug CANNOT occur). persist names its
45
+ # feature `pyo3` (not `python`); edge likewise, and edge's `pyo3` already pulls
46
+ # `ciris-persist/pyo3` transitively — both listed for explicitness. verify is
47
+ # deliberately ABSENT: it is a ctypes wheel (libciris_verify_ffi.so via
48
+ # ctypes.CDLL), not a `#[pymodule]`, so it cannot be a pyo3 submodule.
49
+ python = [
50
+ "dep:pyo3",
51
+ "dep:pyo3-async-runtimes",
52
+ "ciris-lens-core/python",
53
+ "ciris-persist/pyo3",
54
+ "ciris-edge/pyo3",
55
+ ]
41
56
  # `extension-module` is what maturin builds the wheel with (tells PyO3 not to
42
57
  # link libpython). The bin must NOT enable it. See pyproject.toml [tool.maturin].
43
- extension-module = ["python", "pyo3/extension-module"]
58
+ # Propagated to the substrate crates so THEIR pyo3 surfaces also skip linking
59
+ # libpython (each crate gates `extension-module` as its own feature).
60
+ extension-module = [
61
+ "python",
62
+ "pyo3/extension-module",
63
+ "ciris-persist/extension-module",
64
+ "ciris-edge/extension-module",
65
+ ]
44
66
  # NOTE: hardware key custody (TPM/SE/StrongBox) is wired per-TARGET below, not as
45
67
  # a cargo feature — TPM (tss-esapi) is Linux-only, so a top-level `tpm` feature
46
68
  # made `--all-features` drag tss-esapi onto Windows/macOS (where it can't build).
@@ -54,7 +76,7 @@ extension-module = ["python", "pyo3/extension-module"]
54
76
  # libraries over ONE shared persist Engine (registry + lens read/write the same
55
77
  # corpus in-process; per-slice views via Engine::from_shared).
56
78
  #
57
- # Substrate floor (SHIPPED): persist v8.2.0 / edge v4.2.0 / verify-family v5.9.0
79
+ # Substrate floor (SHIPPED): persist v8.4.0 / edge v4.3.0 / verify-family v5.10.0
58
80
  # (ciris-keyring + ciris-crypto + ciris-verify-core), CEG 1.0-RC12. The composition
59
81
  # root pins the singleton construction; the in-tree ciris-lens-core co-bumps in
60
82
  # lockstep (MAJOR caret pins persist "8" / edge "4"). edge v4.2.0 ships the relay
@@ -76,16 +98,19 @@ ciris-lens-core = { path = "crates/ciris-lens-core" } # ABSORBED in-tree (wo
76
98
  # sqlite on all platforms; postgres is Linux-only (libpq/openssl don't link
77
99
  # cleanly on the macOS/Windows runners — same posture as persist's own CI). The
78
100
  # `[target.linux]` table below adds postgres.
79
- ciris-persist = { git = "https://github.com/CIRISAI/CIRISPersist", tag = "v8.2.0", features = ["sqlite"] }
80
- ciris-edge = { git = "https://github.com/CIRISAI/CIRISEdge", tag = "v4.2.0", features = ["transport-reticulum", "transport-http"] }
101
+ # `cirislens_wa_cert` + `cirislens_service_token_revocation` expose the auth
102
+ # substrate the fabric absorbs (CIRISServer#9, src/auth): the agent's `wa_cert`
103
+ # table (users/WA/OAuth/api-keys) + the `revoked_service_tokens` table.
104
+ ciris-persist = { git = "https://github.com/CIRISAI/CIRISPersist", tag = "v8.4.0", features = ["sqlite", "cirislens_wa_cert", "cirislens_service_token_revocation"] }
105
+ ciris-edge = { git = "https://github.com/CIRISAI/CIRISEdge", tag = "v4.3.0", features = ["transport-reticulum", "transport-http"] }
81
106
  # Founder-quorum verification + key-id fingerprint at the composition root
82
107
  # (threshold:: module path — NOT re-exported at the crate root).
83
- ciris-verify-core = { git = "https://github.com/CIRISAI/CIRISVerify", tag = "v5.9.0" }
108
+ ciris-verify-core = { git = "https://github.com/CIRISAI/CIRISVerify", tag = "v5.10.0" }
84
109
  # Hardware-backed transport-identity keystore (verify v5.2.0 #68 / edge #99).
85
110
  # Base = software keystore + byte-identical migration of an existing .rid (works
86
111
  # everywhere, no libtss2). The real TPM-2.0 / SE / StrongBox backend rides the
87
112
  # `tpm` feature; runtime auto-detects hardware and falls back to software.
88
- ciris-keyring = { git = "https://github.com/CIRISAI/CIRISVerify", tag = "v5.9.0", version = "5", features = ["software", "pqc-ml-dsa"] }
113
+ ciris-keyring = { git = "https://github.com/CIRISAI/CIRISVerify", tag = "v5.10.0", version = "5", features = ["software", "pqc-ml-dsa"] }
89
114
 
90
115
  # PyO3 bindings for the abi3 wheel — optional, gated behind the `python` feature
91
116
  # so the binary never links them. 0.29 matches the persist/edge family floor.
@@ -102,6 +127,31 @@ base64 = "0.22"
102
127
  serde = { version = "1", features = ["derive"] } # holonomic scoreboard model (benchmarks::)
103
128
  serde_json = "1"
104
129
  getrandom = "0.3" # mint the ML-DSA-65 federation seed on first boot (hybrid PQC)
130
+ # Auth subsystem (src/auth, CIRISServer#9): timestamps on the absorbed wa_cert
131
+ # rows, SHA-256 for api-key / service-token hashing, hex for the digest wire form.
132
+ # All three already in the lock as substrate-transitive deps (no new resolution).
133
+ chrono = { version = "0.4", features = ["serde"] }
134
+ sha2 = "0.10"
135
+ hex = "0.4"
136
+ # Auth gap-close (CIRISServer#9, src/auth): the byte-compatible password KDF +
137
+ # the OAuth/native/device-auth outbound-HTTP + JWKS-verify halves. All already in
138
+ # the lock as substrate-transitive deps (reqwest/jsonwebtoken via edge+verify;
139
+ # pbkdf2/hmac/ed25519-dalek via the crypto family) — pinned here so the auth
140
+ # subsystem owns them directly, no new resolution.
141
+ # - pbkdf2 + hmac: reproduce the agent's PBKDF2-HMAC-SHA256(100k) password hash
142
+ # (auth_service.py `_hash_password`/`_verify_password`) byte-for-byte.
143
+ # - ed25519-dalek: verify the ROOT mint signature (the agent's `verify_root_signature`).
144
+ # - jsonwebtoken: Apple Sign-In RS256 JWKS verification.
145
+ # - reqwest (rustls): Google tokeninfo / OAuth code→token / Apple JWKS / Portal HTTP.
146
+ # - urlencoding: build the provider authorize-URL query string (matches urlencode).
147
+ pbkdf2 = { version = "0.12", default-features = false }
148
+ hmac = "0.12"
149
+ subtle = "2" # constant-time password-hash compare (the agent's hmac.compare_digest)
150
+ ed25519-dalek = "2"
151
+ jsonwebtoken = "9"
152
+ urlencoding = "2"
153
+ async-trait = "0.1" # the ProviderClient HTTP seam (async fn in trait)
154
+ reqwest = { version = "0.12", default-features = false, features = ["rustls-tls", "json"] }
105
155
  flate2 = "1" # read the gz'd legacy-trace dump (import-traces subcommand)
106
156
  tracing = "0.1"
107
157
  tracing-subscriber = { version = "0.3", features = ["env-filter", "json"] }
@@ -112,13 +162,13 @@ tracing-subscriber = { version = "0.3", features = ["env-filter", "json"] }
112
162
  # - keyring `tpm` (tss-esapi / TPM 2.0) — the real hardware backend; needs
113
163
  # libtss2 (Linux build dep). Other targets keep the software keystore.
114
164
  [target.'cfg(target_os = "linux")'.dependencies]
115
- ciris-persist = { git = "https://github.com/CIRISAI/CIRISPersist", tag = "v8.2.0", features = ["postgres"] }
116
- ciris-keyring = { git = "https://github.com/CIRISAI/CIRISVerify", tag = "v5.9.0", version = "5", features = ["tpm"] }
165
+ ciris-persist = { git = "https://github.com/CIRISAI/CIRISPersist", tag = "v8.4.0", features = ["postgres", "cirislens_wa_cert", "cirislens_service_token_revocation"] }
166
+ ciris-keyring = { git = "https://github.com/CIRISAI/CIRISVerify", tag = "v5.10.0", version = "5", features = ["tpm"] }
117
167
 
118
168
  # Android (arm64/arm32/x86_64): the keyring `android` backend (JNI → Android
119
169
  # Keystore/StrongBox); sqlite bundles, no postgres/tpm. Mirrors persist/edge.
120
170
  [target.'cfg(target_os = "android")'.dependencies]
121
- ciris-keyring = { git = "https://github.com/CIRISAI/CIRISVerify", tag = "v5.9.0", version = "5", features = ["android"] }
171
+ ciris-keyring = { git = "https://github.com/CIRISAI/CIRISVerify", tag = "v5.10.0", version = "5", features = ["android"] }
122
172
 
123
173
  # Test-only — the two-node replication integration test (tests/replication.rs)
124
174
  # builds + signs CEG batches with the same primitives persist verifies against.
@@ -133,7 +183,14 @@ criterion = { version = "0.5", features = ["async_tokio"] }
133
183
  # The PQC primitives the realtime-A/V E2E bench drives directly: hybrid KEX
134
184
  # (X25519 + ML-KEM-768) for the per-Link transit key, AES-256-GCM for the
135
185
  # two-layer chunk seal. Same pin/features edge composes (tag parity).
136
- ciris-crypto = { git = "https://github.com/CIRISAI/CIRISVerify", tag = "v5.9.0", version = "5", features = ["hybrid-kex", "aes-gcm", "pqc-ml-dsa"] }
186
+ ciris-crypto = { git = "https://github.com/CIRISAI/CIRISVerify", tag = "v5.10.0", version = "5", features = ["hybrid-kex", "aes-gcm", "pqc-ml-dsa"] }
187
+ # Enable edge's OWN fountain codec (`codec-fountain`, L1-A) for the survival-floor
188
+ # proof — dev/test ONLY (feature unification applies to test/bench builds; the
189
+ # shipped wheel stays codec-free, since a relay forwards sealed symbols opaquely
190
+ # and never encodes/decodes). This lets tests/chaos_mesh.rs exercise the SUBSTRATE
191
+ # codec (`fountain_encode`/`fountain_decode`) directly — a real MEASURED proof,
192
+ # not a reference stand-in.
193
+ ciris-edge = { git = "https://github.com/CIRISAI/CIRISEdge", tag = "v4.3.0", features = ["codec-fountain"] }
137
194
 
138
195
  # PQC realtime-A/V streaming E2E benchmark (CIRISEdge#62 realtime_av profile).
139
196
  [[bench]]
@@ -151,6 +208,13 @@ harness = false
151
208
  name = "alm_chain"
152
209
  harness = false
153
210
 
211
+ # Sustained multi-stream seal throughput — measures the actual core-fraction to
212
+ # seal N blob streams @30fps in a real loop (promotes the page's "2,000 blob
213
+ # streams ≈ 6-10% of a core" from arithmetic to MEASURED).
214
+ [[bench]]
215
+ name = "stream_fanout"
216
+ harness = false
217
+
154
218
  [profile.release]
155
219
  # panic strategy stays "unwind" (the Win7 build-std lane relies on this being
156
220
  # pinned here, not on the build-std crate list — see release.yml win7 lane).
@@ -24,6 +24,13 @@
24
24
  > (`ed25519.seed.migrated` archived), the `.rid` adopted into the keystore
25
25
  > (`hardware_backed=true`), no re-key. Adoption is deterministic: the carried
26
26
  > identity reproduces byte-for-byte.
27
+ >
28
+ > **Trace import re-validated** (2026-06-16, on the v8.2.0 / edge-v4.2.0 / CEG-RC12
29
+ > floor): `import-traces` on the prod dump → 12,165 traces → 20,959 events,
30
+ > errored=0 (3,635 salvaged). **All cutover gates are met — this migration is
31
+ > READY:** identity continuity (byte-identical `key_id` + RNS dest), 100% hybrid PQC
32
+ > signing, six-key `/v1/identity`, the frozen read endpoints, and legacy-history
33
+ > pre-seed all proven on the shipped floor.
27
34
 
28
35
  ## 1. What changes
29
36
 
@@ -40,10 +47,54 @@
40
47
  manifold conformity, and the detection-event corpus all run inside the node over
41
48
  the shared substrate, queryable from any node.
42
49
 
50
+ ## 1.5 Scope correction — the three-way split + the DSAR gate
51
+
52
+ > The deployed CIRISLens (`CIRISAI/CIRISLens`) serves **more than** the 7 frozen
53
+ > read endpoints: a **DSAR** erasure surface (GDPR Art. 17 — `POST /dsar/delete`,
54
+ > Ed25519-signed, key-scoped: *only traces signed by the requesting key are
55
+ > deleted*), a **public-keys registry**, the **CIRIS scoring feed** (`/capacity/*`,
56
+ > `/factors/*` — distinct from detection-event `/scores`), and **access tiers**
57
+ > (`public_sample` / `partner_access` / `AccessLevel`). The frozen-7 alone is
58
+ > **not** a complete replacement. Migration completeness requires all of it — but
59
+ > it is split three ways, not absorbed wholesale into one node:
60
+
61
+ - **fabric (the lens node):** the epistemic substrate — ingest, corpus, scoring
62
+ (emits `capacity:*`), `system:*` self-report, the **signed / key-scoped** reads,
63
+ the **erasure mechanism** (§19.7 hard-delete / `EjectHardDelete`), the
64
+ **public-keys registry**, and the **access tiers**. The fabric *performs* erasure;
65
+ it exposes no public hook for it.
66
+ - **ciris-status (the monitor node):** the public aggregator + health attestor —
67
+ reads `capacity:*`/`system:*`, serves the public scoring + status surface
68
+ ciris.ai consumes, emits `health:liveness` `scores`. See
69
+ [`CIRISStatus/FSD/MONITORING_NODE_DESIGN.md`](https://github.com/CIRISAI/CIRISStatus).
70
+ The fabric node does **not** serve the public website feed.
71
+ - **thin presentation (ciris.ai / Portal):** renders over the monitor's surface.
72
+
73
+ **GDPR erasure — TWO entry points (both, not either/or), one mechanism.** Right-to-be-
74
+ forgotten reaches the §19.7 hard-delete via **both**:
75
+ 1. **DSAR endpoint, surfaced through ciris-status** — the key-scoped, hybrid-signed
76
+ `dsar/delete` request (CIRISLens `accord_api.py` shape: *only content signed by
77
+ the requesting key is deleted*), exposed on the public monitor node (not a fabric
78
+ public hook), which drives the fabric's erasure; **and**
79
+ 2. **in-app, CEG-native** — the KMP fabric app lets the data subject emit a signed
80
+ `withdraws`/revocation against their content directly; the substrate honours it
81
+ via the same §19.7 descent.
82
+ Both collapse to one substrate mechanism (revocation → `EjectHardDelete` → below the
83
+ recoverability floor), proven by the noise-floor demonstration (CIRISServer#14).
84
+
85
+ **The DSAR gate (hard).** The §19.7 erasure primitives DSAR needs
86
+ (`evict_fountain_content_hard_delete`, `content_aggregation`,
87
+ `EjectionVerdict::EjectHardDelete`) ship in **persist v8.4.0 / verify v5.10.0**;
88
+ the wheel pins **v8.2.0 / v5.9.0**. **Do not decommission CIRISLens until DSAR
89
+ works as designed on the fabric node** (substrate bump → port DSAR + public-keys
90
+ + tiers → CIRISServer#14 noise-floor demonstration). Read-replacement (the 7
91
+ endpoints) can swap first; the Python DSAR path stays reachable until then.
92
+
43
93
  ## 2. Prerequisites
44
94
 
45
- - **`ciris-server` is published on PyPI** (0.1.x, abi3 / CPython 3.10+: manylinux
46
- x86_64 + aarch64, macOS, Windows). Substrate floor baked into the wheel:
95
+ - **`ciris-server` is published on PyPI** (0.2.x, abi3 / CPython 3.10+: manylinux
96
+ x86_64 + aarch64, macOS, Windows, **Android arm64 + armeabi-v7a**). Substrate
97
+ floor baked into the wheel:
47
98
  **persist v8.2.0 / edge v4.2.0 / verify-family v5.9.0** (CEG 1.0-RC12).
48
99
  - **`pip install ciris-server` needs NO build deps** — the manylinux wheel
49
100
  bundles libtss2 + libcrypto (auditwheel). This is the recommended path.
@@ -125,20 +176,28 @@ replaceable default pin).
125
176
  the agent's KMP client.
126
177
 
127
178
  ### 3.5 Corpus
128
- The corpus **starts fresh** on the persist substrate. The legacy TimescaleDB
129
- history is **not migrated** (the post-cutover dedup keys differ; pre-cutover quality
130
- is the legacy pipeline's). Keep the old TimescaleDB **read-only** for archival as
131
- long as you need it, then decommission.
179
+ The live corpus **starts fresh** on the persist substrate. **Legacy history can be
180
+ pre-seeded** for posterity / to show the ragged edge:
181
+ ```
182
+ ciris-server import-traces <dump-dir> # the CIRISLens TimescaleDB dump dir
183
+ ```
184
+ It reconstructs the flat 1.9.x `accord_traces` rows into CEG `CompleteTrace`s under
185
+ the closed-set `2.7.legacy` schema bucket — the original 1.9.x Ed25519 signature
186
+ preserved as **provenance**, imported **pre-verified** (`VerifyMode::TrustPreVerified`
187
+ carve-out; the legacy sig signed the 1.9.x bytes, not the reconstruction, so it is
188
+ not re-verifiable), content-addressed + idempotent. A salvage pass repairs the dump's
189
+ systematic `\\"`→`\"` export mis-escaping. **Validated on the prod dump (v8.2.0
190
+ floor): 12,165 traces → 20,959 trace-events, errored=0 (3,635 salvaged).** Keep the
191
+ old TimescaleDB read-only until you've imported + verified, then decommission.
132
192
 
133
193
  ## 4. Verify (before tearing anything down)
134
- - `GET /v1/identity` (on the read-API port, `listen+1`) returns the
194
+ - `GET /v1/identity` (on the read-API port, `listen+1`) returns the **six-key**
135
195
  `LocalIdentityAggregate` with the **same `key_id`** the CIRISLens node published
136
- (identity continuity confirmed), plus the Ed25519 federation pubkey and the
137
- Reticulum transport pubkeys. **0.1.x note:** `content_x25519` /
138
- `content_ml_kem_768` are `null` — the content-KEM halves fill in once persist
139
- exposes the aggregate for a hardware-signed Engine
140
- ([CIRISPersist#223](https://github.com/CIRISAI/CIRISPersist/issues/223)); the
141
- continuity-critical fields (`key_id`, `ed25519_pubkey_b64`, transport) are present.
196
+ (identity continuity confirmed): the **hybrid** federation signing keys (Ed25519 +
197
+ ML-DSA-65), the persist-minted content-KEM pair (`content_x25519` /
198
+ `content_ml_kem_768`), and the Reticulum transport pubkeys — **all populated** as
199
+ of 0.2.x (CIRISPersist#223/#224; the `with_hardware_signer_hybrid` Engine). A
200
+ carried-over `ed25519.seed` yields a byte-identical `key_id`.
142
201
  - Boot log shows `transport-identity keystore opened hardware_backed=true` (TPM
143
202
  host) and, for the federation key, the keyring reports a sealed-Ed25519 / hardware
144
203
  posture (not `NO HARDWARE BINDING`) — or encrypted-software fallback on a
@@ -152,6 +211,14 @@ service, the OAuth admin UI, and the prod telemetry sidecars
152
211
  (Prometheus/Loki/Tempo/Mimir/MinIO). Archive the `*.migrated-<ts>` identity files
153
212
  and the read-only TimescaleDB per your retention policy.
154
213
 
214
+ **Gate (do NOT skip — §1.5):** decommission only after the **DSAR** erasure
215
+ surface (Art. 17), the public-keys registry, and the access tiers run on the
216
+ fabric node — which is gated on the persist v8.4.0 / verify v5.10.0 bump. Until
217
+ then, keep the CIRISLens DSAR path reachable (you may retire its Grafana /
218
+ ingest / scoring serving earlier — scoring serving moves to the ciris-status
219
+ monitor node). Phasing: (1) read-replacement swap → (2) ciris-status public
220
+ surface → (3) DSAR on fabric → (4) full decommission.
221
+
155
222
  ## 6. Rollback
156
223
  The cutover is reversible until decommission: the old deployment runs read-only
157
224
  alongside the node during the window. If the node misbehaves, re-point emitters/read