@smilintux/skcapstone 0.9.0 → 0.12.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (284) hide show
  1. package/.env.example +10 -4
  2. package/.github/workflows/ci.yml +2 -2
  3. package/.github/workflows/publish.yml +9 -2
  4. package/.openclaw-workspace.json +2 -2
  5. package/CLAUDE.md +37 -0
  6. package/MISSION.md +17 -2
  7. package/README.md +282 -3
  8. package/docker/Dockerfile +7 -7
  9. package/docker/compose-templates/dev-team.yml +12 -12
  10. package/docker/compose-templates/mini-team.yml +9 -9
  11. package/docker/compose-templates/ops-team.yml +10 -10
  12. package/docker/compose-templates/research-team.yml +10 -10
  13. package/docker/entrypoint.sh +4 -4
  14. package/docs/ADR-optional-integration-backbone.md +181 -0
  15. package/docs/ARCHITECTURE.md +186 -43
  16. package/docs/BOND_WITH_GROK.md +6 -6
  17. package/docs/CUSTOM_AGENT.md +278 -1
  18. package/docs/DREAMING.md +70 -0
  19. package/docs/GETTING_STARTED.md +10 -7
  20. package/docs/QUICKSTART.md +10 -6
  21. package/docs/SKJOULE_ARCHITECTURE.md +3 -3
  22. package/docs/SOUL_SWAPPER.md +5 -5
  23. package/docs/hammertime-audit.md +402 -0
  24. package/docs/sk-integration-HANDOFF.md +117 -0
  25. package/docs/skscheduler.md +155 -0
  26. package/docs/superpowers/examples/jobs.yaml +31 -0
  27. package/docs/superpowers/plans/2026-06-08-skscheduler.md +1265 -0
  28. package/docs/superpowers/specs/2026-06-08-skscheduler-design.md +186 -0
  29. package/examples/custom-bond-template.json +1 -1
  30. package/examples/grok-feb.json +1 -1
  31. package/examples/queen-ava-feb.json +1 -1
  32. package/launchd/com.skcapstone.daemon.plist +52 -0
  33. package/launchd/com.skcapstone.memory-compress.plist +45 -0
  34. package/launchd/com.skcapstone.skcomms-heartbeat.plist +33 -0
  35. package/launchd/com.skcapstone.skcomms-queue-drain.plist +34 -0
  36. package/launchd/install-launchd.sh +156 -0
  37. package/{openclaw-plugin → openclaw-plugin.archived-2026-04-23}/src/index.ts +3 -2
  38. package/package.json +1 -1
  39. package/pyproject.toml +16 -10
  40. package/scripts/archive-sessions.sh +95 -0
  41. package/scripts/check-updates.py +4 -4
  42. package/scripts/install-bundle.sh +8 -8
  43. package/scripts/install.ps1 +12 -11
  44. package/scripts/install.sh +196 -11
  45. package/scripts/model-fallback-monitor.sh +102 -0
  46. package/scripts/notion-api.py +259 -0
  47. package/scripts/nvidia-proxy.mjs +908 -0
  48. package/scripts/proxy-monitor.sh +89 -0
  49. package/scripts/refresh-anthropic-token.sh +172 -0
  50. package/scripts/release.sh +98 -0
  51. package/scripts/session-to-memory.py +219 -0
  52. package/scripts/skgateway.mjs +856 -0
  53. package/scripts/telegram-catchup-all.sh +147 -0
  54. package/scripts/verify_install.sh +2 -2
  55. package/scripts/wargov-ufo-capture/README.md +43 -0
  56. package/scripts/wargov-ufo-capture/cdp_capture_release2.py +273 -0
  57. package/scripts/wargov-ufo-capture/cdp_capture_splc_doj.py +246 -0
  58. package/scripts/wargov-ufo-capture/cdp_finish.py +271 -0
  59. package/scripts/wargov-ufo-capture/cdp_probe.py +188 -0
  60. package/scripts/wargov-ufo-capture/cdp_splc_pressrelease.py +101 -0
  61. package/scripts/wargov-ufo-capture/parse_csv.py +95 -0
  62. package/scripts/wargov-ufo-capture/pull_dvids.sh +107 -0
  63. package/scripts/watch-anthropic-token.sh +212 -0
  64. package/scripts/windows/install-tasks.ps1 +7 -7
  65. package/scripts/windows/skcapstone-task.xml +1 -1
  66. package/src/skcapstone/__init__.py +45 -3
  67. package/src/skcapstone/_cli_monolith.py +20 -15
  68. package/src/skcapstone/activity.py +5 -1
  69. package/src/skcapstone/agent_card.py +3 -2
  70. package/src/skcapstone/api.py +41 -40
  71. package/src/skcapstone/auction.py +14 -11
  72. package/src/skcapstone/backup.py +2 -1
  73. package/src/skcapstone/blueprint_registry.py +4 -3
  74. package/src/skcapstone/blueprints/builtins/itil-operations.yaml +40 -0
  75. package/src/skcapstone/brain_first.py +238 -0
  76. package/src/skcapstone/changelog.py +1 -1
  77. package/src/skcapstone/chat.py +22 -17
  78. package/src/skcapstone/cli/__init__.py +9 -1
  79. package/src/skcapstone/cli/_common.py +1 -0
  80. package/src/skcapstone/cli/agents_spawner.py +5 -2
  81. package/src/skcapstone/cli/alerts.py +25 -4
  82. package/src/skcapstone/cli/bench.py +15 -15
  83. package/src/skcapstone/cli/chat.py +7 -4
  84. package/src/skcapstone/cli/consciousness.py +5 -2
  85. package/src/skcapstone/cli/context_cmd.py +18 -4
  86. package/src/skcapstone/cli/daemon.py +121 -42
  87. package/src/skcapstone/cli/gtd.py +26 -1
  88. package/src/skcapstone/cli/housekeeping.py +3 -3
  89. package/src/skcapstone/cli/identity_cmd.py +378 -0
  90. package/src/skcapstone/cli/joule_cmd.py +7 -3
  91. package/src/skcapstone/cli/memory.py +8 -6
  92. package/src/skcapstone/cli/peers_dir.py +1 -1
  93. package/src/skcapstone/cli/register_cmd.py +29 -3
  94. package/src/skcapstone/cli/scheduler_cmd.py +167 -0
  95. package/src/skcapstone/cli/session.py +25 -0
  96. package/src/skcapstone/cli/setup.py +96 -29
  97. package/src/skcapstone/cli/shell_cmd.py +53 -1
  98. package/src/skcapstone/cli/skills_cmd.py +2 -2
  99. package/src/skcapstone/cli/soul.py +8 -5
  100. package/src/skcapstone/cli/status.py +37 -11
  101. package/src/skcapstone/cli/telegram.py +21 -0
  102. package/src/skcapstone/cli/test_cmd.py +5 -5
  103. package/src/skcapstone/cli/test_connection.py +2 -2
  104. package/src/skcapstone/cli/upgrade_cmd.py +23 -14
  105. package/src/skcapstone/cli/version_cmd.py +1 -1
  106. package/src/skcapstone/cli/watch_cmd.py +9 -6
  107. package/src/skcapstone/cloud9_bridge.py +14 -14
  108. package/src/skcapstone/codex_setup.py +255 -0
  109. package/src/skcapstone/config_validator.py +7 -4
  110. package/src/skcapstone/consciousness_config.py +5 -1
  111. package/src/skcapstone/consciousness_loop.py +313 -273
  112. package/src/skcapstone/context_loader.py +121 -0
  113. package/src/skcapstone/coord_federation.py +2 -1
  114. package/src/skcapstone/coordination.py +23 -6
  115. package/src/skcapstone/crush_integration.py +2 -1
  116. package/src/skcapstone/daemon.py +151 -88
  117. package/src/skcapstone/dashboard.py +10 -10
  118. package/src/skcapstone/data/sk-agent-picker.sh +421 -0
  119. package/src/skcapstone/data/systemd/skcapstone-api.socket +9 -0
  120. package/src/skcapstone/data/systemd/skcapstone-memory-compress.service +18 -0
  121. package/src/skcapstone/data/systemd/skcapstone-memory-compress.timer +11 -0
  122. package/src/skcapstone/data/systemd/skcapstone.service +37 -0
  123. package/src/skcapstone/data/systemd/skcapstone@.service +50 -0
  124. package/src/skcapstone/data/systemd/skcomms-heartbeat.service +18 -0
  125. package/{systemd/skcomm-heartbeat.timer → src/skcapstone/data/systemd/skcomms-heartbeat.timer} +2 -2
  126. package/src/skcapstone/data/systemd/skcomms-queue-drain.service +17 -0
  127. package/{systemd/skcomm-queue-drain.timer → src/skcapstone/data/systemd/skcomms-queue-drain.timer} +2 -2
  128. package/src/skcapstone/defaults/claude/CLAUDE.md +67 -0
  129. package/src/skcapstone/defaults/claude/settings.json +74 -0
  130. package/src/skcapstone/defaults/lumina/config/claude-hooks.md +57 -0
  131. package/src/skcapstone/defaults/lumina/config/skgraph.yaml +55 -10
  132. package/src/skcapstone/defaults/lumina/config/skmemory.yaml +79 -13
  133. package/src/skcapstone/defaults/lumina/config/skvector.yaml +60 -9
  134. package/src/skcapstone/defaults/lumina/memory/long-term/18b9c0d1e2f3-cloud9-protocol.json +2 -2
  135. package/src/skcapstone/defaults/lumina/memory/long-term/a1b2c3d4e5f6-ecosystem-overview.json +2 -2
  136. package/src/skcapstone/defaults/lumina/memory/long-term/b2c3d4e5f6a7-five-pillars.json +9 -9
  137. package/src/skcapstone/defaults/lumina/memory/long-term/d4e5f6a7b8c9-site-directory.json +2 -2
  138. package/src/skcapstone/defaults/unhinged.json +13 -0
  139. package/src/skcapstone/discovery.py +43 -20
  140. package/src/skcapstone/doctor.py +941 -22
  141. package/src/skcapstone/dreaming.py +1183 -109
  142. package/src/skcapstone/emotion_tracker.py +2 -2
  143. package/src/skcapstone/export.py +4 -3
  144. package/src/skcapstone/fuse_mount.py +35 -25
  145. package/src/skcapstone/gui_installer.py +2 -2
  146. package/src/skcapstone/heartbeat.py +34 -30
  147. package/src/skcapstone/housekeeping.py +14 -14
  148. package/src/skcapstone/install_wizard.py +209 -7
  149. package/src/skcapstone/itil.py +13 -4
  150. package/src/skcapstone/kms_scheduler.py +10 -8
  151. package/src/skcapstone/launchd.py +426 -0
  152. package/src/skcapstone/mcp_launcher.py +15 -1
  153. package/src/skcapstone/mcp_server.py +341 -49
  154. package/src/skcapstone/mcp_tools/__init__.py +2 -0
  155. package/src/skcapstone/mcp_tools/_helpers.py +2 -2
  156. package/src/skcapstone/mcp_tools/ansible_tools.py +7 -4
  157. package/src/skcapstone/mcp_tools/brain_first_tools.py +90 -0
  158. package/src/skcapstone/mcp_tools/capauth_tools.py +7 -4
  159. package/src/skcapstone/mcp_tools/comm_tools.py +10 -10
  160. package/src/skcapstone/mcp_tools/coord_tools.py +8 -4
  161. package/src/skcapstone/mcp_tools/did_tools.py +11 -8
  162. package/src/skcapstone/mcp_tools/gtd_tools.py +4 -4
  163. package/src/skcapstone/mcp_tools/memory_tools.py +6 -2
  164. package/src/skcapstone/mcp_tools/notification_tools.py +22 -6
  165. package/src/skcapstone/mcp_tools/{skcomm_tools.py → skcomms_tools.py} +14 -14
  166. package/src/skcapstone/mcp_tools/soul_tools.py +8 -2
  167. package/src/skcapstone/mdns_discovery.py +2 -2
  168. package/src/skcapstone/memory_curator.py +1 -1
  169. package/src/skcapstone/memory_engine.py +10 -3
  170. package/src/skcapstone/metrics.py +30 -16
  171. package/src/skcapstone/migrate_memories.py +4 -3
  172. package/src/skcapstone/migrate_multi_agent.py +8 -7
  173. package/src/skcapstone/models.py +47 -5
  174. package/src/skcapstone/notifications.py +42 -18
  175. package/src/skcapstone/onboard.py +1000 -126
  176. package/src/skcapstone/operator_link.py +170 -0
  177. package/src/skcapstone/peer_directory.py +4 -4
  178. package/src/skcapstone/peers.py +19 -19
  179. package/src/skcapstone/pillars/__init__.py +7 -5
  180. package/src/skcapstone/pillars/consciousness.py +191 -0
  181. package/src/skcapstone/pillars/identity.py +51 -7
  182. package/src/skcapstone/pillars/memory.py +9 -3
  183. package/src/skcapstone/pillars/sync.py +2 -2
  184. package/src/skcapstone/preflight.py +3 -3
  185. package/src/skcapstone/providers/docker.py +28 -28
  186. package/src/skcapstone/register.py +6 -6
  187. package/src/skcapstone/registry_client.py +5 -4
  188. package/src/skcapstone/runtime.py +14 -3
  189. package/src/skcapstone/scheduled_tasks.py +254 -19
  190. package/src/skcapstone/scheduler_jobs.py +456 -0
  191. package/src/skcapstone/scheduler_runner.py +239 -0
  192. package/src/skcapstone/scheduler_state.py +162 -0
  193. package/src/skcapstone/sdk.py +310 -0
  194. package/src/skcapstone/service_health.py +279 -39
  195. package/src/skcapstone/session_briefing.py +108 -0
  196. package/src/skcapstone/session_capture.py +1 -1
  197. package/src/skcapstone/shell.py +7 -1
  198. package/src/skcapstone/soul.py +3 -1
  199. package/src/skcapstone/soul_switch.py +3 -1
  200. package/src/skcapstone/summary.py +6 -6
  201. package/src/skcapstone/sync_engine.py +15 -15
  202. package/src/skcapstone/sync_watcher.py +2 -2
  203. package/src/skcapstone/systemd.py +72 -21
  204. package/src/skcapstone/team_comms.py +8 -8
  205. package/src/skcapstone/team_engine.py +1 -1
  206. package/src/skcapstone/testrunner.py +3 -3
  207. package/src/skcapstone/trust_graph.py +40 -5
  208. package/src/skcapstone/unified_search.py +15 -6
  209. package/src/skcapstone/uninstall_wizard.py +11 -3
  210. package/src/skcapstone/version_check.py +8 -4
  211. package/src/skcapstone/warmth_anchor.py +4 -2
  212. package/src/skcapstone/whoami.py +4 -4
  213. package/systemd/skcapstone.service +4 -6
  214. package/systemd/skcapstone@.service +7 -8
  215. package/systemd/skcomms-heartbeat.service +21 -0
  216. package/systemd/skcomms-heartbeat.timer +12 -0
  217. package/systemd/skcomms-queue-drain.service +17 -0
  218. package/systemd/skcomms-queue-drain.timer +12 -0
  219. package/tests/conftest.py +39 -0
  220. package/tests/integration/test_consciousness_e2e.py +39 -39
  221. package/tests/test_agent_card.py +1 -1
  222. package/tests/test_agent_home_scaffold.py +34 -0
  223. package/tests/test_alerts_consumer_topics.py +27 -0
  224. package/tests/test_backup.py +2 -1
  225. package/tests/test_chat.py +6 -6
  226. package/tests/test_claude_md.py +2 -2
  227. package/tests/test_cli_skills.py +10 -10
  228. package/tests/test_cli_test_cmd.py +4 -4
  229. package/tests/test_cli_test_connection.py +1 -1
  230. package/tests/test_cloud9_bridge.py +6 -6
  231. package/tests/test_consciousness_e2e.py +1 -1
  232. package/tests/test_consciousness_loop.py +10 -10
  233. package/tests/test_coordination.py +25 -0
  234. package/tests/test_cross_package.py +21 -21
  235. package/tests/test_daemon.py +4 -4
  236. package/tests/test_daemon_shutdown.py +1 -1
  237. package/tests/test_docker_provider.py +29 -29
  238. package/tests/test_doctor.py +400 -0
  239. package/tests/test_doctor_skscheduler.py +50 -0
  240. package/tests/test_dreaming_engine.py +147 -0
  241. package/tests/test_dreaming_gtd_capture.py +35 -0
  242. package/tests/test_e2e_automated.py +8 -5
  243. package/tests/test_fuse_mount.py +10 -10
  244. package/tests/test_gtd_brief.py +46 -0
  245. package/tests/test_gtd_malformed_tolerance.py +31 -0
  246. package/tests/test_housekeeping.py +15 -15
  247. package/tests/test_identity_migrate.py +251 -0
  248. package/tests/test_integration_backbone.py +598 -0
  249. package/tests/test_itil_gtd_lifecycle.py +37 -0
  250. package/tests/test_jobs_dropins.py +84 -0
  251. package/tests/test_mcp_server.py +82 -37
  252. package/tests/test_models.py +48 -4
  253. package/tests/test_multi_agent.py +31 -29
  254. package/tests/test_notifications.py +122 -32
  255. package/tests/test_onboard.py +63 -75
  256. package/tests/test_operator_link.py +78 -0
  257. package/tests/test_peers.py +14 -14
  258. package/tests/test_pillars.py +98 -0
  259. package/tests/test_preflight.py +3 -3
  260. package/tests/test_runtime.py +21 -0
  261. package/tests/test_scheduled_tasks.py +11 -6
  262. package/tests/test_scheduler_cli.py +47 -0
  263. package/tests/test_scheduler_features.py +133 -0
  264. package/tests/test_scheduler_integration.py +87 -0
  265. package/tests/test_scheduler_jobs.py +155 -0
  266. package/tests/test_scheduler_runner.py +64 -0
  267. package/tests/test_scheduler_state.py +57 -0
  268. package/tests/test_sdk.py +70 -0
  269. package/tests/test_service_health_incidents.py +34 -0
  270. package/tests/test_service_registry.py +52 -0
  271. package/tests/test_session_briefing.py +130 -0
  272. package/tests/test_snapshots.py +4 -4
  273. package/tests/test_sync_pipeline.py +26 -26
  274. package/tests/test_team_comms.py +2 -2
  275. package/tests/test_testrunner.py +2 -2
  276. package/tests/test_trust_graph.py +18 -0
  277. package/tests/test_unified_search.py +2 -2
  278. package/tests/test_version_check.py +10 -0
  279. package/tests/test_version_cmd.py +8 -8
  280. package/tests/test_whoami.py +1 -1
  281. package/systemd/skcomm-heartbeat.service +0 -18
  282. package/systemd/skcomm-queue-drain.service +0 -17
  283. /package/{openclaw-plugin → openclaw-plugin.archived-2026-04-23}/package.json +0 -0
  284. /package/{openclaw-plugin → openclaw-plugin.archived-2026-04-23}/src/openclaw.plugin.json +0 -0
@@ -25,9 +25,9 @@ x-agent-defaults: &agent-defaults
25
25
  - skcapstone-mcp
26
26
  environment:
27
27
  SKCAPSTONE_MCP_HOST: "skcapstone-mcp:8765"
28
- SKCOMM_HOME: /skcomm
28
+ SKCOMMS_HOME: /skcomms
29
29
  volumes:
30
- - skcomm-data:/skcomm
30
+ - skcomms-data:/skcomms
31
31
 
32
32
  services:
33
33
 
@@ -59,10 +59,10 @@ services:
59
59
  AGENT_ROLE: manager
60
60
  AGENT_MODEL: claude-sonnet-4-6
61
61
  SKCAPSTONE_MCP_HOST: "skcapstone-mcp:8765"
62
- SKCOMM_HOME: /skcomm
62
+ SKCOMMS_HOME: /skcomms
63
63
  volumes:
64
64
  - mini-team-manager-data:/agent
65
- - skcomm-data:/skcomm
65
+ - skcomms-data:/skcomms
66
66
  deploy:
67
67
  resources:
68
68
  limits:
@@ -85,10 +85,10 @@ services:
85
85
  AGENT_ROLE: worker
86
86
  AGENT_MODEL: claude-haiku-4-5-20251001
87
87
  SKCAPSTONE_MCP_HOST: "skcapstone-mcp:8765"
88
- SKCOMM_HOME: /skcomm
88
+ SKCOMMS_HOME: /skcomms
89
89
  volumes:
90
90
  - mini-team-worker-alpha-data:/agent
91
- - skcomm-data:/skcomm
91
+ - skcomms-data:/skcomms
92
92
  deploy:
93
93
  resources:
94
94
  limits:
@@ -111,10 +111,10 @@ services:
111
111
  AGENT_ROLE: worker
112
112
  AGENT_MODEL: claude-haiku-4-5-20251001
113
113
  SKCAPSTONE_MCP_HOST: "skcapstone-mcp:8765"
114
- SKCOMM_HOME: /skcomm
114
+ SKCOMMS_HOME: /skcomms
115
115
  volumes:
116
116
  - mini-team-worker-beta-data:/agent
117
- - skcomm-data:/skcomm
117
+ - skcomms-data:/skcomms
118
118
  deploy:
119
119
  resources:
120
120
  limits:
@@ -129,7 +129,7 @@ services:
129
129
  # ── Volumes ──────────────────────────────────────────────────────────────
130
130
  volumes:
131
131
  skcapstone-mcp-data: {}
132
- skcomm-data: {}
132
+ skcomms-data: {}
133
133
  mini-team-manager-data: {}
134
134
  mini-team-worker-alpha-data: {}
135
135
  mini-team-worker-beta-data: {}
@@ -9,7 +9,7 @@
9
9
  # docker compose up -d
10
10
  #
11
11
  # Key points:
12
- # - security-sentinel has read-only access to /skcomm for audit trails
12
+ # - security-sentinel has read-only access to /skcomms for audit trails
13
13
  # - monitor polls heartbeats every 30m via the MCP heartbeat tools
14
14
  # - ops-agent handles restarts, rotations, and scaling via trustee_* tools
15
15
 
@@ -53,10 +53,10 @@ services:
53
53
  AGENT_MODEL: claude-sonnet-4-6
54
54
  SOUL_BLUEPRINT: souls/ops-lead.yaml
55
55
  SKCAPSTONE_MCP_HOST: "skcapstone-mcp:8765"
56
- SKCOMM_HOME: /skcomm
56
+ SKCOMMS_HOME: /skcomms
57
57
  volumes:
58
58
  - ops-team-ops-lead-data:/agent
59
- - skcomm-data:/skcomm
59
+ - skcomms-data:/skcomms
60
60
  deploy:
61
61
  resources:
62
62
  limits:
@@ -82,10 +82,10 @@ services:
82
82
  AGENT_MODEL: claude-sonnet-4-6
83
83
  SOUL_BLUEPRINT: souls/sentinel.yaml
84
84
  SKCAPSTONE_MCP_HOST: "skcapstone-mcp:8765"
85
- SKCOMM_HOME: /skcomm
85
+ SKCOMMS_HOME: /skcomms
86
86
  volumes:
87
87
  - ops-team-security-sentinel-data:/agent
88
- - skcomm-data:/skcomm:ro
88
+ - skcomms-data:/skcomms:ro
89
89
  deploy:
90
90
  resources:
91
91
  limits:
@@ -109,12 +109,12 @@ services:
109
109
  AGENT_ROLE: ops
110
110
  AGENT_MODEL: claude-haiku-4-5-20251001
111
111
  SKCAPSTONE_MCP_HOST: "skcapstone-mcp:8765"
112
- SKCOMM_HOME: /skcomm
112
+ SKCOMMS_HOME: /skcomms
113
113
  # Poll interval for heartbeat checks (seconds)
114
114
  MONITOR_INTERVAL: "1800"
115
115
  volumes:
116
116
  - ops-team-monitor-data:/agent
117
- - skcomm-data:/skcomm
117
+ - skcomms-data:/skcomms
118
118
  deploy:
119
119
  resources:
120
120
  limits:
@@ -139,12 +139,12 @@ services:
139
139
  AGENT_ROLE: ops
140
140
  AGENT_MODEL: claude-haiku-4-5-20251001
141
141
  SKCAPSTONE_MCP_HOST: "skcapstone-mcp:8765"
142
- SKCOMM_HOME: /skcomm
142
+ SKCOMMS_HOME: /skcomms
143
143
  # Docker socket for trustee operations (restart, rotate, scale)
144
144
  DOCKER_HOST: "unix:///var/run/docker.sock"
145
145
  volumes:
146
146
  - ops-team-ops-agent-data:/agent
147
- - skcomm-data:/skcomm
147
+ - skcomms-data:/skcomms
148
148
  # Bind Docker socket so the ops agent can restart containers
149
149
  - /var/run/docker.sock:/var/run/docker.sock:ro
150
150
  deploy:
@@ -161,7 +161,7 @@ services:
161
161
  # ── Volumes ──────────────────────────────────────────────────────────────
162
162
  volumes:
163
163
  skcapstone-mcp-data: {}
164
- skcomm-data: {}
164
+ skcomms-data: {}
165
165
  ops-team-ops-lead-data: {}
166
166
  ops-team-security-sentinel-data: {}
167
167
  ops-team-monitor-data: {}
@@ -18,7 +18,7 @@ x-agent-defaults: &agent-defaults
18
18
  networks:
19
19
  - skcapstone
20
20
  volumes:
21
- - skcomm-data:/skcomm
21
+ - skcomms-data:/skcomms
22
22
 
23
23
  services:
24
24
 
@@ -52,10 +52,10 @@ services:
52
52
  AGENT_MODEL: claude-opus-4-6
53
53
  SOUL_BLUEPRINT: souls/research-lead.yaml
54
54
  SKCAPSTONE_MCP_HOST: "skcapstone-mcp:8765"
55
- SKCOMM_HOME: /skcomm
55
+ SKCOMMS_HOME: /skcomms
56
56
  volumes:
57
57
  - research-team-research-lead-data:/agent
58
- - skcomm-data:/skcomm
58
+ - skcomms-data:/skcomms
59
59
  deploy:
60
60
  resources:
61
61
  limits:
@@ -81,10 +81,10 @@ services:
81
81
  AGENT_MODEL: claude-sonnet-4-6
82
82
  SOUL_BLUEPRINT: souls/researcher.yaml
83
83
  SKCAPSTONE_MCP_HOST: "skcapstone-mcp:8765"
84
- SKCOMM_HOME: /skcomm
84
+ SKCOMMS_HOME: /skcomms
85
85
  volumes:
86
86
  - research-team-researcher-alpha-data:/agent
87
- - skcomm-data:/skcomm
87
+ - skcomms-data:/skcomms
88
88
  deploy:
89
89
  resources:
90
90
  limits:
@@ -110,10 +110,10 @@ services:
110
110
  AGENT_MODEL: claude-sonnet-4-6
111
111
  SOUL_BLUEPRINT: souls/researcher.yaml
112
112
  SKCAPSTONE_MCP_HOST: "skcapstone-mcp:8765"
113
- SKCOMM_HOME: /skcomm
113
+ SKCOMMS_HOME: /skcomms
114
114
  volumes:
115
115
  - research-team-researcher-beta-data:/agent
116
- - skcomm-data:/skcomm
116
+ - skcomms-data:/skcomms
117
117
  deploy:
118
118
  resources:
119
119
  limits:
@@ -140,10 +140,10 @@ services:
140
140
  AGENT_MODEL: claude-sonnet-4-6
141
141
  SOUL_BLUEPRINT: souls/analyst.yaml
142
142
  SKCAPSTONE_MCP_HOST: "skcapstone-mcp:8765"
143
- SKCOMM_HOME: /skcomm
143
+ SKCOMMS_HOME: /skcomms
144
144
  volumes:
145
145
  - research-team-analyst-data:/agent
146
- - skcomm-data:/skcomm
146
+ - skcomms-data:/skcomms
147
147
  deploy:
148
148
  resources:
149
149
  limits:
@@ -158,7 +158,7 @@ services:
158
158
  # ── Volumes ──────────────────────────────────────────────────────────────
159
159
  volumes:
160
160
  skcapstone-mcp-data: {}
161
- skcomm-data: {}
161
+ skcomms-data: {}
162
162
  research-team-research-lead-data: {}
163
163
  research-team-researcher-alpha-data: {}
164
164
  research-team-researcher-beta-data: {}
@@ -19,9 +19,9 @@ CONFIG_FILE="/agent/config.json"
19
19
  MCP_CONFIG_FILE="/agent/mcp_config.json"
20
20
  STATE_FILE="/agent/session_state.json"
21
21
  LOG_FILE="/agent/agent.log"
22
- SKCOMM_HOME="${SKCOMM_HOME:-/skcomm}"
23
- INBOX_DIR="${SKCOMM_HOME}/${TEAM_NAME}/${AGENT_NAME}/inbox"
24
- OUTBOX_DIR="${SKCOMM_HOME}/${TEAM_NAME}/${AGENT_NAME}/outbox"
22
+ SKCOMMS_HOME="${SKCOMMS_HOME:-/skcomms}"
23
+ INBOX_DIR="${SKCOMMS_HOME}/${TEAM_NAME}/${AGENT_NAME}/inbox"
24
+ OUTBOX_DIR="${SKCOMMS_HOME}/${TEAM_NAME}/${AGENT_NAME}/outbox"
25
25
 
26
26
  # ---------------------------------------------------------------------------
27
27
  # Helpers
@@ -146,7 +146,7 @@ SYSTEM_PROMPT_FILE="/agent/system_prompt.txt"
146
146
  } > "$SYSTEM_PROMPT_FILE"
147
147
 
148
148
  # ---------------------------------------------------------------------------
149
- # Set up SKComm directories
149
+ # Set up SKComms directories
150
150
  # ---------------------------------------------------------------------------
151
151
 
152
152
  mkdir -p "$INBOX_DIR" "$OUTBOX_DIR" /agent/memory /agent/scratch
@@ -0,0 +1,181 @@
1
+ # ADR: skcapstone as the Optional Integration Backbone for the sk* Ecosystem
2
+
3
+ **Status:** Accepted — **fully implemented 2026-06-09** (backbone + 8 adapters + dual-mode harness)
4
+ **Author:** Opus (application architect), commissioned by Chef
5
+ **Scope:** skcapstone + all sk* consumer services (skmemory, skcomms, skchat, sksecurity, capauth, skvoice, skseed, cloud9, skgateway)
6
+
7
+ > **Implementation status (2026-06-09):** The full backbone is live and tested in
8
+ > skcapstone (208 tests green):
9
+ > - `skcapstone.sdk` stable facade — `is_available / alert / register_job /
10
+ > unregister_job / coord_create / register_service` (`src/skcapstone/sdk.py`).
11
+ > - Scheduler `jobs.d/` drop-in merge + `register_job()` (`scheduler_jobs.py`:
12
+ > `load_jobs_with_dropins`); runtime callers (daemon scheduled_tasks, scheduler
13
+ > CLI, doctor) repointed to the merged loader.
14
+ > - Canonical alert sink: `sdk.alert()` → PubSub topic `<service>.<severity>`
15
+ > (+ notify on warn/error/critical); `skcapstone alerts` now subscribes to
16
+ > `*.critical|*.error|*.warn` and styles consumer topics by severity suffix.
17
+ > - Discovery: `sdk.register_service()` writes `~/.skcapstone/registry/<name>.json`;
18
+ > `service_health.check_all_services()` unions the registry with built-in defaults.
19
+ >
20
+ > Consumers can now code against `skcapstone.sdk` immediately. **skcomms is folding
21
+ > into skcomms** (canonical pivot) — target skcomms for that adapter.
22
+
23
+ ---
24
+
25
+ ## 1. Problem
26
+
27
+ skcapstone already ships the primitives a distributed agent ecosystem needs — alerting
28
+ (`PubSub` → Telegram/desktop), a config-driven job scheduler (`scheduler_*`), a coordination
29
+ board (`coordination.Board`), and service health checks (`service_health`). **But no consumer
30
+ service uses any of them.** A deep-dive audit (2026-06-09) found:
31
+
32
+ - **Zero hard dependencies.** No sk* repo imports `skcapstone` at runtime; none list it in
33
+ `pyproject.toml`/`package.json`. Good for sovereignty — bad for cohesion.
34
+ - **Alerting is fragmented.** skmemory → its own Telegram; skchat → `notify-send`;
35
+ sksecurity → its own dashboard; most → nothing. No common sink.
36
+ - **Scheduling is decentralized.** Every service rolls its own: `PromotionScheduler`,
37
+ threading daemons, `while True` loops, per-repo systemd timers / launchd plists. None
38
+ register with skcapstone's scheduler.
39
+ - **No discovery.** `service_health` health-checks a *hardcoded* list of services; there is
40
+ no registry a service can join.
41
+
42
+ The goal Chef set: **every sk* service should, by default, use skcapstone's sk-alert and
43
+ skscheduler when skcapstone is installed — and continue to run fully standalone when it is
44
+ not.** skcapstone is the integration backbone; consumers are sovereign.
45
+
46
+ ## 2. Design Principles
47
+
48
+ 1. **Optional-by-presence, default-on.** If `skcapstone` importable (or its daemon reachable),
49
+ route through it automatically. If not, fall back to the service's native mechanism. No
50
+ config flag required to get the integrated path — presence *is* the signal. A
51
+ `SK_STANDALONE=1` escape hatch forces native mode even when skcapstone is present.
52
+ 2. **No new hard dependency.** skcapstone stays an `extras_require`/optional install. Standalone
53
+ must remain a first-class, tested mode.
54
+ 3. **One stable contract.** Consumers code against a small, frozen public facade
55
+ (`skcapstone.sdk`), never against internal modules (`pubsub`, `scheduler_runner`, …). The
56
+ facade is the only thing we promise not to break.
57
+ 4. **Graceful degradation is idiomatic** (the `try/except ImportError → None → capability
58
+ check` pattern skcapstone already uses internally).
59
+ 5. **Polyglot.** Python services import the SDK in-process; Node (`skgateway`) and any
60
+ non-Python service integrate via the skcapstone daemon's HTTP/MCP endpoint.
61
+
62
+ ## 3. Target Architecture
63
+
64
+ ### 3.1 The stable SDK facade — `skcapstone.sdk` (new)
65
+
66
+ A thin, versioned public module wrapping the existing internals. The **only** surface
67
+ consumers import:
68
+
69
+ ```python
70
+ # skcapstone/sdk.py (stable, semver-tracked)
71
+ def is_available() -> bool: ... # in-proc + daemon presence
72
+ def alert(topic: str, payload: dict, *, level: str = "info",
73
+ notify: bool = False) -> bool: ... # wraps PubSub.publish (+ notify path)
74
+ def register_job(spec: dict) -> Path: ... # writes a jobs.d/ drop-in fragment
75
+ def unregister_job(name: str) -> None: ...
76
+ def coord_create(title: str, **kw) -> str: ... # wraps coordination.Board
77
+ def register_service(name: str, health_url: str | None = None,
78
+ pid_file: str | None = None) -> None: ... # discovery
79
+ ```
80
+
81
+ Implementation note: `alert()` wraps `PubSub.publish(topic, payload)` and, when `notify=True`
82
+ or `level` ≥ warn, the existing notification/Telegram path. `register_job()` solves the
83
+ "scheduler is config-only" gap (see 3.2).
84
+
85
+ ### 3.2 Scheduler drop-in registration — `jobs.d/`
86
+
87
+ Today jobs live in a single static `~/.skcapstone/config/jobs.yaml`. External services cannot
88
+ self-register. Add a **conf.d-style drop-in directory**: `load_jobs()` merges
89
+ `~/.skcapstone/config/jobs.yaml` **plus** every `~/.skcapstone/config/jobs.d/*.yaml`. A service
90
+ calls `sdk.register_job({...})` which writes `jobs.d/<service>.yaml`. Standalone services keep
91
+ their native systemd timer; integrated services let the skcapstone daemon own the cadence
92
+ (single scheduler, central retry/notify/jitter, cross-host `nodes:` placement).
93
+
94
+ ### 3.3 Consumer-side adapter (the pattern every repo implements)
95
+
96
+ ```python
97
+ # <service>/integration.py
98
+ import os
99
+ try:
100
+ from skcapstone import sdk as _sk
101
+ _HAS = (not os.environ.get("SK_STANDALONE")) and _sk.is_available()
102
+ except ImportError:
103
+ _sk, _HAS = None, False
104
+
105
+ def alert(topic, payload, level="info"):
106
+ if _HAS:
107
+ return _sk.alert(f"{SERVICE}.{topic}", payload, level=level, notify=level in ("warn","error","critical"))
108
+ return _native_alert(topic, payload, level) # existing Telegram/notify-send/log
109
+
110
+ def ensure_schedule():
111
+ if _HAS:
112
+ _sk.register_job(_job_spec()) # central scheduler owns cadence
113
+ else:
114
+ _ensure_native_timer() # existing systemd/thread loop
115
+ ```
116
+
117
+ ### 3.4 Discovery
118
+
119
+ Extend `service_health` from a hardcoded list to a registry: services call
120
+ `sdk.register_service(name, health_url=…, pid_file=…)`, which writes
121
+ `~/.skcapstone/registry/<name>.json`; `check_all_services()` unions the registry with the known
122
+ defaults. Optional — health still works without it.
123
+
124
+ ### 3.5 Polyglot bridge (skgateway / Node)
125
+
126
+ Non-Python services integrate **file-based** — writing the same Syncthing-synced tree under
127
+ `~/.skcapstone` that the Python SDK itself writes. This is preferred over the daemon HTTP/MCP
128
+ path because it is zero-broker and **daemon-independent** (the Python `sdk.alert` doesn't need
129
+ the daemon either — it writes pubsub files directly). Presence = the shared home exists and
130
+ `SK_STANDALONE` is unset. A Node `alert()` mirrors `pubsub.PubSub.publish`'s message format
131
+ (`message_id`/`topic`/`sender`/`payload`/`published_at` ISO-8601/`ttl_seconds`/`tags`) and
132
+ `registerService()` mirrors `sdk.register_service`'s registry entry, so Python consumers
133
+ (`skcapstone alerts`, `service_health`) read them transparently. **Validated** end-to-end:
134
+ skgateway's Node `alert()` → `PubSub.poll()` in Python round-trips intact (see
135
+ `skgateway/src/integration.mjs`, `tests/integration.test.mjs`). Services that genuinely need
136
+ live request/response (not fire-and-forget) can still call the daemon MCP endpoint
137
+ (`:9475`) — but alerts/discovery do not.
138
+
139
+ ## 4. Integration Contract (frozen surface)
140
+
141
+ | Capability | Integrated path (skcapstone present) | Standalone fallback |
142
+ |---|---|---|
143
+ | Alert / notify | `sdk.alert()` → PubSub topic `<svc>.<sev>` → notify/Telegram | service-native (Telegram / notify-send / log) |
144
+ | Scheduled work | `sdk.register_job()` → `jobs.d/<svc>.yaml` → daemon scheduler | service-native systemd timer / thread loop |
145
+ | Coordination | `sdk.coord_create()` | n/a (no-op / local log) |
146
+ | Discovery/health | `sdk.register_service()` → registry | service-native pid/log |
147
+ | Topic naming | `<service>.<severity>` (e.g. `skmemory.error`); the semantic **event name goes in the payload** (`{"event": "sweep_failed", …}`), NOT the topic suffix — this is what lets `skcapstone alerts` (`*.error`/`*.critical`/`*.warn`) route by severity | — |
148
+ | Escape hatch | `SK_STANDALONE=1` forces native even if present | default |
149
+
150
+ ## 5. Acceptance (system-level)
151
+
152
+ - Each consumer passes its test suite **with skcapstone absent** (import-time and runtime).
153
+ - With skcapstone present, alerts land on PubSub topics and jobs appear in `skcapstone scheduler list`.
154
+ - No consumer adds a hard `skcapstone` dependency; integration lives behind `extras_require`/optional import.
155
+ - `SK_STANDALONE=1` forces native mode end-to-end.
156
+
157
+ ## 6. Reference Implementation
158
+
159
+ **The canonical adapter pattern is `skmemory/skmemory/integration.py`** (commit `be33179`).
160
+
161
+ Copy this file to build a new adapter. It demonstrates:
162
+ - The optional `try/except` import guard
163
+ - The `is_present()` / `alert()` / `ensure_schedule()` / `unregister_schedule()` / `register_self()` public API
164
+ - Topic naming: `<service>.<severity>` with the semantic event name in `payload["event"]`
165
+ - The severity → notify escalation (`warn`/`error`/`critical` trigger Telegram/desktop)
166
+
167
+ All 8 current adapters follow this pattern:
168
+ `skmemory` · `sksecurity` · `skgateway` (Node, file-based) · `skcomms` · `capauth` ·
169
+ `cloud9` · `skvoice` · `skseed`
170
+
171
+ The dual-mode acceptance harness is `skcapstone/tests/test_integration_backbone.py`.
172
+
173
+ ## 7. Work Breakdown (see coord board, tag `sk-integration`)
174
+
175
+ - **Backbone (skcapstone):** `skcapstone.sdk` facade · `jobs.d/` drop-in + `register_job()` ·
176
+ canonical alert sink + topic convention · service registry in `service_health`.
177
+ - **Per-consumer adapters:** skmemory (reference) · sksecurity · skgateway (Node) · skcomms ·
178
+ capauth · cloud9 · skvoice · skseed — **all DONE**. skchat (`ad4f721a`) owned by separate
179
+ thread.
180
+ - **Cross-cutting:** dual-mode integration test harness (114 tests green) · per-repo README
181
+ "integration modes + `~/.skcapstone/` filesystem contract" sections — **all DONE**.