ciris-server 0.5.89__tar.gz → 0.5.91__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.
- {ciris_server-0.5.89 → ciris_server-0.5.91}/.github/workflows/bench.yml +1 -1
- {ciris_server-0.5.89 → ciris_server-0.5.91}/.github/workflows/build-wheels.yml +4 -2
- {ciris_server-0.5.89 → ciris_server-0.5.91}/.github/workflows/ci.yml +6 -9
- {ciris_server-0.5.89 → ciris_server-0.5.91}/.github/workflows/client-artifacts.yml +1 -1
- {ciris_server-0.5.89 → ciris_server-0.5.91}/.github/workflows/conformance.yml +1 -1
- {ciris_server-0.5.89 → ciris_server-0.5.91}/.github/workflows/localization.yml +1 -2
- {ciris_server-0.5.89 → ciris_server-0.5.91}/.github/workflows/release.yml +2 -2
- {ciris_server-0.5.89 → ciris_server-0.5.91}/Cargo.lock +11 -11
- {ciris_server-0.5.89 → ciris_server-0.5.91}/Cargo.toml +12 -12
- {ciris_server-0.5.89 → ciris_server-0.5.91}/PKG-INFO +1 -1
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/Cargo.toml +4 -4
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/src/ffi/pyo3.rs +2 -2
- ciris_server-0.5.91/rust-toolchain.toml +7 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/src/accord.rs +11 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/src/auth/occurrence.rs +4 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/src/compose.rs +72 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/src/federation_delivery.rs +229 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/tests/release_gates/support.rs +3 -3
- ciris_server-0.5.89/rust-toolchain.toml +0 -5
- {ciris_server-0.5.89 → ciris_server-0.5.91}/.cargo/config.toml +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/.claude/workflows/localize-ui.js +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/.github/workflows/publish-pypi.yml +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/.gitignore +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/CHANGELOG.md +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/LICENSE +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/MISSION.md +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/README.md +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/WIRE_VOCABULARY_KINDS.md +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/bench-site/bench_results.json +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/bench-site/index.html +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/bench_results.json +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/benches/alm_chain.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/benches/erasure_survival.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/benches/n_eff_scoring.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/benches/pqc_av_streaming.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/benches/replication_ingest.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/benches/sig_overhead.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/benches/stream_fanout.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/.github/workflows/bench.yml +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/.github/workflows/ci.yml +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/.gitignore +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/.pre-commit-config.yaml +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/FSD/CIRIS_LENS_CORE.md +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/FSD/LENS_CORE_V0_5.md +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/FSD/OPEN_QUESTIONS.md +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/LICENSE +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/MISSION.md +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/README.md +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/benches/aggregate.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/benches/canonicalize.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/benches/project.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/deny.toml +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/docs/BENCHMARKS.md +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/docs/COHABITATION.md +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/docs/PRE_COMMIT.md +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/docs/PUBLIC_SCHEMA_CONTRACT.md +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/docs/PYPI_PUBLISH.md +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/docs/RELEASE_NOTES.md +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/docs/STANDARDS_COMPARISON.md +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/docs/THREAT_MODEL.md +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/patterns_from_cirislens_core/extraction/json_path.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/patterns_from_cirislens_core/extraction/metadata.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/patterns_from_cirislens_core/extraction/mod.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/patterns_from_cirislens_core/scrubber/distilbert_loader.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/patterns_from_cirislens_core/scrubber/fields.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/patterns_from_cirislens_core/scrubber/mod.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/patterns_from_cirislens_core/scrubber/ner.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/patterns_from_cirislens_core/scrubber/ort_loader.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/patterns_from_cirislens_core/scrubber/proptests.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/patterns_from_cirislens_core/scrubber/regex.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/patterns_from_cirislens_core/scrubber/walker.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/patterns_from_cirislens_core/scrubber/xlm_r_loader.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/pyproject.toml +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/python/ciris_lens_core/__init__.py +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/src/audit/api.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/src/audit/delegate.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/src/audit/mod.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/src/audit/pyo3.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/src/canonical/ceg_egress.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/src/canonical/mod.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/src/capacity/attestation.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/src/capacity/mod.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/src/capacity/score.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/src/capture/batch.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/src/capture/client.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/src/capture/consent.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/src/capture/correlation.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/src/capture/event.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/src/capture/mod.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/src/capture/partial.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/src/capture/py_engine.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/src/capture/seal.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/src/cohort/declared.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/src/cohort/mod.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/src/cohort/resourcing.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/src/config/egress.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/src/config/mod.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/src/config/node.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/src/config/retention.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/src/config/upstream.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/src/detector/axis_metrics.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/src/detector/coherence_ratchet.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/src/detector/correlated_action.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/src/detector/distributive_access.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/src/detector/manifold.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/src/detector/mod.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/src/extract/mod.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/src/extract/projection.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/src/ffi/mod.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/src/lib.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/src/observability/mod.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/src/pipeline/lifecycle.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/src/pipeline/mod.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/src/retention/eviction.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/src/retention/mod.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/src/retention/summary.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/src/role/handler.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/src/role/mod.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/src/role/node.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/src/role/relay.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/src/role/ret_relay.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/src/scores/aggregate.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/src/scores/mod.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/src/scores/oracle.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/src/scoring/assembly.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/src/scoring/axis_calibration.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/src/scoring/calibration.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/src/scoring/capacity.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/src/scoring/mod.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/src/scoring/n_eff.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/src/scoring/result.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/src/signing/event.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/src/signing/mod.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/src/wire/mod.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/src/wire/signer.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/tests/parity/README.md +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/tests/parity/canonical_fixtures.json +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/tests/parity/generate_canonical_fixtures.py +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/crates/ciris-lens-core/tests/sovereign_rlib.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/data/live_mesh_2026-06-22.json +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/docs/SCOPE_PRIVACY.md +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/evidence/README.md +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/evidence/cc_impl.tsv +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/examples/mesh_propagation/main.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/examples/qa_runner/accord.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/examples/qa_runner/canonical.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/examples/qa_runner/common.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/examples/qa_runner/family.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/examples/qa_runner/main.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/examples/qa_runner/verify.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/installers/windows/README.md +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/installers/windows/bundle-jre.ps1 +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/installers/windows/ciris-server-entry.py +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/installers/windows/ciris-server-installer.iss +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/installers/windows/ciris-server.spec +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/pyproject.toml +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/python/ciris_server/__init__.py +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/python/ciris_server/__main__.py +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/python/ciris_server/cli.py +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/python/ciris_server/desktop_launcher.py +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/scripts/bench_report.py +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/src/accord_custody.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/src/accord_halt.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/src/accord_pki/yubico_attestation_root_1.der +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/src/accord_pki/yubico_attestation_root_1.pem +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/src/accord_provision.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/src/accord_reactivate.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/src/adapter.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/src/auth/ABSORPTION.md +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/src/auth/api_keys.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/src/auth/attestation.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/src/auth/bootstrap.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/src/auth/consent.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/src/auth/device_auth.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/src/auth/device_grant.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/src/auth/erasure.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/src/auth/gate.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/src/auth/loopback.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/src/auth/mod.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/src/auth/oauth.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/src/auth/ownership.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/src/auth/portable_occurrence.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/src/auth/roles.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/src/auth/self_login.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/src/auth/session.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/src/auth/store.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/src/auth/verify.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/src/benchmarks/bench_results.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/src/benchmarks/mesh.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/src/benchmarks/mod.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/src/benchmarks/scoreboard.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/src/claim_remote.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/src/config.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/src/config_api.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/src/config_reconcile.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/src/delegation_transparency.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/src/family.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/src/federation_admin.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/src/federation_nodecode.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/src/federation_peers.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/src/graph_config.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/src/health.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/src/holonomic.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/src/http_log.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/src/identity.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/src/ids.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/src/import.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/src/ingest_http.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/src/lib.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/src/main.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/src/memory_api.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/src/mesh_relay.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/src/nodecode.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/src/peer.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/src/proxy.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/src/py_adapter.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/src/quorum.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/src/radio.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/src/replication_reconcile.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/src/safety/age.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/src/safety/infohazard.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/src/safety/mod.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/src/safety/moderation.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/src/safety/named.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/src/safety/watchlist.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/src/scorer/n_eff.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/src/scorer.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/src/system_data.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/src/telemetry_logs.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/src/yubico_attestation_ca.pem +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/tests/accord.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/tests/accord_admit_node.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/tests/alm_chain.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/tests/audit_chain.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/tests/capacity_scorer.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/tests/ceg_graph_projection.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/tests/chaos_mesh.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/tests/claim_remote.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/tests/config_reconcile.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/tests/device_grant.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/tests/federation_admin.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/tests/federation_session_kex.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/tests/graph_config.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/tests/ingest_http.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/tests/mesh_seed_e2e.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/tests/mesh_seed_keyplane_e2e.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/tests/nat_traversal.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/tests/nodecode.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/tests/noise_floor.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/tests/noise_floor_verdicts.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/tests/occurrence.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/tests/ownership.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/tests/peer_replication.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/tests/portable_occurrence.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/tests/release_gates/stage1.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/tests/release_gates/stage2.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/tests/release_gates/stage3.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/tests/release_gates/stage4.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/tests/release_gates/stage5.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/tests/release_gates/stage6.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/tests/release_gates/stage7.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/tests/release_gates/stage8.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/tests/release_gates.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/tests/replication.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/tests/replication_reconcile.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/tests/root_bootstrap.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/tests/safety.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/tests/stream_sth_consistency.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/tests/wire_vocabulary_gate.rs +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/tools/audit_cohort_scope_callers.py +0 -0
- {ciris_server-0.5.89 → ciris_server-0.5.91}/tools/check_evidence.py +0 -0
|
@@ -41,7 +41,7 @@ jobs:
|
|
|
41
41
|
url: ${{ steps.deploy.outputs.page_url }}
|
|
42
42
|
steps:
|
|
43
43
|
- uses: actions/checkout@v4
|
|
44
|
-
- uses: dtolnay/rust-toolchain@
|
|
44
|
+
- uses: dtolnay/rust-toolchain@1.97.0
|
|
45
45
|
- name: Install build deps
|
|
46
46
|
run: |
|
|
47
47
|
# Drop the preinstalled Microsoft/azure-cli apt repo: it intermittently
|
|
@@ -46,7 +46,7 @@ jobs:
|
|
|
46
46
|
- { name: linux-aarch64, runs-on: ubuntu-24.04-arm }
|
|
47
47
|
steps:
|
|
48
48
|
- uses: actions/checkout@v4
|
|
49
|
-
- uses: dtolnay/rust-toolchain@
|
|
49
|
+
- uses: dtolnay/rust-toolchain@1.97.0
|
|
50
50
|
# Restore the release substrate compile (warmed on main with the matching
|
|
51
51
|
# shared-key). Saves only on main; on a tag this is restore-only (a tag-
|
|
52
52
|
# scoped save can't be read by the next tag, so it would just burn budget).
|
|
@@ -249,6 +249,7 @@ jobs:
|
|
|
249
249
|
uses: PyO3/maturin-action@v1
|
|
250
250
|
with:
|
|
251
251
|
target: ${{ matrix.target }}
|
|
252
|
+
rust-toolchain: "1.97.0"
|
|
252
253
|
args: --release --strip --out dist
|
|
253
254
|
# maturin-action's built-in compiler cache (sccache over the GHA cache
|
|
254
255
|
# backend), warmed on main by warm-release-cache.yml calling this same
|
|
@@ -348,6 +349,7 @@ jobs:
|
|
|
348
349
|
uses: PyO3/maturin-action@v1
|
|
349
350
|
with:
|
|
350
351
|
target: x64
|
|
352
|
+
rust-toolchain: "1.97.0"
|
|
351
353
|
args: --release --strip --out dist
|
|
352
354
|
# Compiler cache (sccache over the GHA backend), warmed on main via
|
|
353
355
|
# warm-release-cache.yml. Restore-on-tag; harmless otherwise.
|
|
@@ -383,7 +385,7 @@ jobs:
|
|
|
383
385
|
- { abi: arm64-v8a, target: aarch64-linux-android, clang: aarch64-linux-android24, legacy: aarch64-linux-android, pw: 64 }
|
|
384
386
|
steps:
|
|
385
387
|
- uses: actions/checkout@v4
|
|
386
|
-
- uses: dtolnay/rust-toolchain@
|
|
388
|
+
- uses: dtolnay/rust-toolchain@1.97.0
|
|
387
389
|
with:
|
|
388
390
|
targets: ${{ matrix.target }}
|
|
389
391
|
# Cache the NDK cross-compile of the substrate per-ABI (the target-specific
|
|
@@ -1,13 +1,10 @@
|
|
|
1
1
|
name: CI
|
|
2
2
|
|
|
3
3
|
on:
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
- "**/*.md"
|
|
9
|
-
- "FSD/**"
|
|
10
|
-
- "docs/**"
|
|
4
|
+
# PR-only (CI-redundancy trim): a squash-merge to main is byte-identical to the
|
|
5
|
+
# PR that just passed this clippy+test matrix, so re-running on push:main is pure
|
|
6
|
+
# duplication. No CIRISCache save lives here (it's in conformance.yml) — nothing
|
|
7
|
+
# main-only is lost; the tag's publish gate + release are the post-merge check.
|
|
11
8
|
pull_request:
|
|
12
9
|
paths-ignore:
|
|
13
10
|
- "**/*.md"
|
|
@@ -33,7 +30,7 @@ jobs:
|
|
|
33
30
|
runs-on: ubuntu-latest
|
|
34
31
|
steps:
|
|
35
32
|
- uses: actions/checkout@v4
|
|
36
|
-
- uses: dtolnay/rust-toolchain@
|
|
33
|
+
- uses: dtolnay/rust-toolchain@1.97.0
|
|
37
34
|
with:
|
|
38
35
|
components: rustfmt
|
|
39
36
|
- run: cargo fmt --all --check
|
|
@@ -47,7 +44,7 @@ jobs:
|
|
|
47
44
|
os: [ubuntu-latest, macos-latest, windows-latest]
|
|
48
45
|
steps:
|
|
49
46
|
- uses: actions/checkout@v4
|
|
50
|
-
- uses: dtolnay/rust-toolchain@
|
|
47
|
+
- uses: dtolnay/rust-toolchain@1.97.0
|
|
51
48
|
with:
|
|
52
49
|
components: clippy
|
|
53
50
|
- name: Install build deps (Linux)
|
|
@@ -124,7 +124,7 @@ jobs:
|
|
|
124
124
|
python-version: '3.12'
|
|
125
125
|
|
|
126
126
|
- name: Set up Rust (maturin builds the abi3 wheel)
|
|
127
|
-
uses: dtolnay/rust-toolchain@
|
|
127
|
+
uses: dtolnay/rust-toolchain@1.97.0
|
|
128
128
|
|
|
129
129
|
# CIRISCache 4-layer centipede (CIRISServer#99) — restore the substrate
|
|
130
130
|
# compile so the windows-installer maturin build doesn't cold-compile
|
|
@@ -40,7 +40,7 @@ jobs:
|
|
|
40
40
|
runs-on: ubuntu-latest
|
|
41
41
|
steps:
|
|
42
42
|
- uses: actions/checkout@v4
|
|
43
|
-
- uses: dtolnay/rust-toolchain@
|
|
43
|
+
- uses: dtolnay/rust-toolchain@1.97.0
|
|
44
44
|
# Cache the cargo registry/git + the release target/ deps. This is the
|
|
45
45
|
# WARMER for the tag-triggered publish-pypi linux-x86_64 wheel: it builds
|
|
46
46
|
# the SAME `maturin build --release` on the SAME runner, so the substrate
|
|
@@ -78,7 +78,7 @@ jobs:
|
|
|
78
78
|
steps:
|
|
79
79
|
- uses: actions/checkout@v4
|
|
80
80
|
|
|
81
|
-
- uses: dtolnay/rust-toolchain@
|
|
81
|
+
- uses: dtolnay/rust-toolchain@1.97.0
|
|
82
82
|
with:
|
|
83
83
|
targets: ${{ matrix.target }}
|
|
84
84
|
|
|
@@ -207,7 +207,7 @@ jobs:
|
|
|
207
207
|
continue-on-error: true
|
|
208
208
|
steps:
|
|
209
209
|
- uses: actions/checkout@v4
|
|
210
|
-
- uses: dtolnay/rust-toolchain@
|
|
210
|
+
- uses: dtolnay/rust-toolchain@1.97.0
|
|
211
211
|
with:
|
|
212
212
|
targets: aarch64-unknown-linux-musl
|
|
213
213
|
- uses: Swatinem/rust-cache@v2
|
|
@@ -766,8 +766,8 @@ dependencies = [
|
|
|
766
766
|
|
|
767
767
|
[[package]]
|
|
768
768
|
name = "ciris-crypto"
|
|
769
|
-
version = "8.10.
|
|
770
|
-
source = "git+https://github.com/CIRISAI/CIRISVerify?tag=v8.10.
|
|
769
|
+
version = "8.10.1"
|
|
770
|
+
source = "git+https://github.com/CIRISAI/CIRISVerify?tag=v8.10.1#11aa3b5244666062b7d22f3deee694156a73bbd5"
|
|
771
771
|
dependencies = [
|
|
772
772
|
"chacha20poly1305",
|
|
773
773
|
"ed25519-dalek",
|
|
@@ -793,8 +793,8 @@ dependencies = [
|
|
|
793
793
|
|
|
794
794
|
[[package]]
|
|
795
795
|
name = "ciris-edge"
|
|
796
|
-
version = "9.
|
|
797
|
-
source = "git+https://github.com/CIRISAI/CIRISEdge?tag=v9.
|
|
796
|
+
version = "9.3.0"
|
|
797
|
+
source = "git+https://github.com/CIRISAI/CIRISEdge?tag=v9.3.0#00d06def6e81317158b8ae40a5722726b34ad988"
|
|
798
798
|
dependencies = [
|
|
799
799
|
"async-trait",
|
|
800
800
|
"axum",
|
|
@@ -847,8 +847,8 @@ dependencies = [
|
|
|
847
847
|
|
|
848
848
|
[[package]]
|
|
849
849
|
name = "ciris-keyring"
|
|
850
|
-
version = "8.10.
|
|
851
|
-
source = "git+https://github.com/CIRISAI/CIRISVerify?tag=v8.10.
|
|
850
|
+
version = "8.10.1"
|
|
851
|
+
source = "git+https://github.com/CIRISAI/CIRISVerify?tag=v8.10.1#11aa3b5244666062b7d22f3deee694156a73bbd5"
|
|
852
852
|
dependencies = [
|
|
853
853
|
"aes-gcm",
|
|
854
854
|
"async-trait",
|
|
@@ -911,8 +911,8 @@ dependencies = [
|
|
|
911
911
|
|
|
912
912
|
[[package]]
|
|
913
913
|
name = "ciris-persist"
|
|
914
|
-
version = "13.
|
|
915
|
-
source = "git+https://github.com/CIRISAI/CIRISPersist?tag=v13.
|
|
914
|
+
version = "13.5.0"
|
|
915
|
+
source = "git+https://github.com/CIRISAI/CIRISPersist?tag=v13.5.0#95cef81492609a95177101424b9bb8ddf05cc09b"
|
|
916
916
|
dependencies = [
|
|
917
917
|
"async-trait",
|
|
918
918
|
"base64 0.22.1",
|
|
@@ -949,7 +949,7 @@ dependencies = [
|
|
|
949
949
|
|
|
950
950
|
[[package]]
|
|
951
951
|
name = "ciris-server"
|
|
952
|
-
version = "0.5.
|
|
952
|
+
version = "0.5.91"
|
|
953
953
|
dependencies = [
|
|
954
954
|
"anyhow",
|
|
955
955
|
"async-trait",
|
|
@@ -991,8 +991,8 @@ dependencies = [
|
|
|
991
991
|
|
|
992
992
|
[[package]]
|
|
993
993
|
name = "ciris-verify-core"
|
|
994
|
-
version = "8.10.
|
|
995
|
-
source = "git+https://github.com/CIRISAI/CIRISVerify?tag=v8.10.
|
|
994
|
+
version = "8.10.1"
|
|
995
|
+
source = "git+https://github.com/CIRISAI/CIRISVerify?tag=v8.10.1#11aa3b5244666062b7d22f3deee694156a73bbd5"
|
|
996
996
|
dependencies = [
|
|
997
997
|
"android_system_properties",
|
|
998
998
|
"async-trait",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[package]
|
|
2
2
|
name = "ciris-server"
|
|
3
|
-
version = "0.5.89" # 0.5.89 = FEDERATION DELIVERY (#205, subsumes #204). edge v9.1.7→v9.2.0 (CIRISEdge#289: current_edge() downstream-public + require_local_signer attested-announce; persist v13.4.2 / verify v8.10.0 unchanged) + `ffi-uniffi` on the edge dep so ciris_edge::current_edge() links into the controller. NEW pyo3 entry `start_federation_delivery(cadence_seconds=None, announce_logger=True) -> int` (src/federation_delivery.rs + src/lib.rs): the bare AGENT edge, after init_edge_runtime, calls ONE thing that runs the compose delivery controller in-process against current_rust_engine()+current_edge() — reads the baked canonical transport_hints→targets (subsumes #204's read), authors this node's directed consent:replication grant per admitted canonical peer, starts the ONE ReplicationRuntime seeding the canonical key_ids, installs inbound routing (safe post-boot — Edge::run reads the routing OnceLock live per frame), spawns the consent reconcile loop (set_peers) + announce logger. Compose boot UNCHANGED — factored setup_peer_replication's core into compose::start_replication_runtime(engine,edge,node_key_id,extra_targets) (compose passes &[], the controller passes canonical key_ids) + a shared build_replication_peers. CONTRACT: init_edge_runtime(engine=from_shared_with_local(...), disable_reticulum=False, require_local_signer=True, announce_interval_seconds=15) → start_federation_delivery(). CAVEAT: the Reticulum transport only adds a TCP *dial* peer at BUILD time (no runtime add-peer), so the canonical IP MUST be in the edge init bootstrap_peers (agent-side, the user's peers=1 path) — the controller drives everything downstream of the dial. Live delivery is the agent live-lens QA (not unit-testable: needs a live edge + Node A); 4 new unit tests cover peer-set assembly / dedup / empty sets / uninitialized-guard. 0.5.88 = NODE-A BOOT FIX (triple adoption). Substrate bump persist v13.4.1→v13.4.2 / edge v9.1.6→v9.1.7 / verify v8.9.0→v8.10.0. CIRISPersist#394: the #390 canonical bake made seed_canonical_servers `put_public_key` the baked 2-of-3 record — but on the CANONICAL NODE ITSELF (ciris-canonical-1-d7bdeu223k already exists as its own self-signed `node` row, same pubkeys, minted at first registration), put_public_key saw same-key/different-content → Err → EngineError::GenesisSeed → BOOT ABORT. The one node the bake was meant to serve couldn't boot on v13.4.0/v13.4.1 (RCA'd here; bisected 0.5.85✅/0.5.86❌). v13.4.2 seeds via adopt_scrub_upgrade instead: absent→insert, self-signed same-pubkey→UPGRADE to the scrubbed canonical record (A self-roots), already-scrubbed→no-op, drift→reject. verify v8.9.0→v8.10.0 (persist v13.4.2 requires it): additive — the new `ciris-verify manifest sign` CLI (#176/#177, the canonical build-manifest producer emitting SignedCegObject/build_manifest_contribution scoped infra:attest); no server consumer break. edge v9.1.7 = coherence re-pin of persist v13.4.2 + verify v8.10.0. NO server source change — pure substrate adoption; unblocks Node A's upgrade off 0.5.85. 0.5.87 = PYO3-SEED FIX ADOPTION. Substrate bump persist v13.4.0→v13.4.1 / edge v9.1.5→v9.1.6 (verify v8.9.0 unchanged). CIRISPersist#392: the pyo3/wheel ctor PyEngine::new hand-rolled its own genesis seed and stopped at the accord holders — it never ran the #386 entrenched-family (v13.3.0) or #390 canonical (v13.4.0) bakes that Engine::with_signer does. So EVERY wheel consumer (the server's own py_main boot + agent-embedded engines, CIRISServer#191 / CIRISAgent#896) got A1/B1/C1 but NO HUMANITY_ACCORD family row and list_canonical_servers()==[] — the canonical bake never reached the installs it was meant to light up. v13.4.1 factors the full post-holders sequence (verify anchor → family #386 → canonical #390) into ONE shared genesis::seed_family_and_canonical(dir) called by BOTH ctors, so pyo3 + Rust engines are seed-identical. edge v9.1.6 = coherence re-pin of persist v13.4.1. NO server source change — pure substrate adoption; a fresh wheel Engine now returns ciris-canonical-1 + an entrenched family. 0.5.86 = GENESIS-BAKE + GRAPH-FIX. Substrate bump persist v13.3.1→v13.4.0 / edge v9.1.4→v9.1.5 (verify v8.9.0 unchanged). (1) CIRISPersist#390/#391: the 2-of-3 canonical genesis server (ciris-canonical-1-d7bdeu223k) is now BAKED at genesis — the operator's live accord-co-scrubbed record (A1 primary + B1 in additional_scrubs, field-conferred this session) restores the seed #383 deferred (a 1-of-N founding record was a first-strike weakness; canonical ADD is 2-of-3, so the baked genesis is too). A FRESH install boots already trusting ciris-canonical-1 (adopt_scrub_upgrade seeds/upgrades every node's row incl. Node A's own → A self-roots on upgrade), nodes addressable by key_id — no ceremony. edge v9.1.5 = coherence re-pin of persist v13.4.0 (same-repo [patch] gotcha). (2) GRAPH-VIEW FIX: the memory graph crashed loading (JsonConvertException: NodeType has no 'attestation') — 0.5.85's seed_ceg_graph projects CEG trust-root kinds (owner/owned_node/canonical_server/family/holder/delegation/attestation/peer) the client's strict NodeType enum didn't know, so ONE unknown value failed the whole /v1/memory/timeline payload. Fix (client): added the 8 CEG variants + a TOLERANT NodeTypeSerializer (unknown→UNKNOWN, never throws again) + distinct CEG-plane colors. 0.5.85 = SEED-UX cut (no substrate change; edge v9.1.4 / persist v13.3.1 / verify v8.9.0). The fixes that let the operator + a second holder seed the canonical mesh cleanly from the desktop UI: (1) OS-AWARE ykcs11 module path — the node's default PKCS#11 module now resolves per-OS (macOS Homebrew .dylib Apple-Silicon/Intel; Windows Yubico PIV Tool .dll / PATH; Linux .so) via identity.rs::default_ykcs11_module, wired into Pkcs11Options + the accord propose/cosign/admit paths, so a macOS/Windows holder's YubiKey cosign works (was hardcoded Linux → dlopen failure). Optional per-request "PKCS#11 module path (advanced)" field in the hardware-scrub sheet as an override. (2) COPY/EXPORT the co-scrub partial + finished record from the Trust Root card (Propose/Cosign/Pending) — Copy-to-clipboard + Save-to-file; no more pulling JSON off disk. (3) NAV label "Accord" → "Trust Root". (4) CIRISServer#127++ — the memory graph now PROJECTS persist's CEG state (seed_ceg_graph): ~40+ nodes (identity, owner, owned nodes, HUMANITY_ACCORD family + holders, canonical servers, config:*, delegations/consent/structural attestations) with CEG-native typed edges (delegates_to owner-binding, has_member family→holder seat, scrub_conferral holder→canonical, has_config, replicates_to, authored, supersedes/withdraws/recants); each node carries kind·subject·status·record so the client can render it as an AttestationCard. Follow-ups: wire the Trust Root ⋮ hamburger onto graph nodes (client); 28-language fan-out for the 7 new strings; pending-co-scrub graph node. 0.5.84 = THE FULL SAFE-MESH-SEED CUT. Substrate lockstep bumped edge v9.1.2→v9.1.4 / persist v13.2.0→v13.3.1 (v13.3.1 #387 adds the test-only with_signer_no_genesis_seed seam so the accord ceremony tests get a clean engine) (verify v8.9.0 unchanged). (1) CIRISPersist#386: the HUMANITY_ACCORD federation_families row (quorum:2/3, A1/B1/C1) is now SEEDED at boot on every node (idempotent) — lookup_family resolves durably, so the 0.5.83 baked-genesis fallbacks are RETIRED (recognized_family_from_baked_genesis + family_quorum_m fallback deleted; get_family reads the real entrenched row; V097 drops the family_key_id→federation_keys FK — a constitutional family is keyless). (2) CIRISServer#181 producer hook: POST /v1/safety/flag (duty-gated: verify_request + admit_moderation_action(Moderate)) emits the substrate-reserved content_class:{infohazard|reported} flag via a NEW node-scoped substrate_persist identity (sealed Ed25519 <alias>-substrate + software ML-DSA seed, registered through register_federation_key) — the duty-holder authorizes, the substrate signs; action:clear supersedes. This makes the #161 infohazard reveal gate actually FIRE (flag → GET /v1/safety/reveal 403 interstitial for a non-consented viewer). (3) CIRISServer#161 (already on main): POST /v1/safety/reveal — the CC 4.5.13 consent gate. #378 single-owner marker gate rides the persist bump (no server action). Follow-ups: retire ensure_accord_family_anchor throwaway key (low-risk, legacy assemble path); infohazard consent lifecycle + interstitial UX (#180 umbrella / #182-#185). 0.5.83 = BAKED-FAMILY RECOGNITION + RAISE-A-HALT. Same substrate (edge v9.1.2 / persist v13.2.0 / verify v8.9.0). Fixes "No accord family established on this node yet" on a node that has the BAKED genesis but no entrenched federation_families row (persist seeds the 3 holder KEY rows, not the family row — durable fix filed CIRISPersist#386): GET /v1/accord/family + the co-scrub quorum_needed now fall back to verify's baked humanity_accord_genesis() (the 2/3 family + 3 seats, entrenched=false, recognized_via=baked-genesis) — the same recognition resolve_kill_switch_roster already uses. PLUS raise-a-halt: POST /v1/accord/halt (initiate_halt, the binding twin of /drill — one opener signature is sub-quorum and cannot latch; 2-of-3 concur latches) + the client "Halt the mesh" action (was a disabled placeholder). 0.5.82 = CO-SCRUB END-TO-END. Same substrate lockstep edge v9.1.2 / persist v13.2.0 / verify v8.9.0 (no triple change). The cross-device m-of-n seed now works from the app: the co-scrub partial GOSSIPS over the accord peer-plane (the same HTTP set the kill-switch uses) — propose on A1's box → the partial surfaces under "Pending co-signs (canonical)" on B1's box → cosign → conferred, no manual transfer. Server (src/accord_provision.rs): ProvisionState gains an ephemeral bounded pending store + a (target,scrub-count) seen-set; ingest_partial validates structurally + upserts + gossips; NEW open (non-loopback) POST /v1/accord/canonical/gossip-partial peer-receive + GET /v1/accord/canonical/pending; router() split into build()→{loopback,gossip}. Client (#174): proposeCanonical/cosignCanonical/listPendingCoscrubs, the "Pending co-signs (canonical)" section + CanonicalCosignSheet (pending-entry or pasted-partial fallback), "[+ New] Add"→"Propose a canonical server". Bundled: #117 (Delegations loads on screen entry, not VM init → no pre-login 401) + #134 (existing-key offer no longer gated on a typed label; label auto-populates from the picked key_id). 0.5.81 = M-OF-N TRUST ROOT. Substrate lockstep edge v9.1.2 / persist v13.2.0 / verify v8.9.0 (CIRISPersist#383: KeyRecord.additional_scrubs + the DYNAMIC m-of-n admission gate via verify's verify_quorum_policy — canonical is conferred iff distinct_scrub_count() ≥ the family's entrenched quorum:M/N, NOT a hardcoded 2; the 1-of-N genesis is no longer auto-baked). Trust Root co-scrub ceremony (server-side, hardware-signed via the shared open_holder_identity custody path): POST /v1/accord/canonical/{propose,cosign} (scrub #1 → gossip/transfer the partial → append_scrub over the byte-identical envelope → adopt_scrub_upgrade lets the m-of-n gate confer/hold), plus /withdraw + /supersede (#377, 2-of-3 via proposal_digest) and IP-in-envelope TransportHint. Accord ops drill + announce (/v1/accord/{drill,announce}, node-synth'd invocation, gossiped, recorded pre-latch) + /halt-status. DRY audit landed (recipes routed through the substrate: build_self_key_record→produce_self_key_record, CANONICAL_BOOTSTRAP_PEERS→Engine::canonical_bootstrap_hints, owner_binding consts aliased). CEG-native Trust Root card redesign (one AttestationCard + ⋮ hamburger; concur now hardware-signs). KNOWN → 0.5.82 (#174): the client "Add canonical" still posts /add (1-scrub partial under m-of-n) — wire the propose→cosign buttons. 0.5.80 = THE MESH-SEED RELEASE. Substrate lockstep edge v9.1.0 / persist v13.0.1 / verify v8.7.0 (CC 1.0 RC1: KeyRecord.consent_role, the accord-conferred `canonical` identity_type role + admission gate CIRISPersist#372, single-owner owner_of #162, CIRISEdge#277 upgrade-aware Key-plane apply → KERI publish-own end-to-end). Trust Root canonical ops (#164): POST /v1/accord/canonical/add — the 1-of-N hardware-scrub SEED op (scrub-sign w/ the canonical role + adopt onto own row + publish address) + GET /v1/accord/canonical/servers + the client "Canonical servers" card (update-address shipped #165; supersede/withdraw → 0.5.81, need a persist role-removal primitive). ci.yml revived (my #155 evidence-step colon had broken the Rust gate repo-wide). 0.5.79 = substrate triple edge v8.7.2 / persist v12.5.0 / verify v8.7.0 (cross-cdylib block_on-deadlock/SIGABRT fix + CC 0.9.3 gates + dep-trims landed: hickory 0.25 de-dup, dead openssl/qrcodegen/bip39 gone) + REMOTE adopt-scrubbed endpoint (#150 — POST /v1/federation/adopt-scrubbed applies an A1-scrubbed record onto a node's own row so it roots; the seed producer's remote leg, keys live off-node) + server-local dep-trims (#152: drop hmac/pyo3-async-runtimes, lens-core async-trait/opentelemetry, base64 0.21→0.22). 0.5.78 = edge v8.6.1 / persist v12.2.0 adoption — the COMPLETE admit-node → mesh-seed loop. (1) #144 KEY-PLANE replication (KERI publish-own): the ReplicationRuntime converges an EnvelopeKind::Key coordinator per consent peer + a key_selector publishing the node's OWN key_id. (2) #150 PRODUCER: admit-node now calls persist v12.2.0 Engine::adopt_scrub_upgrade (CIRISPersist#351) to upgrade the node's own self-signed row to the accord-holder-scrubbed record — so the Key plane publishes an ANCHORED, rootable record → peers root it. Producer (server upgrades the row) + publish-own (edge advertises it) = the seed closes in place, no wipe. (3) #147 §Q B5: persist FountainHeldMeta.{content_bytes,cohort_scope} adopted (server has no fountain-content admit path; import.rs already sets cohort_scope). Verify unchanged v8.5.0. 0.5.77 = persist v12.0.2 anchor seed + accord-card UX.
|
|
3
|
+
version = "0.5.91" # 0.5.91 = ZERO-TOUCH DELIVERY + CI TRIM (no substrate change; triple stays persist v13.5.0 / edge v9.3.0 / verify v8.10.1). (1) BOOT SELF-PUBLISH (#205 gap #2, the durable close): compose now publishes THIS node's reticulum transport-tier binding (dest_hash from edge.local_dest_hash() + the transport Ed25519 from edge.local_transport_pubkey()[32..64]) into the federation directory at boot, for its OWN key_id — so a v7.0.0 explicit-hash canonical (which cannot announce) is primeable straight from the directory with ZERO operator action: restarting Node A on 0.5.91 IS the publish (the row replicates → a consuming node's start_federation_delivery resolves + prime_peer-roots it → knows_peer flips → delivery converges). Best-effort, self-authenticating (own key_id + own edge-owned transport identity, same basis as an attested announce), no accord quorum needed to declare own reachability; silent no-op on a non-reticulum node. (2) CI-REDUNDANCY TRIM: ci.yml + localization.yml are now pull_request-only — a squash-merge is byte-identical to the PR that just passed, and neither holds a CIRISCache save (that lives in conformance.yml, still on main), so the main-push re-run was pure duplication. conformance's main run (save) + the tag's publish conformance-gate (validates the actual published wheel) are kept — not pure dups. 0.5.90 = TRANSPORT-PRIME (delivery close-out). Substrate triple persist v13.4.2→v13.5.0 / edge v9.2.0→v9.3.0 / verify v8.10.0→v8.10.1. (1) rust-toolchain.toml EXACT-pin stable→1.97.0 (CIRISEdge#291) — `stable` floats, so the CIRISCache key `-rustc<VER>-` never matched the substrate repos exact pin → windows/linux wheel restored COLD; aligning all four repos on 1.97.0 makes the restore hit the substrate layer. (2) persist v13.5.0 #397: TransportDestination gains transport_ed25519_pubkey_base64 (Option) — the transport-tier Ed25519 that pairs with a reticulum dest-hash so a peer can prime_peer an explicit-hash canonical (which cannot announce). The accord canonical-address-update invocation (CanonicalAddressUpdate) now carries it (skip_serializing_if keeps pre-#397 threshold sigs byte-identical); the generic occurrence-bind leaves it None. (3) start_federation_delivery now prime_peers the admitted explicit-hash canonicals from the resolved directory binding (gap #1 of #205) + edge v9.3.0 rooting observability (#292). (4) 1.97 clippy: lens-core manual Option::filter → .filter(). 0.5.89 = FEDERATION DELIVERY (#205, subsumes #204). edge v9.1.7→v9.2.0 (CIRISEdge#289: current_edge() downstream-public + require_local_signer attested-announce; persist v13.4.2 / verify v8.10.0 unchanged) + `ffi-uniffi` on the edge dep so ciris_edge::current_edge() links into the controller. NEW pyo3 entry `start_federation_delivery(cadence_seconds=None, announce_logger=True) -> int` (src/federation_delivery.rs + src/lib.rs): the bare AGENT edge, after init_edge_runtime, calls ONE thing that runs the compose delivery controller in-process against current_rust_engine()+current_edge() — reads the baked canonical transport_hints→targets (subsumes #204's read), authors this node's directed consent:replication grant per admitted canonical peer, starts the ONE ReplicationRuntime seeding the canonical key_ids, installs inbound routing (safe post-boot — Edge::run reads the routing OnceLock live per frame), spawns the consent reconcile loop (set_peers) + announce logger. Compose boot UNCHANGED — factored setup_peer_replication's core into compose::start_replication_runtime(engine,edge,node_key_id,extra_targets) (compose passes &[], the controller passes canonical key_ids) + a shared build_replication_peers. CONTRACT: init_edge_runtime(engine=from_shared_with_local(...), disable_reticulum=False, require_local_signer=True, announce_interval_seconds=15) → start_federation_delivery(). CAVEAT: the Reticulum transport only adds a TCP *dial* peer at BUILD time (no runtime add-peer), so the canonical IP MUST be in the edge init bootstrap_peers (agent-side, the user's peers=1 path) — the controller drives everything downstream of the dial. Live delivery is the agent live-lens QA (not unit-testable: needs a live edge + Node A); 4 new unit tests cover peer-set assembly / dedup / empty sets / uninitialized-guard. 0.5.88 = NODE-A BOOT FIX (triple adoption). Substrate bump persist v13.4.1→v13.4.2 / edge v9.1.6→v9.1.7 / verify v8.9.0→v8.10.0. CIRISPersist#394: the #390 canonical bake made seed_canonical_servers `put_public_key` the baked 2-of-3 record — but on the CANONICAL NODE ITSELF (ciris-canonical-1-d7bdeu223k already exists as its own self-signed `node` row, same pubkeys, minted at first registration), put_public_key saw same-key/different-content → Err → EngineError::GenesisSeed → BOOT ABORT. The one node the bake was meant to serve couldn't boot on v13.4.0/v13.4.1 (RCA'd here; bisected 0.5.85✅/0.5.86❌). v13.4.2 seeds via adopt_scrub_upgrade instead: absent→insert, self-signed same-pubkey→UPGRADE to the scrubbed canonical record (A self-roots), already-scrubbed→no-op, drift→reject. verify v8.9.0→v8.10.0 (persist v13.4.2 requires it): additive — the new `ciris-verify manifest sign` CLI (#176/#177, the canonical build-manifest producer emitting SignedCegObject/build_manifest_contribution scoped infra:attest); no server consumer break. edge v9.1.7 = coherence re-pin of persist v13.4.2 + verify v8.10.0. NO server source change — pure substrate adoption; unblocks Node A's upgrade off 0.5.85. 0.5.87 = PYO3-SEED FIX ADOPTION. Substrate bump persist v13.4.0→v13.4.1 / edge v9.1.5→v9.1.6 (verify v8.9.0 unchanged). CIRISPersist#392: the pyo3/wheel ctor PyEngine::new hand-rolled its own genesis seed and stopped at the accord holders — it never ran the #386 entrenched-family (v13.3.0) or #390 canonical (v13.4.0) bakes that Engine::with_signer does. So EVERY wheel consumer (the server's own py_main boot + agent-embedded engines, CIRISServer#191 / CIRISAgent#896) got A1/B1/C1 but NO HUMANITY_ACCORD family row and list_canonical_servers()==[] — the canonical bake never reached the installs it was meant to light up. v13.4.1 factors the full post-holders sequence (verify anchor → family #386 → canonical #390) into ONE shared genesis::seed_family_and_canonical(dir) called by BOTH ctors, so pyo3 + Rust engines are seed-identical. edge v9.1.6 = coherence re-pin of persist v13.4.1. NO server source change — pure substrate adoption; a fresh wheel Engine now returns ciris-canonical-1 + an entrenched family. 0.5.86 = GENESIS-BAKE + GRAPH-FIX. Substrate bump persist v13.3.1→v13.4.0 / edge v9.1.4→v9.1.5 (verify v8.9.0 unchanged). (1) CIRISPersist#390/#391: the 2-of-3 canonical genesis server (ciris-canonical-1-d7bdeu223k) is now BAKED at genesis — the operator's live accord-co-scrubbed record (A1 primary + B1 in additional_scrubs, field-conferred this session) restores the seed #383 deferred (a 1-of-N founding record was a first-strike weakness; canonical ADD is 2-of-3, so the baked genesis is too). A FRESH install boots already trusting ciris-canonical-1 (adopt_scrub_upgrade seeds/upgrades every node's row incl. Node A's own → A self-roots on upgrade), nodes addressable by key_id — no ceremony. edge v9.1.5 = coherence re-pin of persist v13.4.0 (same-repo [patch] gotcha). (2) GRAPH-VIEW FIX: the memory graph crashed loading (JsonConvertException: NodeType has no 'attestation') — 0.5.85's seed_ceg_graph projects CEG trust-root kinds (owner/owned_node/canonical_server/family/holder/delegation/attestation/peer) the client's strict NodeType enum didn't know, so ONE unknown value failed the whole /v1/memory/timeline payload. Fix (client): added the 8 CEG variants + a TOLERANT NodeTypeSerializer (unknown→UNKNOWN, never throws again) + distinct CEG-plane colors. 0.5.85 = SEED-UX cut (no substrate change; edge v9.1.4 / persist v13.3.1 / verify v8.9.0). The fixes that let the operator + a second holder seed the canonical mesh cleanly from the desktop UI: (1) OS-AWARE ykcs11 module path — the node's default PKCS#11 module now resolves per-OS (macOS Homebrew .dylib Apple-Silicon/Intel; Windows Yubico PIV Tool .dll / PATH; Linux .so) via identity.rs::default_ykcs11_module, wired into Pkcs11Options + the accord propose/cosign/admit paths, so a macOS/Windows holder's YubiKey cosign works (was hardcoded Linux → dlopen failure). Optional per-request "PKCS#11 module path (advanced)" field in the hardware-scrub sheet as an override. (2) COPY/EXPORT the co-scrub partial + finished record from the Trust Root card (Propose/Cosign/Pending) — Copy-to-clipboard + Save-to-file; no more pulling JSON off disk. (3) NAV label "Accord" → "Trust Root". (4) CIRISServer#127++ — the memory graph now PROJECTS persist's CEG state (seed_ceg_graph): ~40+ nodes (identity, owner, owned nodes, HUMANITY_ACCORD family + holders, canonical servers, config:*, delegations/consent/structural attestations) with CEG-native typed edges (delegates_to owner-binding, has_member family→holder seat, scrub_conferral holder→canonical, has_config, replicates_to, authored, supersedes/withdraws/recants); each node carries kind·subject·status·record so the client can render it as an AttestationCard. Follow-ups: wire the Trust Root ⋮ hamburger onto graph nodes (client); 28-language fan-out for the 7 new strings; pending-co-scrub graph node. 0.5.84 = THE FULL SAFE-MESH-SEED CUT. Substrate lockstep bumped edge v9.1.2→v9.1.4 / persist v13.2.0→v13.3.1 (v13.3.1 #387 adds the test-only with_signer_no_genesis_seed seam so the accord ceremony tests get a clean engine) (verify v8.9.0 unchanged). (1) CIRISPersist#386: the HUMANITY_ACCORD federation_families row (quorum:2/3, A1/B1/C1) is now SEEDED at boot on every node (idempotent) — lookup_family resolves durably, so the 0.5.83 baked-genesis fallbacks are RETIRED (recognized_family_from_baked_genesis + family_quorum_m fallback deleted; get_family reads the real entrenched row; V097 drops the family_key_id→federation_keys FK — a constitutional family is keyless). (2) CIRISServer#181 producer hook: POST /v1/safety/flag (duty-gated: verify_request + admit_moderation_action(Moderate)) emits the substrate-reserved content_class:{infohazard|reported} flag via a NEW node-scoped substrate_persist identity (sealed Ed25519 <alias>-substrate + software ML-DSA seed, registered through register_federation_key) — the duty-holder authorizes, the substrate signs; action:clear supersedes. This makes the #161 infohazard reveal gate actually FIRE (flag → GET /v1/safety/reveal 403 interstitial for a non-consented viewer). (3) CIRISServer#161 (already on main): POST /v1/safety/reveal — the CC 4.5.13 consent gate. #378 single-owner marker gate rides the persist bump (no server action). Follow-ups: retire ensure_accord_family_anchor throwaway key (low-risk, legacy assemble path); infohazard consent lifecycle + interstitial UX (#180 umbrella / #182-#185). 0.5.83 = BAKED-FAMILY RECOGNITION + RAISE-A-HALT. Same substrate (edge v9.1.2 / persist v13.2.0 / verify v8.9.0). Fixes "No accord family established on this node yet" on a node that has the BAKED genesis but no entrenched federation_families row (persist seeds the 3 holder KEY rows, not the family row — durable fix filed CIRISPersist#386): GET /v1/accord/family + the co-scrub quorum_needed now fall back to verify's baked humanity_accord_genesis() (the 2/3 family + 3 seats, entrenched=false, recognized_via=baked-genesis) — the same recognition resolve_kill_switch_roster already uses. PLUS raise-a-halt: POST /v1/accord/halt (initiate_halt, the binding twin of /drill — one opener signature is sub-quorum and cannot latch; 2-of-3 concur latches) + the client "Halt the mesh" action (was a disabled placeholder). 0.5.82 = CO-SCRUB END-TO-END. Same substrate lockstep edge v9.1.2 / persist v13.2.0 / verify v8.9.0 (no triple change). The cross-device m-of-n seed now works from the app: the co-scrub partial GOSSIPS over the accord peer-plane (the same HTTP set the kill-switch uses) — propose on A1's box → the partial surfaces under "Pending co-signs (canonical)" on B1's box → cosign → conferred, no manual transfer. Server (src/accord_provision.rs): ProvisionState gains an ephemeral bounded pending store + a (target,scrub-count) seen-set; ingest_partial validates structurally + upserts + gossips; NEW open (non-loopback) POST /v1/accord/canonical/gossip-partial peer-receive + GET /v1/accord/canonical/pending; router() split into build()→{loopback,gossip}. Client (#174): proposeCanonical/cosignCanonical/listPendingCoscrubs, the "Pending co-signs (canonical)" section + CanonicalCosignSheet (pending-entry or pasted-partial fallback), "[+ New] Add"→"Propose a canonical server". Bundled: #117 (Delegations loads on screen entry, not VM init → no pre-login 401) + #134 (existing-key offer no longer gated on a typed label; label auto-populates from the picked key_id). 0.5.81 = M-OF-N TRUST ROOT. Substrate lockstep edge v9.1.2 / persist v13.2.0 / verify v8.9.0 (CIRISPersist#383: KeyRecord.additional_scrubs + the DYNAMIC m-of-n admission gate via verify's verify_quorum_policy — canonical is conferred iff distinct_scrub_count() ≥ the family's entrenched quorum:M/N, NOT a hardcoded 2; the 1-of-N genesis is no longer auto-baked). Trust Root co-scrub ceremony (server-side, hardware-signed via the shared open_holder_identity custody path): POST /v1/accord/canonical/{propose,cosign} (scrub #1 → gossip/transfer the partial → append_scrub over the byte-identical envelope → adopt_scrub_upgrade lets the m-of-n gate confer/hold), plus /withdraw + /supersede (#377, 2-of-3 via proposal_digest) and IP-in-envelope TransportHint. Accord ops drill + announce (/v1/accord/{drill,announce}, node-synth'd invocation, gossiped, recorded pre-latch) + /halt-status. DRY audit landed (recipes routed through the substrate: build_self_key_record→produce_self_key_record, CANONICAL_BOOTSTRAP_PEERS→Engine::canonical_bootstrap_hints, owner_binding consts aliased). CEG-native Trust Root card redesign (one AttestationCard + ⋮ hamburger; concur now hardware-signs). KNOWN → 0.5.82 (#174): the client "Add canonical" still posts /add (1-scrub partial under m-of-n) — wire the propose→cosign buttons. 0.5.80 = THE MESH-SEED RELEASE. Substrate lockstep edge v9.1.0 / persist v13.0.1 / verify v8.7.0 (CC 1.0 RC1: KeyRecord.consent_role, the accord-conferred `canonical` identity_type role + admission gate CIRISPersist#372, single-owner owner_of #162, CIRISEdge#277 upgrade-aware Key-plane apply → KERI publish-own end-to-end). Trust Root canonical ops (#164): POST /v1/accord/canonical/add — the 1-of-N hardware-scrub SEED op (scrub-sign w/ the canonical role + adopt onto own row + publish address) + GET /v1/accord/canonical/servers + the client "Canonical servers" card (update-address shipped #165; supersede/withdraw → 0.5.81, need a persist role-removal primitive). ci.yml revived (my #155 evidence-step colon had broken the Rust gate repo-wide). 0.5.79 = substrate triple edge v8.7.2 / persist v12.5.0 / verify v8.7.0 (cross-cdylib block_on-deadlock/SIGABRT fix + CC 0.9.3 gates + dep-trims landed: hickory 0.25 de-dup, dead openssl/qrcodegen/bip39 gone) + REMOTE adopt-scrubbed endpoint (#150 — POST /v1/federation/adopt-scrubbed applies an A1-scrubbed record onto a node's own row so it roots; the seed producer's remote leg, keys live off-node) + server-local dep-trims (#152: drop hmac/pyo3-async-runtimes, lens-core async-trait/opentelemetry, base64 0.21→0.22). 0.5.78 = edge v8.6.1 / persist v12.2.0 adoption — the COMPLETE admit-node → mesh-seed loop. (1) #144 KEY-PLANE replication (KERI publish-own): the ReplicationRuntime converges an EnvelopeKind::Key coordinator per consent peer + a key_selector publishing the node's OWN key_id. (2) #150 PRODUCER: admit-node now calls persist v12.2.0 Engine::adopt_scrub_upgrade (CIRISPersist#351) to upgrade the node's own self-signed row to the accord-holder-scrubbed record — so the Key plane publishes an ANCHORED, rootable record → peers root it. Producer (server upgrades the row) + publish-own (edge advertises it) = the seed closes in place, no wipe. (3) #147 §Q B5: persist FountainHeldMeta.{content_bytes,cohort_scope} adopted (server has no fountain-content admit path; import.rs already sets cohort_scope). Verify unchanged v8.5.0. 0.5.77 = persist v12.0.2 anchor seed + accord-card UX.
|
|
4
4
|
edition = "2021"
|
|
5
5
|
# MSRV floor is set by the substrate: ciris-verify v5.2.0 requires 1.86
|
|
6
6
|
# (persist v6.0.1 is 1.83). Build with the higher of the two.
|
|
@@ -122,8 +122,8 @@ ciris-lens-core = { path = "crates/ciris-lens-core" } # ABSORBED in-tree (wo
|
|
|
122
122
|
# `cirislens_wa_cert` + `cirislens_service_token_revocation` expose the auth
|
|
123
123
|
# substrate the fabric absorbs (CIRISServer#9, src/auth): the agent's `wa_cert`
|
|
124
124
|
# table (users/WA/OAuth/api-keys) + the `revoked_service_tokens` table.
|
|
125
|
-
ciris-persist = { git = "https://github.com/CIRISAI/CIRISPersist", tag = "v13.
|
|
126
|
-
ciris-edge = { git = "https://github.com/CIRISAI/CIRISEdge", tag = "v9.
|
|
125
|
+
ciris-persist = { git = "https://github.com/CIRISAI/CIRISPersist", tag = "v13.5.0", features = ["sqlite", "cirisgraph", "cirislens_wa_cert", "cirislens_service_token_revocation", "cirisaudit", "cirislens_tasks", "cirislens_thoughts", "cirislens_tickets", "cirislens_correlations", "cirislens_deferral_reports", "cirislens_maintenance_locks", "cirislens_creation_ceremonies", "cirislens_legacy_migration", "cirisincident", "telemetry", "secrets"] }
|
|
126
|
+
ciris-edge = { git = "https://github.com/CIRISAI/CIRISEdge", tag = "v9.3.0", features = ["transport-reticulum", "transport-http", "transport-packet-radio", "ffi-uniffi"] }
|
|
127
127
|
# Founder-quorum verification + key-id fingerprint at the composition root
|
|
128
128
|
# (threshold:: module path — NOT re-exported at the crate root).
|
|
129
129
|
# LOCKSTEP: persist v9.4.0 transitively pins verify-core v6.6.x — the whole
|
|
@@ -132,16 +132,16 @@ ciris-edge = { git = "https://github.com/CIRISAI/CIRISEdge", tag = "v9.2.
|
|
|
132
132
|
# types. v6.6.1 (CIRISVerify#89) adds the create_federation_identity `seal_alias`
|
|
133
133
|
# arg the #247 user-key-derived fix consumes. (6.4–6.6 are HUMANITY_ACCORD + STH
|
|
134
134
|
# stack — the accord-genesis surface CIRISServer#41 consumes.)
|
|
135
|
-
ciris-verify-core = { git = "https://github.com/CIRISAI/CIRISVerify", tag = "v8.10.
|
|
135
|
+
ciris-verify-core = { git = "https://github.com/CIRISAI/CIRISVerify", tag = "v8.10.1" }
|
|
136
136
|
# The hybrid crypto primitives (Ed25519 + ML-DSA-65 software signers) — used by
|
|
137
137
|
# the portable software identity occurrence to build a `HybridSigningIdentity`
|
|
138
138
|
# over two software seeds. Same tag as the rest of the verify family.
|
|
139
|
-
ciris-crypto = { git = "https://github.com/CIRISAI/CIRISVerify", tag = "v8.10.
|
|
139
|
+
ciris-crypto = { git = "https://github.com/CIRISAI/CIRISVerify", tag = "v8.10.1", version = "8", features = ["pqc-ml-dsa", "self-enc"] }
|
|
140
140
|
# Hardware-backed transport-identity keystore (verify v5.2.0 #68 / edge #99).
|
|
141
141
|
# Base = software keystore + byte-identical migration of an existing .rid (works
|
|
142
142
|
# everywhere, no libtss2). The real TPM-2.0 / SE / StrongBox backend rides the
|
|
143
143
|
# `tpm` feature; runtime auto-detects hardware and falls back to software.
|
|
144
|
-
ciris-keyring = { git = "https://github.com/CIRISAI/CIRISVerify", tag = "v8.10.
|
|
144
|
+
ciris-keyring = { git = "https://github.com/CIRISAI/CIRISVerify", tag = "v8.10.1", version = "8", features = ["software", "pqc-ml-dsa"] }
|
|
145
145
|
|
|
146
146
|
# PyO3 bindings for the abi3 wheel — optional, gated behind the `python` feature
|
|
147
147
|
# so the binary never links them. 0.29 matches the persist/edge family floor.
|
|
@@ -204,16 +204,16 @@ tracing-appender = "0.2"
|
|
|
204
204
|
# - keyring `tpm` (tss-esapi / TPM 2.0) — the real hardware backend; needs
|
|
205
205
|
# libtss2 (Linux build dep). Other targets keep the software keystore.
|
|
206
206
|
[target.'cfg(target_os = "linux")'.dependencies]
|
|
207
|
-
ciris-persist = { git = "https://github.com/CIRISAI/CIRISPersist", tag = "v13.
|
|
207
|
+
ciris-persist = { git = "https://github.com/CIRISAI/CIRISPersist", tag = "v13.5.0", features = ["postgres", "cirisgraph", "cirislens_wa_cert", "cirislens_service_token_revocation", "cirisaudit", "cirislens_tasks", "cirislens_thoughts", "cirislens_tickets", "cirislens_correlations", "cirislens_deferral_reports", "cirislens_maintenance_locks", "cirislens_creation_ceremonies", "cirislens_legacy_migration", "cirisincident", "telemetry", "secrets"] }
|
|
208
208
|
# keyring `tpm` (TPM-at-rest, Linux-only via tss-esapi). `pkcs11` is no longer
|
|
209
209
|
# per-target — it rides the global `pkcs11` feature now that cryptoki builds on all
|
|
210
210
|
# targets (CIRISVerify v6.12.0).
|
|
211
|
-
ciris-keyring = { git = "https://github.com/CIRISAI/CIRISVerify", tag = "v8.10.
|
|
211
|
+
ciris-keyring = { git = "https://github.com/CIRISAI/CIRISVerify", tag = "v8.10.1", version = "8", features = ["tpm-plugin"] }
|
|
212
212
|
|
|
213
213
|
# Android (arm64/arm32/x86_64): the keyring `android` backend (JNI → Android
|
|
214
214
|
# Keystore/StrongBox); sqlite bundles, no postgres/tpm. Mirrors persist/edge.
|
|
215
215
|
[target.'cfg(target_os = "android")'.dependencies]
|
|
216
|
-
ciris-keyring = { git = "https://github.com/CIRISAI/CIRISVerify", tag = "v8.10.
|
|
216
|
+
ciris-keyring = { git = "https://github.com/CIRISAI/CIRISVerify", tag = "v8.10.1", version = "8", features = ["android"] }
|
|
217
217
|
|
|
218
218
|
# serialport (the RNode LoRa driver dep, src/radio.rs) pulls libudev-sys on Linux,
|
|
219
219
|
# which only resolves where libudev exists: desktop/server Linux (gnu, x86_64 or
|
|
@@ -264,20 +264,20 @@ http-body-util = "0.1"
|
|
|
264
264
|
# The PQC primitives the realtime-A/V E2E bench drives directly: hybrid KEX
|
|
265
265
|
# (X25519 + ML-KEM-768) for the per-Link transit key, AES-256-GCM for the
|
|
266
266
|
# two-layer chunk seal. Same pin/features edge composes (tag parity).
|
|
267
|
-
ciris-crypto = { git = "https://github.com/CIRISAI/CIRISVerify", tag = "v8.10.
|
|
267
|
+
ciris-crypto = { git = "https://github.com/CIRISAI/CIRISVerify", tag = "v8.10.1", version = "8", features = ["hybrid-kex", "aes-gcm", "pqc-ml-dsa", "self-enc"] }
|
|
268
268
|
# Enable edge's OWN fountain codec (`codec-fountain`, L1-A) for the survival-floor
|
|
269
269
|
# proof — dev/test ONLY (feature unification applies to test/bench builds; the
|
|
270
270
|
# shipped wheel stays codec-free, since a relay forwards sealed symbols opaquely
|
|
271
271
|
# and never encodes/decodes). This lets tests/chaos_mesh.rs exercise the SUBSTRATE
|
|
272
272
|
# codec (`fountain_encode`/`fountain_decode`) directly — a real MEASURED proof,
|
|
273
273
|
# not a reference stand-in.
|
|
274
|
-
ciris-edge = { git = "https://github.com/CIRISAI/CIRISEdge", tag = "v9.
|
|
274
|
+
ciris-edge = { git = "https://github.com/CIRISAI/CIRISEdge", tag = "v9.3.0", features = ["codec-fountain"] }
|
|
275
275
|
# Enable persist's TEST-ONLY genesis-seam (`test-genesis-seam`, CIRISPersist#387) for the
|
|
276
276
|
# accord ceremony tests (tests/accord.rs): `Engine::with_signer_no_genesis_seed` yields a
|
|
277
277
|
# clean engine with the baked HUMANITY_ACCORD family seed SKIPPED, so those tests can stand
|
|
278
278
|
# up their OWN custom-holder family via the assemble ceremony. Dev/test ONLY — resolver-2
|
|
279
279
|
# keeps this feature out of the shipped lib/bin/wheel (prod always seeds the baked family).
|
|
280
|
-
ciris-persist = { git = "https://github.com/CIRISAI/CIRISPersist", tag = "v13.
|
|
280
|
+
ciris-persist = { git = "https://github.com/CIRISAI/CIRISPersist", tag = "v13.5.0", features = ["test-genesis-seam"] }
|
|
281
281
|
|
|
282
282
|
# PQC realtime-A/V streaming E2E benchmark (CIRISEdge#62 realtime_av profile).
|
|
283
283
|
[[bench]]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ciris-server
|
|
3
|
-
Version: 0.5.
|
|
3
|
+
Version: 0.5.91
|
|
4
4
|
License-File: LICENSE
|
|
5
5
|
Summary: The fabric node — the federation's headless cohabitation runtime (registry + lens [+ node] over one shared substrate), as the abi3 wheel CIRISAgent consumes. agent = fabric node + brain.
|
|
6
6
|
Author-email: Eric Moore <eric@ciris.ai>
|
|
@@ -26,8 +26,8 @@ crate-type = ["cdylib", "rlib"]
|
|
|
26
26
|
#
|
|
27
27
|
# OQ-01 closure 2026-05-03: rlib primary, PyO3 cdylib via `python`
|
|
28
28
|
# feature for the deployed-lens cutover.
|
|
29
|
-
ciris-persist = { git = "https://github.com/CIRISAI/CIRISPersist", tag = "v13.
|
|
30
|
-
ciris-edge = { git = "https://github.com/CIRISAI/CIRISEdge", tag = "v9.
|
|
29
|
+
ciris-persist = { git = "https://github.com/CIRISAI/CIRISPersist", tag = "v13.5.0", version = "13", features = ["extract", "sqlite"] }
|
|
30
|
+
ciris-edge = { git = "https://github.com/CIRISAI/CIRISEdge", tag = "v9.3.0", version = "9", features = ["transport-http", "transport-reticulum"] }
|
|
31
31
|
|
|
32
32
|
# Keyring — relay mode (CIRISLensCore#10) loads its Edge transport-
|
|
33
33
|
# signing identity via `ciris_keyring::load_local_seed`. Edge's
|
|
@@ -37,12 +37,12 @@ ciris-edge = { git = "https://github.com/CIRISAI/CIRISEdge", tag = "v9.2.0
|
|
|
37
37
|
# CIRISVerify tag persist + edge pin (v5.0.0 — CEG 1.0 / Agent 3.0 substrate
|
|
38
38
|
# release; MAJOR 4→5 but additive for lens-core) — single verify version.
|
|
39
39
|
# features mirror edge's keyring pin exactly.
|
|
40
|
-
ciris-keyring = { git = "https://github.com/CIRISAI/CIRISVerify", tag = "v8.10.
|
|
40
|
+
ciris-keyring = { git = "https://github.com/CIRISAI/CIRISVerify", tag = "v8.10.1", version = "8", features = ["software", "pqc-ml-dsa"] }
|
|
41
41
|
# verify-core for `fedcode::derive_key_id` — the lens seal path must stamp the
|
|
42
42
|
# DERIVED federation key_id (`derive_key_id(<alias>, <ed25519 pubkey>)`), the id
|
|
43
43
|
# `receive_and_persist` verifies against, NOT the bare `local_key_id` alias
|
|
44
44
|
# (CIRISServer#118; same class as the closed CIRISEdge#203). Single verify version.
|
|
45
|
-
ciris-verify-core = { git = "https://github.com/CIRISAI/CIRISVerify", tag = "v8.10.
|
|
45
|
+
ciris-verify-core = { git = "https://github.com/CIRISAI/CIRISVerify", tag = "v8.10.1", version = "8" }
|
|
46
46
|
|
|
47
47
|
# persist's `sqlite` feature: relay mode persists inbound batches via
|
|
48
48
|
# `Engine::receive_and_persist` + reads `Engine::sqlite_backend()` for
|
|
@@ -1133,14 +1133,14 @@ fn dict_to_inbound_event(d: &Bound<'_, PyDict>) -> PyResult<InboundEvent> {
|
|
|
1133
1133
|
|
|
1134
1134
|
let task_id: Option<String> = d
|
|
1135
1135
|
.get_item("task_id")?
|
|
1136
|
-
.
|
|
1136
|
+
.filter(|v| !v.is_none())
|
|
1137
1137
|
.map(|v| v.extract::<String>())
|
|
1138
1138
|
.transpose()
|
|
1139
1139
|
.map_err(|_| PyValueError::new_err("component field \"task_id\" must be a str or None"))?;
|
|
1140
1140
|
|
|
1141
1141
|
let trace_level: Option<String> = d
|
|
1142
1142
|
.get_item("trace_level")?
|
|
1143
|
-
.
|
|
1143
|
+
.filter(|v| !v.is_none())
|
|
1144
1144
|
.map(|v| v.extract::<String>())
|
|
1145
1145
|
.transpose()
|
|
1146
1146
|
.map_err(|_| {
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
# Exact-pin the toolchain to match the substrate repos (persist/edge/verify),
|
|
2
|
+
# so the CIRISCache key (`...-rustc<VER>-...`) aligns and the windows/linux
|
|
3
|
+
# wheel restore hits the substrate layer instead of compiling cold (CIRISEdge#291,
|
|
4
|
+
# CIRISServer#99). All four repos MUST agree on this version.
|
|
5
|
+
[toolchain]
|
|
6
|
+
channel = "1.97.0"
|
|
7
|
+
components = ["clippy", "rustfmt"]
|
|
@@ -2294,6 +2294,13 @@ struct CanonicalAddressUpdate {
|
|
|
2294
2294
|
invocation_id: String,
|
|
2295
2295
|
/// RFC3339 assertion time.
|
|
2296
2296
|
asserted_at: String,
|
|
2297
|
+
/// v13.5.0 (#397) — the canonical's transport-tier Ed25519 pubkey (base64,
|
|
2298
|
+
/// 32 raw bytes), pairing with a `reticulum` `destination` dest-hash so any
|
|
2299
|
+
/// peer can `prime_peer` this explicit-hash canonical (which cannot announce).
|
|
2300
|
+
/// Optional; `skip_serializing_if` keeps a pre-#397 invocation's JCS bytes —
|
|
2301
|
+
/// and its threshold signatures — byte-identical when absent.
|
|
2302
|
+
#[serde(default, skip_serializing_if = "Option::is_none")]
|
|
2303
|
+
transport_ed25519_pubkey_base64: Option<String>,
|
|
2297
2304
|
}
|
|
2298
2305
|
|
|
2299
2306
|
#[derive(Debug, Deserialize)]
|
|
@@ -2383,6 +2390,10 @@ async fn update_canonical_address(
|
|
|
2383
2390
|
destination: inv.destination.trim().to_string(),
|
|
2384
2391
|
asserted_at,
|
|
2385
2392
|
last_seen_at: None,
|
|
2393
|
+
// v13.5.0 (#397): the transport-tier Ed25519 that pairs with the
|
|
2394
|
+
// dest-hash so peers can prime_peer this (explicit-hash) canonical.
|
|
2395
|
+
// Carried on the address-update invocation when present.
|
|
2396
|
+
transport_ed25519_pubkey_base64: inv.transport_ed25519_pubkey_base64.clone(),
|
|
2386
2397
|
})
|
|
2387
2398
|
.await
|
|
2388
2399
|
{
|
|
@@ -347,6 +347,10 @@ async fn add_occurrence(
|
|
|
347
347
|
destination: dest.clone(),
|
|
348
348
|
asserted_at: now,
|
|
349
349
|
last_seen_at: Some(now),
|
|
350
|
+
// v13.5.0 (#397): the submitted occurrence-bind carries only
|
|
351
|
+
// (kind, dest); the transport-tier Ed25519 is populated by the
|
|
352
|
+
// reticulum self-publish path, not this generic bind.
|
|
353
|
+
transport_ed25519_pubkey_base64: None,
|
|
350
354
|
})
|
|
351
355
|
.await
|
|
352
356
|
{
|
|
@@ -331,6 +331,20 @@ pub async fn serve_with_adapter(cfg: ServerConfig, adapter: Arc<dyn Adapter>) ->
|
|
|
331
331
|
.await
|
|
332
332
|
.context("assemble /v1/identity aggregate")?;
|
|
333
333
|
|
|
334
|
+
// ── Self-publish this node's reticulum transport-tier binding ─────────────
|
|
335
|
+
// (dest_hash + transport-tier Ed25519) into the federation directory, so a
|
|
336
|
+
// peer can `prime_peer`-root this node even though a v7.0.0 explicit-hash
|
|
337
|
+
// destination CANNOT announce (Leviculum `ExplicitHashCannotAnnounce`).
|
|
338
|
+
// CIRISServer#205 gap #2 / CIRISPersist#397: the baked/self-signed record
|
|
339
|
+
// carries only the identity-tier Ed25519 + the IP hint; the transport
|
|
340
|
+
// identity is edge-runtime-derived (unknown at genesis-bake), so the node
|
|
341
|
+
// asserts it here at boot — the same self-authenticating basis (its own
|
|
342
|
+
// key_id, its own edge-owned transport identity) as an attested announce.
|
|
343
|
+
// Best-effort; a node with no Reticulum transport is a no-op. This is why
|
|
344
|
+
// delivery converges with ZERO operator action: restarting the node IS the
|
|
345
|
+
// publish (the directory row replicates, peers resolve + prime it).
|
|
346
|
+
publish_self_transport_destination(&engine, &edge, &cfg.key_id).await;
|
|
347
|
+
|
|
334
348
|
// ── Directed-consent federation peering with Node B (ciris-status) ────────
|
|
335
349
|
// Bidirectional replication A<->B is authorized by DIRECTED CONSENT
|
|
336
350
|
// ATTESTATIONS (federation scope) + MUTUAL KEY REGISTRATION — NOT in-group
|
|
@@ -938,6 +952,64 @@ async fn local_identity_json(
|
|
|
938
952
|
serde_json::to_string(&v).context("serialize identity aggregate JSON")
|
|
939
953
|
}
|
|
940
954
|
|
|
955
|
+
/// Self-publish this node's **reticulum transport-tier binding** (dest-hash +
|
|
956
|
+
/// transport Ed25519) into the federation directory so any peer can
|
|
957
|
+
/// [`prime_peer`]-root it — the durable close of CIRISServer#205 gap #2.
|
|
958
|
+
///
|
|
959
|
+
/// A v7.0.0 explicit-hash canonical (e.g. `ciris-canonical-1`, baked with an IP
|
|
960
|
+
/// hint) **cannot announce** (Leviculum `ExplicitHashCannotAnnounce`), so the only
|
|
961
|
+
/// rooting path is out-of-band `prime_peer(key_id, dest_hash, transport_ed25519)`.
|
|
962
|
+
/// That transport-tier Ed25519 is edge-owned and **not** in the (genesis-baked)
|
|
963
|
+
/// identity record — so the node asserts it here at boot, for its OWN key_id, from
|
|
964
|
+
/// its OWN live edge (`local_dest_hash` / `local_transport_pubkey`). Same
|
|
965
|
+
/// self-authenticating basis as an attested announce; no accord quorum needed for
|
|
966
|
+
/// a node to declare its own reachability. Once written it replicates, and a
|
|
967
|
+
/// consuming node's `start_federation_delivery` resolves + primes it.
|
|
968
|
+
///
|
|
969
|
+
/// Best-effort: a node without a Reticulum transport (relay-off / non-reticulum
|
|
970
|
+
/// build) is a silent no-op, and a directory-write failure is logged, never fatal.
|
|
971
|
+
async fn publish_self_transport_destination(engine: &Engine, edge: &Edge, key_id: &str) {
|
|
972
|
+
use base64::Engine as _;
|
|
973
|
+
let (Some(dest_hash), Some(transport_pubkey)) =
|
|
974
|
+
(edge.local_dest_hash(), edge.local_transport_pubkey())
|
|
975
|
+
else {
|
|
976
|
+
tracing::debug!(
|
|
977
|
+
key_id,
|
|
978
|
+
"no Reticulum transport identity — skipping self transport-destination publish"
|
|
979
|
+
);
|
|
980
|
+
return;
|
|
981
|
+
};
|
|
982
|
+
let dest_hex = hex::encode(dest_hash);
|
|
983
|
+
// The transport identity is X25519(0..32) ‖ Ed25519(32..64); prime_peer wants
|
|
984
|
+
// the Ed25519 half, base64-standard.
|
|
985
|
+
let transport_ed25519_b64 =
|
|
986
|
+
base64::engine::general_purpose::STANDARD.encode(&transport_pubkey[32..64]);
|
|
987
|
+
let record = ciris_persist::federation::TransportDestination {
|
|
988
|
+
occurrence_key_id: key_id.to_string(),
|
|
989
|
+
transport_kind: "reticulum".to_string(),
|
|
990
|
+
destination: dest_hex.clone(),
|
|
991
|
+
asserted_at: chrono::Utc::now(),
|
|
992
|
+
last_seen_at: None,
|
|
993
|
+
transport_ed25519_pubkey_base64: Some(transport_ed25519_b64),
|
|
994
|
+
};
|
|
995
|
+
match engine
|
|
996
|
+
.federation_directory()
|
|
997
|
+
.put_transport_destination(&record)
|
|
998
|
+
.await
|
|
999
|
+
{
|
|
1000
|
+
Ok(()) => tracing::info!(
|
|
1001
|
+
key_id,
|
|
1002
|
+
dest_hash = %dest_hex,
|
|
1003
|
+
"published self reticulum transport-tier binding — peers can now prime_peer this node (#205 gap #2)"
|
|
1004
|
+
),
|
|
1005
|
+
Err(e) => tracing::warn!(
|
|
1006
|
+
key_id,
|
|
1007
|
+
error = %e,
|
|
1008
|
+
"could not publish self transport-destination — peers cannot prime this node until it is asserted"
|
|
1009
|
+
),
|
|
1010
|
+
}
|
|
1011
|
+
}
|
|
1012
|
+
|
|
941
1013
|
/// `GET /v1/identity` → the cached identity-aggregate JSON (stable for the
|
|
942
1014
|
/// node's lifetime), merged onto the read-API listener.
|
|
943
1015
|
fn identity_router(identity_json: String) -> axum::Router {
|