ciris-server 0.2.2__tar.gz → 0.2.6__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 (143) hide show
  1. {ciris_server-0.2.2 → ciris_server-0.2.6}/.github/workflows/bench.yml +5 -2
  2. ciris_server-0.2.6/CHANGELOG.md +297 -0
  3. {ciris_server-0.2.2 → ciris_server-0.2.6}/Cargo.lock +547 -13
  4. {ciris_server-0.2.2 → ciris_server-0.2.6}/Cargo.toml +22 -24
  5. {ciris_server-0.2.2 → ciris_server-0.2.6}/FSD/LENS_TO_SERVER_MIGRATION.md +1 -1
  6. ciris_server-0.2.6/FSD/PQC_AV_STREAMING_BENCH.md +131 -0
  7. {ciris_server-0.2.2 → ciris_server-0.2.6}/PKG-INFO +16 -10
  8. {ciris_server-0.2.2 → ciris_server-0.2.6}/README.md +15 -9
  9. ciris_server-0.2.6/bench-site/data.json +167 -0
  10. ciris_server-0.2.6/bench-site/index.html +125 -0
  11. ciris_server-0.2.6/benches/alm_chain.rs +122 -0
  12. {ciris_server-0.2.2 → ciris_server-0.2.6}/benches/pqc_av_streaming.rs +146 -58
  13. {ciris_server-0.2.2 → ciris_server-0.2.6}/benches/replication_ingest.rs +38 -10
  14. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/Cargo.toml +3 -3
  15. {ciris_server-0.2.2 → ciris_server-0.2.6}/pyproject.toml +5 -2
  16. ciris_server-0.2.6/scripts/bench_report.py +662 -0
  17. ciris_server-0.2.6/src/benchmarks/mod.rs +31 -0
  18. ciris_server-0.2.6/src/benchmarks/scoreboard.rs +374 -0
  19. {ciris_server-0.2.2 → ciris_server-0.2.6}/src/compose.rs +38 -51
  20. {ciris_server-0.2.2 → ciris_server-0.2.6}/src/import.rs +12 -4
  21. {ciris_server-0.2.2 → ciris_server-0.2.6}/src/lib.rs +10 -0
  22. {ciris_server-0.2.2 → ciris_server-0.2.6}/src/main.rs +6 -0
  23. ciris_server-0.2.6/tests/alm_chain.rs +78 -0
  24. ciris_server-0.2.6/tests/chaos_mesh.rs +111 -0
  25. {ciris_server-0.2.2 → ciris_server-0.2.6}/tests/replication.rs +17 -2
  26. ciris_server-0.2.2/CHANGELOG.md +0 -147
  27. ciris_server-0.2.2/FSD/PQC_AV_STREAMING_BENCH.md +0 -95
  28. ciris_server-0.2.2/scripts/bench_report.py +0 -234
  29. {ciris_server-0.2.2 → ciris_server-0.2.6}/.cargo/config.toml +0 -0
  30. {ciris_server-0.2.2 → ciris_server-0.2.6}/.github/workflows/ci.yml +0 -0
  31. {ciris_server-0.2.2 → ciris_server-0.2.6}/.github/workflows/conformance.yml +0 -0
  32. {ciris_server-0.2.2 → ciris_server-0.2.6}/.github/workflows/publish-pypi.yml +0 -0
  33. {ciris_server-0.2.2 → ciris_server-0.2.6}/.github/workflows/release.yml +0 -0
  34. {ciris_server-0.2.2 → ciris_server-0.2.6}/.gitignore +0 -0
  35. {ciris_server-0.2.2 → ciris_server-0.2.6}/FSD/REGISTRY_FOLD_DERISK.md +0 -0
  36. {ciris_server-0.2.2 → ciris_server-0.2.6}/FSD/SERVER_1.0_PLAN.md +0 -0
  37. {ciris_server-0.2.2 → ciris_server-0.2.6}/LICENSE +0 -0
  38. {ciris_server-0.2.2 → ciris_server-0.2.6}/MISSION.md +0 -0
  39. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/.github/workflows/bench.yml +0 -0
  40. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/.github/workflows/ci.yml +0 -0
  41. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/.gitignore +0 -0
  42. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/.pre-commit-config.yaml +0 -0
  43. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/FSD/CIRIS_LENS_CORE.md +0 -0
  44. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/FSD/LENS_CORE_V0_5.md +0 -0
  45. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/FSD/OPEN_QUESTIONS.md +0 -0
  46. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/LICENSE +0 -0
  47. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/MISSION.md +0 -0
  48. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/README.md +0 -0
  49. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/benches/aggregate.rs +0 -0
  50. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/benches/canonicalize.rs +0 -0
  51. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/benches/project.rs +0 -0
  52. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/deny.toml +0 -0
  53. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/docs/BENCHMARKS.md +0 -0
  54. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/docs/COHABITATION.md +0 -0
  55. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/docs/PRE_COMMIT.md +0 -0
  56. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/docs/PUBLIC_SCHEMA_CONTRACT.md +0 -0
  57. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/docs/PYPI_PUBLISH.md +0 -0
  58. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/docs/RELEASE_NOTES.md +0 -0
  59. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/docs/STANDARDS_COMPARISON.md +0 -0
  60. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/docs/THREAT_MODEL.md +0 -0
  61. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/patterns_from_cirislens_core/extraction/json_path.rs +0 -0
  62. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/patterns_from_cirislens_core/extraction/metadata.rs +0 -0
  63. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/patterns_from_cirislens_core/extraction/mod.rs +0 -0
  64. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/patterns_from_cirislens_core/scrubber/distilbert_loader.rs +0 -0
  65. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/patterns_from_cirislens_core/scrubber/fields.rs +0 -0
  66. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/patterns_from_cirislens_core/scrubber/mod.rs +0 -0
  67. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/patterns_from_cirislens_core/scrubber/ner.rs +0 -0
  68. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/patterns_from_cirislens_core/scrubber/ort_loader.rs +0 -0
  69. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/patterns_from_cirislens_core/scrubber/proptests.rs +0 -0
  70. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/patterns_from_cirislens_core/scrubber/regex.rs +0 -0
  71. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/patterns_from_cirislens_core/scrubber/walker.rs +0 -0
  72. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/patterns_from_cirislens_core/scrubber/xlm_r_loader.rs +0 -0
  73. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/pyproject.toml +0 -0
  74. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/python/ciris_lens_core/__init__.py +0 -0
  75. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/src/audit/api.rs +0 -0
  76. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/src/audit/delegate.rs +0 -0
  77. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/src/audit/mod.rs +0 -0
  78. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/src/audit/pyo3.rs +0 -0
  79. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/src/canonical/ceg_egress.rs +0 -0
  80. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/src/canonical/mod.rs +0 -0
  81. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/src/capacity/attestation.rs +0 -0
  82. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/src/capacity/mod.rs +0 -0
  83. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/src/capacity/score.rs +0 -0
  84. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/src/capture/batch.rs +0 -0
  85. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/src/capture/client.rs +0 -0
  86. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/src/capture/consent.rs +0 -0
  87. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/src/capture/correlation.rs +0 -0
  88. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/src/capture/event.rs +0 -0
  89. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/src/capture/mod.rs +0 -0
  90. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/src/capture/partial.rs +0 -0
  91. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/src/capture/py_engine.rs +0 -0
  92. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/src/capture/seal.rs +0 -0
  93. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/src/cohort/declared.rs +0 -0
  94. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/src/cohort/mod.rs +0 -0
  95. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/src/cohort/resourcing.rs +0 -0
  96. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/src/config/egress.rs +0 -0
  97. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/src/config/mod.rs +0 -0
  98. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/src/config/node.rs +0 -0
  99. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/src/config/retention.rs +0 -0
  100. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/src/config/upstream.rs +0 -0
  101. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/src/detector/axis_metrics.rs +0 -0
  102. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/src/detector/coherence_ratchet.rs +0 -0
  103. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/src/detector/correlated_action.rs +0 -0
  104. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/src/detector/distributive_access.rs +0 -0
  105. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/src/detector/manifold.rs +0 -0
  106. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/src/detector/mod.rs +0 -0
  107. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/src/extract/mod.rs +0 -0
  108. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/src/extract/projection.rs +0 -0
  109. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/src/ffi/mod.rs +0 -0
  110. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/src/ffi/pyo3.rs +0 -0
  111. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/src/lib.rs +0 -0
  112. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/src/observability/mod.rs +0 -0
  113. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/src/pipeline/lifecycle.rs +0 -0
  114. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/src/pipeline/mod.rs +0 -0
  115. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/src/retention/eviction.rs +0 -0
  116. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/src/retention/mod.rs +0 -0
  117. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/src/retention/summary.rs +0 -0
  118. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/src/role/handler.rs +0 -0
  119. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/src/role/mod.rs +0 -0
  120. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/src/role/node.rs +0 -0
  121. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/src/role/relay.rs +0 -0
  122. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/src/role/ret_relay.rs +0 -0
  123. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/src/scores/aggregate.rs +0 -0
  124. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/src/scores/mod.rs +0 -0
  125. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/src/scores/oracle.rs +0 -0
  126. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/src/scoring/assembly.rs +0 -0
  127. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/src/scoring/axis_calibration.rs +0 -0
  128. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/src/scoring/calibration.rs +0 -0
  129. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/src/scoring/capacity.rs +0 -0
  130. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/src/scoring/mod.rs +0 -0
  131. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/src/scoring/n_eff.rs +0 -0
  132. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/src/scoring/result.rs +0 -0
  133. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/src/signing/event.rs +0 -0
  134. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/src/signing/mod.rs +0 -0
  135. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/src/wire/mod.rs +0 -0
  136. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/src/wire/signer.rs +0 -0
  137. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/tests/parity/README.md +0 -0
  138. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/tests/parity/canonical_fixtures.json +0 -0
  139. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/tests/parity/generate_canonical_fixtures.py +0 -0
  140. {ciris_server-0.2.2 → ciris_server-0.2.6}/crates/ciris-lens-core/tests/sovereign_rlib.rs +0 -0
  141. {ciris_server-0.2.2 → ciris_server-0.2.6}/rust-toolchain.toml +0 -0
  142. {ciris_server-0.2.2 → ciris_server-0.2.6}/src/config.rs +0 -0
  143. {ciris_server-0.2.2 → ciris_server-0.2.6}/src/quorum.rs +0 -0
@@ -52,11 +52,14 @@ 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
55
+ run: cargo bench --bench pqc_av_streaming --bench replication_ingest --bench alm_chain
56
+ - name: Generate holonomic scoreboard (CIRISServer#12/#13)
57
+ run: cargo run --release --quiet -- scoreboard > scoreboard.json
56
58
  - name: Generate interpreted page
57
59
  run: |
58
60
  BENCH_DATE="$(date -u +%Y-%m-%d)" \
59
- python3 scripts/bench_report.py --out bench-site --commit "$GITHUB_SHA"
61
+ python3 scripts/bench_report.py --out bench-site --commit "$GITHUB_SHA" \
62
+ --scoreboard scoreboard.json
60
63
  - uses: actions/configure-pages@v5
61
64
  with:
62
65
  enablement: true
@@ -0,0 +1,297 @@
1
+ # Changelog
2
+
3
+ All notable changes to CIRISServer. Format follows [Keep a Changelog](https://keepachangelog.com/);
4
+ this project uses [Semantic Versioning](https://semver.org/). The minor line tracks
5
+ the fabric-node scope (0.1 lens · 0.5 +registry · 1.0 +node), paced by the CIRISAgent train.
6
+
7
+ ## [0.2.6] — 2026-06-16
8
+
9
+ Substrate floor → **v4.2.0 family** + the **multi-tier ALM relay chain** test
10
+ (CIRISEdge#149 shipped).
11
+
12
+ ### Changed
13
+ - **Floor → persist v8.2.0 / edge v4.2.0 / verify-family v5.9.0** (CEG 1.0-RC12),
14
+ root + in-tree lens-core. Additive minor bumps; no composition-root change.
15
+
16
+ ### Added
17
+ - **`benches/alm_chain.rs` + `tests/alm_chain.rs`** — the multi-tier ALM relay
18
+ chain, now buildable because edge v4.2.0 ships the relay outer-open primitive
19
+ `open_av_outer` (CIRISEdge#149). Each interior hop opens the inbound per-link
20
+ outer AEAD and re-seals downstream **without touching the epoch DEK**, so the
21
+ inner E2E ciphertext survives arbitrary relay→relay hops.
22
+ - **Correctness (gated)**: `inner_e2e_survives_relay_chain` — viewer recovers the
23
+ publisher's plaintext byte-identical after 1–5 relay hops; `wrong_outer_key_at_a_hop_fails_closed`.
24
+ - **Cost (measured)**: ~**437 ns per relay hop** (blob) / 3.18 µs (full 720p);
25
+ end-to-end through 4 tiers ~2.7 µs (≈0.44 µs/added tier). So 2,000 blob streams
26
+ × 4 tiers @30 fps ≈ ~10% of one core of relay forwarding — confirming the limit
27
+ is donated bandwidth, not CPU (FSD §3–§4).
28
+ - **`tests/chaos_mesh.rs` — resilience proofs.** Stream **path-redundancy**: a
29
+ chunk reaches a viewer over disjoint relay paths (ALM primary + 2 backups); any
30
+ *surviving* path yields the identical plaintext — kill all but one and the stream
31
+ continues, no re-publish. And the **survival floor**: any 20 of 30 fountain
32
+ holders reconstruct → 33% holder-loss tolerance.
33
+ - **Bench page → "Guaranteed mesh characteristics" (the UX spec).** Each guarantee
34
+ — presence-blob (50 kbps) / focus-stream (2.5 Mbps) bandwidth, per-relay-hop +
35
+ tree-depth latency, join/rekey cost, path-redundancy, content survival, E2E-PQC
36
+ (~0/frame) — with a provenance badge (MEASURED / MODEL / PROJECTED) and a UX
37
+ implication, so the UX is built against guaranteed envelopes. `alm_chain` wired
38
+ into `bench.yml`; the ALM pillar now carries the measured per-hop/per-tier cost.
39
+
40
+ ## [0.2.5] — 2026-06-16
41
+
42
+ First cut of the **holonomic federation scoreboard** (CIRISServer#12/#13) — the
43
+ operator-facing measured-vs-modeled surface, replacing per-cut SOTA-comparison toy
44
+ numbers with grounded metrics.
45
+
46
+ ### Added
47
+ - **`server::benchmarks` module + `ciris-server scoreboard`** — emits a JSON
48
+ scoreboard of the federation's capacity/survival posture.
49
+ - **Storage tier — fully grounded** from a `FountainPolicy` (N=20, K=6, H=30
50
+ reference). Replication overhead (1.5×), per-peer load (5%), active-eject
51
+ threshold (H×1.15=34.5), holographic degradation tiers, and the **survival
52
+ floor** `P(Binomial(H, q) ≥ N)` computed in log-space. The calculator
53
+ **reproduces the scale_model v0.7 survival curve from first principles**
54
+ (99.99999 / 99.991 / 99.706 / 97.438 / 73.04 % at q = 0.95/0.90/0.85/0.80/0.70)
55
+ — asserted in tests — which is what makes "measured vs modeled" trustworthy.
56
+ - **Live overlay** (`with_measurement`): recomputes overhead + survival from
57
+ observed holders + real per-peer `q`, and **alarms** when live survival dips
58
+ under the 99% floor (the early-warning signal before content becomes
59
+ unreconstructable), or on >2.0× over-replication.
60
+ - **Substrate + holonomic tiers are honest `gated` stubs** (not fabricated):
61
+ substrate gated on edge v4.1.1's `NETWORK_CAPACITY_MODEL.md` + benches
62
+ (CIRISEdge PR#147); holonomic gated on fountain/holonomic wiring (#11) +
63
+ CIRISRegistry#88's composite model that grounds the targets.
64
+
65
+ ## [0.2.4] — 2026-06-16
66
+
67
+ Catch-up to the **v8 / v4 / v5.8 substrate family** and **CEG 1.0-RC11**. Two
68
+ substrate MAJOR bumps (persist 7→8, edge 3→4) adopted with **zero composition-root
69
+ changes** — the breakage surface was a single benchmark.
70
+
71
+ ### Changed
72
+ - **Substrate floor → persist v8.1.0 / edge v4.1.0 / verify-family v5.8.0**
73
+ (root + in-tree `ciris-lens-core`, MAJOR caret pins co-bumped). The major bumps
74
+ are additive: persist v8 = the `fountain` content primitive (new module);
75
+ edge v4 = the `holonomic` substrate (CEG §19) + realtime-A/V scale work — none of
76
+ it touches the symbols the composition root calls. `compose.rs`, `import.rs`,
77
+ `lib.rs`, and the replication bench/test needed no edits; `CompleteTrace` and the
78
+ hybrid ingest gate are unchanged (replication test still green under v8.1.0).
79
+ - **CEG → 1.0-RC11** (doc/vendor-only for the node, as RC6/RC7 were). The frozen
80
+ §4 "1+4" attestation envelope, signature format, dest-hash, trace schema, and
81
+ identity aggregate are untouched across RC7→RC11. The one envelope-touching
82
+ behavior change — RC8's store-path PQC clarification (the durable corpus MUST
83
+ carry+verify the ML-DSA-65 half) — is already satisfied by 0.2.3's hybrid hard
84
+ cut. RC9/RC10/RC11 wire additions (`codec_id`/`ChunkLayer`, the full
85
+ `SealedAvChunk` layout + double-seal nonces, the §19 holonomic shapes) are
86
+ **edge-owned transport/substrate framing**, additive, reached only through the
87
+ edge dependency.
88
+
89
+ ### Fixed
90
+ - **`pqc_av_streaming` bench** updated to edge v3.8.0's seal API (CIRISEdge#128):
91
+ `seal_av_chunk`/`seal_av_inner` take `codec_id` + `ChunkLayer` (pass
92
+ `CODEC_OPAQUE` + `ChunkLayer::BASE` to keep byte-identical v3.7.0 wire output),
93
+ and `MeshParticipant::new` defaults the new `layer_policy`. CI now checks
94
+ `--all-targets` so the (harness=false) bench can't silently break on a co-bump.
95
+
96
+ ### Adoption
97
+ - Closes the persist 7.0/7.1/7.2 adoption issues (#3/#8/#10) — all satisfied by the
98
+ 0.2.3 hybrid hard cut + this floor. persist v8.0's fountain store API (#11) is now
99
+ available at the floor; wiring the fountain/swarm storage role is tracked as
100
+ follow-on feature work, not required for the floor.
101
+
102
+ ## [0.2.3] — 2026-06-16
103
+
104
+ Hybrid **hard cut, complete end-to-end** (no classical-only path at any tier),
105
+ substrate floor → the v3.7.1 / v7.2.0 / v5.7.0 family, CEG **1.0-RC7**, and a
106
+ CEWP-honest benchmark page.
107
+
108
+ ### Changed
109
+ - **Hard cut to hybrid signing — now end-to-end (CIRISVerify#75 — "no classical-
110
+ only, HNDL demands it").** Three tiers, all hybrid (sealed Ed25519 + ML-DSA-65):
111
+ 1. **Federation wire** sigs — edge `LocalSigner` (already hybrid).
112
+ 2. **Storage-tier scrub** sig — the Engine is built with
113
+ `Engine::with_hardware_signer_hybrid` (CIRISPersist#224); the Ed25519 half
114
+ stays hardware-sealed (never unsealed), the ML-DSA-65 half is the software PQC
115
+ signer. Applies to the node Engine **and** the legacy-import Engine.
116
+ 3. **Per-trace envelope** sig — closed by **persist v7.2.0** (CIRISPersist#225,
117
+ migration `V083`): `trace_events` carries the ML-DSA-65 half and
118
+ `VerifyMode::Full` **rejects classical-only per-trace sigs**. CIRISServer's
119
+ replication path inherits the rejection; the legacy-import path stays exempt
120
+ (`TrustPreVerified`, provenance-only Ed25519).
121
+ Rationale is forge-later, not decrypt-later: the trace corpus is durable,
122
+ content-addressed, kept-for-posterity evidence, so its signatures must outlive
123
+ the classical primitive.
124
+ - **`GET /v1/identity` now serves all six keys.** With the hybrid hardware Engine,
125
+ the aggregate is sourced directly from persist's `local_identity_aggregate`
126
+ (CIRISPersist#223) — the ML-DSA-65 signing half **and** the persist-minted
127
+ content-KEM pair (`content_x25519` / `content_ml_kem_768`) are populated; they
128
+ are no longer `null`. Removes the hand-assembled aggregate.
129
+ - **Substrate floor → persist v7.2.0 / edge v3.7.1 / verify-family v5.7.0**
130
+ (edge v3.7.1's hard-cut co-bump: verify v5.7.0 = hybrid-required at federation
131
+ tier, closes CIRISVerify#75/#76/#77; persist v7.2.0 = trace-tier hybrid, #225);
132
+ **CEG 1.0-RC7**. lens-core co-bumped in lockstep.
133
+
134
+ ### Added
135
+ - **Benchmark upgrade — the CEWP crux ("stream and store at massive scale").**
136
+ - `av_mesh_fanout/shared_inner` now drives v3.7.0's real `seal_av_inner` /
137
+ `seal_av_outer` (CIRISEdge#122), not a hand-rolled mirror — measured fan-out
138
+ win 1.36×/1.85×/**2.07×** at N=2/8/50.
139
+ - **`av_rekey`** (new): the membership-change rekey cost, **projected** from the
140
+ real hybrid-KEM wrap — `flat_rewrap` O(N) vs `tree_rewrap` O(log N). A 50-room
141
+ delta is ~3.4 ms flat → ~0.41 ms with the tree (8.3×). Labelled projected: the
142
+ substrate doesn't rekey on join/leave yet (**CIRISEdge#129**), so "effectively
143
+ free" holds at steady state, not yet under churn.
144
+ - **Honest accounting:** `av_frame_halves` now measures seal (send) vs open
145
+ (recv) **per size**; the report charges receivers open-only and states its GOP
146
+ model inline instead of cherry-picking a frame. A 50-person 30 fps room is
147
+ ~0.5% of a core to receive (stated 720p/GOP-30 model), range ~0.17–0.45%.
148
+ - **Replication is now hybrid (the hard cut at the store path).** The bench
149
+ signs full-hybrid traces (the only kind v7.2.0 accepts); measured ingest is
150
+ **~230 µs/trace (~4,300 traces/s/core)** — the ML-DSA-65 verify adds ~150 µs
151
+ over the old Ed25519-only ~76 µs. That is the **measured HNDL price** at the
152
+ store path. Re-delivery still pays full verify (replay is verify-bound by
153
+ design — verify-before-mutation; dedup-first would be an AV-9 oracle), so the
154
+ levers are the pre-verified relay path + **batch verification** (now materially
155
+ more valuable; tracked in CIRISPersist#225's scale note), not reordering.
156
+
157
+ ## [0.2.2] — 2026-06-15
158
+
159
+ ### Added
160
+ - **`import-traces` on the wheel** (pip-only bridge): the abi3 wheel now exposes
161
+ `ciris_server.import_traces(dump_dir)`, and the `ciris-server` console script
162
+ accepts `ciris-server import-traces <dump-dir>` (same CLI as the binary). The
163
+ legacy CIRISLens dump → persist-corpus-as-CEG import no longer needs the
164
+ source-built binary. Verified from the installed wheel against the prod dump:
165
+ all 12,165 traces, errored=0.
166
+
167
+ ## [0.2.1] — 2026-06-15
168
+
169
+ Android wheels (incl. arm32) now publish; legacy-trace importer.
170
+
171
+ ### Added
172
+ - **`ciris-server import-traces <dump-dir>`** — imports the legacy CIRISLens
173
+ TimescaleDB dump into the persist corpus as CEG objects. Reconstructs flat
174
+ 1.9.x lens rows → `CompleteTrace`/`BatchEnvelope` (reasoning columns →
175
+ components; original schema + signature in a provenance component); stamped
176
+ `2.7.legacy`; imported pre-verified; idempotent. A salvage pass repairs the
177
+ dump's systematic `\\"`→`\"` export mis-escaping and flags those rows
178
+ `_salvaged: true`. Validated on the prod dump: **all 12,165 traces →
179
+ 20,959 trace-events, errored=0** (3,635 salvaged).
180
+ - **Android wheels** (armeabi-v7a + arm64-v8a) now build & publish (NDK r26b
181
+ cross-compile: explicit `CC`/`AR`/linker for the toolchain, legacy-NDK
182
+ tool-name shims for openssl-src, `ANDROID_API_LEVEL`). Promoted from
183
+ continue-on-error to a required publish lane.
184
+
185
+ ## [0.2.0] — 2026-06-15
186
+
187
+ All-platforms-green CI, **full hybrid post-quantum federation signatures**, and a
188
+ published interpreted benchmark page.
189
+
190
+ ### Added
191
+ - **Full hybrid PQC federation signature (Ed25519 + ML-DSA-65).** The node mints
192
+ (or **adopts**, on takeover) an `ml_dsa_65.seed` and signs every federation
193
+ envelope with both halves (edge `LocalSigner` classical + pqc). `/v1/identity`
194
+ now carries `ml_dsa_65_pubkey_b64` + `pqc_key_id`. Classical stays
195
+ hardware-sealed; the ML-DSA half is a software seed (no sealed-ML-DSA backend
196
+ exists — a TPM can't do ML-DSA).
197
+ - **One remaining classical path**, filed upstream: persist's storage-tier
198
+ scrub signature is Ed25519-only — `with_hardware_signer` is classical-only and
199
+ `with_signer_arcs` (hybrid) needs a plaintext key. **CIRISPersist#224** adds a
200
+ hybrid-hardware ctor to close it without un-sealing.
201
+ - **Interpreted benchmark page** → `https://cirisai.github.io/CIRISServer/`
202
+ (`.github/workflows/bench.yml` + `scripts/bench_report.py`): video throughput
203
+ (fps ceiling, sustainable mesh participants @30 fps), post-quantum handshake
204
+ overhead, mesh fan-out, and **replication speed** (new `replication_ingest`
205
+ bench, ~13K traces/s/core).
206
+ - Android arm32 (armeabi-v7a) + arm64 wheel lane (NDK cross-compile;
207
+ `continue-on-error` while it iterates to green).
208
+
209
+ ### Changed / Fixed
210
+ - **All CI platforms green** (was red on macOS/Windows/Win7). Root cause was our
211
+ own feature wiring: a top-level `tpm` feature + unconditional `postgres`
212
+ dragged `tss-esapi`/`openssl` onto platforms that can't build them. Fixed with
213
+ per-target deps (`postgres` + `tpm` Linux-only; `android` keyring backend) and
214
+ dropping `--all-features`.
215
+
216
+ ## [0.1.2] — 2026-06-15
217
+
218
+ Substrate floor bump + the `/v1/identity` endpoint the migration runbook requires.
219
+
220
+ ### Added
221
+ - **`GET /v1/identity`** — the node's `LocalIdentityAggregate` (CEG §5.6.8.8.2),
222
+ merged onto the read-API listener (same port as `GET /lens/api/v1/*`). Serves
223
+ `key_id`, the Ed25519 federation pubkey, the Reticulum transport pubkeys
224
+ (x25519 ‖ ed25519), and `identity_hash` — the identity-continuity surface the
225
+ CIRISLens→CIRISServer cutover verifies (runbook §4 step 1). Closes the gap that
226
+ blocked the first cutover attempt (#5).
227
+ - `content_x25519` / `content_ml_kem_768` are `null` for now: persist's
228
+ `local_identity_aggregate` requires a software `LocalSigner`, and CIRISServer
229
+ runs a hardware signer (`with_hardware_signer` → `local_signer: None`). The
230
+ content-KEM halves fill in once persist exposes the aggregate for a
231
+ hardware-signed Engine (tracked upstream).
232
+
233
+ ### Changed
234
+ - Substrate floor → **persist v7.0.0 / edge v3.6.0 / verify-family v5.6.0**
235
+ (the edge v3.6.0 "CEWP-ready" co-bump; CEG 1.0-RC6). Major persist 6→7, built
236
+ clean with zero code changes.
237
+ - `build_edge` wires the Reticulum transport via the typed `.reticulum_transport()`
238
+ builder so `Edge::local_transport_pubkey()` resolves (populates the
239
+ RET-transport role of `/v1/identity`).
240
+
241
+ ## [0.1.1] — 2026-06-15
242
+
243
+ Release-CI fixes only — **no change to the node**. 0.1.0 was tagged but did not
244
+ publish: `publish-pypi.yml`'s linux wheel built in a manylinux_2_28 (AlmaLinux 8)
245
+ container whose tpm2-tss is 2.3.2, too old for the keyring's `tss-esapi-sys`
246
+ (`tss2-sys not found`), and two lint gates failed.
247
+
248
+ ### Fixed
249
+ - **Linux wheels** now build on the native runners (ubuntu-latest + ubuntu-24.04-arm)
250
+ with apt `libtss2-dev` + `patchelf` — the same recipe the green conformance
251
+ wheel job and the sister wheels (persist `manylinux_2_38`, edge `_2_39`) use —
252
+ instead of the el8 container with its stale tss2.
253
+ - `rustfmt` (bench formatting) and `clippy` doc-list lints in
254
+ `benches/pqc_av_streaming.rs` (allow the two stylized-doc lints).
255
+
256
+ ## [0.1.0] — 2026-06-15
257
+
258
+ First release. **Lens-only fabric node** — the federation's headless cohabitation
259
+ runtime with only the observation slice live. Replaces both the deployed CIRISLens
260
+ server and the agent's direct `ciris-lens-core` cohabitation.
261
+
262
+ ### Added
263
+ - **Zero-setup node** (`ciris-server`): one shared persist `Engine` + one shared
264
+ Reticulum `Edge` (a single federation identity), mode defaults to `server`,
265
+ no wizard. Data under `$CIRIS_HOME`; SQLite corpus by default, Postgres via
266
+ `CIRIS_DB_URL`.
267
+ - **Lens slice**: relay ingest of CEG `AccordEventsBatch` (over Reticulum/HTTP)
268
+ into the shared corpus, plus the seven frozen `GET /lens/api/v1/*` read
269
+ endpoints. `ciris-lens-core` is absorbed in-tree (workspace member); the
270
+ standalone CIRISLensCore library and the CIRISLens deployment retire.
271
+ - **Hardware key custody**, two classes: the RNS transport identity and the
272
+ Ed25519 federation seed are TPM / Secure-Enclave / StrongBox sealed, with a
273
+ software-encrypted fallback. Existing keys are **adopted byte-identically** —
274
+ a CIRISLens host keeps its `key_id` and RNS destination on cutover (no re-key,
275
+ no re-enroll). See `FSD/LENS_TO_SERVER_MIGRATION.md`.
276
+ - **Reticulum floor with capability gating**: always a routable RET node; the
277
+ lens corpus + read API gate on a realistic free-disk minimum
278
+ (`CIRIS_SERVER_LENS_STORE_MIN_GIB`), else the node runs as a relay.
279
+ - **`ciris-canonical` founder-quorum** (`src/quorum.rs`): the entrenched 2-of-3
280
+ trust root that replaces the shared steward key (prep for the 0.5 registry
281
+ fold; CEG §8.1.13.1.1).
282
+ - **PyO3 abi3 wheel**: `pip install ciris-server` → the `ciris-server` command,
283
+ and the lens drop-in `from ciris_server import LensClient` for CIRISAgent.
284
+ - **Conformance + benchmarks**: cohabitation + CEG-profile gating via
285
+ CIRISConformance; `benches/pqc_av_streaming.rs` (realtime-A/V two-layer
286
+ hybrid-PQC mesh) and `tests/replication.rs` (CEG-RC5 corpus replication spine).
287
+
288
+ ### Substrate
289
+ - persist **v7.0.0** · edge **v3.6.0** · verify-family **v5.6.0**
290
+ (verify-core + keyring + crypto). CEG **1.0-RC6**.
291
+
292
+ ### Notes
293
+ - Registry (0.5) and node (1.0) slices are scaffolded in `src/compose.rs` and
294
+ fold in as their co-bumps land. Registry-fold prep: `FSD/REGISTRY_FOLD_DERISK.md`,
295
+ [#2](https://github.com/CIRISAI/CIRISServer/issues/2).
296
+
297
+ [0.1.0]: https://github.com/CIRISAI/CIRISServer/releases/tag/v0.1.0