Skip to content

feat: consolidate saorsa-core + saorsa-transport into workspace#66

Open
grumbach wants to merge 1 commit intoWithAutonomi:mainfrom
grumbach:feat/consolidate-workspace
Open

feat: consolidate saorsa-core + saorsa-transport into workspace#66
grumbach wants to merge 1 commit intoWithAutonomi:mainfrom
grumbach:feat/consolidate-workspace

Conversation

@grumbach
Copy link
Copy Markdown
Collaborator

@grumbach grumbach commented Apr 9, 2026

Why

Our dependency situation is getting out of hand. Across PRs and repos we have:

Something that builds on one developer's machine breaks on another's. Every NAT traversal fix requires coordinated PRs across 3 repos.

What this does

Moves saorsa-core and saorsa-transport into crates/ as workspace members. All dependencies become simple path references.

ant-node/
  Cargo.toml          (workspace root)
  src/                 (ant-node binary + lib)
  crates/
    saorsa-core/       (DHT, trust, networking)
    saorsa-transport/  (QUIC transport, NAT traversal)

What this does NOT do

  • No code changes. Pure repo structure.
  • Source copied verbatim from rc-2026.4.1 branches of both repos.
  • 492 ant-node tests pass.

Follow-up PRs (stacked on this)

  1. Mick's TLS-derived identity + coordinator rotation (saorsa-core#75 + saorsa-transport#52)
  2. Clock skew tolerance fix (saorsa-core#77)

Copilot AI review requested due to automatic review settings April 9, 2026 05:24
Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Note

Copilot was unable to run its full agentic suite in this review.

This PR restructures ant-node into a Cargo workspace by vendoring saorsa-core (and referencing saorsa-transport) as workspace members, replacing fragile cross-repo dependency references with local path dependencies.

Changes:

  • Introduces a workspace root in Cargo.toml and switches ant-node to depend on local crates/saorsa-core.
  • Adds the vendored saorsa-core crate with its own Cargo.toml, build script, and architecture doc.
  • Brings in a substantial amount of .planning/ review artifacts and repo/tooling config files under crates/saorsa-core/.

Reviewed changes

Copilot reviewed 81 out of 621 changed files in this pull request and generated 5 comments.

Show a summary per file
File Description
crates/saorsa-core/build.rs Adds an (empty) build script stub for the vendored crate.
crates/saorsa-core/Cargo.toml Defines saorsa-core package metadata and dependencies, including a path dep to saorsa-transport.
crates/saorsa-core/ARCHITECTURE.md Adds architecture documentation for the vendored crate.
crates/saorsa-core/.planning/reviews/workflow-configuration.md Adds internal workflow review notes.
crates/saorsa-core/.planning/reviews/type-safety-review-validation.md Adds internal validation notes (includes local absolute paths).
crates/saorsa-core/.planning/reviews/test-coverage.md Adds internal test coverage review notes.
crates/saorsa-core/.planning/reviews/task-spec.md Adds internal task spec review notes.
crates/saorsa-core/.planning/reviews/review-iteration-1-complete.md Adds internal iteration summary.
crates/saorsa-core/.planning/reviews/phase-1-review-summary.md Adds internal phase summary.
crates/saorsa-core/.planning/reviews/minimax.md Adds an external review artifact.
crates/saorsa-core/.planning/reviews/kimi.md Adds an external review artifact (contains auth failure details).
crates/saorsa-core/.planning/reviews/iteration-2-summary.md Adds internal iteration summary.
crates/saorsa-core/.planning/reviews/iteration-2-fixes-applied.md Adds internal fixes-applied summary.
crates/saorsa-core/.planning/reviews/glm.md Adds an external review artifact.
crates/saorsa-core/.planning/reviews/fixes-applied-phase2-task2.md Adds internal fixes-applied summary.
crates/saorsa-core/.planning/reviews/fixes-applied-phase2-task1.md Adds internal fixes-applied summary.
crates/saorsa-core/.planning/reviews/fixes-applied-encoding.md Adds internal fixes-applied summary.
crates/saorsa-core/.planning/reviews/error-handling.md Adds internal error-handling audit notes (includes local absolute paths).
crates/saorsa-core/.planning/reviews/documentation.md Adds internal documentation audit notes.
crates/saorsa-core/.planning/reviews/consensus-type-safety-20260129.md Adds consensus review artifact.
crates/saorsa-core/.planning/reviews/consensus-encoding-review-20260129.md Adds consensus review artifact.
crates/saorsa-core/.planning/reviews/consensus-20260204-183500.md Adds consensus review artifact.
crates/saorsa-core/.planning/reviews/consensus-20260202-143500.md Adds consensus review artifact.
crates/saorsa-core/.planning/reviews/consensus-20260129-210600.md Adds consensus review artifact.
crates/saorsa-core/.planning/reviews/consensus-20260129-200500.md Adds consensus review artifact.
crates/saorsa-core/.planning/reviews/consensus-20260129-155118.md Adds consensus review artifact.
crates/saorsa-core/.planning/reviews/consensus-20260129-154812.md Adds consensus review artifact.
crates/saorsa-core/.planning/reviews/consensus-20260129-153828.md Adds consensus review artifact.
crates/saorsa-core/.planning/reviews/build.md Adds internal build validation notes.
crates/saorsa-core/.planning/reviews/build-iteration-2.md Adds internal build validation notes.
crates/saorsa-core/.planning/reviews/EXTERNAL_REVIEWS_COMPLETE.md Adds external reviews completion marker.
crates/saorsa-core/.planning/reviews/CODEX_REVIEW_SUMMARY.md Adds external review summary artifact.
crates/saorsa-core/.planning/progress.md Adds internal project progress log.
crates/saorsa-core/.planning/architecture-analysis/06-forward-secrecy.md Adds internal architecture analysis document.
crates/saorsa-core/.planning/architecture-analysis/05-message-persistence.md Adds internal architecture analysis document.
crates/saorsa-core/.planning/architecture-analysis/04-routing-strategy.md Adds internal architecture analysis document.
crates/saorsa-core/.planning/architecture-analysis/03-offline-delivery.md Adds internal architecture analysis document.
crates/saorsa-core/.planning/STATE.json Adds internal project/review state tracking.
crates/saorsa-core/.planning/REVIEW_ITERATION_1_COMPLETE.md Adds internal review cycle artifact.
crates/saorsa-core/.planning/REVIEW_CYCLE_COMPLETE.md Adds internal review cycle artifact.
crates/saorsa-core/.planning/REVIEW_CYCLE_1_COMPLETE.md Adds internal review cycle artifact.
crates/saorsa-core/.planning/PROJECT.md Adds internal project description.
crates/saorsa-core/.planning/PLAN-phase-5.md Adds internal planning document.
crates/saorsa-core/.planning/PLAN-phase-3.md Adds internal planning document.
crates/saorsa-core/.planning/PLAN-phase-1.md Adds internal planning document.
crates/saorsa-core/.planning/PHASE_2_TASK_1_REVIEW_ITERATION_1.md Adds internal review tracking document.
crates/saorsa-core/.planning/PHASE_2_TASK_1_ITERATION_1_STATUS.md Adds internal status document.
crates/saorsa-core/.planning/PHASE_2_TASK_1_FIXES_APPLIED.md Adds internal fixes-applied document.
crates/saorsa-core/.planning/MILESTONES.md Adds internal milestones document.
crates/saorsa-core/.planning/CODE_QUALITY_REVIEW_EXECUTIVE_SUMMARY.md Adds internal executive summary document.
crates/saorsa-core/.gitignore Adds crate-local ignore rules.
crates/saorsa-core/.cursorules Adds editor/tool configuration pointer.
crates/saorsa-core/.cursorrules Adds editor/tool configuration pointer (duplicate naming variant).
crates/saorsa-core/.clippy.toml Adds crate-local clippy configuration.
crates/saorsa-core/.actrc Adds local act runner configuration.
Cargo.toml Declares the workspace and switches saorsa-core to a path dependency; bumps ant-node version.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +1 to +10
// Copyright 2024 Saorsa Labs Limited
//
// Build script for saorsa-core
//
// Currently empty - VDF guest program no longer required.
// Signed heartbeats replaced VDF-based heartbeats in Phase 4.

fn main() {
// No build steps required
}
Copy link

Copilot AI Apr 9, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The crate adds a build.rs that does nothing. Even an “empty” build script still participates in Cargo’s build graph (can add compile-time overhead and complicate downstream consumers/docs builds). If there are truly no build steps required, remove build.rs entirely (and any related docs.rs/build-script commentary), and only reintroduce it when it’s needed.

Suggested change
// Copyright 2024 Saorsa Labs Limited
//
// Build script for saorsa-core
//
// Currently empty - VDF guest program no longer required.
// Signed heartbeats replaced VDF-based heartbeats in Phase 4.
fn main() {
// No build steps required
}

Copilot uses AI. Check for mistakes.
Comment on lines +1 to +23
[package]
name = "saorsa-core"
# 0.10.3: postcard serialization migration (PR #14)
# 0.10.4: refocus on phonebook + trust signals, remove user-facing APIs (PR #15)
# 0.11.0: remove feature gates — adaptive/trust/placement always compiled
# 0.11.1: fix Kademlia protocol violations in iterative lookups
# 0.12.0: configurable max_message_size, bump saorsa-transport to 0.22.0
# 0.12.1: patch release
# 0.13.0: multi-channel transport, PeerId ownership, BLAKE3 migration (PR #32)
# 0.14.0: user-agent DHT gating — exclude ephemeral clients from DHT routing table
# 0.14.1: fix deterministic identity generation to use real ML-DSA keypairs
# 0.15.0: routing table single-source-of-truth fixes
# 0.16.0: delegate transport addressing to saorsa-transport's TransportAddr (PR #39)
# 0.17.0: remove configuration system, streamline network setup
# 0.17.1: keep logging macros crate-internal, strip from public API
# 0.17.2: bump saorsa-transport to 0.27
# 0.18.0: harden send_message reconnect logic
# 0.18.1: enforce address invariants in KBucket::add_node
# 0.19.0: NAT traversal timeouts, dual-stack normalisation, connection reliability
# 0.20.0: simplify IP diversity, stale-peer fixes, cache atomicity improvements
# 0.21.0: penalty-only trust model, distance-sorted lookup candidates, stale docs cleanup
# 0.22.0: MASQUE relay data plane, upgrade saorsa-transport to 0.31.0
version = "0.22.0"
Copy link

Copilot AI Apr 9, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This vendored crate includes a large amount of internal planning/review artifacts under .planning/ (as seen in this PR). If saorsa-core is ever packaged/published (or used as a dependency outside this repo), these files will be included by default, increasing crate size and distributing internal process notes. Consider adding publish = false (if it should never be published from this workspace) or adding an explicit exclude = [".planning/**", ...] / include = [...] to control packaging content.

Copilot uses AI. Check for mistakes.
## Review Summary

### File Analyzed
- **Path**: `/Users/davidirvine/Desktop/Devel/projects/saorsa-core/src/messaging/encoding.rs`
Copy link

Copilot AI Apr 9, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This documentation embeds an absolute local filesystem path (including a username). That can leak developer environment details and isn’t portable/meaningful to other contributors. Replace absolute paths with repo-relative paths (e.g., src/messaging/encoding.rs) and avoid including local machine directories in committed artifacts.

Suggested change
- **Path**: `/Users/davidirvine/Desktop/Devel/projects/saorsa-core/src/messaging/encoding.rs`
- **Path**: `src/messaging/encoding.rs`

Copilot uses AI. Check for mistakes.
Comment on lines +1 to +7
[workspace]
members = [
".",
"crates/saorsa-core",
"crates/saorsa-transport",
"crates/saorsa-transport/saorsa-transport-workspace-hack",
]
Copy link

Copilot AI Apr 9, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Including "." as a workspace member is typically redundant when the workspace root is also a package (the root package is already part of the workspace). Consider dropping "." to reduce confusion and keep the workspace member list focused on subcrates.

Copilot uses AI. Check for mistakes.
Comment on lines +1 to +7
[workspace]
members = [
".",
"crates/saorsa-core",
"crates/saorsa-transport",
"crates/saorsa-transport/saorsa-transport-workspace-hack",
]
Copy link

Copilot AI Apr 9, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The PR description says “No code changes. Pure repo structure.” but this diff introduces many additional vendored project artifacts (e.g., .planning/**, multiple review reports, tooling configs, and a build.rs). If these are intentional parts of the vendored sources, it’d help to explicitly call out that non-code artifacts are being imported as well; otherwise, consider splitting them into a follow-up PR or excluding them from the vendoring step to keep this PR narrowly about workspace consolidation.

Copilot uses AI. Check for mistakes.
@grumbach grumbach force-pushed the feat/consolidate-workspace branch from c3c2a6b to 5327d19 Compare April 9, 2026 05:55
Copilot AI review requested due to automatic review settings April 9, 2026 06:09
@grumbach grumbach force-pushed the feat/consolidate-workspace branch from 5327d19 to f42dbaf Compare April 9, 2026 06:09
Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 56 out of 485 changed files in this pull request and generated 7 comments.

Comments suppressed due to low confidence (1)

crates/saorsa-core/src/rate_limit.rs:1

  • The doc comments state security-sensitive defaults (e.g., “/64 default: 1”, global default: 100), but Default currently sets all limits to 10_000, effectively disabling join rate limiting out of the box. This is security-relevant (Sybil/flood protection) and also misleading documentation. Recommendation (mandatory): either (a) set Default to the documented safe values, or (b) explicitly document that defaults are “effectively unlimited / development defaults” and provide a separate JoinRateLimiterConfig::production_defaults() (or similar) with the strict values.
use lru::LruCache;

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +1 to +8
[workspace]
members = [
".",
"crates/saorsa-core",
"crates/saorsa-transport",
"crates/saorsa-transport/saorsa-transport-workspace-hack",
]
resolver = "2"
Copy link

Copilot AI Apr 9, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The PR description says “No code changes. Pure repo structure.” but this PR introduces a workspace and vendors in a substantial amount of new saorsa-core code/docs (not just a move/rename). Please update the PR description to reflect that the source is being imported into this repo (even if copied verbatim from upstream), and clarify the expected implications (e.g., semver/versioning, ownership of future edits, and upgrade workflow).

Copilot uses AI. Check for mistakes.
[dependencies]
# Core (provides EVERYTHING: networking, DHT, security, trust, storage)
saorsa-core = "0.22.0"
saorsa-core = { path = "crates/saorsa-core" }
Copy link

Copilot AI Apr 9, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The PR description says “No code changes. Pure repo structure.” but this PR introduces a workspace and vendors in a substantial amount of new saorsa-core code/docs (not just a move/rename). Please update the PR description to reflect that the source is being imported into this repo (even if copied verbatim from upstream), and clarify the expected implications (e.g., semver/versioning, ownership of future edits, and upgrade workflow).

Copilot uses AI. Check for mistakes.
Comment on lines +59 to +66
pub struct Engine<K: Eq + Hash + Clone + ToString> {
cfg: EngineConfig,
global: Mutex<Bucket>,
/// LRU cache with max 100k entries to prevent memory DoS from many IPs
keyed: RwLock<LruCache<K, Bucket>>,
}

impl<K: Eq + Hash + Clone + ToString> Engine<K> {
Copy link

Copilot AI Apr 9, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Engine<K> requires ToString, but the implementation shown doesn’t use it. Dropping the ToString bound will make the type easier to reuse (and reduces unnecessary trait constraints) while keeping behavior identical.

Suggested change
pub struct Engine<K: Eq + Hash + Clone + ToString> {
cfg: EngineConfig,
global: Mutex<Bucket>,
/// LRU cache with max 100k entries to prevent memory DoS from many IPs
keyed: RwLock<LruCache<K, Bucket>>,
}
impl<K: Eq + Hash + Clone + ToString> Engine<K> {
pub struct Engine<K: Eq + Hash + Clone> {
cfg: EngineConfig,
global: Mutex<Bucket>,
/// LRU cache with max 100k entries to prevent memory DoS from many IPs
keyed: RwLock<LruCache<K, Bucket>>,
}
impl<K: Eq + Hash + Clone> Engine<K> {

Copilot uses AI. Check for mistakes.
Comment on lines +74 to +91
/// Handle a DHT query request.
async fn handle_query(
&self,
remote_addr: SocketAddr,
data: Bytes,
) -> LinkResult<Option<Bytes>> {
trace!(remote_addr = %remote_addr, size = data.len(), "Processing DHT query");

let message: DhtMessage = postcard::from_bytes(&data)
.map_err(|e| LinkError::Internal(format!("Failed to deserialize query: {e}")))?;

let response = self.process_message(message).await?;

let response_bytes = postcard::to_stdvec(&response)
.map_err(|e| LinkError::Internal(format!("Failed to serialize response: {e}")))?;

Ok(Some(Bytes::from(response_bytes)))
}
Copy link

Copilot AI Apr 9, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This introduces non-trivial request/response serialization logic and error mapping, but the current tests in this file only cover stream type conversions. Consider adding unit tests that (1) round-trip a DhtMessage through handle_query and assert the decoded DhtResponse, and (2) verify invalid postcard input returns the expected LinkError variant/message prefix. This will guard against protocol regressions during the workspace consolidation.

Copilot uses AI. Check for mistakes.
Comment on lines +30 to +34
pub mod node_identity;
pub mod peer_id;

pub use node_identity::{IdentityData, NodeIdentity};
pub use peer_id::{PEER_ID_BYTE_LEN, PeerId, PeerIdParseError};
Copy link

Copilot AI Apr 9, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

src/identity/node_identity_extensions.rs is added in this PR but is not declared here (or elsewhere in the shown module tree). As written, it won’t be compiled, and its impl NodeIdentity helpers won’t be available to callers/tests. Recommendation: either add pub mod node_identity_extensions; (or #[cfg(test)] mod ... if test-only), or remove/relocate the file to avoid dead, confusing code.

Copilot uses AI. Check for mistakes.
Ok(())
})
.await
.map_err(|e| anyhow::anyhow!("close group cache save task panicked: {e}"))?
Copy link

Copilot AI Apr 9, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

spawn_blocking(...).await can fail due to cancellation as well as panic. The message “task panicked” is inaccurate in the cancellation case and can mislead operational debugging. Consider rewording to “close group cache save task failed” (or similar) while still including {e}.

Suggested change
.map_err(|e| anyhow::anyhow!("close group cache save task panicked: {e}"))?
.map_err(|e| anyhow::anyhow!("close group cache save task failed: {e}"))?

Copilot uses AI. Check for mistakes.
Comment on lines +50 to +55
}

impl From<anyhow::Error> for AdaptiveNetworkError {
fn from(e: anyhow::Error) -> Self {
AdaptiveNetworkError::Network(std::io::Error::other(e.to_string()))
}
Copy link

Copilot AI Apr 9, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Converting anyhow::Error into std::io::Error loses structured context/classification and forces downstream code to treat non-I/O failures as I/O. Consider adding a dedicated Anyhow(#[from] anyhow::Error) (or Other(anyhow::Error)) variant instead, so callers can preserve error chains and avoid misclassification.

Suggested change
}
impl From<anyhow::Error> for AdaptiveNetworkError {
fn from(e: anyhow::Error) -> Self {
AdaptiveNetworkError::Network(std::io::Error::other(e.to_string()))
}
#[error("Unhandled error: {0}")]
Anyhow(#[from] anyhow::Error),

Copilot uses AI. Check for mistakes.
@grumbach grumbach force-pushed the feat/consolidate-workspace branch from f42dbaf to 9384621 Compare April 9, 2026 06:15
Copilot AI review requested due to automatic review settings April 9, 2026 06:24
@grumbach grumbach force-pushed the feat/consolidate-workspace branch from 9384621 to 68835e6 Compare April 9, 2026 06:24
Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 58 out of 487 changed files in this pull request and generated 5 comments.


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +154 to +164
impl Default for JoinRateLimiterConfig {
fn default() -> Self {
Self {
max_joins_per_64_per_hour: 10_000,
max_joins_per_48_per_hour: 10_000,
max_joins_per_24_per_hour: 10_000,
max_global_joins_per_minute: 10_000,
global_burst_size: 10_000,
}
}
}
Copy link

Copilot AI Apr 9, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

JoinRateLimiterConfig’s doc comments describe strict defaults (e.g., “/64 default: 1”, “/48 default: 5”, “/24 default: 3”, “global default: 100”), but Default currently sets all limits to 10,000, which effectively disables Sybil protection by default. Either update Default to match the intended security posture, or update the doc comments to reflect the actual defaults (and consider using an explicit JoinRateLimiterConfig::permissive_dev() for high limits).

Copilot uses AI. Check for mistakes.
Comment on lines +354 to +355
fn test_proof_of_work() {
// PoW removed: this test no longer applicable
Copy link

Copilot AI Apr 9, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This test is now a no-op and will always pass, which reduces signal in the test suite. Please remove it, or replace it with an assertion that validates the intended post-change invariant (e.g., that identity generation/verification works without any PoW-related fields or APIs).

Suggested change
fn test_proof_of_work() {
// PoW removed: this test no longer applicable
fn test_identity_works_without_proof_of_work() {
let identity = NodeIdentity::generate().expect("Identity generation should succeed");
// Identity should be usable immediately without any PoW-specific step.
assert_eq!(
identity.peer_id,
peer_id_from_public_key(identity.public_key())
);
let message = b"identity works without proof of work";
let signature = identity.sign(message).expect("Signing should succeed");
assert!(identity
.verify(message, &signature)
.expect("Verification should succeed"));

Copilot uses AI. Check for mistakes.
// Re-export saorsa-transport PQC functions for convenience
pub use self::saorsa_transport_integration::{generate_ml_dsa_keypair, ml_dsa_sign, ml_dsa_verify};

// Primary post-quantum cryptography types from saorsa-pqc 0.3.0
Copy link

Copilot AI Apr 9, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The comment says saorsa-pqc 0.3.0, but Cargo.toml in this PR pins saorsa-pqc = "0.5". Please update the comment to avoid misleading version guidance (or remove the hard-coded version reference).

Suggested change
// Primary post-quantum cryptography types from saorsa-pqc 0.3.0
// Primary post-quantum cryptography types from saorsa-pqc

Copilot uses AI. Check for mistakes.
Comment on lines +7 to +17
| Node | Provider | IP Address | Region | Purpose | Status |
|------|----------|------------|--------|---------|--------|
| saorsa-1 | Hetzner | 77.42.75.115 | Helsinki | Dashboard & Website | Active |
| saorsa-2 | DigitalOcean | 142.93.199.50 | NYC1 | Bootstrap Node | Active |
| saorsa-3 | DigitalOcean | 147.182.234.192 | SFO3 | Bootstrap Node | Active |
| saorsa-4 | DigitalOcean | 206.189.7.117 | AMS3 | Test Node | Active |
| saorsa-5 | DigitalOcean | 144.126.230.161 | LON1 | Test Node | Active |
| saorsa-6 | Hetzner | 65.21.157.229 | Helsinki | Test Node | Active |
| saorsa-7 | Hetzner | 116.203.101.172 | Nuremberg | Test Node | Active |
| saorsa-8 | Vultr | 149.28.156.231 | Singapore | Test Node | Active |
| saorsa-9 | Vultr | 45.77.176.184 | Tokyo | Test Node | Active |
Copy link

Copilot AI Apr 9, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This doc publishes detailed infrastructure inventory (public IPs, roles, provisioning commands, and also lists SSH key identifiers later in the doc). Even if the IPs are public, consolidating this information in-repo can materially increase attackability (target selection, port scanning focus, social-engineering). Consider moving these details to a private ops repo/wiki, or redact/abstract sensitive fields (IPs, key IDs, exact firewall names), leaving only high-level operational guidance.

Copilot uses AI. Check for mistakes.
version = "0.22.0"
edition = "2024"
authors = ["Saorsa Labs Limited <david@saorsalabs.com>"]
license = "AGPL-3.0"
Copy link

Copilot AI Apr 9, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Many newly added source headers state the code is dual-licensed “AGPL-3.0-or-later” + “Commercial License”, but Cargo.toml declares license = "AGPL-3.0". To keep crate metadata consistent with the headers (and with SPDX expectations), update the manifest license expression (e.g., AGPL-3.0-or-later) and/or document the commercial licensing via license-file / LicenseRef-... per your distribution strategy.

Suggested change
license = "AGPL-3.0"
license = "AGPL-3.0-or-later"

Copilot uses AI. Check for mistakes.
Move saorsa-core and saorsa-transport into crates/ as workspace members.
All dependencies now use path references instead of fragile git URLs,
branch names, or commit hashes.

Cleaned up ~100 non-source files: AI planning artifacts, saved test
outputs, Go legacy files, orphaned scripts.

492 ant-node tests pass.
@grumbach grumbach force-pushed the feat/consolidate-workspace branch from 68835e6 to 95bedc8 Compare April 9, 2026 07:11
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants