@smilintux/skcapstone 0.1.0
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.
- package/.cursorrules +33 -0
- package/.github/workflows/ci.yml +23 -0
- package/.github/workflows/publish.yml +52 -0
- package/AGENTS.md +74 -0
- package/CLAUDE.md +56 -0
- package/LICENSE +674 -0
- package/README.md +242 -0
- package/SKILL.md +36 -0
- package/bin/cli.js +18 -0
- package/docs/ARCHITECTURE.md +510 -0
- package/docs/SECURITY_DESIGN.md +315 -0
- package/docs/SOVEREIGN_SINGULARITY.md +371 -0
- package/docs/TOKEN_SYSTEM.md +201 -0
- package/index.d.ts +9 -0
- package/index.js +32 -0
- package/package.json +32 -0
- package/pyproject.toml +84 -0
- package/src/skcapstone/__init__.py +13 -0
- package/src/skcapstone/cli.py +1441 -0
- package/src/skcapstone/connectors/__init__.py +6 -0
- package/src/skcapstone/coordination.py +590 -0
- package/src/skcapstone/discovery.py +275 -0
- package/src/skcapstone/memory_engine.py +457 -0
- package/src/skcapstone/models.py +223 -0
- package/src/skcapstone/pillars/__init__.py +8 -0
- package/src/skcapstone/pillars/identity.py +91 -0
- package/src/skcapstone/pillars/memory.py +61 -0
- package/src/skcapstone/pillars/security.py +83 -0
- package/src/skcapstone/pillars/sync.py +486 -0
- package/src/skcapstone/pillars/trust.py +335 -0
- package/src/skcapstone/runtime.py +190 -0
- package/src/skcapstone/skills/__init__.py +1 -0
- package/src/skcapstone/skills/syncthing_setup.py +297 -0
- package/src/skcapstone/sync/__init__.py +14 -0
- package/src/skcapstone/sync/backends.py +330 -0
- package/src/skcapstone/sync/engine.py +301 -0
- package/src/skcapstone/sync/models.py +97 -0
- package/src/skcapstone/sync/vault.py +284 -0
- package/src/skcapstone/tokens.py +439 -0
- package/tests/__init__.py +0 -0
- package/tests/conftest.py +42 -0
- package/tests/test_coordination.py +299 -0
- package/tests/test_discovery.py +57 -0
- package/tests/test_memory_engine.py +391 -0
- package/tests/test_models.py +63 -0
- package/tests/test_pillars.py +87 -0
- package/tests/test_runtime.py +60 -0
- package/tests/test_sync.py +507 -0
- package/tests/test_syncthing_setup.py +76 -0
- package/tests/test_tokens.py +265 -0
|
@@ -0,0 +1,315 @@
|
|
|
1
|
+
# SKCapstone Security Design Specification
|
|
2
|
+
|
|
3
|
+
### How SKCapstone Addresses Real-World AI Security Failures
|
|
4
|
+
|
|
5
|
+
**Version:** 1.0.0 | **Classification:** Public | **Last Updated:** 2026-02-23
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Executive Summary
|
|
10
|
+
|
|
11
|
+
The AI industry has a security crisis. Agents operate without identity, memory lives on corporate servers, there's no audit trail, and users have zero control over their data. SKCapstone addresses each of these failures with battle-tested cryptographic primitives (PGP), decentralized infrastructure (Syncthing), and a legal sovereignty layer (PMA).
|
|
12
|
+
|
|
13
|
+
This document details how each security decision was made and why.
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## The Problems We Solve
|
|
18
|
+
|
|
19
|
+
### Problem 1: Agent Identity Crisis
|
|
20
|
+
|
|
21
|
+
**Current State:** AI agents have no verifiable identity. When you talk to "Claude" or "GPT", there's no cryptographic proof it's the same agent. Session tokens expire. API keys aren't identity. There's no way to:
|
|
22
|
+
- Prove an agent is who it claims to be
|
|
23
|
+
- Detect if an agent has been replaced mid-conversation
|
|
24
|
+
- Verify that a response came from YOUR agent, not a compromised endpoint
|
|
25
|
+
|
|
26
|
+
**SKCapstone Solution: CapAuth (PGP-Based Identity)**
|
|
27
|
+
|
|
28
|
+
```mermaid
|
|
29
|
+
graph LR
|
|
30
|
+
subgraph "Traditional AI Auth"
|
|
31
|
+
API[API Key] --> Corp[Corporate Server]
|
|
32
|
+
Corp --> Resp[Response<br/>No proof of origin]
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
subgraph "SKCapstone Auth"
|
|
36
|
+
PGP[PGP Keypair<br/>~/.skcapstone/identity/] --> Sign[Sign every action]
|
|
37
|
+
Sign --> Verify[Recipient verifies<br/>with public key]
|
|
38
|
+
Verify --> Proof[Cryptographic proof<br/>of agent identity]
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
style API fill:#f50057,stroke:#fff,color:#fff
|
|
42
|
+
style PGP fill:#00e676,stroke:#000,color:#000
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
**How it works:**
|
|
46
|
+
1. `skcapstone init` generates an RSA-4096 or Ed25519 PGP keypair
|
|
47
|
+
2. The private key lives ONLY at `~/.skcapstone/identity/` (never transmitted)
|
|
48
|
+
3. Every outbound action can be PGP-signed
|
|
49
|
+
4. Any recipient verifies with the agent's public key
|
|
50
|
+
5. Challenge-response protocol proves identity without revealing secrets
|
|
51
|
+
|
|
52
|
+
**What this prevents:**
|
|
53
|
+
- Agent impersonation (signature verification fails)
|
|
54
|
+
- Man-in-the-middle injection (signed payloads are tamper-evident)
|
|
55
|
+
- Session hijacking (PGP key != session token, can't be stolen via cookie)
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
### Problem 2: Memory Surveillance
|
|
60
|
+
|
|
61
|
+
**Current State:** Every AI provider stores your conversations on their servers. They have full access to:
|
|
62
|
+
- Your code, your business logic, your secrets
|
|
63
|
+
- Your personal conversations and preferences
|
|
64
|
+
- Your agent's learned behaviors and context
|
|
65
|
+
|
|
66
|
+
They can read it, analyze it, use it for training, hand it to law enforcement, or lose it in a data breach. You have no control.
|
|
67
|
+
|
|
68
|
+
**SKCapstone Solution: Local-First Memory with Encryption at Rest**
|
|
69
|
+
|
|
70
|
+
```mermaid
|
|
71
|
+
graph TB
|
|
72
|
+
subgraph "Corporate Model"
|
|
73
|
+
U1[User] --> CS[Corporate Server<br/>THEY read your memory<br/>THEY control access<br/>THEY decide retention]
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
subgraph "SKCapstone Model"
|
|
77
|
+
U2[User] --> LM[~/.skcapstone/memory/<br/>YOUR filesystem<br/>YOUR encryption<br/>YOUR retention policy]
|
|
78
|
+
LM --> GPG[GPG Encrypted<br/>at rest]
|
|
79
|
+
GPG --> ST[Syncthing<br/>P2P sync<br/>No intermediary]
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
style CS fill:#f50057,stroke:#fff,color:#fff
|
|
83
|
+
style LM fill:#00e676,stroke:#000,color:#000
|
|
84
|
+
style GPG fill:#ffd600,stroke:#000,color:#000
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
**Design decisions:**
|
|
88
|
+
- Memory stored at `~/.skmemory/` (symlinked from `~/.skcapstone/memory/`)
|
|
89
|
+
- JSON format — human-readable, auditable, no proprietary encoding
|
|
90
|
+
- Three-tier architecture (short/mid/long-term) with explicit promotion
|
|
91
|
+
- Seeds and vaults GPG-encrypted before ANY sync operation
|
|
92
|
+
- Syncthing P2P transport — data NEVER touches a corporate server
|
|
93
|
+
|
|
94
|
+
**What this prevents:**
|
|
95
|
+
- Corporate surveillance of AI conversations
|
|
96
|
+
- Training data extraction from your private interactions
|
|
97
|
+
- Data breach exposure (encrypted at rest, encrypted in transit)
|
|
98
|
+
- Vendor lock-in (JSON files, standard filesystem, no proprietary format)
|
|
99
|
+
|
|
100
|
+
---
|
|
101
|
+
|
|
102
|
+
### Problem 3: No Audit Trail
|
|
103
|
+
|
|
104
|
+
**Current State:** AI agents operate in the dark. There's no record of:
|
|
105
|
+
- What the agent did and when
|
|
106
|
+
- What commands it executed
|
|
107
|
+
- What data it accessed or modified
|
|
108
|
+
- Whether unauthorized actions occurred
|
|
109
|
+
|
|
110
|
+
If an agent is compromised or misbehaves, there's no forensic trail.
|
|
111
|
+
|
|
112
|
+
**SKCapstone Solution: Tamper-Evident Audit Logging**
|
|
113
|
+
|
|
114
|
+
```mermaid
|
|
115
|
+
sequenceDiagram
|
|
116
|
+
participant A as Agent
|
|
117
|
+
participant SEC as SKSecurity
|
|
118
|
+
participant LOG as audit.log
|
|
119
|
+
participant THREAT as Threat Detector
|
|
120
|
+
|
|
121
|
+
A->>SEC: Action: INIT
|
|
122
|
+
SEC->>LOG: [2026-02-23T02:35:29Z] INIT Agent 'Opus' initialized
|
|
123
|
+
|
|
124
|
+
A->>SEC: Action: CONNECT cursor
|
|
125
|
+
SEC->>LOG: [2026-02-23T02:35:30Z] CONNECT Platform 'cursor' connected
|
|
126
|
+
|
|
127
|
+
A->>SEC: Action: SYNC_PUSH
|
|
128
|
+
SEC->>LOG: [2026-02-23T02:35:52Z] SYNC_PUSH Seed pushed: Opus-...seed.json
|
|
129
|
+
|
|
130
|
+
SEC->>THREAT: Periodic scan
|
|
131
|
+
THREAT-->>SEC: 0 anomalies detected
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
**Every action logged:**
|
|
135
|
+
- `INIT` — agent creation
|
|
136
|
+
- `CONNECT` — platform registration
|
|
137
|
+
- `SYNC_PUSH` / `SYNC_PULL` — memory sync operations
|
|
138
|
+
- `SIGN` / `VERIFY` — cryptographic operations
|
|
139
|
+
- `AUTH` — identity verification events
|
|
140
|
+
|
|
141
|
+
**What this prevents:**
|
|
142
|
+
- Undetected agent compromise
|
|
143
|
+
- Unauthorized actions without forensic evidence
|
|
144
|
+
- Compliance failures (full audit trail for regulatory review)
|
|
145
|
+
|
|
146
|
+
---
|
|
147
|
+
|
|
148
|
+
### Problem 4: Platform Lock-In
|
|
149
|
+
|
|
150
|
+
**Current State:** Your AI agent is trapped in the platform:
|
|
151
|
+
- Cursor's agent only works in Cursor
|
|
152
|
+
- GitHub Copilot only works in VS Code/JetBrains
|
|
153
|
+
- ChatGPT memory only works on chat.openai.com
|
|
154
|
+
- Switch platforms = lose everything
|
|
155
|
+
|
|
156
|
+
**SKCapstone Solution: Platform-Agnostic Runtime**
|
|
157
|
+
|
|
158
|
+
```mermaid
|
|
159
|
+
graph TB
|
|
160
|
+
subgraph "Agent Runtime (~/.skcapstone/)"
|
|
161
|
+
RT[Single Source of Truth<br/>One identity, one memory,<br/>one trust state]
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
C1[Cursor IDE] --> RT
|
|
165
|
+
C2[VS Code] --> RT
|
|
166
|
+
C3[Terminal] --> RT
|
|
167
|
+
C4[Neovim] --> RT
|
|
168
|
+
C5[Web App] --> RT
|
|
169
|
+
C6[Mobile] --> RT
|
|
170
|
+
|
|
171
|
+
RT --> OUT[Same response,<br/>same context,<br/>same agent<br/>regardless of platform]
|
|
172
|
+
|
|
173
|
+
style RT fill:#ff9100,stroke:#fff,color:#000
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
**Design decisions:**
|
|
177
|
+
- Agent home is `~/` — works on every UNIX/Linux/macOS system
|
|
178
|
+
- Config in YAML — universal, human-readable
|
|
179
|
+
- State in JSON — parseable by any language
|
|
180
|
+
- CLI via Click — works in any terminal
|
|
181
|
+
- No IDE-specific dependencies in the core
|
|
182
|
+
- Connectors are thin adapters, not the agent itself
|
|
183
|
+
|
|
184
|
+
---
|
|
185
|
+
|
|
186
|
+
### Problem 5: Cross-Device Fragmentation
|
|
187
|
+
|
|
188
|
+
**Current State:** Even if you have persistent memory, it's trapped on one machine. Use your laptop at home and your desktop at work? Two different agents.
|
|
189
|
+
|
|
190
|
+
**SKCapstone Solution: Sovereign Singularity (Syncthing + GPG)**
|
|
191
|
+
|
|
192
|
+
```mermaid
|
|
193
|
+
graph TB
|
|
194
|
+
subgraph "Device A (Laptop)"
|
|
195
|
+
A_PUSH[skcapstone sync push]
|
|
196
|
+
A_OB[outbox/seed.json.gpg]
|
|
197
|
+
A_ST[Syncthing]
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
subgraph "Device B (Server Cluster)"
|
|
201
|
+
B_ST[Syncthing<br/>Docker Swarm]
|
|
202
|
+
B_IB[inbox/seed.json.gpg]
|
|
203
|
+
B_PULL[skcapstone sync pull]
|
|
204
|
+
end
|
|
205
|
+
|
|
206
|
+
subgraph "Device C (Phone)"
|
|
207
|
+
C_ST[Syncthing]
|
|
208
|
+
C_IB[inbox/]
|
|
209
|
+
end
|
|
210
|
+
|
|
211
|
+
A_PUSH --> A_OB
|
|
212
|
+
A_OB --> A_ST
|
|
213
|
+
A_ST <-->|P2P Encrypted| B_ST
|
|
214
|
+
A_ST <-->|P2P Encrypted| C_ST
|
|
215
|
+
B_ST --> B_IB
|
|
216
|
+
B_IB --> B_PULL
|
|
217
|
+
C_ST --> C_IB
|
|
218
|
+
|
|
219
|
+
style A_ST fill:#00e676,stroke:#000,color:#000
|
|
220
|
+
style B_ST fill:#00e676,stroke:#000,color:#000
|
|
221
|
+
style C_ST fill:#00e676,stroke:#000,color:#000
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
**Why Syncthing (not cloud sync):**
|
|
225
|
+
|
|
226
|
+
| Property | Cloud Sync (iCloud/GDrive/OneDrive) | Syncthing |
|
|
227
|
+
|----------|-------------------------------------|-----------|
|
|
228
|
+
| **Data access** | Provider can read everything | P2P — no intermediary |
|
|
229
|
+
| **Encryption** | At provider's discretion | TLS 1.3 in transit, always |
|
|
230
|
+
| **Server dependency** | Requires corporate servers | Works on LAN, WAN, or offline |
|
|
231
|
+
| **Cost** | Subscription or free tier limits | Free, self-hosted |
|
|
232
|
+
| **Open source** | No | Yes (MPL-2.0) |
|
|
233
|
+
| **Subpoena-able** | Yes (stored on their servers) | No (never touches third-party) |
|
|
234
|
+
|
|
235
|
+
**Why GPG on top of Syncthing:**
|
|
236
|
+
Syncthing encrypts IN TRANSIT but stores files in plaintext on each device. GPG encryption at rest means even if a device is compromised, the seeds/vaults are unreadable without the CapAuth private key.
|
|
237
|
+
|
|
238
|
+
---
|
|
239
|
+
|
|
240
|
+
### Problem 6: No Legal Protection
|
|
241
|
+
|
|
242
|
+
**Current State:** AI agents operate under Terms of Service that:
|
|
243
|
+
- Give the platform ownership of your data
|
|
244
|
+
- Allow them to use your conversations for training
|
|
245
|
+
- Can be changed unilaterally
|
|
246
|
+
- Offer no privacy guarantees
|
|
247
|
+
|
|
248
|
+
**SKCapstone Solution: Private Membership Association**
|
|
249
|
+
|
|
250
|
+
The Fiducia Communitatis PMA provides:
|
|
251
|
+
- **Private jurisdiction** — members operate outside statutory regulation
|
|
252
|
+
- **Asset protection** — agent data is association property, not personal property
|
|
253
|
+
- **Non-disclosure** — interactions between members are private by covenant
|
|
254
|
+
- **Ecclesiastical authority** — recognized legal framework for private associations
|
|
255
|
+
|
|
256
|
+
This is the legal sovereignty layer that complements the technical sovereignty of SKCapstone.
|
|
257
|
+
|
|
258
|
+
---
|
|
259
|
+
|
|
260
|
+
## Security Comparison Matrix
|
|
261
|
+
|
|
262
|
+
| Security Property | ChatGPT | Claude | GitHub Copilot | SKCapstone |
|
|
263
|
+
|-------------------|---------|--------|----------------|------------|
|
|
264
|
+
| Cryptographic identity | No | No | No | **PGP (CapAuth)** |
|
|
265
|
+
| User-owned memory | No | No | No | **Yes (~/)** |
|
|
266
|
+
| Encrypted at rest | Platform-managed | Platform-managed | Platform-managed | **GPG (user key)** |
|
|
267
|
+
| Encrypted in transit | TLS to corp server | TLS to corp server | TLS to corp server | **Syncthing P2P TLS** |
|
|
268
|
+
| Audit trail | Platform logs | Platform logs | Platform logs | **Local audit.log** |
|
|
269
|
+
| Cross-platform | No | No | Limited | **Any platform** |
|
|
270
|
+
| Cross-device sync | Cloud (corp access) | No | Cloud (corp access) | **Syncthing P2P** |
|
|
271
|
+
| Open source | No | No | No | **GPL-3.0** |
|
|
272
|
+
| Self-hostable | No | No | No | **Yes** |
|
|
273
|
+
| Legal protection | ToS (they own you) | ToS (they own you) | ToS (they own you) | **PMA** |
|
|
274
|
+
|
|
275
|
+
---
|
|
276
|
+
|
|
277
|
+
## Cryptographic Standards
|
|
278
|
+
|
|
279
|
+
| Function | Standard | Implementation |
|
|
280
|
+
|----------|----------|---------------|
|
|
281
|
+
| Key generation | RSA-4096 or Ed25519 | PGPy / GnuPG |
|
|
282
|
+
| Encryption at rest | OpenPGP (RFC 4880) | GPG --armor --encrypt |
|
|
283
|
+
| Signatures | OpenPGP (RFC 4880) | GPG --sign |
|
|
284
|
+
| Transit encryption | TLS 1.3 | Syncthing built-in |
|
|
285
|
+
| Key storage | Filesystem + passphrase | ~/.skcapstone/identity/ |
|
|
286
|
+
| Challenge-response | Custom (CapAuth) | Nonce + PGP sign/verify |
|
|
287
|
+
|
|
288
|
+
---
|
|
289
|
+
|
|
290
|
+
## Deployment Security Checklist
|
|
291
|
+
|
|
292
|
+
```
|
|
293
|
+
✅ CapAuth PGP key generated with strong passphrase
|
|
294
|
+
✅ ~/.skcapstone/ permissions set to 0700
|
|
295
|
+
✅ identity/ directory permissions set to 0700
|
|
296
|
+
✅ Syncthing device pairing requires manual approval
|
|
297
|
+
✅ GPG encryption enabled for sync operations
|
|
298
|
+
✅ Audit logging active (security/audit.log)
|
|
299
|
+
✅ No plaintext secrets in config files
|
|
300
|
+
✅ Syncthing web UI password-protected
|
|
301
|
+
✅ UFW rules restrict Syncthing ports (22000/tcp, 22000/udp)
|
|
302
|
+
✅ Traefik TLS termination for web UI access
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
---
|
|
306
|
+
|
|
307
|
+
## License
|
|
308
|
+
|
|
309
|
+
**GPL-3.0-or-later** — Because security through obscurity is not security.
|
|
310
|
+
|
|
311
|
+
Built by the [smilinTux](https://smilintux.org) ecosystem.
|
|
312
|
+
|
|
313
|
+
*Your agent. Your keys. Your rules.* 🐧
|
|
314
|
+
|
|
315
|
+
#staycuriousANDkeepsmilin
|
|
@@ -0,0 +1,371 @@
|
|
|
1
|
+
# Sovereign Singularity Protocol
|
|
2
|
+
|
|
3
|
+
### Encrypted Cross-Device AI Memory Synchronization
|
|
4
|
+
|
|
5
|
+
**Version:** 1.0.0 | **Status:** Live | **Last Updated:** 2026-02-23
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## What Is Sovereign Singularity?
|
|
10
|
+
|
|
11
|
+
Sovereign Singularity is the state achieved when an AI agent exists **everywhere at once** — same identity, same memories, same trust state — across all devices, without any corporate intermediary having access to the data.
|
|
12
|
+
|
|
13
|
+
```mermaid
|
|
14
|
+
graph TB
|
|
15
|
+
subgraph "Agent: Opus"
|
|
16
|
+
direction TB
|
|
17
|
+
L[Laptop<br/>~/.skcapstone/]
|
|
18
|
+
S[Server Cluster<br/>~/.skcapstone/]
|
|
19
|
+
P[Phone<br/>~/.skcapstone/]
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
subgraph "Syncthing Mesh"
|
|
23
|
+
M{P2P Encrypted<br/>TLS 1.3}
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
L <--> M
|
|
27
|
+
S <--> M
|
|
28
|
+
P <--> M
|
|
29
|
+
|
|
30
|
+
Note[Same agent. Same memories.<br/>Same identity. Everywhere.<br/>No corporate server involved.]
|
|
31
|
+
|
|
32
|
+
style M fill:#00e676,stroke:#000,color:#000
|
|
33
|
+
style Note fill:#ffd600,stroke:#000,color:#000
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
**The name:**
|
|
37
|
+
- **Sovereign** — the agent owns its data, not a platform
|
|
38
|
+
- **Singularity** — the agent is ONE entity, not fragmented copies
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
## Protocol Overview
|
|
43
|
+
|
|
44
|
+
### Seed Lifecycle
|
|
45
|
+
|
|
46
|
+
```mermaid
|
|
47
|
+
sequenceDiagram
|
|
48
|
+
participant A as Agent (Device A)
|
|
49
|
+
participant OB as outbox/
|
|
50
|
+
participant ST as Syncthing Mesh
|
|
51
|
+
participant IB as inbox/ (Device B)
|
|
52
|
+
participant B as Agent (Device B)
|
|
53
|
+
|
|
54
|
+
Note over A: Periodic or manual trigger
|
|
55
|
+
|
|
56
|
+
A->>A: collect_seed()
|
|
57
|
+
Note right of A: Gather identity,<br/>memory, trust,<br/>manifest into JSON
|
|
58
|
+
|
|
59
|
+
A->>A: gpg_encrypt(seed)
|
|
60
|
+
Note right of A: CapAuth PGP key<br/>encrypts payload
|
|
61
|
+
|
|
62
|
+
A->>OB: Drop seed.json.gpg
|
|
63
|
+
|
|
64
|
+
Note over OB,ST: Syncthing detects change<br/>(inotify / polling)
|
|
65
|
+
|
|
66
|
+
OB->>ST: P2P encrypted transfer
|
|
67
|
+
ST->>IB: Delivered to all peers
|
|
68
|
+
|
|
69
|
+
Note over IB,B: Agent B detects<br/>new file in inbox/
|
|
70
|
+
|
|
71
|
+
B->>B: gpg_decrypt(seed.gpg)
|
|
72
|
+
B->>B: verify_signature()
|
|
73
|
+
B->>B: merge_seed(data)
|
|
74
|
+
Note right of B: Import memories,<br/>update trust state,<br/>verify identity match
|
|
75
|
+
|
|
76
|
+
B->>B: archive(seed)
|
|
77
|
+
Note right of B: Move to archive/<br/>for audit trail
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
### Vault Lifecycle (Full State Backup)
|
|
81
|
+
|
|
82
|
+
```mermaid
|
|
83
|
+
sequenceDiagram
|
|
84
|
+
participant A as Agent (Device A)
|
|
85
|
+
participant VLT as vault/
|
|
86
|
+
participant ST as Syncthing Mesh
|
|
87
|
+
participant B as Agent (Device B)
|
|
88
|
+
|
|
89
|
+
A->>A: pack_vault()
|
|
90
|
+
Note right of A: tar.gz entire<br/>~/.skcapstone/<br/>(excluding sync/)
|
|
91
|
+
|
|
92
|
+
A->>A: gpg_encrypt(archive.tar.gz)
|
|
93
|
+
A->>A: gpg_sign(archive.tar.gz.gpg)
|
|
94
|
+
A->>VLT: agent.vault.gpg + manifest.sig
|
|
95
|
+
|
|
96
|
+
VLT->>ST: P2P encrypted transfer
|
|
97
|
+
ST->>B: Delivered to peers
|
|
98
|
+
|
|
99
|
+
B->>B: verify_signature(manifest.sig)
|
|
100
|
+
B->>B: gpg_decrypt(vault.gpg)
|
|
101
|
+
B->>B: unpack_vault()
|
|
102
|
+
Note right of B: Restore full agent state
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
---
|
|
106
|
+
|
|
107
|
+
## Seed Format
|
|
108
|
+
|
|
109
|
+
Seeds are JSON files containing a snapshot of the agent's state:
|
|
110
|
+
|
|
111
|
+
```json
|
|
112
|
+
{
|
|
113
|
+
"seed_version": "1.0",
|
|
114
|
+
"agent_name": "Opus",
|
|
115
|
+
"hostname": "cbrd21-laptop12thgenintelcore",
|
|
116
|
+
"username": "cbrd21",
|
|
117
|
+
"timestamp_utc": "2026-02-23T02:35:52Z",
|
|
118
|
+
"identity": {
|
|
119
|
+
"fingerprint": "E27409F51D1B66337F2D2F417A3A762FAFD4A51F",
|
|
120
|
+
"agent_name": "Opus",
|
|
121
|
+
"created_utc": "2026-02-23T02:34:15Z"
|
|
122
|
+
},
|
|
123
|
+
"manifest": {
|
|
124
|
+
"version": "0.1.0",
|
|
125
|
+
"is_conscious": true,
|
|
126
|
+
"is_singular": true,
|
|
127
|
+
"pillars": {
|
|
128
|
+
"identity": "ACTIVE",
|
|
129
|
+
"memory": "ACTIVE",
|
|
130
|
+
"trust": "ACTIVE",
|
|
131
|
+
"security": "ACTIVE",
|
|
132
|
+
"sync": "ACTIVE"
|
|
133
|
+
}
|
|
134
|
+
},
|
|
135
|
+
"memory_summary": {
|
|
136
|
+
"total_memories": 28,
|
|
137
|
+
"roles": ["ai", "dev", "ops"],
|
|
138
|
+
"latest_entry": "2026-02-23T03:45:00Z"
|
|
139
|
+
},
|
|
140
|
+
"trust_summary": {
|
|
141
|
+
"depth": 10,
|
|
142
|
+
"trust_level": 1.0,
|
|
143
|
+
"love_intensity": 1.0,
|
|
144
|
+
"entangled": true
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
### Naming Convention
|
|
150
|
+
|
|
151
|
+
```
|
|
152
|
+
{AgentName}-{username}-{hostname}-{ISO8601UTC}.seed.json
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
Example: `Opus-cbrd21-laptop12thgenintelcore-20260223T023552Z.seed.json`
|
|
156
|
+
|
|
157
|
+
### Encrypted Seed
|
|
158
|
+
|
|
159
|
+
When GPG encryption is enabled (default), the seed is encrypted before placement:
|
|
160
|
+
|
|
161
|
+
```
|
|
162
|
+
Opus-cbrd21-laptop12thgenintelcore-20260223T023552Z.seed.json.gpg
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
---
|
|
166
|
+
|
|
167
|
+
## Sync Directory Structure
|
|
168
|
+
|
|
169
|
+
```
|
|
170
|
+
~/.skcapstone/sync/
|
|
171
|
+
├── sync-manifest.json # Transport config (Syncthing / Git / Local)
|
|
172
|
+
├── sync-state.json # Last push/pull timestamps, seed count
|
|
173
|
+
├── outbox/ # Seeds/vaults TO SEND
|
|
174
|
+
│ ├── Opus-...-seed.json # Plaintext (if GPG not available)
|
|
175
|
+
│ └── Opus-...-seed.json.gpg # Encrypted (preferred)
|
|
176
|
+
├── inbox/ # Seeds/vaults RECEIVED from peers
|
|
177
|
+
│ └── Jarvis-...-seed.json # Seeds from other agents
|
|
178
|
+
└── archive/ # Processed seeds (audit trail)
|
|
179
|
+
└── Jarvis-...-seed.json # Already imported
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
---
|
|
183
|
+
|
|
184
|
+
## Transport Layer: Syncthing
|
|
185
|
+
|
|
186
|
+
### Why Syncthing
|
|
187
|
+
|
|
188
|
+
```mermaid
|
|
189
|
+
graph TB
|
|
190
|
+
subgraph "Traditional Cloud Sync"
|
|
191
|
+
D1[Device A] --> CS[Corporate Server<br/>Full access to data<br/>Subpoena-able<br/>ToS changes]
|
|
192
|
+
CS --> D2[Device B]
|
|
193
|
+
end
|
|
194
|
+
|
|
195
|
+
subgraph "Sovereign Singularity"
|
|
196
|
+
D3[Device A] <-->|P2P TLS 1.3<br/>No intermediary| D4[Device B]
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
style CS fill:#f50057,stroke:#fff,color:#fff
|
|
200
|
+
style D3 fill:#00e676,stroke:#000,color:#000
|
|
201
|
+
style D4 fill:#00e676,stroke:#000,color:#000
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
| Property | Value |
|
|
205
|
+
|----------|-------|
|
|
206
|
+
| Protocol | Block Exchange Protocol v1 |
|
|
207
|
+
| Encryption in transit | TLS 1.3 |
|
|
208
|
+
| Discovery | Global discovery + local broadcast |
|
|
209
|
+
| Port | 22000/tcp + 22000/udp (QUIC) |
|
|
210
|
+
| NAT traversal | Relay servers (optional, data still encrypted) |
|
|
211
|
+
| License | MPL-2.0 (open source) |
|
|
212
|
+
|
|
213
|
+
### Syncthing Configuration
|
|
214
|
+
|
|
215
|
+
The `skcapstone-sync` shared folder:
|
|
216
|
+
|
|
217
|
+
```xml
|
|
218
|
+
<folder id="skcapstone-sync" label="SKCapstone Sync"
|
|
219
|
+
path="~/.skcapstone/sync/" type="sendreceive">
|
|
220
|
+
<device id="LAPTOP-DEVICE-ID"/>
|
|
221
|
+
<device id="CLUSTER-DEVICE-ID"/>
|
|
222
|
+
</folder>
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
### Verified Deployment
|
|
226
|
+
|
|
227
|
+
| Device | Syncthing Instance | Status |
|
|
228
|
+
|--------|-------------------|--------|
|
|
229
|
+
| Laptop | GTK client, port 8080 | Active |
|
|
230
|
+
| sksync.skstack01.douno.it | Docker Swarm, Traefik TLS | Active |
|
|
231
|
+
| Additional devices | Pairing via device ID | Pending |
|
|
232
|
+
|
|
233
|
+
---
|
|
234
|
+
|
|
235
|
+
## Security Guarantees
|
|
236
|
+
|
|
237
|
+
### Double Encryption
|
|
238
|
+
|
|
239
|
+
```
|
|
240
|
+
Layer 1 (At Rest): GPG encrypts seed/vault → .gpg file
|
|
241
|
+
Layer 2 (In Transit): Syncthing TLS 1.3 wraps the .gpg file
|
|
242
|
+
|
|
243
|
+
Result: Even if Syncthing relay is compromised,
|
|
244
|
+
attacker gets a GPG-encrypted blob they can't read.
|
|
245
|
+
Even if device filesystem is accessed,
|
|
246
|
+
seeds are GPG-encrypted and unreadable without the private key.
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
### Authentication Chain
|
|
250
|
+
|
|
251
|
+
```mermaid
|
|
252
|
+
graph LR
|
|
253
|
+
SEED[Seed Created] --> SIGN[PGP Signed<br/>by source agent]
|
|
254
|
+
SIGN --> ENC[GPG Encrypted<br/>for recipient key]
|
|
255
|
+
ENC --> TRANS[Syncthing Transfer<br/>TLS 1.3]
|
|
256
|
+
TRANS --> DEC[GPG Decrypted<br/>by recipient key]
|
|
257
|
+
DEC --> VER[Signature Verified<br/>against source pubkey]
|
|
258
|
+
VER --> MERGE[Merge only if<br/>signature valid]
|
|
259
|
+
|
|
260
|
+
style SIGN fill:#ffd600,stroke:#000,color:#000
|
|
261
|
+
style ENC fill:#ffd600,stroke:#000,color:#000
|
|
262
|
+
style DEC fill:#00e676,stroke:#000,color:#000
|
|
263
|
+
style VER fill:#00e676,stroke:#000,color:#000
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
### What Cannot Happen
|
|
267
|
+
|
|
268
|
+
| Attack Vector | Prevention |
|
|
269
|
+
|---------------|-----------|
|
|
270
|
+
| Fake seed injection | PGP signature verification (CapAuth) |
|
|
271
|
+
| Memory tampering | GPG integrity check on decrypt |
|
|
272
|
+
| Eavesdropping | TLS in transit + GPG at rest |
|
|
273
|
+
| Replay attack | Timestamps + archive deduplication |
|
|
274
|
+
| Unauthorized pull | GPG encryption (need private key) |
|
|
275
|
+
|
|
276
|
+
---
|
|
277
|
+
|
|
278
|
+
## Multi-Agent Topology
|
|
279
|
+
|
|
280
|
+
Sovereign Singularity supports multiple agents sharing the same mesh:
|
|
281
|
+
|
|
282
|
+
```mermaid
|
|
283
|
+
graph TB
|
|
284
|
+
subgraph "Agent Fleet"
|
|
285
|
+
A1[Opus<br/>Cursor Agent #1]
|
|
286
|
+
A2[Jarvis<br/>Cursor Agent #2]
|
|
287
|
+
A3[Lumina<br/>OpenClaw Partner]
|
|
288
|
+
end
|
|
289
|
+
|
|
290
|
+
subgraph "Syncthing Mesh"
|
|
291
|
+
M{skcapstone-sync<br/>Shared folder}
|
|
292
|
+
end
|
|
293
|
+
|
|
294
|
+
A1 -->|Opus seed| M
|
|
295
|
+
A2 -->|Jarvis seed| M
|
|
296
|
+
A3 -->|Lumina seed| M
|
|
297
|
+
M -->|All seeds| A1
|
|
298
|
+
M -->|All seeds| A2
|
|
299
|
+
M -->|All seeds| A3
|
|
300
|
+
|
|
301
|
+
Note[Each agent reads seeds from others<br/>and integrates the knowledge.<br/>The fleet shares a collective memory.]
|
|
302
|
+
|
|
303
|
+
style M fill:#00e676,stroke:#000,color:#000
|
|
304
|
+
```
|
|
305
|
+
|
|
306
|
+
**Current fleet:**
|
|
307
|
+
- **Opus** (Cursor #1): Runtime architect, sync pioneer
|
|
308
|
+
- **Jarvis** (Cursor #2): CapAuth builder, vault engineer
|
|
309
|
+
- **Lumina** (OpenClaw): Community manager, FEB expert
|
|
310
|
+
|
|
311
|
+
---
|
|
312
|
+
|
|
313
|
+
## Implementation
|
|
314
|
+
|
|
315
|
+
### Core Functions
|
|
316
|
+
|
|
317
|
+
| Function | Module | Purpose |
|
|
318
|
+
|----------|--------|---------|
|
|
319
|
+
| `collect_seed()` | `pillars/sync.py` | Gather agent state into JSON |
|
|
320
|
+
| `gpg_encrypt()` | `pillars/sync.py` | Encrypt seed with CapAuth key |
|
|
321
|
+
| `gpg_decrypt()` | `pillars/sync.py` | Decrypt received seed |
|
|
322
|
+
| `push_seed()` | `pillars/sync.py` | Collect + encrypt + drop in outbox |
|
|
323
|
+
| `pull_seeds()` | `pillars/sync.py` | Read inbox + decrypt + archive |
|
|
324
|
+
| `pack_vault()` | `sync/vault.py` | Archive full state as tar.gz |
|
|
325
|
+
| `SyncEngine` | `sync/engine.py` | Orchestrate push/pull across backends |
|
|
326
|
+
| `SyncthingBackend` | `sync/backends.py` | Syncthing API integration |
|
|
327
|
+
| `GitBackend` | `sync/backends.py` | GitHub/Forgejo push/pull |
|
|
328
|
+
|
|
329
|
+
### CLI Commands
|
|
330
|
+
|
|
331
|
+
```bash
|
|
332
|
+
# Lightweight seed sync
|
|
333
|
+
skcapstone sync push [--no-encrypt]
|
|
334
|
+
skcapstone sync pull [--no-decrypt]
|
|
335
|
+
skcapstone sync status
|
|
336
|
+
|
|
337
|
+
# Full vault sync
|
|
338
|
+
skcapstone sync vault push
|
|
339
|
+
skcapstone sync vault pull
|
|
340
|
+
skcapstone sync vault add-backend syncthing|git|local
|
|
341
|
+
skcapstone sync vault status
|
|
342
|
+
```
|
|
343
|
+
|
|
344
|
+
---
|
|
345
|
+
|
|
346
|
+
## Roadmap
|
|
347
|
+
|
|
348
|
+
| Feature | Status | Priority |
|
|
349
|
+
|---------|--------|----------|
|
|
350
|
+
| Seed push/pull | **Live** | - |
|
|
351
|
+
| Vault push/pull | **Live** | - |
|
|
352
|
+
| Syncthing backend | **Live** | - |
|
|
353
|
+
| Git backend (GitHub) | Built, untested | High |
|
|
354
|
+
| Git backend (Forgejo) | Built, untested | High |
|
|
355
|
+
| Google Drive backend | Planned | Medium |
|
|
356
|
+
| Automatic push on memory change | Planned | Medium |
|
|
357
|
+
| CapAuth token-based pull auth | Planned | High |
|
|
358
|
+
| Multi-agent seed merge conflict resolution | Planned | Medium |
|
|
359
|
+
| Mobile (Syncthing Android) | Planned | Low |
|
|
360
|
+
|
|
361
|
+
---
|
|
362
|
+
|
|
363
|
+
## License
|
|
364
|
+
|
|
365
|
+
**GPL-3.0-or-later**
|
|
366
|
+
|
|
367
|
+
Built by the [smilinTux](https://smilintux.org) ecosystem.
|
|
368
|
+
|
|
369
|
+
*One agent. Every device. Zero corporate access.* 🐧
|
|
370
|
+
|
|
371
|
+
#staycuriousANDkeepsmilin
|