ciris-server 0.2.0__tar.gz → 0.2.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (134) hide show
  1. {ciris_server-0.2.0 → ciris_server-0.2.2}/.github/workflows/publish-pypi.yml +25 -4
  2. {ciris_server-0.2.0 → ciris_server-0.2.2}/CHANGELOG.md +28 -0
  3. {ciris_server-0.2.0 → ciris_server-0.2.2}/Cargo.lock +43 -1
  4. {ciris_server-0.2.0 → ciris_server-0.2.2}/Cargo.toml +2 -1
  5. {ciris_server-0.2.0 → ciris_server-0.2.2}/PKG-INFO +1 -1
  6. {ciris_server-0.2.0 → ciris_server-0.2.2}/pyproject.toml +1 -1
  7. {ciris_server-0.2.0 → ciris_server-0.2.2}/src/compose.rs +1 -1
  8. ciris_server-0.2.2/src/import.rs +266 -0
  9. {ciris_server-0.2.0 → ciris_server-0.2.2}/src/lib.rs +42 -8
  10. ciris_server-0.2.2/src/main.rs +26 -0
  11. ciris_server-0.2.0/src/main.rs +0 -14
  12. {ciris_server-0.2.0 → ciris_server-0.2.2}/.cargo/config.toml +0 -0
  13. {ciris_server-0.2.0 → ciris_server-0.2.2}/.github/workflows/bench.yml +0 -0
  14. {ciris_server-0.2.0 → ciris_server-0.2.2}/.github/workflows/ci.yml +0 -0
  15. {ciris_server-0.2.0 → ciris_server-0.2.2}/.github/workflows/conformance.yml +0 -0
  16. {ciris_server-0.2.0 → ciris_server-0.2.2}/.github/workflows/release.yml +0 -0
  17. {ciris_server-0.2.0 → ciris_server-0.2.2}/.gitignore +0 -0
  18. {ciris_server-0.2.0 → ciris_server-0.2.2}/FSD/LENS_TO_SERVER_MIGRATION.md +0 -0
  19. {ciris_server-0.2.0 → ciris_server-0.2.2}/FSD/PQC_AV_STREAMING_BENCH.md +0 -0
  20. {ciris_server-0.2.0 → ciris_server-0.2.2}/FSD/REGISTRY_FOLD_DERISK.md +0 -0
  21. {ciris_server-0.2.0 → ciris_server-0.2.2}/FSD/SERVER_1.0_PLAN.md +0 -0
  22. {ciris_server-0.2.0 → ciris_server-0.2.2}/LICENSE +0 -0
  23. {ciris_server-0.2.0 → ciris_server-0.2.2}/MISSION.md +0 -0
  24. {ciris_server-0.2.0 → ciris_server-0.2.2}/README.md +0 -0
  25. {ciris_server-0.2.0 → ciris_server-0.2.2}/benches/pqc_av_streaming.rs +0 -0
  26. {ciris_server-0.2.0 → ciris_server-0.2.2}/benches/replication_ingest.rs +0 -0
  27. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/.github/workflows/bench.yml +0 -0
  28. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/.github/workflows/ci.yml +0 -0
  29. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/.gitignore +0 -0
  30. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/.pre-commit-config.yaml +0 -0
  31. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/Cargo.toml +0 -0
  32. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/FSD/CIRIS_LENS_CORE.md +0 -0
  33. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/FSD/LENS_CORE_V0_5.md +0 -0
  34. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/FSD/OPEN_QUESTIONS.md +0 -0
  35. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/LICENSE +0 -0
  36. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/MISSION.md +0 -0
  37. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/README.md +0 -0
  38. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/benches/aggregate.rs +0 -0
  39. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/benches/canonicalize.rs +0 -0
  40. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/benches/project.rs +0 -0
  41. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/deny.toml +0 -0
  42. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/docs/BENCHMARKS.md +0 -0
  43. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/docs/COHABITATION.md +0 -0
  44. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/docs/PRE_COMMIT.md +0 -0
  45. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/docs/PUBLIC_SCHEMA_CONTRACT.md +0 -0
  46. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/docs/PYPI_PUBLISH.md +0 -0
  47. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/docs/RELEASE_NOTES.md +0 -0
  48. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/docs/STANDARDS_COMPARISON.md +0 -0
  49. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/docs/THREAT_MODEL.md +0 -0
  50. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/patterns_from_cirislens_core/extraction/json_path.rs +0 -0
  51. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/patterns_from_cirislens_core/extraction/metadata.rs +0 -0
  52. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/patterns_from_cirislens_core/extraction/mod.rs +0 -0
  53. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/patterns_from_cirislens_core/scrubber/distilbert_loader.rs +0 -0
  54. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/patterns_from_cirislens_core/scrubber/fields.rs +0 -0
  55. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/patterns_from_cirislens_core/scrubber/mod.rs +0 -0
  56. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/patterns_from_cirislens_core/scrubber/ner.rs +0 -0
  57. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/patterns_from_cirislens_core/scrubber/ort_loader.rs +0 -0
  58. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/patterns_from_cirislens_core/scrubber/proptests.rs +0 -0
  59. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/patterns_from_cirislens_core/scrubber/regex.rs +0 -0
  60. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/patterns_from_cirislens_core/scrubber/walker.rs +0 -0
  61. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/patterns_from_cirislens_core/scrubber/xlm_r_loader.rs +0 -0
  62. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/pyproject.toml +0 -0
  63. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/python/ciris_lens_core/__init__.py +0 -0
  64. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/audit/api.rs +0 -0
  65. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/audit/delegate.rs +0 -0
  66. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/audit/mod.rs +0 -0
  67. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/audit/pyo3.rs +0 -0
  68. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/canonical/ceg_egress.rs +0 -0
  69. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/canonical/mod.rs +0 -0
  70. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/capacity/attestation.rs +0 -0
  71. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/capacity/mod.rs +0 -0
  72. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/capacity/score.rs +0 -0
  73. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/capture/batch.rs +0 -0
  74. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/capture/client.rs +0 -0
  75. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/capture/consent.rs +0 -0
  76. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/capture/correlation.rs +0 -0
  77. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/capture/event.rs +0 -0
  78. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/capture/mod.rs +0 -0
  79. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/capture/partial.rs +0 -0
  80. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/capture/py_engine.rs +0 -0
  81. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/capture/seal.rs +0 -0
  82. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/cohort/declared.rs +0 -0
  83. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/cohort/mod.rs +0 -0
  84. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/cohort/resourcing.rs +0 -0
  85. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/config/egress.rs +0 -0
  86. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/config/mod.rs +0 -0
  87. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/config/node.rs +0 -0
  88. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/config/retention.rs +0 -0
  89. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/config/upstream.rs +0 -0
  90. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/detector/axis_metrics.rs +0 -0
  91. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/detector/coherence_ratchet.rs +0 -0
  92. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/detector/correlated_action.rs +0 -0
  93. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/detector/distributive_access.rs +0 -0
  94. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/detector/manifold.rs +0 -0
  95. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/detector/mod.rs +0 -0
  96. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/extract/mod.rs +0 -0
  97. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/extract/projection.rs +0 -0
  98. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/ffi/mod.rs +0 -0
  99. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/ffi/pyo3.rs +0 -0
  100. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/lib.rs +0 -0
  101. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/observability/mod.rs +0 -0
  102. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/pipeline/lifecycle.rs +0 -0
  103. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/pipeline/mod.rs +0 -0
  104. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/retention/eviction.rs +0 -0
  105. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/retention/mod.rs +0 -0
  106. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/retention/summary.rs +0 -0
  107. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/role/handler.rs +0 -0
  108. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/role/mod.rs +0 -0
  109. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/role/node.rs +0 -0
  110. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/role/relay.rs +0 -0
  111. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/role/ret_relay.rs +0 -0
  112. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/scores/aggregate.rs +0 -0
  113. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/scores/mod.rs +0 -0
  114. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/scores/oracle.rs +0 -0
  115. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/scoring/assembly.rs +0 -0
  116. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/scoring/axis_calibration.rs +0 -0
  117. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/scoring/calibration.rs +0 -0
  118. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/scoring/capacity.rs +0 -0
  119. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/scoring/mod.rs +0 -0
  120. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/scoring/n_eff.rs +0 -0
  121. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/scoring/result.rs +0 -0
  122. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/signing/event.rs +0 -0
  123. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/signing/mod.rs +0 -0
  124. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/wire/mod.rs +0 -0
  125. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/wire/signer.rs +0 -0
  126. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/tests/parity/README.md +0 -0
  127. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/tests/parity/canonical_fixtures.json +0 -0
  128. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/tests/parity/generate_canonical_fixtures.py +0 -0
  129. {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/tests/sovereign_rlib.rs +0 -0
  130. {ciris_server-0.2.0 → ciris_server-0.2.2}/rust-toolchain.toml +0 -0
  131. {ciris_server-0.2.0 → ciris_server-0.2.2}/scripts/bench_report.py +0 -0
  132. {ciris_server-0.2.0 → ciris_server-0.2.2}/src/config.rs +0 -0
  133. {ciris_server-0.2.0 → ciris_server-0.2.2}/src/quorum.rs +0 -0
  134. {ciris_server-0.2.0 → ciris_server-0.2.2}/tests/replication.rs +0 -0
@@ -115,13 +115,13 @@ jobs:
115
115
  android:
116
116
  name: wheel android-${{ matrix.abi }}
117
117
  runs-on: ubuntu-latest
118
- continue-on-error: true
118
+ # Green as of 0.2.1 (arm64-v8a + armeabi-v7a both package). A required gate now.
119
119
  strategy:
120
120
  fail-fast: false
121
121
  matrix:
122
122
  include:
123
- - { abi: armeabi-v7a, target: armv7-linux-androideabi, clang: armv7a-linux-androideabi24, pw: 32 }
124
- - { abi: arm64-v8a, target: aarch64-linux-android, clang: aarch64-linux-android24, pw: 64 }
123
+ - { abi: armeabi-v7a, target: armv7-linux-androideabi, clang: armv7a-linux-androideabi24, legacy: arm-linux-androideabi, pw: 32 }
124
+ - { abi: arm64-v8a, target: aarch64-linux-android, clang: aarch64-linux-android24, legacy: aarch64-linux-android, pw: 64 }
125
125
  steps:
126
126
  - uses: actions/checkout@v4
127
127
  - uses: dtolnay/rust-toolchain@stable
@@ -155,8 +155,29 @@ jobs:
155
155
  - name: Build wheel (maturin, Android NDK)
156
156
  env:
157
157
  ANDROID_NDK_HOME: ${{ steps.ndk.outputs.ndk-path }}
158
- RUSTFLAGS: "-L ${{ runner.temp }}/python-stub -C link-arg=-Wl,--no-as-needed -C link-arg=-lpython3.10"
158
+ ANDROID_API_LEVEL: "24" # maturin can't infer the API level for armv7 (it can for arm64)
159
159
  run: |
160
+ # cc-rs guesses the wrong NDK clang name (arm-linux-androideabi-clang);
161
+ # point CC/CXX/AR + the cargo linker at the real r26b tools (what
162
+ # cargo-ndk would set). Var names use the underscore/SCREAMING target.
163
+ TC="${ANDROID_NDK_HOME}/toolchains/llvm/prebuilt/linux-x86_64/bin"
164
+ CLANG="${TC}/${{ matrix.clang }}-clang"
165
+ TUS="$(echo '${{ matrix.target }}' | tr - _)"
166
+ TSC="$(echo "$TUS" | tr a-z A-Z)"
167
+ export "CC_${TUS}=${CLANG}"
168
+ export "CXX_${TUS}=${CLANG}++"
169
+ export "AR_${TUS}=${TC}/llvm-ar"
170
+ export "RANLIB_${TUS}=${TC}/llvm-ranlib"
171
+ export "CARGO_TARGET_${TSC}_LINKER=${CLANG}"
172
+ # openssl-src (pulled by persist on android) hardcodes the LEGACY NDK
173
+ # tool names that r26b dropped; shim them → the r26b llvm tools.
174
+ export ANDROID_NDK_ROOT="${ANDROID_NDK_HOME}"
175
+ ln -sf "${TC}/llvm-ar" "${TC}/${{ matrix.legacy }}-ar"
176
+ ln -sf "${TC}/llvm-ranlib" "${TC}/${{ matrix.legacy }}-ranlib"
177
+ ln -sf "${CLANG}" "${TC}/${{ matrix.legacy }}-clang"
178
+ ln -sf "${CLANG}++" "${TC}/${{ matrix.legacy }}-clang++"
179
+ export PATH="${TC}:${PATH}"
180
+ export RUSTFLAGS="-L ${RUNNER_TEMP}/python-stub -C link-arg=-Wl,--no-as-needed -C link-arg=-lpython3.10"
160
181
  python -m pip install --upgrade pip
161
182
  pip install "maturin>=1.7,<2"
162
183
  maturin build --release --out dist --target ${{ matrix.target }}
@@ -4,6 +4,34 @@ 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.2.2] — 2026-06-15
8
+
9
+ ### Added
10
+ - **`import-traces` on the wheel** (pip-only bridge): the abi3 wheel now exposes
11
+ `ciris_server.import_traces(dump_dir)`, and the `ciris-server` console script
12
+ accepts `ciris-server import-traces <dump-dir>` (same CLI as the binary). The
13
+ legacy CIRISLens dump → persist-corpus-as-CEG import no longer needs the
14
+ source-built binary. Verified from the installed wheel against the prod dump:
15
+ all 12,165 traces, errored=0.
16
+
17
+ ## [0.2.1] — 2026-06-15
18
+
19
+ Android wheels (incl. arm32) now publish; legacy-trace importer.
20
+
21
+ ### Added
22
+ - **`ciris-server import-traces <dump-dir>`** — imports the legacy CIRISLens
23
+ TimescaleDB dump into the persist corpus as CEG objects. Reconstructs flat
24
+ 1.9.x lens rows → `CompleteTrace`/`BatchEnvelope` (reasoning columns →
25
+ components; original schema + signature in a provenance component); stamped
26
+ `2.7.legacy`; imported pre-verified; idempotent. A salvage pass repairs the
27
+ dump's systematic `\\"`→`\"` export mis-escaping and flags those rows
28
+ `_salvaged: true`. Validated on the prod dump: **all 12,165 traces →
29
+ 20,959 trace-events, errored=0** (3,635 salvaged).
30
+ - **Android wheels** (armeabi-v7a + arm64-v8a) now build & publish (NDK r26b
31
+ cross-compile: explicit `CC`/`AR`/linker for the toolchain, legacy-NDK
32
+ tool-name shims for openssl-src, `ANDROID_API_LEVEL`). Promoted from
33
+ continue-on-error to a required publish lane.
34
+
7
35
  ## [0.2.0] — 2026-06-15
8
36
 
9
37
  All-platforms-green CI, **full hybrid post-quantum federation signatures**, and a
@@ -2,6 +2,12 @@
2
2
  # It is not intended for manual editing.
3
3
  version = 4
4
4
 
5
+ [[package]]
6
+ name = "adler2"
7
+ version = "2.0.1"
8
+ source = "registry+https://github.com/rust-lang/crates.io-index"
9
+ checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa"
10
+
5
11
  [[package]]
6
12
  name = "aead"
7
13
  version = "0.5.2"
@@ -982,7 +988,7 @@ dependencies = [
982
988
 
983
989
  [[package]]
984
990
  name = "ciris-server"
985
- version = "0.2.0"
991
+ version = "0.2.2"
986
992
  dependencies = [
987
993
  "anyhow",
988
994
  "axum",
@@ -996,6 +1002,7 @@ dependencies = [
996
1002
  "ciris-verify-core",
997
1003
  "criterion",
998
1004
  "ed25519-dalek",
1005
+ "flate2",
999
1006
  "fs2",
1000
1007
  "getrandom 0.3.4",
1001
1008
  "pyo3",
@@ -1196,6 +1203,15 @@ dependencies = [
1196
1203
  "libc",
1197
1204
  ]
1198
1205
 
1206
+ [[package]]
1207
+ name = "crc32fast"
1208
+ version = "1.5.0"
1209
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1210
+ checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511"
1211
+ dependencies = [
1212
+ "cfg-if",
1213
+ ]
1214
+
1199
1215
  [[package]]
1200
1216
  name = "criterion"
1201
1217
  version = "0.5.1"
@@ -1740,6 +1756,16 @@ version = "0.4.2"
1740
1756
  source = "registry+https://github.com/rust-lang/crates.io-index"
1741
1757
  checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80"
1742
1758
 
1759
+ [[package]]
1760
+ name = "flate2"
1761
+ version = "1.1.9"
1762
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1763
+ checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c"
1764
+ dependencies = [
1765
+ "crc32fast",
1766
+ "miniz_oxide",
1767
+ ]
1768
+
1743
1769
  [[package]]
1744
1770
  name = "float_eq"
1745
1771
  version = "1.0.1"
@@ -3047,6 +3073,16 @@ version = "0.2.1"
3047
3073
  source = "registry+https://github.com/rust-lang/crates.io-index"
3048
3074
  checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
3049
3075
 
3076
+ [[package]]
3077
+ name = "miniz_oxide"
3078
+ version = "0.8.9"
3079
+ source = "registry+https://github.com/rust-lang/crates.io-index"
3080
+ checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316"
3081
+ dependencies = [
3082
+ "adler2",
3083
+ "simd-adler32",
3084
+ ]
3085
+
3050
3086
  [[package]]
3051
3087
  name = "mio"
3052
3088
  version = "1.2.1"
@@ -5031,6 +5067,12 @@ dependencies = [
5031
5067
  "rand_core 0.10.1",
5032
5068
  ]
5033
5069
 
5070
+ [[package]]
5071
+ name = "simd-adler32"
5072
+ version = "0.3.9"
5073
+ source = "registry+https://github.com/rust-lang/crates.io-index"
5074
+ checksum = "703d5c7ef118737c72f1af64ad2f6f8c5e1921f818cdcb97b8fe6fc69bf66214"
5075
+
5034
5076
  [[package]]
5035
5077
  name = "siphasher"
5036
5078
  version = "1.0.3"
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "ciris-server"
3
- version = "0.2.0" # 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.2.2" # 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.
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.
@@ -110,6 +110,7 @@ axum = "0.8"
110
110
  base64 = "0.22"
111
111
  serde_json = "1"
112
112
  getrandom = "0.3" # mint the ML-DSA-65 federation seed on first boot (hybrid PQC)
113
+ flate2 = "1" # read the gz'd legacy-trace dump (import-traces subcommand)
113
114
  tracing = "0.1"
114
115
  tracing-subscriber = { version = "0.3", features = ["env-filter", "json"] }
115
116
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ciris-server
3
- Version: 0.2.0
3
+ Version: 0.2.2
4
4
  License-File: LICENSE
5
5
  Summary: The fabric node — the federation's headless cohabitation runtime (registry + lens [+ node] over one shared substrate), as the abi3 wheel CIRISAgent consumes. agent = fabric node + brain.
6
6
  Author-email: Eric Moore <eric@ciris.ai>
@@ -12,7 +12,7 @@ build-backend = "maturin"
12
12
  [project]
13
13
  name = "ciris-server"
14
14
  # Mirrors Cargo.toml; bump in lockstep.
15
- version = "0.2.0" # matches the Cargo crate. 0.1 = lens-only; patch forward (0.1.1) on breakage
15
+ version = "0.2.2" # matches the Cargo crate. 0.1 = lens-only; patch forward (0.1.1) on breakage
16
16
  description = "The fabric node — the federation's headless cohabitation runtime (registry + lens [+ node] over one shared substrate), as the abi3 wheel CIRISAgent consumes. agent = fabric node + brain."
17
17
  authors = [{ name = "Eric Moore", email = "eric@ciris.ai" }]
18
18
  license = { text = "AGPL-3.0-or-later" }
@@ -250,7 +250,7 @@ fn federation_pqc_signer(cfg: &ServerConfig) -> Result<Arc<dyn PqcSigner>> {
250
250
  /// already-sealed seed is loaded, or a fresh one is generated + sealed
251
251
  /// (`get_platform_ed25519_signer`). Either way the seed is TPM/SE/StrongBox-sealed
252
252
  /// at rest with software-encrypted fallback; the pubkey stays 32-byte Ed25519.
253
- fn federation_signer(cfg: &ServerConfig) -> Result<Box<dyn HardwareSigner>> {
253
+ pub(crate) fn federation_signer(cfg: &ServerConfig) -> Result<Box<dyn HardwareSigner>> {
254
254
  let seed_path = cfg.seed_path(); // identity_dir/ed25519.seed — the takeover source
255
255
  if seed_path.exists() {
256
256
  let bytes =
@@ -0,0 +1,266 @@
1
+ //! `ciris-server import-traces <dump-dir>` — import the legacy CIRISLens
2
+ //! TimescaleDB trace dump into the persist-v7 corpus as **CEG objects**
3
+ //! (`CompleteTrace` / `BatchEnvelope`), for posterity + to show the ragged edge.
4
+ //!
5
+ //! The dump's `accord_traces.jsonl.gz` is the **flat** lens row (schema 1.9.x,
6
+ //! ~90 denormalized columns), NOT CEG wire. This maps each row → a
7
+ //! `CompleteTrace`: the seven reasoning dict-columns become `TraceComponent`s
8
+ //! (thought_start→Observation/ThoughtStart, dma_results→Rationale/DmaResults,
9
+ //! conscience_result→Conscience/ConscienceResult, action_result→Action/
10
+ //! ActionResult, …). The original `signature` + `signature_key_id` are preserved
11
+ //! as provenance; the trace is imported **pre-verified** (the legacy signature
12
+ //! signed the 1.9.x bytes, not the reconstructed trace, so it is not
13
+ //! re-verifiable — `receive_and_persist_pre_verified`). Content-addressed dedup
14
+ //! makes re-runs idempotent.
15
+ //!
16
+ //! Robust to the ragged edge: a streaming JSON-value reader (not line-split)
17
+ //! recovers rows with embedded newlines, and persist's `#[serde(other)]`
18
+ //! component fallbacks keep odd rows from hard-failing.
19
+
20
+ use std::path::Path;
21
+ use std::sync::Arc;
22
+
23
+ use anyhow::{Context, Result};
24
+ use ciris_persist::prelude::Engine;
25
+ use ciris_persist::scrub::NullScrubber;
26
+ use flate2::read::GzDecoder;
27
+ use serde_json::{json, Map, Value};
28
+
29
+ use crate::compose::federation_signer;
30
+ use crate::config::ServerConfig;
31
+
32
+ /// (flat column, component_type, event_type, timestamp column) — the mapping.
33
+ const COMPONENTS: &[(&str, &str, &str, &str)] = &[
34
+ (
35
+ "thought_start",
36
+ "observation",
37
+ "thought_start",
38
+ "thought_start_at",
39
+ ),
40
+ (
41
+ "snapshot_and_context",
42
+ "context",
43
+ "snapshot_and_context",
44
+ "snapshot_at",
45
+ ),
46
+ ("dma_results", "rationale", "dma_results", "dma_results_at"),
47
+ ("idma_result", "rationale", "idma_result", "idma_at"),
48
+ ("aspdma_result", "rationale", "aspdma_result", "aspdma_at"),
49
+ (
50
+ "conscience_result",
51
+ "conscience",
52
+ "conscience_result",
53
+ "conscience_at",
54
+ ),
55
+ (
56
+ "action_result",
57
+ "action",
58
+ "action_result",
59
+ "action_result_at",
60
+ ),
61
+ ];
62
+
63
+ /// Entry point for the `import-traces` subcommand.
64
+ pub async fn run(dump_dir: &str) -> Result<()> {
65
+ let cfg = ServerConfig::from_env()?;
66
+ cfg.ensure_dirs()?;
67
+ let signer: Arc<dyn ciris_keyring::HardwareSigner> = Arc::from(federation_signer(&cfg)?);
68
+ let engine = Engine::with_hardware_signer(signer, &cfg.dsn())
69
+ .await
70
+ .context("open persist Engine for import")?;
71
+
72
+ let path = Path::new(dump_dir).join("accord_traces.jsonl.gz");
73
+ let path = if path.exists() {
74
+ path
75
+ } else {
76
+ Path::new(dump_dir).join("accord_traces.jsonl") // accept a pre-gunzipped dump too
77
+ };
78
+ tracing::info!(dump = %path.display(), dsn = %cfg.dsn(), "importing legacy traces as CEG objects");
79
+
80
+ let file = std::fs::File::open(&path).with_context(|| format!("open {}", path.display()))?;
81
+ let reader: Box<dyn std::io::Read> = if path.extension().is_some_and(|e| e == "gz") {
82
+ Box::new(GzDecoder::new(file))
83
+ } else {
84
+ Box::new(file)
85
+ };
86
+ // Tolerant JSONL reader: accumulate lines until a complete JSON value parses
87
+ // (recovers multi-line records — the ragged ~30%), and skip a genuinely
88
+ // corrupt record by resyncing at the next line (serde's streaming reader
89
+ // can't — it halts at the first bad value).
90
+ use std::io::BufRead;
91
+ let lines = std::io::BufReader::new(reader).lines();
92
+ let mut buf = String::new();
93
+
94
+ let (mut seen, mut inserted, mut conflicted, mut errored, mut unparsed, mut salvaged) =
95
+ (0u64, 0u64, 0u64, 0u64, 0u64, 0u64);
96
+ for line in lines {
97
+ let line = line.context("read dump line")?;
98
+ if buf.is_empty() {
99
+ buf.push_str(&line);
100
+ } else {
101
+ buf.push('\n');
102
+ buf.push_str(&line);
103
+ }
104
+ let mut was_salvaged = false;
105
+ let row: Value = match serde_json::from_str(&buf) {
106
+ Ok(v) => {
107
+ buf.clear();
108
+ v
109
+ }
110
+ Err(e) if e.is_eof() => continue, // incomplete multi-line record — keep accumulating
111
+ Err(_) => {
112
+ // Complete but malformed: the dump's systematic export bug —
113
+ // stringified-JSON fields escape inner quotes as `\\"` (escaped
114
+ // backslash + bare quote, which closes the string early) instead
115
+ // of `\"`. Salvage by un-doubling `\\"` → `\"` and retrying
116
+ // (a few passes for multi-level nesting).
117
+ let mut repaired = buf.clone();
118
+ buf.clear();
119
+ let mut got: Option<Value> = None;
120
+ for _ in 0..4 {
121
+ let next = repaired.replace("\\\\\"", "\\\"");
122
+ if next == repaired {
123
+ break;
124
+ }
125
+ repaired = next;
126
+ if let Ok(v) = serde_json::from_str::<Value>(&repaired) {
127
+ got = Some(v);
128
+ break;
129
+ }
130
+ }
131
+ match got {
132
+ Some(v) => {
133
+ salvaged += 1;
134
+ was_salvaged = true;
135
+ v
136
+ }
137
+ None => {
138
+ unparsed += 1;
139
+ if unparsed <= 5 {
140
+ tracing::warn!("skipping unparseable dump record (unrepairable)");
141
+ }
142
+ continue;
143
+ }
144
+ }
145
+ }
146
+ };
147
+ seen += 1;
148
+ let bytes = match reconstruct_batch(&row, was_salvaged) {
149
+ Some(b) => b,
150
+ None => {
151
+ errored += 1;
152
+ continue;
153
+ }
154
+ };
155
+ match engine
156
+ .receive_and_persist_pre_verified(&bytes, &NullScrubber)
157
+ .await
158
+ {
159
+ Ok(s) => {
160
+ inserted += s.trace_events_inserted as u64;
161
+ conflicted += s.trace_events_conflicted as u64;
162
+ }
163
+ Err(e) => {
164
+ errored += 1;
165
+ if errored <= 10 {
166
+ let tid = row.get("trace_id").and_then(Value::as_str).unwrap_or("?");
167
+ tracing::warn!(trace_id = %tid, error = %e, "import: row rejected");
168
+ }
169
+ }
170
+ }
171
+ if seen % 1000 == 0 {
172
+ tracing::info!(seen, inserted, conflicted, errored, "import progress");
173
+ }
174
+ }
175
+ tracing::info!(
176
+ seen,
177
+ inserted,
178
+ conflicted,
179
+ errored,
180
+ unparsed,
181
+ salvaged,
182
+ "legacy trace import complete"
183
+ );
184
+ Ok(())
185
+ }
186
+
187
+ /// Reconstruct one flat 1.9.x lens row into a CEG `BatchEnvelope` JSON (bytes).
188
+ /// Returns `None` if the row lacks the minimum identity fields.
189
+ fn reconstruct_batch(row: &Value, salvaged: bool) -> Option<Vec<u8>> {
190
+ let s = |k: &str| row.get(k).and_then(Value::as_str);
191
+ let trace_id = s("trace_id")?;
192
+ let thought_id = s("thought_id")?;
193
+ let started_at = s("started_at")?;
194
+ let completed_at = s("completed_at").unwrap_or(started_at);
195
+ let level = s("trace_level").unwrap_or("generic");
196
+ // persist accepts a CLOSED schema set; "2.7.legacy" is its designated bucket
197
+ // for pre-2.7.8.9 traces. The original lens schema (e.g. 1.9.3) + signature
198
+ // are preserved in a provenance component below — the auditable ragged edge.
199
+ let orig_schema = s("schema_version").unwrap_or("(absent)");
200
+ let schema_version = "2.7.legacy";
201
+
202
+ let mut components = Vec::new();
203
+ for (col, ctype, etype, ts_col) in COMPONENTS {
204
+ if let Some(data) = row.get(*col).filter(|v| v.is_object()) {
205
+ let ts = s(ts_col).unwrap_or(started_at);
206
+ components.push(json!({
207
+ "component_type": ctype,
208
+ "event_type": etype,
209
+ "timestamp": ts,
210
+ "data": data,
211
+ }));
212
+ }
213
+ }
214
+ // Provenance component — the ragged edge, made auditable: original lens
215
+ // schema + the legacy signature that signed the 1.9.x bytes (not re-verifiable
216
+ // against this reconstruction). `unknown` event_type rides persist's
217
+ // serde(other) fallback.
218
+ components.push(json!({
219
+ "component_type": "observation",
220
+ "event_type": "unknown",
221
+ "timestamp": started_at,
222
+ "data": {
223
+ "_imported_from": "cirislens-timescaledb",
224
+ "legacy_schema_version": orig_schema,
225
+ "legacy_signature": s("signature").unwrap_or(""),
226
+ "legacy_signature_key_id": s("signature_key_id").unwrap_or(""),
227
+ // The raggedest edge: this record's JSON was repaired (the export's
228
+ // `\\"`→`\"` mis-escaping in stringified-JSON fields) before import.
229
+ "_salvaged": salvaged,
230
+ },
231
+ }));
232
+
233
+ let mut trace = Map::new();
234
+ trace.insert("trace_id".into(), json!(trace_id));
235
+ trace.insert("thought_id".into(), json!(thought_id));
236
+ if let Some(t) = s("task_id") {
237
+ trace.insert("task_id".into(), json!(t));
238
+ }
239
+ trace.insert(
240
+ "agent_id_hash".into(),
241
+ json!(s("agent_id_hash").unwrap_or("legacy")),
242
+ );
243
+ trace.insert("started_at".into(), json!(started_at));
244
+ trace.insert("completed_at".into(), json!(completed_at));
245
+ trace.insert("trace_level".into(), json!(level));
246
+ trace.insert("trace_schema_version".into(), json!(schema_version));
247
+ trace.insert("components".into(), json!(components));
248
+ trace.insert("cohort_scope".into(), json!("federation"));
249
+ // Provenance: the legacy signature signed the 1.9.x payload, not this
250
+ // reconstruction — preserved, not re-verified (imported pre-verified).
251
+ trace.insert("signature".into(), json!(s("signature").unwrap_or("")));
252
+ trace.insert(
253
+ "signature_key_id".into(),
254
+ json!(s("signature_key_id").unwrap_or("imported:legacy")),
255
+ );
256
+
257
+ let consent = s("consent_timestamp").unwrap_or(started_at);
258
+ let envelope = json!({
259
+ "events": [{ "event_type": "complete_trace", "trace_level": level, "trace": Value::Object(trace) }],
260
+ "batch_timestamp": started_at,
261
+ "consent_timestamp": consent,
262
+ "trace_level": level,
263
+ "trace_schema_version": schema_version,
264
+ });
265
+ Some(envelope.to_string().into_bytes())
266
+ }
@@ -26,6 +26,7 @@
26
26
 
27
27
  mod compose;
28
28
  mod config;
29
+ mod import;
29
30
  /// The `ciris-canonical` founder-quorum (steward-key replacement) — shared with
30
31
  /// the registry slice at Server 0.5 (CIRISServer#1; FSD/REGISTRY_FOLD_DERISK.md).
31
32
  pub mod quorum;
@@ -46,6 +47,12 @@ pub async fn run() -> Result<()> {
46
47
  compose::serve(cfg).await
47
48
  }
48
49
 
50
+ /// Import the legacy CIRISLens TimescaleDB trace dump into the persist corpus as
51
+ /// CEG objects (the `import-traces <dump-dir>` subcommand). See `src/import.rs`.
52
+ pub async fn import_traces(dump_dir: &str) -> Result<()> {
53
+ import::run(dump_dir).await
54
+ }
55
+
49
56
  /// Initialize tracing (shared by the binary and the wheel entry point).
50
57
  pub fn init_tracing() {
51
58
  use tracing_subscriber::{fmt, prelude::*, EnvFilter};
@@ -61,25 +68,52 @@ pub fn init_tracing() {
61
68
  mod python {
62
69
  use pyo3::prelude::*;
63
70
 
71
+ fn rt_block_on<F: std::future::Future<Output = anyhow::Result<()>>>(fut: F) -> PyResult<()> {
72
+ // ONE multi-thread runtime; the node spawns onto it (never a second
73
+ // runtime around the Engine — the persist dual-runtime-deadlock rule).
74
+ let rt = tokio::runtime::Runtime::new()
75
+ .map_err(|e| pyo3::exceptions::PyRuntimeError::new_err(e.to_string()))?;
76
+ rt.block_on(fut)
77
+ .map_err(|e| pyo3::exceptions::PyRuntimeError::new_err(e.to_string()))
78
+ }
79
+
64
80
  /// Console entry point: `pip install ciris-server` → the `ciris-server`
65
- /// command (pyproject `[project.scripts]`). Boots a node with zero-setup
66
- /// defaults mode = server, trusting `ciris-canonical` — no wizard.
81
+ /// command (pyproject `[project.scripts]`). Mirrors the binary's CLI:
82
+ /// `ciris-server import-traces <dump-dir>` runs the legacy-trace import;
83
+ /// otherwise boots a zero-setup node (mode = server, trusts `ciris-canonical`).
67
84
  #[pyfunction]
68
85
  #[pyo3(name = "main")]
69
86
  fn py_main() -> PyResult<()> {
70
87
  crate::init_tracing();
71
- // ONE multi-thread runtime; the lens node spawns onto it (never a second
72
- // runtime around the Engine — the persist dual-runtime-deadlock rule).
73
- let rt = tokio::runtime::Runtime::new()
74
- .map_err(|e| pyo3::exceptions::PyRuntimeError::new_err(e.to_string()))?;
75
- rt.block_on(crate::run())
76
- .map_err(|e| pyo3::exceptions::PyRuntimeError::new_err(e.to_string()))
88
+ let mut args = std::env::args().skip(1);
89
+ match args.next().as_deref() {
90
+ Some("import-traces") => {
91
+ let dir = args.next().ok_or_else(|| {
92
+ pyo3::exceptions::PyRuntimeError::new_err(
93
+ "usage: ciris-server import-traces <dump-dir>",
94
+ )
95
+ })?;
96
+ rt_block_on(crate::import_traces(&dir))
97
+ }
98
+ _ => rt_block_on(crate::run()),
99
+ }
100
+ }
101
+
102
+ /// `ciris_server.import_traces(dump_dir)` — programmatic legacy-trace import
103
+ /// for a pip-only bridge (the CIRISLens TimescaleDB dump → persist corpus as
104
+ /// CEG objects). Reads `CIRIS_HOME`/DSN from the environment, same as the node.
105
+ #[pyfunction]
106
+ #[pyo3(name = "import_traces")]
107
+ fn py_import_traces(dump_dir: String) -> PyResult<()> {
108
+ crate::init_tracing();
109
+ rt_block_on(crate::import_traces(&dump_dir))
77
110
  }
78
111
 
79
112
  /// `import ciris_server` — the composition CIRISAgent embeds.
80
113
  #[pymodule]
81
114
  fn ciris_server(_py: Python<'_>, m: &Bound<'_, PyModule>) -> PyResult<()> {
82
115
  m.add_function(wrap_pyfunction!(py_main, m)?)?;
116
+ m.add_function(wrap_pyfunction!(py_import_traces, m)?)?;
83
117
  // Re-export lens-core's Python surface so CIRISAgent can swap
84
118
  // `from ciris_lens_core import LensClient` → `from ciris_server import
85
119
  // LensClient` (drop-in). One wheel bundles the lens slice; registry +
@@ -0,0 +1,26 @@
1
+ //! CIRISServer binary — the headless fabric node entry point.
2
+ //!
3
+ //! Thin shell: all composition lives in the `ciris_server` library
4
+ //! (src/lib.rs), which is ALSO built as a PyO3 abi3 wheel that CIRISAgent
5
+ //! consumes. `agent = fabric node + brain` — one cohabitation composition, two
6
+ //! shapes (MISSION.md §1.2/§6). See lib.rs and MISSION.md.
7
+
8
+ use anyhow::Result;
9
+
10
+ #[tokio::main]
11
+ async fn main() -> Result<()> {
12
+ ciris_server::init_tracing();
13
+ let mut args = std::env::args().skip(1);
14
+ match args.next().as_deref() {
15
+ // `ciris-server import-traces <dump-dir>` — one-shot legacy-trace import
16
+ // (CIRISLens TimescaleDB dump → persist corpus as CEG objects).
17
+ Some("import-traces") => {
18
+ let dump_dir = args
19
+ .next()
20
+ .ok_or_else(|| anyhow::anyhow!("usage: ciris-server import-traces <dump-dir>"))?;
21
+ ciris_server::import_traces(&dump_dir).await
22
+ }
23
+ // Default: boot the fabric node.
24
+ _ => ciris_server::run().await,
25
+ }
26
+ }
@@ -1,14 +0,0 @@
1
- //! CIRISServer binary — the headless fabric node entry point.
2
- //!
3
- //! Thin shell: all composition lives in the `ciris_server` library
4
- //! (src/lib.rs), which is ALSO built as a PyO3 abi3 wheel that CIRISAgent
5
- //! consumes. `agent = fabric node + brain` — one cohabitation composition, two
6
- //! shapes (MISSION.md §1.2/§6). See lib.rs and MISSION.md.
7
-
8
- use anyhow::Result;
9
-
10
- #[tokio::main]
11
- async fn main() -> Result<()> {
12
- ciris_server::init_tracing();
13
- ciris_server::run().await
14
- }
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes