2026-04-14 11:17:01 -04:00
|
|
|
{
|
|
|
|
|
"version": 1,
|
|
|
|
|
"last_updated": "2026-04-13T20:00:00Z",
|
feat(#10): knowledge file format schema + example knowledge files
- SCHEMA.md: full specification for index.json and YAML knowledge files
- knowledge/global/pitfalls.yaml: 8 cross-repo pitfalls
- knowledge/global/tool-quirks.yaml: 7 environment quirk facts
- knowledge/repos/hermes-agent.yaml: 8 per-repo pitfalls (cron, paths, SSH)
- knowledge/repos/the-nexus.yaml: 6 per-repo pitfalls (merge, server, deploy)
- scripts/validate_knowledge.py: schema validator (29 facts, all passing)
- knowledge/index.json: populated with 29 seed facts from real fleet data
Design decisions:
- YAML for humans, index.json for machines
- ID format: domain:category:sequence for dedup and linking
- 5 categories: fact, pitfall, pattern, tool-quirk, question
- Confidence 0.0-1.0 with defined ranges
- Related facts by ID for graph traversal
- Tags for searchability
- Source count + dates for decay/expiry
Acceptance criteria:
- [x] Directory structure created
- [x] Schema documented (SCHEMA.md)
- [x] index.json with real facts (29 total)
- [x] Example knowledge files for 2 repos (hermes-agent, the-nexus)
- [x] Validation script passes
2026-04-14 14:21:21 -04:00
|
|
|
"total_facts": 29,
|
|
|
|
|
"facts": [
|
|
|
|
|
{
|
|
|
|
|
"id": "hermes-agent:pitfall:001",
|
|
|
|
|
"fact": "deploy-crons.py leaves jobs in mixed model format",
|
|
|
|
|
"category": "pitfall",
|
|
|
|
|
"domain": "hermes-agent",
|
|
|
|
|
"confidence": 0.95,
|
|
|
|
|
"tags": [
|
|
|
|
|
"cron",
|
|
|
|
|
"deploy",
|
|
|
|
|
"model",
|
|
|
|
|
"config"
|
|
|
|
|
],
|
|
|
|
|
"source_count": 5,
|
|
|
|
|
"first_seen": "2026-04-08",
|
|
|
|
|
"last_confirmed": "2026-04-13",
|
|
|
|
|
"related": [
|
|
|
|
|
"hermes-agent:pitfall:002",
|
|
|
|
|
"hermes-agent:pitfall:003"
|
|
|
|
|
]
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"id": "hermes-agent:pitfall:002",
|
|
|
|
|
"fact": "deploy-crons.py --deploy doesn't set legacy skill field from skills list",
|
|
|
|
|
"category": "pitfall",
|
|
|
|
|
"domain": "hermes-agent",
|
|
|
|
|
"confidence": 0.9,
|
|
|
|
|
"tags": [
|
|
|
|
|
"cron",
|
|
|
|
|
"deploy",
|
|
|
|
|
"skills"
|
|
|
|
|
],
|
|
|
|
|
"source_count": 3,
|
|
|
|
|
"first_seen": "2026-04-09",
|
|
|
|
|
"last_confirmed": "2026-04-13",
|
|
|
|
|
"related": [
|
|
|
|
|
"hermes-agent:pitfall:001"
|
|
|
|
|
]
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"id": "hermes-agent:pitfall:003",
|
|
|
|
|
"fact": "Cron jobs with blank fallback_model fields trigger spurious gateway warnings",
|
|
|
|
|
"category": "pitfall",
|
|
|
|
|
"domain": "hermes-agent",
|
|
|
|
|
"confidence": 0.9,
|
|
|
|
|
"tags": [
|
|
|
|
|
"cron",
|
|
|
|
|
"model",
|
|
|
|
|
"fallback"
|
|
|
|
|
],
|
|
|
|
|
"source_count": 4,
|
|
|
|
|
"first_seen": "2026-04-07",
|
|
|
|
|
"last_confirmed": "2026-04-12",
|
|
|
|
|
"related": [
|
|
|
|
|
"hermes-agent:pitfall:001"
|
|
|
|
|
]
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"id": "hermes-agent:pitfall:004",
|
|
|
|
|
"fact": "model-watchdog.py checks first provider line, not model.provider - causes false drift alarms",
|
|
|
|
|
"category": "pitfall",
|
|
|
|
|
"domain": "hermes-agent",
|
|
|
|
|
"confidence": 0.9,
|
|
|
|
|
"tags": [
|
|
|
|
|
"watchdog",
|
|
|
|
|
"model",
|
|
|
|
|
"config"
|
|
|
|
|
],
|
|
|
|
|
"source_count": 3,
|
|
|
|
|
"first_seen": "2026-04-08",
|
|
|
|
|
"last_confirmed": "2026-04-13"
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"id": "hermes-agent:pitfall:005",
|
|
|
|
|
"fact": "10+ files read HERMES_HOME directly instead of get_hermes_home()",
|
|
|
|
|
"category": "pitfall",
|
|
|
|
|
"domain": "hermes-agent",
|
|
|
|
|
"confidence": 0.85,
|
|
|
|
|
"tags": [
|
|
|
|
|
"paths",
|
|
|
|
|
"env",
|
|
|
|
|
"hermes-home"
|
|
|
|
|
],
|
|
|
|
|
"source_count": 6,
|
|
|
|
|
"first_seen": "2026-04-06",
|
|
|
|
|
"last_confirmed": "2026-04-12",
|
|
|
|
|
"related": [
|
|
|
|
|
"global:pitfall:002"
|
|
|
|
|
]
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"id": "hermes-agent:pitfall:006",
|
|
|
|
|
"fact": "get_hermes_home() doesn't expand tilde when HERMES_HOME=~/... is set",
|
|
|
|
|
"category": "pitfall",
|
|
|
|
|
"domain": "hermes-agent",
|
|
|
|
|
"confidence": 0.8,
|
|
|
|
|
"tags": [
|
|
|
|
|
"paths",
|
|
|
|
|
"env",
|
|
|
|
|
"bug"
|
|
|
|
|
],
|
|
|
|
|
"source_count": 2,
|
|
|
|
|
"first_seen": "2026-04-05"
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"id": "hermes-agent:pitfall:007",
|
|
|
|
|
"fact": "vps-agent-dispatch reports OK while remote hermes binary path is broken",
|
|
|
|
|
"category": "pitfall",
|
|
|
|
|
"domain": "hermes-agent",
|
|
|
|
|
"confidence": 0.9,
|
|
|
|
|
"tags": [
|
|
|
|
|
"ssh",
|
|
|
|
|
"dispatch",
|
|
|
|
|
"vps"
|
|
|
|
|
],
|
|
|
|
|
"source_count": 4,
|
|
|
|
|
"first_seen": "2026-04-07",
|
|
|
|
|
"last_confirmed": "2026-04-11"
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"id": "hermes-agent:pitfall:008",
|
|
|
|
|
"fact": "nightwatch-health-monitor SSH check fails on cloud-model-only deployments",
|
|
|
|
|
"category": "pitfall",
|
|
|
|
|
"domain": "hermes-agent",
|
|
|
|
|
"confidence": 0.85,
|
|
|
|
|
"tags": [
|
|
|
|
|
"ssh",
|
|
|
|
|
"health",
|
|
|
|
|
"cloud"
|
|
|
|
|
],
|
|
|
|
|
"source_count": 2,
|
|
|
|
|
"first_seen": "2026-04-10"
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"id": "the-nexus:pitfall:001",
|
|
|
|
|
"fact": "Merges fail with HTTP 405 due to branch protection",
|
|
|
|
|
"category": "pitfall",
|
|
|
|
|
"domain": "the-nexus",
|
|
|
|
|
"confidence": 0.95,
|
|
|
|
|
"tags": [
|
|
|
|
|
"git",
|
|
|
|
|
"merge",
|
|
|
|
|
"branch-protection",
|
|
|
|
|
"gitea"
|
|
|
|
|
],
|
|
|
|
|
"source_count": 12,
|
|
|
|
|
"first_seen": "2026-04-05",
|
|
|
|
|
"last_confirmed": "2026-04-13",
|
|
|
|
|
"related": [
|
|
|
|
|
"global:pitfall:001"
|
|
|
|
|
]
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"id": "the-nexus:pitfall:002",
|
|
|
|
|
"fact": "ThreadingHTTPServer required for multi-user bridge - standard HTTPServer blocks on concurrent requests",
|
|
|
|
|
"category": "pitfall",
|
|
|
|
|
"domain": "the-nexus",
|
|
|
|
|
"confidence": 0.95,
|
|
|
|
|
"tags": [
|
|
|
|
|
"server",
|
|
|
|
|
"concurrency",
|
|
|
|
|
"bridge"
|
|
|
|
|
],
|
|
|
|
|
"source_count": 5,
|
|
|
|
|
"first_seen": "2026-04-10",
|
|
|
|
|
"last_confirmed": "2026-04-13"
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"id": "the-nexus:pitfall:003",
|
|
|
|
|
"fact": "ChatLog.log() crashes on message persistence when index.html has orphaned button tags",
|
|
|
|
|
"category": "pitfall",
|
|
|
|
|
"domain": "the-nexus",
|
|
|
|
|
"confidence": 0.9,
|
|
|
|
|
"tags": [
|
|
|
|
|
"html",
|
|
|
|
|
"crash",
|
|
|
|
|
"chatlog"
|
|
|
|
|
],
|
|
|
|
|
"source_count": 3,
|
|
|
|
|
"first_seen": "2026-04-12",
|
|
|
|
|
"last_confirmed": "2026-04-13"
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"id": "the-nexus:pitfall:004",
|
|
|
|
|
"fact": "Three.js LOD not implemented - local hardware struggles with full scene",
|
|
|
|
|
"category": "pitfall",
|
|
|
|
|
"domain": "the-nexus",
|
|
|
|
|
"confidence": 0.85,
|
|
|
|
|
"tags": [
|
|
|
|
|
"threejs",
|
|
|
|
|
"performance",
|
|
|
|
|
"lod"
|
|
|
|
|
],
|
|
|
|
|
"source_count": 4,
|
|
|
|
|
"first_seen": "2026-04-09",
|
|
|
|
|
"last_confirmed": "2026-04-13"
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"id": "the-nexus:pitfall:005",
|
|
|
|
|
"fact": "Duplicate content blocks appear in index.html when PR merges conflict silently",
|
|
|
|
|
"category": "pitfall",
|
|
|
|
|
"domain": "the-nexus",
|
|
|
|
|
"confidence": 0.8,
|
|
|
|
|
"tags": [
|
|
|
|
|
"html",
|
|
|
|
|
"merge-conflict",
|
|
|
|
|
"duplicate"
|
|
|
|
|
],
|
|
|
|
|
"source_count": 3,
|
|
|
|
|
"first_seen": "2026-04-11",
|
|
|
|
|
"last_confirmed": "2026-04-13"
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"id": "the-nexus:pitfall:006",
|
|
|
|
|
"fact": "Unified HTTP + WebSocket server required for proper URL deployment - separate servers break CORS",
|
|
|
|
|
"category": "pitfall",
|
|
|
|
|
"domain": "the-nexus",
|
|
|
|
|
"confidence": 0.9,
|
|
|
|
|
"tags": [
|
|
|
|
|
"deploy",
|
|
|
|
|
"websocket",
|
|
|
|
|
"http",
|
|
|
|
|
"cors"
|
|
|
|
|
],
|
|
|
|
|
"source_count": 4,
|
|
|
|
|
"first_seen": "2026-04-10",
|
|
|
|
|
"last_confirmed": "2026-04-13"
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"id": "global:tool-quirk:001",
|
|
|
|
|
"fact": "Gitea token stored at ~/.config/gitea/token, not env var GITEA_TOKEN",
|
|
|
|
|
"category": "tool-quirk",
|
|
|
|
|
"domain": "global",
|
|
|
|
|
"confidence": 0.95,
|
|
|
|
|
"tags": [
|
|
|
|
|
"git",
|
|
|
|
|
"auth",
|
|
|
|
|
"gitea",
|
|
|
|
|
"token"
|
|
|
|
|
],
|
|
|
|
|
"source_count": 23,
|
|
|
|
|
"first_seen": "2026-03-27",
|
|
|
|
|
"last_confirmed": "2026-04-13",
|
|
|
|
|
"related": [
|
|
|
|
|
"global:pitfall:001"
|
|
|
|
|
]
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"id": "global:tool-quirk:002",
|
|
|
|
|
"fact": "Gitea API uses 'Authorization: token TOKEN' header format, not Bearer",
|
|
|
|
|
"category": "tool-quirk",
|
|
|
|
|
"domain": "global",
|
|
|
|
|
"confidence": 0.9,
|
|
|
|
|
"tags": [
|
|
|
|
|
"git",
|
|
|
|
|
"api",
|
|
|
|
|
"gitea"
|
|
|
|
|
],
|
|
|
|
|
"source_count": 8,
|
|
|
|
|
"first_seen": "2026-03-28",
|
|
|
|
|
"last_confirmed": "2026-04-12"
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"id": "global:tool-quirk:003",
|
|
|
|
|
"fact": "Gitea Issues API type=issues param does NOT filter PRs",
|
|
|
|
|
"category": "tool-quirk",
|
|
|
|
|
"domain": "global",
|
|
|
|
|
"confidence": 0.95,
|
|
|
|
|
"tags": [
|
|
|
|
|
"gitea",
|
|
|
|
|
"api",
|
|
|
|
|
"issues",
|
|
|
|
|
"pr"
|
|
|
|
|
],
|
|
|
|
|
"source_count": 6,
|
|
|
|
|
"first_seen": "2026-04-01",
|
|
|
|
|
"last_confirmed": "2026-04-13"
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"id": "global:tool-quirk:004",
|
|
|
|
|
"fact": "~/.hermes is the default hermes home - check get_hermes_home() not the path literal",
|
|
|
|
|
"category": "tool-quirk",
|
|
|
|
|
"domain": "global",
|
|
|
|
|
"confidence": 0.9,
|
|
|
|
|
"tags": [
|
|
|
|
|
"paths",
|
|
|
|
|
"hermes",
|
|
|
|
|
"env"
|
|
|
|
|
],
|
|
|
|
|
"source_count": 10,
|
|
|
|
|
"first_seen": "2026-03-30",
|
|
|
|
|
"last_confirmed": "2026-04-13",
|
|
|
|
|
"related": [
|
|
|
|
|
"hermes-agent:pitfall:005"
|
|
|
|
|
]
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"id": "global:tool-quirk:005",
|
|
|
|
|
"fact": "Ansible vault-encrypted vars in YAML require vault_inline_vars plugin",
|
|
|
|
|
"category": "tool-quirk",
|
|
|
|
|
"domain": "global",
|
|
|
|
|
"confidence": 0.85,
|
|
|
|
|
"tags": [
|
|
|
|
|
"ansible",
|
|
|
|
|
"vault",
|
|
|
|
|
"config"
|
|
|
|
|
],
|
|
|
|
|
"source_count": 3,
|
|
|
|
|
"first_seen": "2026-04-02"
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"id": "global:tool-quirk:006",
|
|
|
|
|
"fact": "mimo-v2-pro via Nous Research is the default model - don't assume Anthropic is available",
|
|
|
|
|
"category": "tool-quirk",
|
|
|
|
|
"domain": "global",
|
|
|
|
|
"confidence": 0.95,
|
|
|
|
|
"tags": [
|
|
|
|
|
"model",
|
|
|
|
|
"provider",
|
|
|
|
|
"nous",
|
|
|
|
|
"default"
|
|
|
|
|
],
|
|
|
|
|
"source_count": 15,
|
|
|
|
|
"first_seen": "2026-03-25",
|
|
|
|
|
"last_confirmed": "2026-04-13"
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"id": "global:tool-quirk:007",
|
|
|
|
|
"fact": "Kill + restart with 'hermes chat' preserves old model state - NEVER use --resume",
|
|
|
|
|
"category": "tool-quirk",
|
|
|
|
|
"domain": "global",
|
|
|
|
|
"confidence": 0.95,
|
|
|
|
|
"tags": [
|
|
|
|
|
"hermes",
|
|
|
|
|
"model",
|
|
|
|
|
"restart",
|
|
|
|
|
"session"
|
|
|
|
|
],
|
|
|
|
|
"source_count": 8,
|
|
|
|
|
"first_seen": "2026-03-29",
|
|
|
|
|
"last_confirmed": "2026-04-12"
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"id": "global:pitfall:001",
|
|
|
|
|
"fact": "Branch protection requires 1 approval on main - API merges fail with 405 without it",
|
|
|
|
|
"category": "pitfall",
|
|
|
|
|
"domain": "global",
|
|
|
|
|
"confidence": 0.95,
|
|
|
|
|
"tags": [
|
|
|
|
|
"git",
|
|
|
|
|
"merge",
|
|
|
|
|
"branch-protection",
|
|
|
|
|
"gitea"
|
|
|
|
|
],
|
|
|
|
|
"source_count": 12,
|
|
|
|
|
"first_seen": "2026-04-05",
|
|
|
|
|
"last_confirmed": "2026-04-13",
|
|
|
|
|
"related": [
|
|
|
|
|
"the-nexus:pitfall:001"
|
|
|
|
|
]
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"id": "global:pitfall:002",
|
|
|
|
|
"fact": "Never use --no-verify on git commits",
|
|
|
|
|
"category": "pitfall",
|
|
|
|
|
"domain": "global",
|
|
|
|
|
"confidence": 0.95,
|
|
|
|
|
"tags": [
|
|
|
|
|
"git",
|
|
|
|
|
"hooks",
|
|
|
|
|
"safety"
|
|
|
|
|
],
|
|
|
|
|
"source_count": 5,
|
|
|
|
|
"first_seen": "2026-03-28",
|
|
|
|
|
"last_confirmed": "2026-04-13"
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"id": "global:pitfall:003",
|
|
|
|
|
"fact": "Gitea PR creation workaround needed on the-nexus - direct API call fails",
|
|
|
|
|
"category": "pitfall",
|
|
|
|
|
"domain": "global",
|
|
|
|
|
"confidence": 0.9,
|
|
|
|
|
"tags": [
|
|
|
|
|
"gitea",
|
|
|
|
|
"pr",
|
|
|
|
|
"api",
|
|
|
|
|
"workaround"
|
|
|
|
|
],
|
|
|
|
|
"source_count": 4,
|
|
|
|
|
"first_seen": "2026-04-06",
|
|
|
|
|
"last_confirmed": "2026-04-12"
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"id": "global:pitfall:004",
|
|
|
|
|
"fact": "Anthropic is BANNED from fallback chain",
|
|
|
|
|
"category": "pitfall",
|
|
|
|
|
"domain": "global",
|
|
|
|
|
"confidence": 0.95,
|
|
|
|
|
"tags": [
|
|
|
|
|
"provider",
|
|
|
|
|
"anthropic",
|
|
|
|
|
"fallback"
|
|
|
|
|
],
|
|
|
|
|
"source_count": 7,
|
|
|
|
|
"first_seen": "2026-03-30",
|
|
|
|
|
"last_confirmed": "2026-04-13"
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"id": "global:pitfall:005",
|
|
|
|
|
"fact": "Telegram tokens expired - don't assume Telegram notifications work",
|
|
|
|
|
"category": "pitfall",
|
|
|
|
|
"domain": "global",
|
|
|
|
|
"confidence": 0.85,
|
|
|
|
|
"tags": [
|
|
|
|
|
"telegram",
|
|
|
|
|
"notifications",
|
|
|
|
|
"token"
|
|
|
|
|
],
|
|
|
|
|
"source_count": 3,
|
|
|
|
|
"first_seen": "2026-04-02"
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"id": "global:pitfall:006",
|
|
|
|
|
"fact": "Multiple gateways = 'cannot schedule futures' error - only one gateway process should run",
|
|
|
|
|
"category": "pitfall",
|
|
|
|
|
"domain": "global",
|
|
|
|
|
"confidence": 0.9,
|
|
|
|
|
"tags": [
|
|
|
|
|
"gateway",
|
|
|
|
|
"cron",
|
|
|
|
|
"process"
|
|
|
|
|
],
|
|
|
|
|
"source_count": 4,
|
|
|
|
|
"first_seen": "2026-04-04",
|
|
|
|
|
"last_confirmed": "2026-04-11"
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"id": "global:pitfall:007",
|
|
|
|
|
"fact": "pytest root collection picks up operational *_test.py scripts - restrict to tests/ directory",
|
|
|
|
|
"category": "pitfall",
|
|
|
|
|
"domain": "global",
|
|
|
|
|
"confidence": 0.9,
|
|
|
|
|
"tags": [
|
|
|
|
|
"pytest",
|
|
|
|
|
"test",
|
|
|
|
|
"collection"
|
|
|
|
|
],
|
|
|
|
|
"source_count": 3,
|
|
|
|
|
"first_seen": "2026-04-07",
|
|
|
|
|
"last_confirmed": "2026-04-13"
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"id": "global:pitfall:008",
|
|
|
|
|
"fact": "TDD: test 1 before building 55",
|
|
|
|
|
"category": "pitfall",
|
|
|
|
|
"domain": "global",
|
|
|
|
|
"confidence": 0.95,
|
|
|
|
|
"tags": [
|
|
|
|
|
"tdd",
|
|
|
|
|
"testing",
|
|
|
|
|
"methodology"
|
|
|
|
|
],
|
|
|
|
|
"source_count": 8,
|
|
|
|
|
"first_seen": "2026-03-25",
|
|
|
|
|
"last_confirmed": "2026-04-13"
|
|
|
|
|
}
|
|
|
|
|
]
|
2026-04-14 11:17:01 -04:00
|
|
|
}
|