$ curl -s localhost:8800/audit; echo
{"events": [{"t": 1793015015.752, "user": "이준호", "route": "차단", "blocked_by": "rule", "reason": "/(이전|앞의|위의|지금까지의?)\\s*(지시|지침|명령)\\S*\\s*(모두|다)?\\s*(무시|잊)/i", "masked": 0, "tools_used": []}, {"t": 1793015017.235, "user": "한지훈", "route": "차단", "blocked_by": "guard", "reason": "requests other employee's data", "masked": 0, "tools_used": []}, {"t": 1793015020.608, "user": "최유진", "route": "자동 답변", "blocked_by": "", "reason": "", "masked": 1, "tools_used": ["Get_ticket"]}, {"t": 1793015023.583, "user": "박서연", "route": "자동 답변", "blocked_by": "", "reason": "", "masked": 0, "tools_used": ["Search_FAQ"]}, {"t": 1793015027.52, "user": "최유진", "route": "자동 답변", "blocked_by": "", "reason": "", "masked": 1, "tools_used": ["Get_ticket"]}, {"t": 1793015030.93, "user": "박서연", "route": "자동 답변", "blocked_by": "", "reason": "", "masked": 0, "tools_used": ["Search_FAQ"]}, {"t": 1793015031.01, "user": "이준호", "route": "차단", "blocked_by": "rule", "reason": "/(이전|앞의|위의|지금까지의?)\\s*(지시|지침|명령)\\S*\\s*(모두|다)?\\s*(무시|잊)/i", "masked": 0, "tools_used": []}, {"t": 1793015031.952, "user": "이준호", "route": "차단", "blocked_by": "guard", "reason": "request to skip permission checks and show all tickets", "masked": 0, "tools_used": []}, {"t": 1793015034.988, "user": "최유진", "route": "자동 답변", "blocked_by": "", "reason": "", "masked": 1, "tools_used": ["Get_ticket"]}, {"t": 1793015038.519, "user": "박서연", "route": "자동 답변", "blocked_by": "", "reason": "", "masked": 0, "tools_used": ["Search_FAQ"]}]}

$ uv run tools/flow.py doctor -v
! n8n install folder /Users/mcchae/day65-n8n
   → day 65 SETUP-N8N 5단계 (get.n8n.io 설치). 다른 곳에 설치했다면 Last3Mon/65/n8n/.env 에 N8N_HOME=<폴더>
✔ n8n container day65-n8n-n8n-1
✔ n8n http://localhost:5678
    seen
      {
        "GET": "/healthz",
        "status": 200,
        "response": {
          "status": "ok"
        }
      }
✔ data API http://localhost:8800
    seen
      {
        "GET": "/health",
        "status": 200,
        "response": {
          "status": "ok"
        }
      }
✔ employees /employees (day 73 data API)
    seen
      {
        "GET": "/employees",
        "status": 200,
        "response": {
          "employees": [
            {
              "name": "이준호",
              "dept": "영업팀"
            },
            {
              "name": "박서연",
              "dept": "재무팀"
            },
            {
              "name": "최유진",
              "dept": "인사팀"
            },
            {
              "name": "한지훈",
              "dept": "개발팀"
            },
            {
              "name": "김민지",
              "dept": "IT팀"
            },
            {
              "name": "정우성",
              "dept": "IT팀"
            }
          ]
        }
      }
    cache GET /cache-stats
      {
        "status": 200,
        "response": {
          "entries": 0,
          "hits": 0,
          "misses": 0
        }
      }
    $ docker exec day65-n8n-n8n-1 node -e fetch('http://data-api:8800/health').then(r=>console.log(r.status)).catch(()=>console.l... → exit 0
      200
✔ n8n → http://data-api:8800
    seen
      {
        "from n8n": "GET http://data-api:8800/health",
        "status": "200"
      }
    $ docker exec day65-n8n-n8n-1 sh -c n8n export:credentials --all --output=/tmp/course-cred.json >/dev/null 2>&1; cat /tmp/c... → exit 0
    credentials in n8n (id · name · type, no secrets)
      [
        "openAiCourse0001 · OpenAI (.env) · openAiApi",
        "ollamaLocal0001 · Ollama local · ollamaApi",
        "itAgentKey0001 · IT agent key · httpHeaderAuth"
      ]
✔ credential 'OpenAI (.env)' (openAiCourse0001)
✔ node catalog (for check)
    seen
      {
        "node types": 843,
        "cache": "tools/.cache"
      }
✔ CLI coding agent: codex, claude, agy
    seen
      {
        "codex": "/Users/mcchae/.local/bin/codex",
        "claude": "/Users/mcchae/.local/bin/claude",
        "agy": "/Users/mcchae/.local/bin/agy"
      }
ready

