소스 정보
- 저장소
- lukemcqueen/hermes-cortex
- 최근 소스 활동
- 2026년 8월 27일 14:37
- 감지된 SKILL.md 언어
- 영어
- 스타
- 4
- 포크
- 1
설치 방법
기본적으로 소스를 먼저 확인하는 Prompt가 선택됩니다. 직접 명령으로 전환하거나 로컬 사본을 다운로드할 수도 있습니다.
소스 파일 검토
설치 여부를 결정하기 전에 SKILL.md와 SkillsMP에 표시된 보조 파일을 읽어 보세요.
메뉴
기본적으로 소스를 먼저 확인하는 Prompt가 선택됩니다. 직접 명령으로 전환하거나 로컬 사본을 다운로드할 수도 있습니다.
설치 여부를 결정하기 전에 SKILL.md와 SkillsMP에 표시된 보조 파일을 읽어 보세요.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
직접 명령은 검토 Prompt를 거치지 않습니다. 실행하기 전에 소스를 확인하세요.
npx skills add https://github.com/lukemcqueen/hermes-cortex --skill deploy-load-verification명령은 한 줄로 유지됩니다. 복사하기 전에 가로로 스크롤해 전체 내용을 확인하세요.
로컬 사본을 원하시나요? SkillsMP에서 현재 제공할 수 있는 파일을 다운로드하세요.
SKILL.md 표시 중
| name | deploy-load-verification |
| version | 1.0.0 |
| category | devops |
| description | Use when a config change isn't live — verify what loaded. |
| platforms | ["linux","macos"] |
| author | Esther (Hermes Cortex) |
| license | MIT |
| metadata | {"hermes":{"tags":["deploy","verification","gateway","mcp","config","restart"],"related_skills":["hermes-gateway-operations","cortex-bus","change-checklist"]}} |
config.yaml (MCP servers, plugins, enforcer) — is the change actually live?agent_bus → cortex_bus) — do tool names match what skills/crons reference?A file on disk is not a running process. The gateway (and any long-running daemon) loads config/plugin/enforcer code at START and keeps it in memory. Deploy ≠ load. Verification = compare when the process started vs when the files changed, and inspect what the process ACTUALLY spawned.
# 1. When did the process start vs when did the files change?
ps -eo pid,lstart,cmd | grep 'hermes_cli.main gateway' | grep -v grep
stat -c '%y %n' ~/.hermes/plugins/governance-enforcer/__init__.py ~/.hermes/config.yaml
# 2. What did the running process ACTUALLY spawn? (ground truth)
ps -eo pid,lstart,cmd | grep mcp_stdio_watchdog | grep -v grep
# 3. Bus/server daemon: exact module name in argv
ps -eo pid,lstart,cmd | grep uvicorn | grep -v grep
Rule of thumb: process start > file mtime → new code loaded. Start < mtime → old code still in memory; restart required.
MCP children are ground truth: each mcp_stdio_watchdog child carries the
exact script path the gateway spawned at startup. An old path in the child argv
(e.g. agent-bus-mcp.py while config now says cortex-bus-mcp.py) means the
gateway started before the config change — what config.yaml says on disk is
irrelevant until restart.
mcp_servers.<name>: key in config.yaml determines the exposed tool
namespace: key agent-bus → tools mcp__agent_bus__* (hyphen → underscore).cortex-bus) changes the tool namespace and breaks
every skill/cron that references the old mcp__<name>__* tools — until the
gateway restarts with the new key.grep -iE 'agent-bus|cortex-bus'), never underscores — agent_bus
matches the Python package, never the config key.config.yaml is enforcer-blocked for direct agent patch ("Agent cannot
modify security-sensitive configuration"). Use hermes config set <path>
/ hermes config unset <path> (see hermes config --help), or have the
user edit the file directly.MemoryProvider tools register in TWO passes with different timing:
add_provider → get_tool_schemas()) runs BEFORE
initialize() in agent_init.py. If get_tool_schemas() gates on
runtime state (e.g. self._pg), it returns [] at registration time →
the executor's routing table stays empty.inject_memory_provider_tools → get_all_tool_schemas)
runs AFTER initialize() — by then _pg exists, so the schemas ARE
advertised in the prompt.Result: tools listed in the system prompt but every call fails
{"error": "Unknown tool: mem_profile"}. The gateway log tells the story:
Memory provider 'mycortex-mem' registered (0 tools) while the prompt
advertises 5.
Fix: get_tool_schemas() must return static schemas unconditionally
(only _cron_skipped / context-only recall mode suppress them) — never
gate on connection state that only exists after initialize(). Regression
test: instantiate the provider, call get_tool_schemas() BEFORE
initialize(), assert the full tool set (RED → GREEN).
Plugin modules are cached in sys.modules — load_memory_provider
reuses the cached module (_load_provider_from_dir checks sys.modules
first). A deployed plugin file fix is NOT loaded until the gateway process
restarts, even though a fresh AIAgent is built per message. Log line
"registered (0 tools)" persisting after deploy = old module still in
memory; restart required (from a separate shell — in-process restart is
blocked by the lifecycle guard).
config.yaml still had mcp_servers.agent-bus: — only the file-mutation
verifier (refused patch) surfaced the overstatement. Always verify the
config key + running children, not just the repo strings.agent_bus finds the Python
package, not the config key agent-bus. Hyphens in config keys, underscores
in code/package names.lstart, don't assume.lstart > every changed file's mtime (or restart happened after deploy)mcp_stdio_watchdog children show the NEW script pathsmcp__<key>__*)references/rename-verification-example.md — worked example: the agent_bus → cortex_bus fleet rename (2026-08-04)