{"records":[{"request_id":"beee0915b227448a86cf869ee08d1eb8","ts":"2026-04-18T17:29:02.821483Z","duration_ms":0.143,"method":"GET","path":"/docs","query":"","operation_id":"","client_ip":"192.168.29.10","user_agent":"kube-probe/1.31","auth":{"scheme":null,"scope":"admin","auth_enabled":false,"recognized":true},"request":{"headers":{"host":"10.244.112.209:8420","user-agent":"kube-probe/1.31","accept":"*/*","connection":"close"},"request_body_size":0,"request_body_truncated":false,"request_body_kind":"empty","request_body":null},"status":200,"response":{"headers":{"content-length":"936","content-type":"text/html; charset=utf-8","x-request-id":"beee0915b227448a86cf869ee08d1eb8"},"response_body_size":936,"response_body_truncated":false,"response_body_kind":"text","response_body":"\n    <!DOCTYPE html>\n    <html>\n    <head>\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\">\n    <link rel=\"shortcut icon\" href=\"https://fastapi.tiangolo.com/img/favicon.png\">\n    <title>Singing Bird - Swagger UI</title>\n    </head>\n    <body>\n    <div id=\"swagger-ui\">\n    </div>\n    <script src=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\"></script>\n    <!-- `SwaggerUIBundle` is now available on the page -->\n    <script>\n    const ui = SwaggerUIBundle({\n        url: '/openapi.json',\n    \"dom_id\": \"#swagger-ui\",\n\"layout\": \"BaseLayout\",\n\"deepLinking\": true,\n\"showExtensions\": true,\n\"showCommonExtensions\": true,\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\n    presets: [\n        SwaggerUIBundle.presets.apis,\n        SwaggerUIBundle.SwaggerUIStandalonePreset\n        ],\n    })\n    </script>\n    </body>\n    </html>\n    ","response_stream":false},"error":null},{"request_id":"452988b6a78c41c292d79b186ffbb7cf","ts":"2026-04-18T17:29:02.820891Z","duration_ms":0.234,"method":"GET","path":"/docs","query":"","operation_id":"","client_ip":"192.168.29.10","user_agent":"kube-probe/1.31","auth":{"scheme":null,"scope":"admin","auth_enabled":false,"recognized":true},"request":{"headers":{"host":"10.244.112.209:8420","user-agent":"kube-probe/1.31","accept":"*/*","connection":"close"},"request_body_size":0,"request_body_truncated":false,"request_body_kind":"empty","request_body":null},"status":200,"response":{"headers":{"content-length":"936","content-type":"text/html; charset=utf-8","x-request-id":"452988b6a78c41c292d79b186ffbb7cf"},"response_body_size":936,"response_body_truncated":false,"response_body_kind":"text","response_body":"\n    <!DOCTYPE html>\n    <html>\n    <head>\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\">\n    <link rel=\"shortcut icon\" href=\"https://fastapi.tiangolo.com/img/favicon.png\">\n    <title>Singing Bird - Swagger UI</title>\n    </head>\n    <body>\n    <div id=\"swagger-ui\">\n    </div>\n    <script src=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\"></script>\n    <!-- `SwaggerUIBundle` is now available on the page -->\n    <script>\n    const ui = SwaggerUIBundle({\n        url: '/openapi.json',\n    \"dom_id\": \"#swagger-ui\",\n\"layout\": \"BaseLayout\",\n\"deepLinking\": true,\n\"showExtensions\": true,\n\"showCommonExtensions\": true,\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\n    presets: [\n        SwaggerUIBundle.presets.apis,\n        SwaggerUIBundle.SwaggerUIStandalonePreset\n        ],\n    })\n    </script>\n    </body>\n    </html>\n    ","response_stream":false},"error":null},{"request_id":"54ce2c1d47c74dec974270530af9ed7b","ts":"2026-04-18T17:28:52.820394Z","duration_ms":0.296,"method":"GET","path":"/docs","query":"","operation_id":"","client_ip":"192.168.29.10","user_agent":"kube-probe/1.31","auth":{"scheme":null,"scope":"admin","auth_enabled":false,"recognized":true},"request":{"headers":{"host":"10.244.112.209:8420","user-agent":"kube-probe/1.31","accept":"*/*","connection":"close"},"request_body_size":0,"request_body_truncated":false,"request_body_kind":"empty","request_body":null},"status":200,"response":{"headers":{"content-length":"936","content-type":"text/html; charset=utf-8","x-request-id":"54ce2c1d47c74dec974270530af9ed7b"},"response_body_size":936,"response_body_truncated":false,"response_body_kind":"text","response_body":"\n    <!DOCTYPE html>\n    <html>\n    <head>\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\">\n    <link rel=\"shortcut icon\" href=\"https://fastapi.tiangolo.com/img/favicon.png\">\n    <title>Singing Bird - Swagger UI</title>\n    </head>\n    <body>\n    <div id=\"swagger-ui\">\n    </div>\n    <script src=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\"></script>\n    <!-- `SwaggerUIBundle` is now available on the page -->\n    <script>\n    const ui = SwaggerUIBundle({\n        url: '/openapi.json',\n    \"dom_id\": \"#swagger-ui\",\n\"layout\": \"BaseLayout\",\n\"deepLinking\": true,\n\"showExtensions\": true,\n\"showCommonExtensions\": true,\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\n    presets: [\n        SwaggerUIBundle.presets.apis,\n        SwaggerUIBundle.SwaggerUIStandalonePreset\n        ],\n    })\n    </script>\n    </body>\n    </html>\n    ","response_stream":false},"error":null},{"request_id":"fb69046d4d4044d191b43fc46bf338d3","ts":"2026-04-18T17:28:42.820891Z","duration_ms":0.252,"method":"GET","path":"/docs","query":"","operation_id":"","client_ip":"192.168.29.10","user_agent":"kube-probe/1.31","auth":{"scheme":null,"scope":"admin","auth_enabled":false,"recognized":true},"request":{"headers":{"host":"10.244.112.209:8420","user-agent":"kube-probe/1.31","accept":"*/*","connection":"close"},"request_body_size":0,"request_body_truncated":false,"request_body_kind":"empty","request_body":null},"status":200,"response":{"headers":{"content-length":"936","content-type":"text/html; charset=utf-8","x-request-id":"fb69046d4d4044d191b43fc46bf338d3"},"response_body_size":936,"response_body_truncated":false,"response_body_kind":"text","response_body":"\n    <!DOCTYPE html>\n    <html>\n    <head>\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\">\n    <link rel=\"shortcut icon\" href=\"https://fastapi.tiangolo.com/img/favicon.png\">\n    <title>Singing Bird - Swagger UI</title>\n    </head>\n    <body>\n    <div id=\"swagger-ui\">\n    </div>\n    <script src=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\"></script>\n    <!-- `SwaggerUIBundle` is now available on the page -->\n    <script>\n    const ui = SwaggerUIBundle({\n        url: '/openapi.json',\n    \"dom_id\": \"#swagger-ui\",\n\"layout\": \"BaseLayout\",\n\"deepLinking\": true,\n\"showExtensions\": true,\n\"showCommonExtensions\": true,\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\n    presets: [\n        SwaggerUIBundle.presets.apis,\n        SwaggerUIBundle.SwaggerUIStandalonePreset\n        ],\n    })\n    </script>\n    </body>\n    </html>\n    ","response_stream":false},"error":null},{"request_id":"a51e5a94ac9147269bf32961de29602f","ts":"2026-04-18T17:28:32.821815Z","duration_ms":0.157,"method":"GET","path":"/docs","query":"","operation_id":"","client_ip":"192.168.29.10","user_agent":"kube-probe/1.31","auth":{"scheme":null,"scope":"admin","auth_enabled":false,"recognized":true},"request":{"headers":{"host":"10.244.112.209:8420","user-agent":"kube-probe/1.31","accept":"*/*","connection":"close"},"request_body_size":0,"request_body_truncated":false,"request_body_kind":"empty","request_body":null},"status":200,"response":{"headers":{"content-length":"936","content-type":"text/html; charset=utf-8","x-request-id":"a51e5a94ac9147269bf32961de29602f"},"response_body_size":936,"response_body_truncated":false,"response_body_kind":"text","response_body":"\n    <!DOCTYPE html>\n    <html>\n    <head>\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\">\n    <link rel=\"shortcut icon\" href=\"https://fastapi.tiangolo.com/img/favicon.png\">\n    <title>Singing Bird - Swagger UI</title>\n    </head>\n    <body>\n    <div id=\"swagger-ui\">\n    </div>\n    <script src=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\"></script>\n    <!-- `SwaggerUIBundle` is now available on the page -->\n    <script>\n    const ui = SwaggerUIBundle({\n        url: '/openapi.json',\n    \"dom_id\": \"#swagger-ui\",\n\"layout\": \"BaseLayout\",\n\"deepLinking\": true,\n\"showExtensions\": true,\n\"showCommonExtensions\": true,\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\n    presets: [\n        SwaggerUIBundle.presets.apis,\n        SwaggerUIBundle.SwaggerUIStandalonePreset\n        ],\n    })\n    </script>\n    </body>\n    </html>\n    ","response_stream":false},"error":null},{"request_id":"cbffe523f21d471da8be8e17db8f3b09","ts":"2026-04-18T17:28:32.821173Z","duration_ms":0.242,"method":"GET","path":"/docs","query":"","operation_id":"","client_ip":"192.168.29.10","user_agent":"kube-probe/1.31","auth":{"scheme":null,"scope":"admin","auth_enabled":false,"recognized":true},"request":{"headers":{"host":"10.244.112.209:8420","user-agent":"kube-probe/1.31","accept":"*/*","connection":"close"},"request_body_size":0,"request_body_truncated":false,"request_body_kind":"empty","request_body":null},"status":200,"response":{"headers":{"content-length":"936","content-type":"text/html; charset=utf-8","x-request-id":"cbffe523f21d471da8be8e17db8f3b09"},"response_body_size":936,"response_body_truncated":false,"response_body_kind":"text","response_body":"\n    <!DOCTYPE html>\n    <html>\n    <head>\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\">\n    <link rel=\"shortcut icon\" href=\"https://fastapi.tiangolo.com/img/favicon.png\">\n    <title>Singing Bird - Swagger UI</title>\n    </head>\n    <body>\n    <div id=\"swagger-ui\">\n    </div>\n    <script src=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\"></script>\n    <!-- `SwaggerUIBundle` is now available on the page -->\n    <script>\n    const ui = SwaggerUIBundle({\n        url: '/openapi.json',\n    \"dom_id\": \"#swagger-ui\",\n\"layout\": \"BaseLayout\",\n\"deepLinking\": true,\n\"showExtensions\": true,\n\"showCommonExtensions\": true,\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\n    presets: [\n        SwaggerUIBundle.presets.apis,\n        SwaggerUIBundle.SwaggerUIStandalonePreset\n        ],\n    })\n    </script>\n    </body>\n    </html>\n    ","response_stream":false},"error":null},{"request_id":"2e050ee21912441b9e8e2c53d4a4c8fd","ts":"2026-04-18T17:28:22.820568Z","duration_ms":0.265,"method":"GET","path":"/docs","query":"","operation_id":"","client_ip":"192.168.29.10","user_agent":"kube-probe/1.31","auth":{"scheme":null,"scope":"admin","auth_enabled":false,"recognized":true},"request":{"headers":{"host":"10.244.112.209:8420","user-agent":"kube-probe/1.31","accept":"*/*","connection":"close"},"request_body_size":0,"request_body_truncated":false,"request_body_kind":"empty","request_body":null},"status":200,"response":{"headers":{"content-length":"936","content-type":"text/html; charset=utf-8","x-request-id":"2e050ee21912441b9e8e2c53d4a4c8fd"},"response_body_size":936,"response_body_truncated":false,"response_body_kind":"text","response_body":"\n    <!DOCTYPE html>\n    <html>\n    <head>\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\">\n    <link rel=\"shortcut icon\" href=\"https://fastapi.tiangolo.com/img/favicon.png\">\n    <title>Singing Bird - Swagger UI</title>\n    </head>\n    <body>\n    <div id=\"swagger-ui\">\n    </div>\n    <script src=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\"></script>\n    <!-- `SwaggerUIBundle` is now available on the page -->\n    <script>\n    const ui = SwaggerUIBundle({\n        url: '/openapi.json',\n    \"dom_id\": \"#swagger-ui\",\n\"layout\": \"BaseLayout\",\n\"deepLinking\": true,\n\"showExtensions\": true,\n\"showCommonExtensions\": true,\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\n    presets: [\n        SwaggerUIBundle.presets.apis,\n        SwaggerUIBundle.SwaggerUIStandalonePreset\n        ],\n    })\n    </script>\n    </body>\n    </html>\n    ","response_stream":false},"error":null},{"request_id":"40457f37583d4241a7c07523b3b56c2e","ts":"2026-04-18T17:28:12.820589Z","duration_ms":0.275,"method":"GET","path":"/docs","query":"","operation_id":"","client_ip":"192.168.29.10","user_agent":"kube-probe/1.31","auth":{"scheme":null,"scope":"admin","auth_enabled":false,"recognized":true},"request":{"headers":{"host":"10.244.112.209:8420","user-agent":"kube-probe/1.31","accept":"*/*","connection":"close"},"request_body_size":0,"request_body_truncated":false,"request_body_kind":"empty","request_body":null},"status":200,"response":{"headers":{"content-length":"936","content-type":"text/html; charset=utf-8","x-request-id":"40457f37583d4241a7c07523b3b56c2e"},"response_body_size":936,"response_body_truncated":false,"response_body_kind":"text","response_body":"\n    <!DOCTYPE html>\n    <html>\n    <head>\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\">\n    <link rel=\"shortcut icon\" href=\"https://fastapi.tiangolo.com/img/favicon.png\">\n    <title>Singing Bird - Swagger UI</title>\n    </head>\n    <body>\n    <div id=\"swagger-ui\">\n    </div>\n    <script src=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\"></script>\n    <!-- `SwaggerUIBundle` is now available on the page -->\n    <script>\n    const ui = SwaggerUIBundle({\n        url: '/openapi.json',\n    \"dom_id\": \"#swagger-ui\",\n\"layout\": \"BaseLayout\",\n\"deepLinking\": true,\n\"showExtensions\": true,\n\"showCommonExtensions\": true,\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\n    presets: [\n        SwaggerUIBundle.presets.apis,\n        SwaggerUIBundle.SwaggerUIStandalonePreset\n        ],\n    })\n    </script>\n    </body>\n    </html>\n    ","response_stream":false},"error":null},{"request_id":"718196f8c90e4cae8eb1676fc399d676","ts":"2026-04-18T17:28:02.821973Z","duration_ms":0.133,"method":"GET","path":"/docs","query":"","operation_id":"","client_ip":"192.168.29.10","user_agent":"kube-probe/1.31","auth":{"scheme":null,"scope":"admin","auth_enabled":false,"recognized":true},"request":{"headers":{"host":"10.244.112.209:8420","user-agent":"kube-probe/1.31","accept":"*/*","connection":"close"},"request_body_size":0,"request_body_truncated":false,"request_body_kind":"empty","request_body":null},"status":200,"response":{"headers":{"content-length":"936","content-type":"text/html; charset=utf-8","x-request-id":"718196f8c90e4cae8eb1676fc399d676"},"response_body_size":936,"response_body_truncated":false,"response_body_kind":"text","response_body":"\n    <!DOCTYPE html>\n    <html>\n    <head>\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\">\n    <link rel=\"shortcut icon\" href=\"https://fastapi.tiangolo.com/img/favicon.png\">\n    <title>Singing Bird - Swagger UI</title>\n    </head>\n    <body>\n    <div id=\"swagger-ui\">\n    </div>\n    <script src=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\"></script>\n    <!-- `SwaggerUIBundle` is now available on the page -->\n    <script>\n    const ui = SwaggerUIBundle({\n        url: '/openapi.json',\n    \"dom_id\": \"#swagger-ui\",\n\"layout\": \"BaseLayout\",\n\"deepLinking\": true,\n\"showExtensions\": true,\n\"showCommonExtensions\": true,\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\n    presets: [\n        SwaggerUIBundle.presets.apis,\n        SwaggerUIBundle.SwaggerUIStandalonePreset\n        ],\n    })\n    </script>\n    </body>\n    </html>\n    ","response_stream":false},"error":null},{"request_id":"30a858e0941d49468412d4ffec78f702","ts":"2026-04-18T17:28:02.821385Z","duration_ms":0.246,"method":"GET","path":"/docs","query":"","operation_id":"","client_ip":"192.168.29.10","user_agent":"kube-probe/1.31","auth":{"scheme":null,"scope":"admin","auth_enabled":false,"recognized":true},"request":{"headers":{"host":"10.244.112.209:8420","user-agent":"kube-probe/1.31","accept":"*/*","connection":"close"},"request_body_size":0,"request_body_truncated":false,"request_body_kind":"empty","request_body":null},"status":200,"response":{"headers":{"content-length":"936","content-type":"text/html; charset=utf-8","x-request-id":"30a858e0941d49468412d4ffec78f702"},"response_body_size":936,"response_body_truncated":false,"response_body_kind":"text","response_body":"\n    <!DOCTYPE html>\n    <html>\n    <head>\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\">\n    <link rel=\"shortcut icon\" href=\"https://fastapi.tiangolo.com/img/favicon.png\">\n    <title>Singing Bird - Swagger UI</title>\n    </head>\n    <body>\n    <div id=\"swagger-ui\">\n    </div>\n    <script src=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\"></script>\n    <!-- `SwaggerUIBundle` is now available on the page -->\n    <script>\n    const ui = SwaggerUIBundle({\n        url: '/openapi.json',\n    \"dom_id\": \"#swagger-ui\",\n\"layout\": \"BaseLayout\",\n\"deepLinking\": true,\n\"showExtensions\": true,\n\"showCommonExtensions\": true,\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\n    presets: [\n        SwaggerUIBundle.presets.apis,\n        SwaggerUIBundle.SwaggerUIStandalonePreset\n        ],\n    })\n    </script>\n    </body>\n    </html>\n    ","response_stream":false},"error":null},{"request_id":"ae78b40b1ad54629b0e7d827d9a1b121","ts":"2026-04-18T17:27:52.820872Z","duration_ms":0.243,"method":"GET","path":"/docs","query":"","operation_id":"","client_ip":"192.168.29.10","user_agent":"kube-probe/1.31","auth":{"scheme":null,"scope":"admin","auth_enabled":false,"recognized":true},"request":{"headers":{"host":"10.244.112.209:8420","user-agent":"kube-probe/1.31","accept":"*/*","connection":"close"},"request_body_size":0,"request_body_truncated":false,"request_body_kind":"empty","request_body":null},"status":200,"response":{"headers":{"content-length":"936","content-type":"text/html; charset=utf-8","x-request-id":"ae78b40b1ad54629b0e7d827d9a1b121"},"response_body_size":936,"response_body_truncated":false,"response_body_kind":"text","response_body":"\n    <!DOCTYPE html>\n    <html>\n    <head>\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\">\n    <link rel=\"shortcut icon\" href=\"https://fastapi.tiangolo.com/img/favicon.png\">\n    <title>Singing Bird - Swagger UI</title>\n    </head>\n    <body>\n    <div id=\"swagger-ui\">\n    </div>\n    <script src=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\"></script>\n    <!-- `SwaggerUIBundle` is now available on the page -->\n    <script>\n    const ui = SwaggerUIBundle({\n        url: '/openapi.json',\n    \"dom_id\": \"#swagger-ui\",\n\"layout\": \"BaseLayout\",\n\"deepLinking\": true,\n\"showExtensions\": true,\n\"showCommonExtensions\": true,\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\n    presets: [\n        SwaggerUIBundle.presets.apis,\n        SwaggerUIBundle.SwaggerUIStandalonePreset\n        ],\n    })\n    </script>\n    </body>\n    </html>\n    ","response_stream":false},"error":null},{"request_id":"f7e1977f38a64aadb7d5ace3e94cd25a","ts":"2026-04-18T17:27:42.821064Z","duration_ms":0.261,"method":"GET","path":"/docs","query":"","operation_id":"","client_ip":"192.168.29.10","user_agent":"kube-probe/1.31","auth":{"scheme":null,"scope":"admin","auth_enabled":false,"recognized":true},"request":{"headers":{"host":"10.244.112.209:8420","user-agent":"kube-probe/1.31","accept":"*/*","connection":"close"},"request_body_size":0,"request_body_truncated":false,"request_body_kind":"empty","request_body":null},"status":200,"response":{"headers":{"content-length":"936","content-type":"text/html; charset=utf-8","x-request-id":"f7e1977f38a64aadb7d5ace3e94cd25a"},"response_body_size":936,"response_body_truncated":false,"response_body_kind":"text","response_body":"\n    <!DOCTYPE html>\n    <html>\n    <head>\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\">\n    <link rel=\"shortcut icon\" href=\"https://fastapi.tiangolo.com/img/favicon.png\">\n    <title>Singing Bird - Swagger UI</title>\n    </head>\n    <body>\n    <div id=\"swagger-ui\">\n    </div>\n    <script src=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\"></script>\n    <!-- `SwaggerUIBundle` is now available on the page -->\n    <script>\n    const ui = SwaggerUIBundle({\n        url: '/openapi.json',\n    \"dom_id\": \"#swagger-ui\",\n\"layout\": \"BaseLayout\",\n\"deepLinking\": true,\n\"showExtensions\": true,\n\"showCommonExtensions\": true,\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\n    presets: [\n        SwaggerUIBundle.presets.apis,\n        SwaggerUIBundle.SwaggerUIStandalonePreset\n        ],\n    })\n    </script>\n    </body>\n    </html>\n    ","response_stream":false},"error":null},{"request_id":"55dd92b426b64fb7a4b9dcfe026ba3ca","ts":"2026-04-18T17:27:32.822115Z","duration_ms":0.167,"method":"GET","path":"/docs","query":"","operation_id":"","client_ip":"192.168.29.10","user_agent":"kube-probe/1.31","auth":{"scheme":null,"scope":"admin","auth_enabled":false,"recognized":true},"request":{"headers":{"host":"10.244.112.209:8420","user-agent":"kube-probe/1.31","accept":"*/*","connection":"close"},"request_body_size":0,"request_body_truncated":false,"request_body_kind":"empty","request_body":null},"status":200,"response":{"headers":{"content-length":"936","content-type":"text/html; charset=utf-8","x-request-id":"55dd92b426b64fb7a4b9dcfe026ba3ca"},"response_body_size":936,"response_body_truncated":false,"response_body_kind":"text","response_body":"\n    <!DOCTYPE html>\n    <html>\n    <head>\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\">\n    <link rel=\"shortcut icon\" href=\"https://fastapi.tiangolo.com/img/favicon.png\">\n    <title>Singing Bird - Swagger UI</title>\n    </head>\n    <body>\n    <div id=\"swagger-ui\">\n    </div>\n    <script src=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\"></script>\n    <!-- `SwaggerUIBundle` is now available on the page -->\n    <script>\n    const ui = SwaggerUIBundle({\n        url: '/openapi.json',\n    \"dom_id\": \"#swagger-ui\",\n\"layout\": \"BaseLayout\",\n\"deepLinking\": true,\n\"showExtensions\": true,\n\"showCommonExtensions\": true,\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\n    presets: [\n        SwaggerUIBundle.presets.apis,\n        SwaggerUIBundle.SwaggerUIStandalonePreset\n        ],\n    })\n    </script>\n    </body>\n    </html>\n    ","response_stream":false},"error":null},{"request_id":"32320ac2a24f4a648100eb94750f832f","ts":"2026-04-18T17:27:32.821414Z","duration_ms":0.291,"method":"GET","path":"/docs","query":"","operation_id":"","client_ip":"192.168.29.10","user_agent":"kube-probe/1.31","auth":{"scheme":null,"scope":"admin","auth_enabled":false,"recognized":true},"request":{"headers":{"host":"10.244.112.209:8420","user-agent":"kube-probe/1.31","accept":"*/*","connection":"close"},"request_body_size":0,"request_body_truncated":false,"request_body_kind":"empty","request_body":null},"status":200,"response":{"headers":{"content-length":"936","content-type":"text/html; charset=utf-8","x-request-id":"32320ac2a24f4a648100eb94750f832f"},"response_body_size":936,"response_body_truncated":false,"response_body_kind":"text","response_body":"\n    <!DOCTYPE html>\n    <html>\n    <head>\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\">\n    <link rel=\"shortcut icon\" href=\"https://fastapi.tiangolo.com/img/favicon.png\">\n    <title>Singing Bird - Swagger UI</title>\n    </head>\n    <body>\n    <div id=\"swagger-ui\">\n    </div>\n    <script src=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\"></script>\n    <!-- `SwaggerUIBundle` is now available on the page -->\n    <script>\n    const ui = SwaggerUIBundle({\n        url: '/openapi.json',\n    \"dom_id\": \"#swagger-ui\",\n\"layout\": \"BaseLayout\",\n\"deepLinking\": true,\n\"showExtensions\": true,\n\"showCommonExtensions\": true,\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\n    presets: [\n        SwaggerUIBundle.presets.apis,\n        SwaggerUIBundle.SwaggerUIStandalonePreset\n        ],\n    })\n    </script>\n    </body>\n    </html>\n    ","response_stream":false},"error":null},{"request_id":"5fc2b1c85aae44398a7ef9791ac9e7ef","ts":"2026-04-18T17:27:22.821069Z","duration_ms":0.253,"method":"GET","path":"/docs","query":"","operation_id":"","client_ip":"192.168.29.10","user_agent":"kube-probe/1.31","auth":{"scheme":null,"scope":"admin","auth_enabled":false,"recognized":true},"request":{"headers":{"host":"10.244.112.209:8420","user-agent":"kube-probe/1.31","accept":"*/*","connection":"close"},"request_body_size":0,"request_body_truncated":false,"request_body_kind":"empty","request_body":null},"status":200,"response":{"headers":{"content-length":"936","content-type":"text/html; charset=utf-8","x-request-id":"5fc2b1c85aae44398a7ef9791ac9e7ef"},"response_body_size":936,"response_body_truncated":false,"response_body_kind":"text","response_body":"\n    <!DOCTYPE html>\n    <html>\n    <head>\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\">\n    <link rel=\"shortcut icon\" href=\"https://fastapi.tiangolo.com/img/favicon.png\">\n    <title>Singing Bird - Swagger UI</title>\n    </head>\n    <body>\n    <div id=\"swagger-ui\">\n    </div>\n    <script src=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\"></script>\n    <!-- `SwaggerUIBundle` is now available on the page -->\n    <script>\n    const ui = SwaggerUIBundle({\n        url: '/openapi.json',\n    \"dom_id\": \"#swagger-ui\",\n\"layout\": \"BaseLayout\",\n\"deepLinking\": true,\n\"showExtensions\": true,\n\"showCommonExtensions\": true,\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\n    presets: [\n        SwaggerUIBundle.presets.apis,\n        SwaggerUIBundle.SwaggerUIStandalonePreset\n        ],\n    })\n    </script>\n    </body>\n    </html>\n    ","response_stream":false},"error":null},{"request_id":"ba503c538c12448da8d50290c2026fd8","ts":"2026-04-18T17:27:12.821494Z","duration_ms":0.28,"method":"GET","path":"/docs","query":"","operation_id":"","client_ip":"192.168.29.10","user_agent":"kube-probe/1.31","auth":{"scheme":null,"scope":"admin","auth_enabled":false,"recognized":true},"request":{"headers":{"host":"10.244.112.209:8420","user-agent":"kube-probe/1.31","accept":"*/*","connection":"close"},"request_body_size":0,"request_body_truncated":false,"request_body_kind":"empty","request_body":null},"status":200,"response":{"headers":{"content-length":"936","content-type":"text/html; charset=utf-8","x-request-id":"ba503c538c12448da8d50290c2026fd8"},"response_body_size":936,"response_body_truncated":false,"response_body_kind":"text","response_body":"\n    <!DOCTYPE html>\n    <html>\n    <head>\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\">\n    <link rel=\"shortcut icon\" href=\"https://fastapi.tiangolo.com/img/favicon.png\">\n    <title>Singing Bird - Swagger UI</title>\n    </head>\n    <body>\n    <div id=\"swagger-ui\">\n    </div>\n    <script src=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\"></script>\n    <!-- `SwaggerUIBundle` is now available on the page -->\n    <script>\n    const ui = SwaggerUIBundle({\n        url: '/openapi.json',\n    \"dom_id\": \"#swagger-ui\",\n\"layout\": \"BaseLayout\",\n\"deepLinking\": true,\n\"showExtensions\": true,\n\"showCommonExtensions\": true,\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\n    presets: [\n        SwaggerUIBundle.presets.apis,\n        SwaggerUIBundle.SwaggerUIStandalonePreset\n        ],\n    })\n    </script>\n    </body>\n    </html>\n    ","response_stream":false},"error":null},{"request_id":"643e602df45f4e40807eb1560eb0863c","ts":"2026-04-18T17:27:08.449100Z","duration_ms":0.844,"method":"GET","path":"/openapi.json","query":"","operation_id":"","client_ip":"216.73.216.73","user_agent":"Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com)","auth":{"scheme":null,"scope":"admin","auth_enabled":false,"recognized":true},"request":{"headers":{"host":"singing-bird.benac.dev","user-agent":"Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com)","accept":"*/*","accept-encoding":"gzip, br, zstd, deflate","via":"2.0 Caddy","x-forwarded-for":"216.73.216.73","x-forwarded-host":"singing-bird.benac.dev","x-forwarded-proto":"https","x-real-ip":"216.73.216.73"},"request_body_size":0,"request_body_truncated":false,"request_body_kind":"empty","request_body":null},"status":200,"response":{"headers":{"content-length":"57854","content-type":"application/json","x-request-id":"643e602df45f4e40807eb1560eb0863c"},"response_body_size":57854,"response_body_truncated":false,"response_body_kind":"json","response_body":{"openapi":"3.1.0","info":{"title":"Singing Bird","description":"Control plane for the Singing Bird embodied simulation kernel","version":"0.3.0"},"paths":{"/v1/sessions":{"get":{"summary":"List active simulation sessions","description":"List all active simulation sessions.\n\nReturns session_id, scenario_path, created_at, and paused state for each.\nUse before create_session to see what is already running, or to pick a\nsession_id for other tools.","operationId":"list_sessions_v1_sessions_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":"[REDACTED]"}]},"post":{"summary":"Start a new simulation","description":"Start a new simulation from a scenario pack.\n\nIdentify the scenario via `scenario_ref` (preferred) or `scenario_path`\n(legacy alias). Both accept id, filename stem, or a path — all normalize.\nCall list_scenarios to discover available ids. Sessions start paused;\nadvance via step_session, or resume_session for auto-advance.","operationId":"create_session_v1_sessions_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSessionRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":"[REDACTED]"}]}},"/v1/sessions/{session_id}":{"get":{"summary":"Inspect one session","description":"Get a single session's current state — same shape as get_overview.\n\nExists for REST-idiomatic lookup-by-id; prefer get_overview when you\nare calling by session_id anyway, or list_sessions for discovery.","operationId":"get_session_v1_sessions__session_id__get","parameters":[{"required":true,"schema":{"type":"string","title":"Session Id"},"name":"session_id","in":"path"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":"[REDACTED]"}]},"delete":{"summary":"Close and destroy a session","description":"Close a session and release its resources.\n\nDestroys the session's in-memory state. If you may want to go back,\ntake or reference a snapshot first (list_snapshots + restore_snapshot).","operationId":"close_session_v1_sessions__session_id__delete","parameters":[{"required":true,"schema":{"type":"string","title":"Session Id"},"name":"session_id","in":"path"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":"[REDACTED]"}]}},"/v1/scenarios/{scenario_id}":{"get":{"summary":"Inspect a scenario pack in detail","description":"Inspect a scenario pack in detail.\n\nscenario_id accepts id, filename stem, or a scenario_path — all\nnormalize to the same scenario.\n\nview modes (use view='authoring' when you plan to edit and write back):\n  - full (default): headline metadata + section summary + parsed YAML + raw text\n  - summary:   headline metadata + section summary only (compact)\n  - authoring: {scenario_id, path, content} where `content` is the exact\n               shape update_scenario accepts as its body\n  - raw:       {scenario_id, path, raw} — raw YAML text\n\nformat=raw returns the YAML as text/yaml (overrides view).","operationId":"get_scenario","parameters":[{"required":true,"schema":{"type":"string","title":"Scenario Id"},"name":"scenario_id","in":"path"},{"required":false,"schema":{"type":"string","title":"View","default":"full"},"name":"view","in":"query"},{"required":false,"schema":{"type":"string","title":"Format","default":"json"},"name":"format","in":"query"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":"[REDACTED]"}]},"put":{"summary":"Replace a scenario's full contents","description":"Full replace. The body `content` must match the authoring shape from\nget_scenario(view='authoring') — i.e. the raw YAML dict with\nworld.topology.locations, world.entities, synths, profiles, etc. (NOT\nthe flat content-summary view from get_scenario(view='summary')).\n\nIf the target is a shipped baseline, the write lands in data/scenarios/\nand shadows the original (fork-on-write). Pass dry_run=true to preview.","operationId":"update_scenario","parameters":[{"required":true,"schema":{"type":"string","title":"Scenario Id"},"name":"scenario_id","in":"path"},{"required":false,"schema":{"type":"boolean","title":"Dry Run","default":false},"name":"dry_run","in":"query"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateScenarioRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":"[REDACTED]"}]},"delete":{"summary":"Delete a user-authored scenario","description":"Removes a user-authored scenario. Shipped scenarios cannot be deleted —\nfork them first if you want a deletable copy. Accepts scenario_id (id,\nfilename stem, or scenario_path — all normalize to the same scenario).","operationId":"delete_scenario","parameters":[{"required":true,"schema":{"type":"string","title":"Scenario Id"},"name":"scenario_id","in":"path"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":"[REDACTED]"}]}},"/v1/scenarios":{"get":{"summary":"List available scenario packs","description":"List scenario packs available on disk.\n\nMetadata-only — no world is loaded. Use before create_session to\ndiscover what simulations can be started; pass a returned path\nas the scenario_path argument to create_session.","operationId":"list_scenarios_v1_scenarios_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":"[REDACTED]"}]},"post":{"summary":"Create a new scenario pack","description":"Author a new scenario. If content is omitted a minimal valid scaffold\n(one location, no entities, no synths) is written so you can fill it in\npiece by piece with the component-level add_* tools.\n\nPass dry_run=true to preview the effect without writing the file.","operationId":"create_scenario","parameters":[{"required":false,"schema":{"type":"boolean","title":"Dry Run","default":false},"name":"dry_run","in":"query"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateScenarioRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":"[REDACTED]"}]}},"/v1/scenarios/{scenario_id}/fork":{"post":{"summary":"Duplicate a scenario under a new id","description":"Duplicate the source scenario under new_scenario_id. Optional overrides\nare merged at the top level (e.g. {\"random_seed\": 123}). scenario_id\naccepts id, filename stem, or a scenario_path — all normalize to the\nsame scenario. Pass dry_run=true to preview the fork without writing.","operationId":"fork_scenario","parameters":[{"required":true,"schema":{"type":"string","title":"Scenario Id"},"name":"scenario_id","in":"path"},{"required":false,"schema":{"type":"boolean","title":"Dry Run","default":false},"name":"dry_run","in":"query"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForkScenarioRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":"[REDACTED]"}]}},"/v1/scenarios/{scenario_id}/locations":{"post":{"summary":"Add a location to a scenario","operationId":"add_location","parameters":[{"required":true,"schema":{"type":"string","title":"Scenario Id"},"name":"scenario_id","in":"path"},{"required":false,"schema":{"type":"boolean","title":"Dry Run","default":false},"name":"dry_run","in":"query"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LocationModel"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":"[REDACTED]"}]}},"/v1/scenarios/{scenario_id}/locations/{loc_id}":{"put":{"summary":"Replace a location (destructive; drops unsent fields)","description":"Full replace. Every unsent field on the prior location is dropped.\nIf you only want to change a few fields, use patch_location.","operationId":"replace_location","parameters":[{"required":true,"schema":{"type":"string","title":"Scenario Id"},"name":"scenario_id","in":"path"},{"required":true,"schema":{"type":"string","title":"Loc Id"},"name":"loc_id","in":"path"},{"required":false,"schema":{"type":"boolean","title":"Dry Run","default":false},"name":"dry_run","in":"query"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LocationModel"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":"[REDACTED]"}]},"delete":{"summary":"Remove a location (and its adjacency edges)","operationId":"remove_location","parameters":[{"required":true,"schema":{"type":"string","title":"Scenario Id"},"name":"scenario_id","in":"path"},{"required":true,"schema":{"type":"string","title":"Loc Id"},"name":"loc_id","in":"path"},{"required":false,"schema":{"type":"boolean","title":"Dry Run","default":false},"name":"dry_run","in":"query"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":"[REDACTED]"}]},"patch":{"summary":"Patch a location (merge; unsent fields are preserved)","description":"Deep-merge partial update. Fields you don't send are preserved.\nSend `{\"key\": null}` to delete a key. Returns the full location after\nthe merge, so you can see both the changed and unchanged fields.\n\nBody must be `{\"patch\": {...}}` — the patch dict is the value of the\nrequired `patch` field. Example: `{\"patch\": {\"description\": \"updated\"}}`.","operationId":"patch_location","parameters":[{"required":true,"schema":{"type":"string","title":"Scenario Id"},"name":"scenario_id","in":"path"},{"required":true,"schema":{"type":"string","title":"Loc Id"},"name":"loc_id","in":"path"},{"required":false,"schema":{"type":"boolean","title":"Dry Run","default":false},"name":"dry_run","in":"query"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":"[REDACTED]"}]}},"/v1/scenarios/{scenario_id}/entities":{"post":{"summary":"Add an entity to a scenario (ruleset-validated)","operationId":"add_entity","parameters":[{"required":true,"schema":{"type":"string","title":"Scenario Id"},"name":"scenario_id","in":"path"},{"required":false,"schema":{"type":"boolean","title":"Dry Run","default":false},"name":"dry_run","in":"query"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EntityModel"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":"[REDACTED]"}]}},"/v1/scenarios/{scenario_id}/entities/{entity_id}":{"put":{"summary":"Replace an entity (destructive; drops unsent fields)","description":"Full replace. Every unsent field on the prior entity is dropped.\nComponents are revalidated against the ruleset. Use patch_entity for\npartial updates.","operationId":"replace_entity","parameters":[{"required":true,"schema":{"type":"string","title":"Scenario Id"},"name":"scenario_id","in":"path"},{"required":true,"schema":{"type":"string","title":"Entity Id"},"name":"entity_id","in":"path"},{"required":false,"schema":{"type":"boolean","title":"Dry Run","default":false},"name":"dry_run","in":"query"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EntityModel"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":"[REDACTED]"}]},"delete":{"summary":"Remove an entity from a scenario","operationId":"remove_entity","parameters":[{"required":true,"schema":{"type":"string","title":"Scenario Id"},"name":"scenario_id","in":"path"},{"required":true,"schema":{"type":"string","title":"Entity Id"},"name":"entity_id","in":"path"},{"required":false,"schema":{"type":"boolean","title":"Dry Run","default":false},"name":"dry_run","in":"query"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":"[REDACTED]"}]},"patch":{"summary":"Patch an entity (merge; unsent fields are preserved)","description":"Deep-merge partial update. Fields you don't send are preserved.\nIf you include 'components', the whole list is replaced (list merging is\nambiguous). Returns the full entity after the merge.\n\nBody must be `{\"patch\": {...}}`. Example: `{\"patch\": {\"name\": \"Stone Bench\"}}`.","operationId":"patch_entity","parameters":[{"required":true,"schema":{"type":"string","title":"Scenario Id"},"name":"scenario_id","in":"path"},{"required":true,"schema":{"type":"string","title":"Entity Id"},"name":"entity_id","in":"path"},{"required":false,"schema":{"type":"boolean","title":"Dry Run","default":false},"name":"dry_run","in":"query"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":"[REDACTED]"}]}},"/v1/scenarios/{scenario_id}/synths":{"post":{"summary":"Add a synth to a scenario","description":"Add a synth. Required fields (id, entity, identity) are validated at\nthe edge; the full synth shape — identity, cognition, initial_state\n(affect, beliefs, projects, memories, mental_models) — is published in\nthe OpenAPI schema so clients know what to send.","operationId":"add_synth","parameters":[{"required":true,"schema":{"type":"string","title":"Scenario Id"},"name":"scenario_id","in":"path"},{"required":false,"schema":{"type":"boolean","title":"Dry Run","default":false},"name":"dry_run","in":"query"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SynthModel"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":"[REDACTED]"}]}},"/v1/scenarios/{scenario_id}/synths/{synth_id}":{"put":{"summary":"Replace a synth (destructive; drops unsent fields)","description":"Full replace. Every unsent field on the prior synth is dropped. This is\nintentionally risky — use patch_synth when you only want to change a few\nfields (e.g. initial_state.beliefs).","operationId":"replace_synth","parameters":[{"required":true,"schema":{"type":"string","title":"Scenario Id"},"name":"scenario_id","in":"path"},{"required":true,"schema":{"type":"string","title":"Synth Id"},"name":"synth_id","in":"path"},{"required":false,"schema":{"type":"boolean","title":"Dry Run","default":false},"name":"dry_run","in":"query"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SynthModel"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":"[REDACTED]"}]},"delete":{"summary":"Remove a synth from a scenario","operationId":"remove_synth","parameters":[{"required":true,"schema":{"type":"string","title":"Scenario Id"},"name":"scenario_id","in":"path"},{"required":true,"schema":{"type":"string","title":"Synth Id"},"name":"synth_id","in":"path"},{"required":false,"schema":{"type":"boolean","title":"Dry Run","default":false},"name":"dry_run","in":"query"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":"[REDACTED]"}]},"patch":{"summary":"Patch a synth (merge; unsent fields are preserved)","description":"Deep-merge partial update of one synth.\n\nBody must be `{\"patch\": {...}}` — wrap your merge under the `patch` key.\nExample to clear James's prior knowledge of the shore without losing\nhis identity, embodiment, or mood:\n\n  PATCH /v1/scenarios/lighthouse/synths/james\n  {\"patch\": {\"initial_state\": {\"beliefs\": []}}}\n\nReturns the full synth after the merge so you can see both the fields\nyou changed and the ones you didn't touch.\n\nPass dry_run=true to preview the merged synth without writing.","operationId":"patch_synth","parameters":[{"required":true,"schema":{"type":"string","title":"Scenario Id"},"name":"scenario_id","in":"path"},{"required":true,"schema":{"type":"string","title":"Synth Id"},"name":"synth_id","in":"path"},{"required":false,"schema":{"type":"boolean","title":"Dry Run","default":false},"name":"dry_run","in":"query"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":"[REDACTED]"}]}},"/v1/scenarios/{scenario_id}/adjacency":{"post":{"summary":"Add an adjacency edge between two locations","operationId":"add_adjacency","parameters":[{"required":true,"schema":{"type":"string","title":"Scenario Id"},"name":"scenario_id","in":"path"},{"required":false,"schema":{"type":"boolean","title":"Dry Run","default":false},"name":"dry_run","in":"query"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdjacencyModel"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":"[REDACTED]"}]},"delete":{"summary":"Remove an adjacency edge (by from+to)","operationId":"remove_adjacency","parameters":[{"required":true,"schema":{"type":"string","title":"Scenario Id"},"name":"scenario_id","in":"path"},{"required":true,"schema":{"type":"string","title":"From Location"},"name":"from_location","in":"query"},{"required":true,"schema":{"type":"string","title":"To Location"},"name":"to_location","in":"query"},{"required":false,"schema":{"type":"boolean","title":"Dry Run","default":false},"name":"dry_run","in":"query"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":"[REDACTED]"}]}},"/v1/sessions/{session_id}/snapshots":{"get":{"summary":"List a session's snapshots","description":"List snapshots taken for a session.\n\nSnapshots are automatic checkpoints taken at cycle boundaries. Pair\nwith restore_snapshot to undo recent changes or roll back after a bad\npatch or an unintended step.","operationId":"list_snapshots_v1_sessions__session_id__snapshots_get","parameters":[{"required":true,"schema":{"type":"string","title":"Session Id"},"name":"session_id","in":"path"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":"[REDACTED]"}]}},"/v1/sessions/{session_id}/snapshots/diff":{"get":{"summary":"Diff two arbitrary snapshots","description":"Event-level diff between two persisted snapshots (RFC-0001).\n\nGeneralizes get_changes to arbitrary snapshot pairs: returns changed_refs,\nevent counts by type, event details, and compact summaries for everything\nthat happened from from_snapshot (exclusive) to to_snapshot (inclusive).\nRead-only; the live session is untouched.","operationId":"diff_snapshots","parameters":[{"required":true,"schema":{"type":"string","title":"Session Id"},"name":"session_id","in":"path"},{"required":true,"schema":{"type":"string","title":"From Snapshot"},"name":"from_snapshot","in":"query"},{"required":true,"schema":{"type":"string","title":"To Snapshot"},"name":"to_snapshot","in":"query"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":"[REDACTED]"}]}},"/v1/sessions/{session_id}/snapshots/{snapshot_ref}/overview":{"get":{"summary":"Historical session overview at a snapshot","description":"RFC-0001 tool #1: full world overview materialized from a past snapshot.\n\nSame shape as get_overview, but read from a persisted snapshot. The live\nsession is not modified — this is how you scrub through cycles without\nthe destructive side effect of restore_snapshot.","operationId":"get_snapshot_overview","parameters":[{"required":true,"schema":{"type":"string","title":"Session Id"},"name":"session_id","in":"path"},{"required":true,"schema":{"type":"string","title":"Snapshot Ref"},"name":"snapshot_ref","in":"path"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":"[REDACTED]"}]}},"/v1/sessions/{session_id}/snapshots/{snapshot_ref}/objects/{kind}/{ref}":{"get":{"summary":"Historical object detail at a snapshot","description":"RFC-0001 tool #2: object detail as of a persisted snapshot.\n\nSame shape as get_object. Returns 404 if the object did not exist yet at\nthat snapshot (e.g. an entity created at a later cycle). Read-only.","operationId":"get_snapshot_object","parameters":[{"required":true,"schema":{"type":"string","title":"Session Id"},"name":"session_id","in":"path"},{"required":true,"schema":{"type":"string","title":"Snapshot Ref"},"name":"snapshot_ref","in":"path"},{"required":true,"schema":{"type":"string","title":"Kind"},"name":"kind","in":"path"},{"required":true,"schema":{"type":"string","title":"Ref"},"name":"ref","in":"path"},{"required":false,"schema":{"type":"string","title":"View","default":"both"},"name":"view","in":"query"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":"[REDACTED]"}]}},"/v1/sessions/{session_id}/restore":{"post":{"summary":"Roll back to a snapshot","description":"Rewind a session to a previous snapshot — the undo button.\n\nReplaces the current session state with the snapshot; anything after\nthat point is discarded unless it was itself snapshotted. Get\nsnapshot_ref from list_snapshots. Safe to retry with idempotency_key.","operationId":"restore_snapshot_v1_sessions__session_id__restore_post","parameters":[{"required":true,"schema":{"type":"string","title":"Session Id"},"name":"session_id","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RestoreRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":"[REDACTED]"}]}},"/v1/sessions/{session_id}/step":{"post":{"summary":"Advance N cognitive cycles","description":"Advance the simulation by n cycles (default 1).\n\nEach cycle runs perception → cognition → intent resolution → commit:\nsynths observe their surroundings, decide, and act. Any stimuli queued\nvia queue_stimulus are drained into this step. After stepping, call\nget_last_cycle_report for a narrative of what happened, or get_changes\nfor a structured diff.","operationId":"step_session_v1_sessions__session_id__step_post","parameters":[{"required":true,"schema":{"type":"string","title":"Session Id"},"name":"session_id","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/StepRequest"}],"title":"Req","default":{"n":1}}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":"[REDACTED]"}]}},"/v1/sessions/{session_id}/pause":{"post":{"summary":"Pause auto-advance","description":"Pause a session's auto-advance.\n\nStops any timed cycle loop; manual step_session calls still work.\nPair with resume_session to restart the loop.","operationId":"pause_session_v1_sessions__session_id__pause_post","parameters":[{"required":true,"schema":{"type":"string","title":"Session Id"},"name":"session_id","in":"path"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":"[REDACTED]"}]}},"/v1/sessions/{session_id}/resume":{"post":{"summary":"Resume auto-advance","description":"Resume a session's auto-advance after pause_session.\n\nCycles run on the configured cadence. No-op if the session is already\nrunning.","operationId":"resume_session_v1_sessions__session_id__resume_post","parameters":[{"required":true,"schema":{"type":"string","title":"Session Id"},"name":"session_id","in":"path"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":"[REDACTED]"}]}},"/v1/sessions/{session_id}/turns":{"post":{"summary":"Inject an external turn","description":"Inject an external event through the director and run a cycle.\n\nUse for in-world events: a spoken announcement, a narrated action, a\nscripted intervention from the operator. The event flows through the\ndirector and triggers a full cycle. Compare queue_stimulus, which\nenqueues a sensory stimulus without triggering a cycle. origin_type\nis usually 'human'; payload is free-form but typically includes a\n'message' field.","operationId":"submit_turn_v1_sessions__session_id__turns_post","parameters":[{"required":true,"schema":{"type":"string","title":"Session Id"},"name":"session_id","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TurnRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":"[REDACTED]"}]}},"/v1/sessions/{session_id}/overview":{"get":{"summary":"Full session overview","description":"Compact snapshot of the current session state.\n\nReturns synths (with brief status), environment, time, and locations —\nthe go-to call for a status update. Cheaper than inspecting individual\nobjects; use get_object for deep detail on a specific synth/entity/location.","operationId":"get_overview_v1_sessions__session_id__overview_get","parameters":[{"required":true,"schema":{"type":"string","title":"Session Id"},"name":"session_id","in":"path"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":"[REDACTED]"}]}},"/v1/sessions/{session_id}/resolve":{"get":{"summary":"Resolve a name to a ref","description":"Resolve a human-readable name to its stable UUID ref.\n\nPass q (the name) and optionally kind (synth, entity, or location) to\nnarrow the search. Use before any tool that takes a ref argument —\nnotably get_object and the ref-bearing ops in apply_patch. Returns a\nmatches array; ambiguous names return multiple hits.","operationId":"resolve_ref_v1_sessions__session_id__resolve_get","parameters":[{"required":true,"schema":{"type":"string","title":"Session Id"},"name":"session_id","in":"path"},{"required":true,"schema":{"type":"string","title":"Q"},"name":"q","in":"query"},{"required":false,"schema":{"type":"string","title":"Kind"},"name":"kind","in":"query"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":"[REDACTED]"}]}},"/v1/sessions/{session_id}/objects/{kind}/{ref}":{"get":{"summary":"Fetch a typed object by ref","description":"Detailed view of a specific synth, entity, or location by ref.\n\nkind must be one of: synth, entity, location.\n- synth: beliefs, mood, memories, available actions.\n- entity: components, location, mobility.\n- location: contents, exits.\nUse resolve_ref first if you only know the name. view defaults to 'both'\n(internal + external) — the other options are 'internal' or 'external'.","operationId":"get_object_v1_sessions__session_id__objects__kind___ref__get","parameters":[{"required":true,"schema":{"type":"string","title":"Session Id"},"name":"session_id","in":"path"},{"required":true,"schema":{"type":"string","title":"Kind"},"name":"kind","in":"path"},{"required":true,"schema":{"type":"string","title":"Ref"},"name":"ref","in":"path"},{"required":false,"schema":{"type":"string","title":"View","default":"both"},"name":"view","in":"query"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":"[REDACTED]"}]}},"/v1/sessions/{session_id}/events":{"get":{"summary":"Paginate raw audit events","description":"Raw audit events from the session since a sequence number.\n\nFull fidelity — every perception, thought, action, and world change.\nBest for detailed history or debugging. For a narrative summary, use\nget_last_cycle_report (single cycle) or get_report_since (multi-cycle).\nPagination: pass since=<last seq seen>, limit=N.","operationId":"get_events_v1_sessions__session_id__events_get","parameters":[{"required":true,"schema":{"type":"string","title":"Session Id"},"name":"session_id","in":"path"},{"required":false,"schema":{"type":"integer","title":"Since","default":0},"name":"since","in":"query"},{"required":false,"schema":{"type":"integer","title":"Limit","default":50},"name":"limit","in":"query"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":"[REDACTED]"}]}},"/v1/sessions/{session_id}/changes":{"get":{"summary":"Structured change set since a cursor","description":"Structured diff of world state: what refs changed and by how much.\n\nAggregated event counts, short summaries, and the set of changed refs —\nsince a given sequence cursor or against a snapshot (snapshot_ref).\nNarrower than get_events (no per-event detail), broader than\nget_overview (historical, not just current).","operationId":"get_changes_v1_sessions__session_id__changes_get","parameters":[{"required":true,"schema":{"type":"string","title":"Session Id"},"name":"session_id","in":"path"},{"required":false,"schema":{"type":"integer","title":"Since","default":0},"name":"since","in":"query"},{"required":false,"schema":{"type":"string","title":"Snapshot Ref"},"name":"snapshot_ref","in":"query"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":"[REDACTED]"}]}},"/v1/sessions/{session_id}/reports/last-cycle":{"get":{"summary":"Narrative report of the last cycle","description":"Narrative report of the most recent cycle.\n\nWorld events, synth speech and actions, belief changes, mood shifts —\nhuman-readable. Call after step_session to see what just happened.\nFor multiple cycles at once, use get_report_since.","operationId":"get_last_cycle_report_v1_sessions__session_id__reports_last_cycle_get","parameters":[{"required":true,"schema":{"type":"string","title":"Session Id"},"name":"session_id","in":"path"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":"[REDACTED]"}]}},"/v1/sessions/{session_id}/reports/since":{"get":{"summary":"Narrative report since a cursor","description":"Narrative report spanning every cycle since a sequence cursor.\n\nLike get_last_cycle_report but multi-cycle — use to catch up after\nseveral steps without walking raw events. Returns summaries, event\ncounts, and changed refs since the cursor.","operationId":"get_report_since_v1_sessions__session_id__reports_since_get","parameters":[{"required":true,"schema":{"type":"string","title":"Session Id"},"name":"session_id","in":"path"},{"required":false,"schema":{"type":"integer","title":"Since","default":0},"name":"since","in":"query"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":"[REDACTED]"}]}},"/v1/sessions/{session_id}/stream":{"get":{"summary":"Live SSE event stream","description":"SSE event stream. Connect and receive events as they happen.","operationId":"stream_events_v1_sessions__session_id__stream_get","parameters":[{"required":true,"schema":{"type":"string","title":"Session Id"},"name":"session_id","in":"path"},{"required":false,"schema":{"type":"integer","title":"Since","default":0},"name":"since","in":"query"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":"[REDACTED]"}]}},"/v1/sessions/{session_id}/patches":{"post":{"summary":"Apply world mutations","description":"Apply typed operations to mutate world state directly.\n\nBypasses the perception path — synths do NOT necessarily perceive\nthese changes. For things synths should sense (sounds, sights, smells),\nprefer queue_stimulus instead.\n\noperations is an array of op objects. Supported ops:\n  - move_entity: {op, entity_ref, destination_ref}\n  - create_entity: {op, name, description, location_ref, components}\n  - remove_entity: {op, entity_ref}\n  - set_component_property: {op, entity_ref, component_type, property, value}\n  - set_environment_field: {op, field_path, value}\n  - add_belief: {op, synth_ref, subject, predicate, content, confidence, ...}\n  - add_memory: {op, synth_ref, content, memory_type, salience, ...}\n  - set_mood: {op, synth_ref, mood, valence, arousal, stress}\n\nmode: 'dry_run' (validate only, no change), 'commit' (apply), or\n'commit_and_step' (apply then run one cycle). Safe to retry with\nidempotency_key.","operationId":"apply_patch_v1_sessions__session_id__patches_post","parameters":[{"required":true,"schema":{"type":"string","title":"Session Id"},"name":"session_id","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":"[REDACTED]"}]}},"/v1/sessions/{session_id}/stimuli":{"post":{"summary":"Queue an external sensory stimulus","description":"Queue an external stimulus for delivery through the perception path.\n\nStimuli are mediated: they enter through compose_sensory_bundle on the\nnext step or turn, so synths perceive them naturally — a sound heard,\na smell noticed, a visual cue. Contrast apply_patch (mutates state\ndirectly, bypasses perception) and submit_turn (routes through the\ndirector and triggers a cycle).\n\nchannel: auditory, visual, olfactory, tactile, proprioceptive.\ntarget_synth_refs: empty list means broadcast to all synths in scope.\ndelivery: 'next_cycle' (default — queues, fires on next step) or\n'immediate_with_step' (queues + runs one step right now).","operationId":"queue_stimulus_v1_sessions__session_id__stimuli_post","parameters":[{"required":true,"schema":{"type":"string","title":"Session Id"},"name":"session_id","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StimulusRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":"[REDACTED]"}]}},"/v1/health/llm":{"get":{"summary":"LLM backend health check","description":"Probe the LLM backend the synths would actually call.\n\nPer ADR-0001, silent cognition failure is an operational hazard. This\nendpoint surfaces reachability + TLS + auth state before anyone tries\nto step a session. Never raises; failures are reported in the payload.","operationId":"check_llm_health","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":"[REDACTED]"}]}},"/v1/tooling/manifest":{"get":{"summary":"API tool manifest","description":"Tool manifest generated from the OpenAPI schema (the source of truth).\n\nLists every tool with name, method, path, scope, and description. The\nsame tool set is available over MCP at POST /mcp — MCP clients should\nprefer tools/list there instead of calling this endpoint.","operationId":"get_tool_manifest_v1_tooling_manifest_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/admin/logs":{"get":{"summary":"API request/response audit log","description":"Search the API request/response audit log.\n\nEvery HTTP request (REST, MCP, dashboard) produces one JSONL record at\ndata/audit/api_calls.jsonl. MCP JSON-RPC messages produce a second record\nwith type=\"mcp_call\". Each record carries a request_id that is also\nreturned in the X-Request-Id response header for correlation.\n\nFilters are AND-combined. For pagination, use limit+offset with order=desc\nto walk from newest to oldest; total_matched lets you know when to stop.\nDefault order is newest-first (desc) which is what you usually want when\ndebugging.\n\nCommon recipes:\n  - Find a specific request:            ?request_id=df143dc0...\n  - Find failures on a path:            ?path=/v1/sessions&min_status=400\n  - Find slow requests:                 ?min_duration_ms=500\n  - Find all MCP tool calls:            ?type=mcp_call\n  - Find a specific MCP tool's calls:   ?type=mcp_call&tool_name=list_scenarios\n  - Errors of any kind:                 ?has_error=true","operationId":"get_api_call_log","parameters":[{"required":false,"schema":{"type":"integer","title":"Limit","default":100},"name":"limit","in":"query"},{"required":false,"schema":{"type":"integer","title":"Offset","default":0},"name":"offset","in":"query"},{"required":false,"schema":{"type":"string","title":"Since Ts"},"name":"since_ts","in":"query"},{"required":false,"schema":{"type":"string","title":"Before Ts"},"name":"before_ts","in":"query"},{"required":false,"schema":{"type":"string","title":"Request Id"},"name":"request_id","in":"query"},{"required":false,"schema":{"type":"string","title":"Path"},"name":"path","in":"query"},{"required":false,"schema":{"type":"string","title":"Method"},"name":"method","in":"query"},{"required":false,"schema":{"type":"integer","title":"Status"},"name":"status","in":"query"},{"required":false,"schema":{"type":"integer","title":"Min Status"},"name":"min_status","in":"query"},{"required":false,"schema":{"type":"integer","title":"Max Status"},"name":"max_status","in":"query"},{"required":false,"schema":{"type":"string","title":"Operation Id"},"name":"operation_id","in":"query"},{"required":false,"schema":{"type":"string","title":"Tool Name"},"name":"tool_name","in":"query"},{"required":false,"schema":{"type":"string","title":"Type"},"name":"type","in":"query"},{"required":false,"schema":{"type":"number","title":"Min Duration Ms"},"name":"min_duration_ms","in":"query"},{"required":false,"schema":{"type":"boolean","title":"Has Error"},"name":"has_error","in":"query"},{"required":false,"schema":{"type":"string","title":"Order","default":"desc"},"name":"order","in":"query"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":"[REDACTED]"}]}},"/dashboard":{"get":{"summary":"Dashboard Html","description":"Operator dashboard: one tile per tool, showing available options.","operationId":"dashboard_html_dashboard_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/dashboard/data":{"get":{"summary":"Dashboard Data","description":"JSON form of the dashboard — same tiles, machine-readable.","operationId":"dashboard_data_dashboard_data_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/dashboard/execute":{"get":{"summary":"Dashboard Execute","description":"Render a page that fires the given API request from the browser and displays the response.","operationId":"dashboard_execute_dashboard_execute_get","parameters":[{"required":false,"schema":{"type":"string","title":"Method","default":"GET"},"name":"method","in":"query"},{"required":false,"schema":{"type":"string","title":"Path","default":"/"},"name":"path","in":"query"},{"required":false,"schema":{"type":"string","title":"Body","default":""},"name":"body","in":"query"},{"required":false,"schema":{"type":"string","title":"Label","default":""},"name":"label","in":"query"}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"AdjacencyModel":{"properties":{"from":{"type":"string","title":"From"},"to":{"type":"string","title":"To"},"kind":{"type":"string","title":"Kind","default":"path"},"bidirectional":{"type":"boolean","title":"Bidirectional","default":true},"constraints":{"type":"object","title":"Constraints"}},"type":"object","required":["from","to"],"title":"AdjacencyModel"},"AffectModel":{"properties":{"mood":{"type":"string","title":"Mood","default":"neutral"},"valence":{"type":"number","title":"Valence","default":0.0},"arousal":{"type":"number","title":"Arousal","default":0.3},"stress":{"type":"number","title":"Stress","default":0.2},"drives":{"items":{"type":"string"},"type":"array","title":"Drives"}},"type":"object","title":"AffectModel","description":"Leaf model — accepts extra keys so forward-compatible fields survive."},"BeliefModel":{"properties":{"subject":{"type":"string","title":"Subject"},"predicate":{"type":"string","title":"Predicate"},"value":{"type":"string","title":"Value"},"confidence":{"type":"number","title":"Confidence","default":0.8},"source_modality":{"type":"string","title":"Source Modality","default":"prior"}},"type":"object","required":["subject","predicate","value"],"title":"BeliefModel","description":"Leaf model — accepts extra keys so forward-compatible fields survive."},"CognitionModel":{"properties":{"model":{"type":"string","title":"Model","description":"Model alias or concrete model id.","default":"@chat"},"temperature":{"type":"number","title":"Temperature","default":0.7},"max_intents":{"type":"integer","title":"Max Intents","default":3}},"type":"object","title":"CognitionModel","description":"Leaf model — accepts extra keys so forward-compatible fields survive."},"ComponentModel":{"properties":{"type":{"type":"string","title":"Type","description":"Component type. Must be valid in the ruleset."}},"type":"object","required":["type"],"title":"ComponentModel","description":"Leaf model — accepts extra keys so forward-compatible fields survive."},"CreateScenarioRequest":{"properties":{"scenario_id":{"type":"string","title":"Scenario Id"},"content":{"type":"object","title":"Content"}},"type":"object","required":["scenario_id"],"title":"CreateScenarioRequest"},"CreateSessionRequest":{"properties":{"scenario_path":{"type":"string","title":"Scenario Path"},"scenario_ref":{"type":"string","title":"Scenario Ref"}},"type":"object","title":"CreateSessionRequest","description":"Pass either `scenario_ref` (preferred) or `scenario_path` (historical alias). Accepts id, filename stem, or a path — all normalize to the same scenario."},"EntityModel":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"location":{"type":"string","title":"Location","description":"Location id where the entity starts."},"mobility":{"type":"string","title":"Mobility","description":"movable | fixed | carried","default":"movable"},"description":{"type":"string","title":"Description","default":""},"visible":{"type":"boolean","title":"Visible","default":true},"components":{"items":{"$ref":"#/components/schemas/ComponentModel"},"type":"array","title":"Components"}},"type":"object","required":["id","name","location"],"title":"EntityModel"},"ForkScenarioRequest":{"properties":{"new_scenario_id":{"type":"string","title":"New Scenario Id"},"overrides":{"type":"object","title":"Overrides"}},"type":"object","required":["new_scenario_id"],"title":"ForkScenarioRequest"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"IdentityModel":{"properties":{"name":{"type":"string","title":"Name"},"kind":{"type":"string","title":"Kind","default":"human"},"biography":{"type":"string","title":"Biography"},"traits":{"items":{"type":"string"},"type":"array","title":"Traits"},"values":{"items":{"type":"string"},"type":"array","title":"Values"}},"type":"object","required":["name"],"title":"IdentityModel","description":"Leaf model — accepts extra keys so forward-compatible fields survive."},"InitialStateModel":{"properties":{"believed_location":{"type":"string","title":"Believed Location"},"believed_condition":{"type":"object","title":"Believed Condition"},"affect":{"$ref":"#/components/schemas/AffectModel"},"beliefs":{"items":{"$ref":"#/components/schemas/BeliefModel"},"type":"array","title":"Beliefs"},"mental_models":{"items":{"$ref":"#/components/schemas/MentalModelModel"},"type":"array","title":"Mental Models"},"projects":{"items":{"$ref":"#/components/schemas/ProjectModel"},"type":"array","title":"Projects"},"memories":{"items":{"$ref":"#/components/schemas/MemoryModel"},"type":"array","title":"Memories"}},"type":"object","title":"InitialStateModel","description":"Leaf model — accepts extra keys so forward-compatible fields survive."},"LocationModel":{"properties":{"id":{"type":"string","title":"Id","description":"Stable ref, referenced by entities and adjacency edges."},"name":{"type":"string","title":"Name","description":"Human-readable label."},"kind":{"type":"string","title":"Kind","description":"LocationKind: room, exterior, vehicle, container, ...","default":"room"},"description":{"type":"string","title":"Description","description":"Short narrative description.","default":""},"parent":{"type":"string","title":"Parent","description":"Parent location id, for nested spaces."}},"type":"object","required":["id","name"],"title":"LocationModel"},"MemoryModel":{"properties":{"type":{"type":"string","title":"Type","description":"working | episodic | semantic | procedural","default":"semantic"},"content":{"type":"string","title":"Content"},"salience":{"type":"number","title":"Salience","default":0.5},"source_modality":{"type":"string","title":"Source Modality","default":"prior"},"emotional_tone":{"type":"string","title":"Emotional Tone"}},"type":"object","required":["content"],"title":"MemoryModel","description":"Leaf model — accepts extra keys so forward-compatible fields survive."},"MentalModelModel":{"properties":{"name":{"type":"string","title":"Name"},"believed_location":{"type":"string","title":"Believed Location"},"believed_mood":{"type":"string","title":"Believed Mood"},"believed_goals":{"items":{"type":"string"},"type":"array","title":"Believed Goals"},"believed_knowledge":{"items":{"type":"string"},"type":"array","title":"Believed Knowledge"},"believed_beliefs_about_me":{"type":"string","title":"Believed Beliefs About Me"},"confidence":{"type":"number","title":"Confidence","default":0.5}},"type":"object","required":["name"],"title":"MentalModelModel","description":"Leaf model — accepts extra keys so forward-compatible fields survive."},"PatchBody":{"properties":{"patch":{"type":"object","title":"Patch","description":"RFC 7396 JSON Merge Patch. Keys present in the patch overlay the existing object; null deletes a key; lists replace. Unsent fields are preserved."}},"type":"object","required":["patch"],"title":"PatchBody","description":"Wrapper so OpenAPI / MCP schemas publish a named 'patch' field.\n\nWithout this, `patch: Dict[str, Any]` emits an anonymous body and MCP\nclients can't see that `patch` is required — they send just scope\narguments and get a cryptic 422."},"PatchOperation":{"properties":{"op":{"type":"string","title":"Op"},"entity_ref":{"type":"string","title":"Entity Ref"},"destination_ref":{"type":"string","title":"Destination Ref"},"location_ref":{"type":"string","title":"Location Ref"},"synth_ref":{"type":"string","title":"Synth Ref"},"name":{"type":"string","title":"Name"},"description":{"type":"string","title":"Description"},"mobility":{"type":"string","title":"Mobility"},"components":{"items":{"type":"object"},"type":"array","title":"Components"},"component_type":{"type":"string","title":"Component Type"},"property":{"type":"string","title":"Property"},"value":{"title":"Value"},"field_path":{"type":"string","title":"Field Path"},"subject":{"type":"string","title":"Subject"},"predicate":{"type":"string","title":"Predicate"},"content":{"type":"string","title":"Content"},"confidence":{"type":"number","title":"Confidence"},"source_modality":{"type":"string","title":"Source Modality"},"source_agent":{"type":"string","title":"Source Agent"},"memory_type":{"type":"string","title":"Memory Type"},"salience":{"type":"number","title":"Salience"},"mood":{"type":"string","title":"Mood"},"valence":{"type":"number","title":"Valence"},"arousal":{"type":"number","title":"Arousal"},"stress":{"type":"number","title":"Stress"}},"type":"object","required":["op"],"title":"PatchOperation"},"PatchRequest":{"properties":{"operations":{"items":{"$ref":"#/components/schemas/PatchOperation"},"type":"array","title":"Operations"},"mode":{"type":"string","title":"Mode","default":"commit"},"idempotency_key":{"type":"string","title":"Idempotency Key"}},"type":"object","required":["operations"],"title":"PatchRequest"},"ProjectModel":{"properties":{"title":{"type":"string","title":"Title"},"goal":{"type":"string","title":"Goal"},"motivation":{"type":"string","title":"Motivation"},"status":{"type":"string","title":"Status","default":"active"},"priority":{"type":"integer","title":"Priority","default":0},"next_step":{"type":"string","title":"Next Step"}},"type":"object","required":["title","goal"],"title":"ProjectModel","description":"Leaf model — accepts extra keys so forward-compatible fields survive."},"RestoreRequest":{"properties":{"snapshot_ref":{"type":"string","title":"Snapshot Ref"},"idempotency_key":{"type":"string","title":"Idempotency Key"}},"type":"object","required":["snapshot_ref"],"title":"RestoreRequest"},"StepRequest":{"properties":{"n":{"type":"integer","title":"N","default":1},"idempotency_key":{"type":"string","title":"Idempotency Key"}},"type":"object","title":"StepRequest"},"StimulusRequest":{"properties":{"target_synth_refs":{"items":{"type":"string"},"type":"array","title":"Target Synth Refs","default":[]},"channel":{"type":"string","title":"Channel","default":"auditory"},"content":{"type":"string","title":"Content"},"source":{"type":"string","title":"Source","default":"external"},"source_agent":{"type":"string","title":"Source Agent","default":"director"},"salience":{"type":"number","title":"Salience","default":0.8},"delivery":{"type":"string","title":"Delivery","default":"next_cycle"},"idempotency_key":{"type":"string","title":"Idempotency Key"}},"type":"object","required":["content"],"title":"StimulusRequest"},"SynthModel":{"properties":{"id":{"type":"string","title":"Id"},"entity":{"type":"string","title":"Entity","description":"Entity id this synth is embodied in."},"embodiment_profile":{"type":"string","title":"Embodiment Profile","description":"Key into profiles.embodiment_profiles. Required unless 'embodiment' is provided inline."},"embodiment":{"type":"object","title":"Embodiment","description":"Inline embodiment override. Merged with profile if both given."},"identity":{"$ref":"#/components/schemas/IdentityModel"},"cognition":{"$ref":"#/components/schemas/CognitionModel"},"initial_state":{"$ref":"#/components/schemas/InitialStateModel"}},"type":"object","required":["id","entity","identity"],"title":"SynthModel"},"TurnRequest":{"properties":{"origin_type":{"type":"string","title":"Origin Type","default":"human"},"origin_ref":{"type":"string","title":"Origin Ref"},"payload":{"type":"object","title":"Payload","default":{}},"idempotency_key":{"type":"string","title":"Idempotency Key"}},"type":"object","title":"TurnRequest"},"UpdateScenarioRequest":{"properties":{"content":{"type":"object","title":"Content"}},"type":"object","required":["content"],"title":"UpdateScenarioRequest"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}},"securitySchemes":{"HTTPBearer":"[REDACTED]"}}},"response_stream":false},"error":null},{"request_id":"90a895e8907748299a293f37bd791b5f","ts":"2026-04-18T17:27:07.855480Z","duration_ms":592.459,"method":"GET","path":"/dashboard/data","query":"","operation_id":"dashboard_data_dashboard_data_get","client_ip":"216.73.216.73","user_agent":"Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com)","auth":{"scheme":null,"scope":"admin","auth_enabled":false,"recognized":true},"request":{"headers":{"host":"singing-bird.benac.dev","user-agent":"Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com)","accept":"*/*","accept-encoding":"gzip, br, zstd, deflate","via":"2.0 Caddy","x-forwarded-for":"216.73.216.73","x-forwarded-host":"singing-bird.benac.dev","x-forwarded-proto":"https","x-real-ip":"216.73.216.73"},"request_body_size":0,"request_body_truncated":false,"request_body_kind":"empty","request_body":null},"status":200,"response":{"headers":{"content-length":"125663","content-type":"application/json","x-request-id":"90a895e8907748299a293f37bd791b5f"},"response_body_size":125663,"response_body_truncated":true,"response_body_kind":"text","response_body":"{\"base_url\":\"https://singing-bird.benac.dev\",\"groups\":[{\"id\":\"sessions\",\"label\":\"Sessions\",\"description\":\"Session lifecycle — create, inspect, close, snapshot, restore.\",\"tile_count\":26},{\"id\":\"control\",\"label\":\"Control\",\"description\":\"Advance the simulation — step, pause, resume, submit turns.\",\"tile_count\":4},{\"id\":\"observation\",\"label\":\"Observation\",\"description\":\"Query state — overview, objects, events, changes, reports, SSE.\",\"tile_count\":11},{\"id\":\"intervention\",\"label\":\"Intervention\",\"description\":\"Mutate live state — patches, external stimuli.\",\"tile_count\":2},{\"id\":\"tooling\",\"label\":\"Tooling\",\"description\":\"Meta endpoints — manifest, schema.\",\"tile_count\":3}],\"tiles\":[{\"name\":\"list_scenarios\",\"title\":\"Available scenario packs\",\"tools\":[\"list_scenarios\"],\"method\":\"GET\",\"path\":\"/v1/scenarios\",\"scope\":\"read\",\"group\":\"sessions\",\"summary\":\"List scenario packs discoverable on disk. Dynamic: drop a new *.yaml into the scenarios directory and it appears.\",\"option_label\":\"scenario_path\",\"option_hint\":\"Pass a scenario path as the body of POST /v1/sessions to create a session.\",\"options\":[{\"path\":\"scenarios/dockside_outpost.yaml\",\"scenario_id\":\"dockside_outpost\",\"ruleset_ref\":\"physical_social_v1\",\"chronon_interval_seconds\":240,\"random_seed\":777,\"locations\":3,\"entities\":8,\"processes\":2,\"synths\":3,\"source\":\"shipped\"},{\"path\":\"scenarios/lighthouse.yaml\",\"scenario_id\":\"lighthouse\",\"ruleset_ref\":\"physical_social_v1\",\"chronon_interval_seconds\":300,\"random_seed\":42,\"locations\":4,\"entities\":12,\"processes\":2,\"synths\":3,\"source\":\"shipped\"},{\"path\":\"data/scenarios/lighthouse_fork.yaml\",\"scenario_id\":\"lighthouse_fork\",\"ruleset_ref\":\"physical_social_v1\",\"chronon_interval_seconds\":300,\"random_seed\":42,\"locations\":4,\"entities\":12,\"processes\":2,\"synths\":3,\"source\":\"user\"},{\"path\":\"data/scenarios/lighthouse_test_base.yaml\",\"scenario_id\":\"lighthouse_test_base\",\"ruleset_ref\":\"physical_social_v1\",\"chronon_interval_seconds\":300,\"random_seed\":42,\"locations\":4,\"entities\":12,\"processes\":2,\"synths\":3,\"source\":\"user\"},{\"path\":\"scenarios/night_clinic.yaml\",\"scenario_id\":\"night_clinic\",\"ruleset_ref\":\"physical_social_v1\",\"chronon_interval_seconds\":180,\"random_seed\":2718,\"locations\":3,\"entities\":7,\"processes\":1,\"synths\":3,\"source\":\"shipped\"},{\"path\":\"scenarios/park_bench.yaml\",\"scenario_id\":\"park_bench\",\"ruleset_ref\":\"physical_social_v1\",\"chronon_interval_seconds\":180,\"random_seed\":99,\"locations\":3,\"entities\":5,\"processes\":1,\"synths\":2,\"source\":\"shipped\"},{\"path\":\"scenarios/storm_cellar.yaml\",\"scenario_id\":\"storm_cellar\",\"ruleset_ref\":\"physical_social_v1\",\"chronon_interval_seconds\":240,\"random_seed\":314,\"locations\":3,\"entities\":8,\"processes\":2,\"synths\":3,\"source\":\"shipped\"},{\"path\":\"scenarios/workshop_blackout.yaml\",\"scenario_id\":\"workshop_blackout\",\"ruleset_ref\":\"physical_social_v1\",\"chronon_interval_seconds\":240,\"random_seed\":123,\"locations\":3,\"entities\":8,\"processes\":2,\"synths\":3,\"source\":\"shipped\"}],\"execution\":{\"method\":\"GET\",\"path\":\"/v1/scenarios\",\"label\":\"List scenarios\",\"url\":\"https://singing-bird.benac.dev/v1/scenarios\",\"execute_href\":\"/dashboard/execute?method=GET&path=%2Fv1%2Fscenarios&label=List+scenarios\"},\"url\":\"https://singing-bird.benac.dev/v1/scenarios\"},{\"name\":\"get_api_call_log\",\"title\":\"API audit log\",\"tools\":[\"get_api_call_log\"],\"method\":\"GET\",\"path\":\"/v1/admin/logs\",\"scope\":\"admin\",\"group\":\"tooling\",\"summary\":\"Live tail of the API request/response audit log. Every HTTP exchange and every MCP JSON-RPC message is captured. The X-Request-Id response header links each response back to a record here.\",\"option_label\":\"request_id\",\"option_hint\":\"Most recent first. Click Run to fetch more records as JSON.\",\"options\":[{\"request_id\":\"b92b497dbe4f432cb4ed7726184da8f4\",\"ts\":\"2026-04-17T15:38:02.493080Z\",\"duration_ms\":0.158,\"method\":\"GET\",\"path\":\"/docs\",\"query\":\"\",\"operation_id\":\"\",\"client_ip\":\"192.168.29.10\",\"user_agent\":\"kube-probe/1.31\",\"auth\":{\"scheme\":null,\"scope\":\"admin\",\"auth_enabled\":false,\"recognized\":true},\"request\":{\"headers\":{\"host\":\"10.244.112.162:8420\",\"user-agent\":\"kube-probe/1.31\",\"accept\":\"*/*\",\"connection\":\"close\"},\"request_body_size\":0,\"request_body_truncated\":false,\"request_body_kind\":\"empty\",\"request_body\":null},\"status\":200,\"response\":{\"headers\":{\"content-length\":\"936\",\"content-type\":\"text/html; charset=utf-8\",\"x-request-id\":\"b92b497dbe4f432cb4ed7726184da8f4\"},\"response_body_size\":936,\"response_body_truncated\":false,\"response_body_kind\":\"text\",\"response_body\":\"\\n    <!DOCTYPE html>\\n    <html>\\n    <head>\\n    <link type=\\\"text/css\\\" rel=\\\"stylesheet\\\" href=\\\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\\\">\\n    <link rel=\\\"shortcut icon\\\" href=\\\"https://fastapi.tiangolo.com/img/favicon.png\\\">\\n    <title>Singing Bird - Swagger UI</title>\\n    </head>\\n    <body>\\n    <div id=\\\"swagger-ui\\\">\\n    </div>\\n    <script src=\\\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\\\"></script>\\n    <!-- `SwaggerUIBundle` is now available on the page -->\\n    <script>\\n    const ui = SwaggerUIBundle({\\n        url: '/openapi.json',\\n    \\\"dom_id\\\": \\\"#swagger-ui\\\",\\n\\\"layout\\\": \\\"BaseLayout\\\",\\n\\\"deepLinking\\\": true,\\n\\\"showExtensions\\\": true,\\n\\\"showCommonExtensions\\\": true,\\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\\n    presets: [\\n        SwaggerUIBundle.presets.apis,\\n        SwaggerUIBundle.SwaggerUIStandalonePreset\\n        ],\\n    })\\n    </script>\\n    </body>\\n    </html>\\n    \",\"response_stream\":false},\"error\":null},{\"request_id\":\"8e0c45db72f740b1ad264d229026c521\",\"ts\":\"2026-04-17T15:38:02.492457Z\",\"duration_ms\":0.258,\"method\":\"GET\",\"path\":\"/docs\",\"query\":\"\",\"operation_id\":\"\",\"client_ip\":\"192.168.29.10\",\"user_agent\":\"kube-probe/1.31\",\"auth\":{\"scheme\":null,\"scope\":\"admin\",\"auth_enabled\":false,\"recognized\":true},\"request\":{\"headers\":{\"host\":\"10.244.112.162:8420\",\"user-agent\":\"kube-probe/1.31\",\"accept\":\"*/*\",\"connection\":\"close\"},\"request_body_size\":0,\"request_body_truncated\":false,\"request_body_kind\":\"empty\",\"request_body\":null},\"status\":200,\"response\":{\"headers\":{\"content-length\":\"936\",\"content-type\":\"text/html; charset=utf-8\",\"x-request-id\":\"8e0c45db72f740b1ad264d229026c521\"},\"response_body_size\":936,\"response_body_truncated\":false,\"response_body_kind\":\"text\",\"response_body\":\"\\n    <!DOCTYPE html>\\n    <html>\\n    <head>\\n    <link type=\\\"text/css\\\" rel=\\\"stylesheet\\\" href=\\\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\\\">\\n    <link rel=\\\"shortcut icon\\\" href=\\\"https://fastapi.tiangolo.com/img/favicon.png\\\">\\n    <title>Singing Bird - Swagger UI</title>\\n    </head>\\n    <body>\\n    <div id=\\\"swagger-ui\\\">\\n    </div>\\n    <script src=\\\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\\\"></script>\\n    <!-- `SwaggerUIBundle` is now available on the page -->\\n    <script>\\n    const ui = SwaggerUIBundle({\\n        url: '/openapi.json',\\n    \\\"dom_id\\\": \\\"#swagger-ui\\\",\\n\\\"layout\\\": \\\"BaseLayout\\\",\\n\\\"deepLinking\\\": true,\\n\\\"showExtensions\\\": true,\\n\\\"showCommonExtensions\\\": true,\\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\\n    presets: [\\n        SwaggerUIBundle.presets.apis,\\n        SwaggerUIBundle.SwaggerUIStandalonePreset\\n        ],\\n    })\\n    </script>\\n    </body>\\n    </html>\\n    \",\"response_stream\":false},\"error\":null},{\"request_id\":\"ebe9349af31941f6a0e97688cf1332b4\",\"ts\":\"2026-04-17T15:37:52.492900Z\",\"duration_ms\":0.243,\"method\":\"GET\",\"path\":\"/docs\",\"query\":\"\",\"operation_id\":\"\",\"client_ip\":\"192.168.29.10\",\"user_agent\":\"kube-probe/1.31\",\"auth\":{\"scheme\":null,\"scope\":\"admin\",\"auth_enabled\":false,\"recognized\":true},\"request\":{\"headers\":{\"host\":\"10.244.112.162:8420\",\"user-agent\":\"kube-probe/1.31\",\"accept\":\"*/*\",\"connection\":\"close\"},\"request_body_size\":0,\"request_body_truncated\":false,\"request_body_kind\":\"empty\",\"request_body\":null},\"status\":200,\"response\":{\"headers\":{\"content-length\":\"936\",\"content-type\":\"text/html; charset=utf-8\",\"x-request-id\":\"ebe9349af31941f6a0e97688cf1332b4\"},\"response_body_size\":936,\"response_body_truncated\":false,\"response_body_kind\":\"text\",\"response_body\":\"\\n    <!DOCTYPE html>\\n    <html>\\n    <head>\\n    <link type=\\\"text/css\\\" rel=\\\"stylesheet\\\" href=\\\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\\\">\\n    <link rel=\\\"shortcut icon\\\" href=\\\"https://fastapi.tiangolo.com/img/favicon.png\\\">\\n    <title>Singing Bird - Swagger UI</title>\\n    </head>\\n    <body>\\n    <div id=\\\"swagger-ui\\\">\\n    </div>\\n    <script src=\\\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\\\"></script>\\n    <!-- `SwaggerUIBundle` is now available on the page -->\\n    <script>\\n    const ui = SwaggerUIBundle({\\n        url: '/openapi.json',\\n    \\\"dom_id\\\": \\\"#swagger-ui\\\",\\n\\\"layout\\\": \\\"BaseLayout\\\",\\n\\\"deepLinking\\\": true,\\n\\\"showExtensions\\\": true,\\n\\\"showCommonExtensions\\\": true,\\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\\n    presets: [\\n        SwaggerUIBundle.presets.apis,\\n        SwaggerUIBundle.SwaggerUIStandalonePreset\\n        ],\\n    })\\n    </script>\\n    </body>\\n    </html>\\n    \",\"response_stream\":false},\"error\":null},{\"request_id\":\"a7bca64996f147aaa8e9f4f43c32f9ee\",\"ts\":\"2026-04-17T15:37:42.492288Z\",\"duration_ms\":0.262,\"method\":\"GET\",\"path\":\"/docs\",\"query\":\"\",\"operation_id\":\"\",\"client_ip\":\"192.168.29.10\",\"user_agent\":\"kube-probe/1.31\",\"auth\":{\"scheme\":null,\"scope\":\"admin\",\"auth_enabled\":false,\"recognized\":true},\"request\":{\"headers\":{\"host\":\"10.244.112.162:8420\",\"user-agent\":\"kube-probe/1.31\",\"accept\":\"*/*\",\"connection\":\"close\"},\"request_body_size\":0,\"request_body_truncated\":false,\"request_body_kind\":\"empty\",\"request_body\":null},\"status\":200,\"response\":{\"headers\":{\"content-length\":\"936\",\"content-type\":\"text/html; charset=utf-8\",\"x-request-id\":\"a7bca64996f147aaa8e9f4f43c32f9ee\"},\"response_body_size\":936,\"response_body_truncated\":false,\"response_body_kind\":\"text\",\"response_body\":\"\\n    <!DOCTYPE html>\\n    <html>\\n    <head>\\n    <link type=\\\"text/css\\\" rel=\\\"stylesheet\\\" href=\\\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\\\">\\n    <link rel=\\\"shortcut icon\\\" href=\\\"https://fastapi.tiangolo.com/img/favicon.png\\\">\\n    <title>Singing Bird - Swagger UI</title>\\n    </head>\\n    <body>\\n    <div id=\\\"swagger-ui\\\">\\n    </div>\\n    <script src=\\\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\\\"></script>\\n    <!-- `SwaggerUIBundle` is now available on the page -->\\n    <script>\\n    const ui = SwaggerUIBundle({\\n        url: '/openapi.json',\\n    \\\"dom_id\\\": \\\"#swagger-ui\\\",\\n\\\"layout\\\": \\\"BaseLayout\\\",\\n\\\"deepLinking\\\": true,\\n\\\"showExtensions\\\": true,\\n\\\"showCommonExtensions\\\": true,\\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\\n    presets: [\\n        SwaggerUIBundle.presets.apis,\\n        SwaggerUIBundle.SwaggerUIStandalonePreset\\n        ],\\n    })\\n    </script>\\n    </body>\\n    </html>\\n    \",\"response_stream\":false},\"error\":null},{\"request_id\":\"6eb8652fc5584e2997120df756e12cd1\",\"ts\":\"2026-04-17T15:37:32.493624Z\",\"duration_ms\":0.174,\"method\":\"GET\",\"path\":\"/docs\",\"query\":\"\",\"operation_id\":\"\",\"client_ip\":\"192.168.29.10\",\"user_agent\":\"kube-probe/1.31\",\"auth\":{\"scheme\":null,\"scope\":\"admin\",\"auth_enabled\":false,\"recognized\":true},\"request\":{\"headers\":{\"host\":\"10.244.112.162:8420\",\"user-agent\":\"kube-probe/1.31\",\"accept\":\"*/*\",\"connection\":\"close\"},\"request_body_size\":0,\"request_body_truncated\":false,\"request_body_kind\":\"empty\",\"request_body\":null},\"status\":200,\"response\":{\"headers\":{\"content-length\":\"936\",\"content-type\":\"text/html; charset=utf-8\",\"x-request-id\":\"6eb8652fc5584e2997120df756e12cd1\"},\"response_body_size\":936,\"response_body_truncated\":false,\"response_body_kind\":\"text\",\"response_body\":\"\\n    <!DOCTYPE html>\\n    <html>\\n    <head>\\n    <link type=\\\"text/css\\\" rel=\\\"stylesheet\\\" href=\\\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\\\">\\n    <link rel=\\\"shortcut icon\\\" href=\\\"https://fastapi.tiangolo.com/img/favicon.png\\\">\\n    <title>Singing Bird - Swagger UI</title>\\n    </head>\\n    <body>\\n    <div id=\\\"swagger-ui\\\">\\n    </div>\\n    <script src=\\\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\\\"></script>\\n    <!-- `SwaggerUIBundle` is now available on the page -->\\n    <script>\\n    const ui = SwaggerUIBundle({\\n        url: '/openapi.json',\\n    \\\"dom_id\\\": \\\"#swagger-ui\\\",\\n\\\"layout\\\": \\\"BaseLayout\\\",\\n\\\"deepLinking\\\": true,\\n\\\"showExtensions\\\": true,\\n\\\"showCommonExtensions\\\": true,\\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\\n    presets: [\\n        SwaggerUIBundle.presets.apis,\\n        SwaggerUIBundle.SwaggerUIStandalonePreset\\n        ],\\n    })\\n    </script>\\n    </body>\\n    </html>\\n    \",\"response_stream\":false},\"error\":null},{\"request_id\":\"6aea4a5d4584496a8277f8ca2efc7bf5\",\"ts\":\"2026-04-17T15:37:32.492946Z\",\"duration_ms\":0.265,\"method\":\"GET\",\"path\":\"/docs\",\"query\":\"\",\"operation_id\":\"\",\"client_ip\":\"192.168.29.10\",\"user_agent\":\"kube-probe/1.31\",\"auth\":{\"scheme\":null,\"scope\":\"admin\",\"auth_enabled\":false,\"recognized\":true},\"request\":{\"headers\":{\"host\":\"10.244.112.162:8420\",\"user-agent\":\"kube-probe/1.31\",\"accept\":\"*/*\",\"connection\":\"close\"},\"request_body_size\":0,\"request_body_truncated\":false,\"request_body_kind\":\"empty\",\"request_body\":null},\"status\":200,\"response\":{\"headers\":{\"content-length\":\"936\",\"content-type\":\"text/html; charset=utf-8\",\"x-request-id\":\"6aea4a5d4584496a8277f8ca2efc7bf5\"},\"response_body_size\":936,\"response_body_truncated\":false,\"response_body_kind\":\"text\",\"response_body\":\"\\n    <!DOCTYPE html>\\n    <html>\\n    <head>\\n    <link type=\\\"text/css\\\" rel=\\\"stylesheet\\\" href=\\\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\\\">\\n    <link rel=\\\"shortcut icon\\\" href=\\\"https://fastapi.tiangolo.com/img/favicon.png\\\">\\n    <title>Singing Bird - Swagger UI</title>\\n    </head>\\n    <body>\\n    <div id=\\\"swagger-ui\\\">\\n    </div>\\n    <script src=\\\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\\\"></script>\\n    <!-- `SwaggerUIBundle` is now available on the page -->\\n    <script>\\n    const ui = SwaggerUIBundle({\\n        url: '/openapi.json',\\n    \\\"dom_id\\\": \\\"#swagger-ui\\\",\\n\\\"layout\\\": \\\"BaseLayout\\\",\\n\\\"deepLinking\\\": true,\\n\\\"showExtensions\\\": true,\\n\\\"showCommonExtensions\\\": true,\\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\\n    presets: [\\n        SwaggerUIBundle.presets.apis,\\n        SwaggerUIBundle.SwaggerUIStandalonePreset\\n        ],\\n    })\\n    </script>\\n    </body>\\n    </html>\\n    \",\"response_stream\":false},\"error\":null},{\"request_id\":\"bd80e4d64b61487e94c6fb7ccd342826\",\"ts\":\"2026-04-17T15:37:22.492898Z\",\"duration_ms\":0.244,\"method\":\"GET\",\"path\":\"/docs\",\"query\":\"\",\"operation_id\":\"\",\"client_ip\":\"192.168.29.10\",\"user_agent\":\"kube-probe/1.31\",\"auth\":{\"scheme\":null,\"scope\":\"admin\",\"auth_enabled\":false,\"recognized\":true},\"request\":{\"headers\":{\"host\":\"10.244.112.162:8420\",\"user-agent\":\"kube-probe/1.31\",\"accept\":\"*/*\",\"connection\":\"close\"},\"request_body_size\":0,\"request_body_truncated\":false,\"request_body_kind\":\"empty\",\"request_body\":null},\"status\":200,\"response\":{\"headers\":{\"content-length\":\"936\",\"content-type\":\"text/html; charset=utf-8\",\"x-request-id\":\"bd80e4d64b61487e94c6fb7ccd342826\"},\"response_body_size\":936,\"response_body_truncated\":false,\"response_body_kind\":\"text\",\"response_body\":\"\\n    <!DOCTYPE html>\\n    <html>\\n    <head>\\n    <link type=\\\"text/css\\\" rel=\\\"stylesheet\\\" href=\\\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\\\">\\n    <link rel=\\\"shortcut icon\\\" href=\\\"https://fastapi.tiangolo.com/img/favicon.png\\\">\\n    <title>Singing Bird - Swagger UI</title>\\n    </head>\\n    <body>\\n    <div id=\\\"swagger-ui\\\">\\n    </div>\\n    <script src=\\\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\\\"></script>\\n    <!-- `SwaggerUIBundle` is now available on the page -->\\n    <script>\\n    const ui = SwaggerUIBundle({\\n        url: '/openapi.json',\\n    \\\"dom_id\\\": \\\"#swagger-ui\\\",\\n\\\"layout\\\": \\\"BaseLayout\\\",\\n\\\"deepLinking\\\": true,\\n\\\"showExtensions\\\": true,\\n\\\"showCommonExtensions\\\": true,\\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\\n    presets: [\\n        SwaggerUIBundle.presets.apis,\\n        SwaggerUIBundle.SwaggerUIStandalonePreset\\n        ],\\n    })\\n    </script>\\n    </body>\\n    </html>\\n    \",\"response_stream\":false},\"error\":null},{\"request_id\":\"5ae4b27c4c4e461cb1fca8909421d666\",\"ts\":\"2026-04-17T15:37:12.492810Z\",\"duration_ms\":0.242,\"method\":\"GET\",\"path\":\"/docs\",\"query\":\"\",\"operation_id\":\"\",\"client_ip\":\"192.168.29.10\",\"user_agent\":\"kube-probe/1.31\",\"auth\":{\"scheme\":null,\"scope\":\"admin\",\"auth_enabled\":false,\"recognized\":true},\"request\":{\"headers\":{\"host\":\"10.244.112.162:8420\",\"user-agent\":\"kube-probe/1.31\",\"accept\":\"*/*\",\"connection\":\"close\"},\"request_body_size\":0,\"request_body_truncated\":false,\"request_body_kind\":\"empty\",\"request_body\":null},\"status\":200,\"response\":{\"headers\":{\"content-length\":\"936\",\"content-type\":\"text/html; charset=utf-8\",\"x-request-id\":\"5ae4b27c4c4e461cb1fca8909421d666\"},\"response_body_size\":936,\"response_body_truncated\":false,\"response_body_kind\":\"text\",\"response_body\":\"\\n    <!DOCTYPE html>\\n    <html>\\n    <head>\\n    <link type=\\\"text/css\\\" rel=\\\"stylesheet\\\" href=\\\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\\\">\\n    <link rel=\\\"shortcut icon\\\" href=\\\"https://fastapi.tiangolo.com/img/favicon.png\\\">\\n    <title>Singing Bird - Swagger UI</title>\\n    </head>\\n    <body>\\n    <div id=\\\"swagger-ui\\\">\\n    </div>\\n    <script src=\\\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\\\"></script>\\n    <!-- `SwaggerUIBundle` is now available on the page -->\\n    <script>\\n    const ui = SwaggerUIBundle({\\n        url: '/openapi.json',\\n    \\\"dom_id\\\": \\\"#swagger-ui\\\",\\n\\\"layout\\\": \\\"BaseLayout\\\",\\n\\\"deepLinking\\\": true,\\n\\\"showExtensions\\\": true,\\n\\\"showCommonExtensions\\\": true,\\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\\n    presets: [\\n        SwaggerUIBundle.presets.apis,\\n        SwaggerUIBundle.SwaggerUIStandalonePreset\\n        ],\\n    })\\n    </script>\\n    </body>\\n    </html>\\n    \",\"response_stream\":false},\"error\":null},{\"request_id\":\"92601084923d45489d7168b92bc73fed\",\"ts\":\"2026-04-17T15:37:02.493744Z\",\"duration_ms\":0.122,\"method\":\"GET\",\"path\":\"/docs\",\"query\":\"\",\"operation_id\":\"\",\"client_ip\":\"192.168.29.10\",\"user_agent\":\"kube-probe/1.31\",\"auth\":{\"scheme\":null,\"scope\":\"admin\",\"auth_enabled\":false,\"recognized\":true},\"request\":{\"headers\":{\"host\":\"10.244.112.162:8420\",\"user-agent\":\"kube-probe/1.31\",\"accept\":\"*/*\",\"connection\":\"close\"},\"request_body_size\":0,\"request_body_truncated\":false,\"request_body_kind\":\"empty\",\"request_body\":null},\"status\":200,\"response\":{\"headers\":{\"content-length\":\"936\",\"content-type\":\"text/html; charset=utf-8\",\"x-request-id\":\"92601084923d45489d7168b92bc73fed\"},\"response_body_size\":936,\"response_body_truncated\":false,\"response_body_kind\":\"text\",\"response_body\":\"\\n    <!DOCTYPE html>\\n    <html>\\n    <head>\\n    <link type=\\\"text/css\\\" rel=\\\"stylesheet\\\" href=\\\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\\\">\\n    <link rel=\\\"shortcut icon\\\" href=\\\"https://fastapi.tiangolo.com/img/favicon.png\\\">\\n    <title>Singing Bird - Swagger UI</title>\\n    </head>\\n    <body>\\n    <div id=\\\"swagger-ui\\\">\\n    </div>\\n    <script src=\\\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\\\"></script>\\n    <!-- `SwaggerUIBundle` is now available on the page -->\\n    <script>\\n    const ui = SwaggerUIBundle({\\n        url: '/openapi.json',\\n    \\\"dom_id\\\": \\\"#swagger-ui\\\",\\n\\\"layout\\\": \\\"BaseLayout\\\",\\n\\\"deepLinking\\\": true,\\n\\\"showExtensions\\\": true,\\n\\\"showCommonExtensions\\\": true,\\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\\n    presets: [\\n        SwaggerUIBundle.presets.apis,\\n        SwaggerUIBundle.SwaggerUIStandalonePreset\\n        ],\\n    })\\n    </script>\\n    </body>\\n    </html>\\n    \",\"response_stream\":false},\"error\":null},{\"request_id\":\"b1901305b01b4f6581d911043bde1084\",\"ts\":\"2026-04-17T15:37:02.493118Z\",\"duration_ms\":0.27,\"method\":\"GET\",\"path\":\"/docs\",\"query\":\"\",\"operation_id\":\"\",\"client_ip\":\"192.168.29.10\",\"user_agent\":\"kube-probe/1.31\",\"auth\":{\"scheme\":null,\"scope\":\"admin\",\"auth_enabled\":false,\"recognized\":true},\"request\":{\"headers\":{\"host\":\"10.244.112.162:8420\",\"user-agent\":\"kube-probe/1.31\",\"accept\":\"*/*\",\"connection\":\"close\"},\"request_body_size\":0,\"request_body_truncated\":false,\"request_body_kind\":\"empty\",\"request_body\":null},\"status\":200,\"response\":{\"headers\":{\"content-length\":\"936\",\"content-type\":\"text/html; charset=utf-8\",\"x-request-id\":\"b1901305b01b4f6581d911043bde1084\"},\"response_body_size\":936,\"response_body_truncated\":false,\"response_body_kind\":\"text\",\"response_body\":\"\\n    <!DOCTYPE html>\\n    <html>\\n    <head>\\n    <link type=\\\"text/css\\\" rel=\\\"stylesheet\\\" href=\\\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\\\">\\n    <link rel=\\\"shortcut icon\\\" href=\\\"https://fastapi.tiangolo.com/img/favicon.png\\\">\\n    <title>Singing Bird - Swagger UI</title>\\n    </head>\\n    <body>\\n    <div id=\\\"swagger-ui\\\">\\n    </div>\\n    <script src=\\\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\\\"></script>\\n    <!-- `SwaggerUIBundle` is now available on the page -->\\n    <script>\\n    const ui = SwaggerUIBundle({\\n        url: '/openapi.json',\\n    \\\"dom_id\\\": \\\"#swagger-ui\\\",\\n\\\"layout\\\": \\\"BaseLayout\\\",\\n\\\"deepLinking\\\": true,\\n\\\"showExtensions\\\": true,\\n\\\"showCommonExtensions\\\": true,\\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\\n    presets: [\\n        SwaggerUIBundle.presets.apis,\\n        SwaggerUIBundle.SwaggerUIStandalonePreset\\n        ],\\n    })\\n    </script>\\n    </body>\\n    </html>\\n    \",\"response_stream\":false},\"error\":null},{\"request_id\":\"077e03218a424441a3a2f1afc814415b\",\"ts\":\"2026-04-17T15:36:52.493107Z\",\"duration_ms\":0.246,\"method\":\"GET\",\"path\":\"/docs\",\"query\":\"\",\"operation_id\":\"\",\"client_ip\":\"192.168.29.10\",\"user_agent\":\"kube-probe/1.31\",\"auth\":{\"scheme\":null,\"scope\":\"admin\",\"auth_enabled\":false,\"recognized\":true},\"request\":{\"headers\":{\"host\":\"10.244.112.162:8420\",\"user-agent\":\"kube-probe/1.31\",\"accept\":\"*/*\",\"connection\":\"close\"},\"request_body_size\":0,\"request_body_truncated\":false,\"request_body_kind\":\"empty\",\"request_body\":null},\"status\":200,\"response\":{\"headers\":{\"content-length\":\"936\",\"content-type\":\"text/html; charset=utf-8\",\"x-request-id\":\"077e03218a424441a3a2f1afc814415b\"},\"response_body_size\":936,\"response_body_truncated\":false,\"response_body_kind\":\"text\",\"response_body\":\"\\n    <!DOCTYPE html>\\n    <html>\\n    <head>\\n    <link type=\\\"text/css\\\" rel=\\\"stylesheet\\\" href=\\\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\\\">\\n    <link rel=\\\"shortcut icon\\\" href=\\\"https://fastapi.tiangolo.com/img/favicon.png\\\">\\n    <title>Singing Bird - Swagger UI</title>\\n    </head>\\n    <body>\\n    <div id=\\\"swagger-ui\\\">\\n    </div>\\n    <script src=\\\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\\\"></script>\\n    <!-- `SwaggerUIBundle` is now available on the page -->\\n    <script>\\n    const ui = SwaggerUIBundle({\\n        url: '/openapi.json',\\n    \\\"dom_id\\\": \\\"#swagger-ui\\\",\\n\\\"layout\\\": \\\"BaseLayout\\\",\\n\\\"deepLinking\\\": true,\\n\\\"showExtensions\\\": true,\\n\\\"showCommonExtensions\\\": true,\\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\\n    presets: [\\n        SwaggerUIBundle.presets.apis,\\n        SwaggerUIBundle.SwaggerUIStandalonePreset\\n        ],\\n    })\\n    </script>\\n    </body>\\n    </html>\\n    \",\"response_stream\":false},\"error\":null},{\"request_id\":\"01a80e4ace17494bb3560a48aa569d32\",\"ts\":\"2026-04-17T15:36:42.492671Z\",\"duration_ms\":0.274,\"method\":\"GET\",\"path\":\"/docs\",\"query\":\"\",\"operation_id\":\"\",\"client_ip\":\"192.168.29.10\",\"user_agent\":\"kube-probe/1.31\",\"auth\":{\"scheme\":null,\"scope\":\"admin\",\"auth_enabled\":false,\"recognized\":true},\"request\":{\"headers\":{\"host\":\"10.244.112.162:8420\",\"user-agent\":\"kube-probe/1.31\",\"accept\":\"*/*\",\"connection\":\"close\"},\"request_body_size\":0,\"request_body_truncated\":false,\"request_body_kind\":\"empty\",\"request_body\":null},\"status\":200,\"response\":{\"headers\":{\"content-length\":\"936\",\"content-type\":\"text/html; charset=utf-8\",\"x-request-id\":\"01a80e4ace17494bb3560a48aa569d32\"},\"response_body_size\":936,\"response_body_truncated\":false,\"response_body_kind\":\"text\",\"response_body\":\"\\n    <!DOCTYPE html>\\n    <html>\\n    <head>\\n    <link type=\\\"text/css\\\" rel=\\\"stylesheet\\\" href=\\\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\\\">\\n    <link rel=\\\"shortcut icon\\\" href=\\\"https://fastapi.tiangolo.com/img/favicon.png\\\">\\n    <title>Singing Bird - Swagger UI</title>\\n    </head>\\n    <body>\\n    <div id=\\\"swagger-ui\\\">\\n    </div>\\n    <script src=\\\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\\\"></script>\\n    <!-- `SwaggerUIBundle` is now available on the page -->\\n    <script>\\n    const ui = SwaggerUIBundle({\\n        url: '/openapi.json',\\n    \\\"dom_id\\\": \\\"#swagger-ui\\\",\\n\\\"layout\\\": \\\"BaseLayout\\\",\\n\\\"deepLinking\\\": true,\\n\\\"showExtensions\\\": true,\\n\\\"showCommonExtensions\\\": true,\\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\\n    presets: [\\n        SwaggerUIBundle.presets.apis,\\n        SwaggerUIBundle.SwaggerUIStandalonePreset\\n        ],\\n    })\\n    </script>\\n    </body>\\n    </html>\\n    \",\"response_stream\":false},\"error\":null},{\"request_id\":\"e32addc9bf2c475f9b299889ae9f6376\",\"ts\":\"2026-04-17T15:36:32.493772Z\",\"duration_ms\":0.205,\"method\":\"GET\",\"path\":\"/docs\",\"query\":\"\",\"operation_id\":\"\",\"client_ip\":\"192.168.29.10\",\"user_agent\":\"kube-probe/1.31\",\"auth\":{\"scheme\":null,\"scope\":\"admin\",\"auth_enabled\":false,\"recognized\":true},\"request\":{\"headers\":{\"host\":\"10.244.112.162:8420\",\"user-agent\":\"kube-probe/1.31\",\"accept\":\"*/*\",\"connection\":\"close\"},\"request_body_size\":0,\"request_body_truncated\":false,\"request_body_kind\":\"empty\",\"request_body\":null},\"status\":200,\"response\":{\"headers\":{\"content-length\":\"936\",\"content-type\":\"text/html; charset=utf-8\",\"x-request-id\":\"e32addc9bf2c475f9b299889ae9f6376\"},\"response_body_size\":936,\"response_body_truncated\":false,\"response_body_kind\":\"text\",\"response_body\":\"\\n    <!DOCTYPE html>\\n    <html>\\n    <head>\\n    <link type=\\\"text/css\\\" rel=\\\"stylesheet\\\" href=\\\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\\\">\\n    <link rel=\\\"shortcut icon\\\" href=\\\"https://fastapi.tiangolo.com/img/favicon.png\\\">\\n    <title>Singing Bird - Swagger UI</title>\\n    </head>\\n    <body>\\n    <div id=\\\"swagger-ui\\\">\\n    </div>\\n    <script src=\\\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\\\"></script>\\n    <!-- `SwaggerUIBundle` is now available on the page -->\\n    <script>\\n    const ui = SwaggerUIBundle({\\n        url: '/openapi.json',\\n    \\\"dom_id\\\": \\\"#swagger-ui\\\",\\n\\\"layout\\\": \\\"BaseLayout\\\",\\n\\\"deepLinking\\\": true,\\n\\\"showExtensions\\\": true,\\n\\\"showCommonExtensions\\\": true,\\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\\n    presets: [\\n        SwaggerUIBundle.presets.apis,\\n        SwaggerUIBundle.SwaggerUIStandalonePreset\\n        ],\\n    })\\n    </script>\\n    </body>\\n    </html>\\n    \",\"response_stream\":false},\"error\":null},{\"request_id\":\"21473ff4637a433fb4aa2caaec8b00b5\",\"ts\":\"2026-04-17T15:36:32.493037Z\",\"duration_ms\":0.303,\"method\":\"GET\",\"path\":\"/docs\",\"query\":\"\",\"operation_id\":\"\",\"client_ip\":\"192.168.29.10\",\"user_agent\":\"kube-probe/1.31\",\"auth\":{\"scheme\":null,\"scope\":\"admin\",\"auth_enabled\":false,\"recognized\":true},\"request\":{\"headers\":{\"host\":\"10.244.112.162:8420\",\"user-agent\":\"kube-probe/1.31\",\"accept\":\"*/*\",\"connection\":\"close\"},\"request_body_size\":0,\"request_body_truncated\":false,\"request_body_kind\":\"empty\",\"request_body\":null},\"status\":200,\"response\":{\"headers\":{\"content-length\":\"936\",\"content-type\":\"text/html; charset=utf-8\",\"x-request-id\":\"21473ff4637a433fb4aa2caaec8b00b5\"},\"response_body_size\":936,\"response_body_truncated\":false,\"response_body_kind\":\"text\",\"response_body\":\"\\n    <!DOCTYPE html>\\n    <html>\\n    <head>\\n    <link type=\\\"text/css\\\" rel=\\\"stylesheet\\\" href=\\\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\\\">\\n    <link rel=\\\"shortcut icon\\\" href=\\\"https://fastapi.tiangolo.com/img/favicon.png\\\">\\n    <title>Singing Bird - Swagger UI</title>\\n    </head>\\n    <body>\\n    <div id=\\\"swagger-ui\\\">\\n    </div>\\n    <script src=\\\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\\\"></script>\\n    <!-- `SwaggerUIBundle` is now available on the page -->\\n    <script>\\n    const ui = SwaggerUIBundle({\\n        url: '/openapi.json',\\n    \\\"dom_id\\\": \\\"#swagger-ui\\\",\\n\\\"layout\\\": \\\"BaseLayout\\\",\\n\\\"deepLinking\\\": true,\\n\\\"showExtensions\\\": true,\\n\\\"showCommonExtensions\\\": true,\\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\\n    presets: [\\n        SwaggerUIBundle.presets.apis,\\n        SwaggerUIBundle.SwaggerUIStandalonePreset\\n        ],\\n    })\\n    </script>\\n    </body>\\n    </html>\\n    \",\"response_stream\":false},\"error\":null},{\"request_id\":\"e98fec5475264f459157519beb6e0b5e\",\"ts\":\"2026-04-17T15:36:22.492802Z\",\"duration_ms\":0.313,\"method\":\"GET\",\"path\":\"/docs\",\"query\":\"\",\"operation_id\":\"\",\"client_ip\":\"192.168.29.10\",\"user_agent\":\"kube-probe/1.31\",\"auth\":{\"scheme\":null,\"scope\":\"admin\",\"auth_enabled\":false,\"recognized\":true},\"request\":{\"headers\":{\"host\":\"10.244.112.162:8420\",\"user-agent\":\"kube-probe/1.31\",\"accept\":\"*/*\",\"connection\":\"close\"},\"request_body_size\":0,\"request_body_truncated\":false,\"request_body_kind\":\"empty\",\"request_body\":null},\"status\":200,\"response\":{\"headers\":{\"content-length\":\"936\",\"content-type\":\"text/html; charset=utf-8\",\"x-request-id\":\"e98fec5475264f459157519beb6e0b5e\"},\"response_body_size\":936,\"response_body_truncated\":false,\"response_body_kind\":\"text\",\"response_body\":\"\\n    <!DOCTYPE html>\\n    <html>\\n    <head>\\n    <link type=\\\"text/css\\\" rel=\\\"stylesheet\\\" href=\\\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\\\">\\n    <link rel=\\\"shortcut icon\\\" href=\\\"https://fastapi.tiangolo.com/img/favicon.png\\\">\\n    <title>Singing Bird - Swagger UI</title>\\n    </head>\\n    <body>\\n    <div id=\\\"swagger-ui\\\">\\n    </div>\\n    <script src=\\\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\\\"></script>\\n    <!-- `SwaggerUIBundle` is now available on the page -->\\n    <script>\\n    const ui = SwaggerUIBundle({\\n        url: '/openapi.json',\\n    \\\"dom_id\\\": \\\"#swagger-ui\\\",\\n\\\"layout\\\": \\\"BaseLayout\\\",\\n\\\"deepLinking\\\": true,\\n\\\"showExtensions\\\": true,\\n\\\"showCommonExtensions\\\": true,\\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\\n    presets: [\\n        SwaggerUIBundle.presets.apis,\\n        SwaggerUIBundle.SwaggerUIStandalonePreset\\n        ],\\n    })\\n    </script>\\n    </body>\\n    </html>\\n    \",\"response_stream\":false},\"error\":null},{\"request_id\":\"c33e3e7801254345a1e61f08a8c92e55\",\"ts\":\"2026-04-17T15:36:12.493262Z\",\"duration_ms\":0.224,\"method\":\"GET\",\"path\":\"/docs\",\"query\":\"\",\"operation_id\":\"\",\"client_ip\":\"192.168.29.10\",\"user_agent\":\"kube-probe/1.31\",\"auth\":{\"scheme\":null,\"scope\":\"admin\",\"auth_enabled\":false,\"recognized\":true},\"request\":{\"headers\":{\"host\":\"10.244.112.162:8420\",\"user-agent\":\"kube-probe/1.31\",\"accept\":\"*/*\",\"connection\":\"close\"},\"request_body_size\":0,\"request_body_truncated\":false,\"request_body_kind\":\"empty\",\"request_body\":null},\"status\":200,\"response\":{\"headers\":{\"content-length\":\"936\",\"content-type\":\"text/html; charset=utf-8\",\"x-request-id\":\"c33e3e7801254345a1e61f08a8c92e55\"},\"response_body_size\":936,\"response_body_truncated\":false,\"response_body_kind\":\"text\",\"response_body\":\"\\n    <!DOCTYPE html>\\n    <html>\\n    <head>\\n    <link type=\\\"text/css\\\" rel=\\\"stylesheet\\\" href=\\\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\\\">\\n    <link rel=\\\"shortcut icon\\\" href=\\\"https://fastapi.tiangolo.com/img/favicon.png\\\">\\n    <title>Singing Bird - Swagger UI</title>\\n    </head>\\n    <body>\\n    <div id=\\\"swagger-ui\\\">\\n    </div>\\n    <script src=\\\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\\\"></script>\\n    <!-- `SwaggerUIBundle` is now available on the page -->\\n    <script>\\n    const ui = SwaggerUIBundle({\\n        url: '/openapi.json',\\n    \\\"dom_id\\\": \\\"#swagger-ui\\\",\\n\\\"layout\\\": \\\"BaseLayout\\\",\\n\\\"deepLinking\\\": true,\\n\\\"showExtensions\\\": true,\\n\\\"showCommonExtensions\\\": true,\\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\\n    presets: [\\n        SwaggerUIBundle.presets.apis,\\n        SwaggerUIBundle.SwaggerUIStandalonePreset\\n        ],\\n    })\\n    </script>\\n    </body>\\n    </html>\\n    \",\"response_stream\":false},\"error\":null},{\"request_id\":\"d253ea3d6c6d4d07b3b69a847f5d93e3\",\"ts\":\"2026-04-17T15:36:02.497031Z\",\"duration_ms\":0.223,\"method\":\"GET\",\"path\":\"/docs\",\"query\":\"\",\"operation_id\":\"\",\"client_ip\":\"192.168.29.10\",\"user_agent\":\"kube-probe/1.31\",\"auth\":{\"scheme\":null,\"scope\":\"admin\",\"auth_enabled\":false,\"recognized\":true},\"request\":{\"headers\":{\"host\":\"10.244.112.162:8420\",\"user-agent\":\"kube-probe/1.31\",\"accept\":\"*/*\",\"connection\":\"close\"},\"request_body_size\":0,\"request_body_truncated\":false,\"request_body_kind\":\"empty\",\"request_body\":null},\"status\":200,\"response\":{\"headers\":{\"content-length\":\"936\",\"content-type\":\"text/html; charset=utf-8\",\"x-request-id\":\"d253ea3d6c6d4d07b3b69a847f5d93e3\"},\"response_body_size\":936,\"response_body_truncated\":false,\"response_body_kind\":\"text\",\"response_body\":\"\\n    <!DOCTYPE html>\\n    <html>\\n    <head>\\n    <link type=\\\"text/css\\\" rel=\\\"stylesheet\\\" href=\\\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\\\">\\n    <link rel=\\\"shortcut icon\\\" href=\\\"https://fastapi.tiangolo.com/img/favicon.png\\\">\\n    <title>Singing Bird - Swagger UI</title>\\n    </head>\\n    <body>\\n    <div id=\\\"swagger-ui\\\">\\n    </div>\\n    <script src=\\\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\\\"></script>\\n    <!-- `SwaggerUIBundle` is now available on the page -->\\n    <script>\\n    const ui = SwaggerUIBundle({\\n        url: '/openapi.json',\\n    \\\"dom_id\\\": \\\"#swagger-ui\\\",\\n\\\"layout\\\": \\\"BaseLayout\\\",\\n\\\"deepLinking\\\": true,\\n\\\"showExtensions\\\": true,\\n\\\"showCommonExtensions\\\": true,\\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\\n    presets: [\\n        SwaggerUIBundle.presets.apis,\\n        SwaggerUIBundle.SwaggerUIStandalonePreset\\n        ],\\n    })\\n    </script>\\n    </body>\\n    </html>\\n    \",\"response_stream\":false},\"error\":null},{\"request_id\":\"58ac0152bd51465e963581867f0d7174\",\"ts\":\"2026-04-17T15:36:02.496145Z\",\"duration_ms\":0.376,\"method\":\"GET\",\"path\":\"/docs\",\"query\":\"\",\"operation_id\":\"\",\"client_ip\":\"192.168.29.10\",\"user_agent\":\"kube-probe/1.31\",\"auth\":{\"scheme\":null,\"scope\":\"admin\",\"auth_enabled\":false,\"recognized\":true},\"request\":{\"headers\":{\"host\":\"10.244.112.162:8420\",\"user-agent\":\"kube-probe/1.31\",\"accept\":\"*/*\",\"connection\":\"close\"},\"request_body_size\":0,\"request_body_truncated\":false,\"request_body_kind\":\"empty\",\"request_body\":null},\"status\":200,\"response\":{\"headers\":{\"content-length\":\"936\",\"content-type\":\"text/html; charset=utf-8\",\"x-request-id\":\"58ac0152bd51465e963581867f0d7174\"},\"response_body_size\":936,\"response_body_truncated\":false,\"response_body_kind\":\"text\",\"response_body\":\"\\n    <!DOCTYPE html>\\n    <html>\\n    <head>\\n    <link type=\\\"text/css\\\" rel=\\\"stylesheet\\\" href=\\\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\\\">\\n    <link rel=\\\"shortcut icon\\\" href=\\\"https://fastapi.tiangolo.com/img/favicon.png\\\">\\n    <title>Singing Bird - Swagger UI</title>\\n    </head>\\n    <body>\\n    <div id=\\\"swagger-ui\\\">\\n    </div>\\n    <script src=\\\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\\\"></script>\\n    <!-- `SwaggerUIBundle` is now available on the page -->\\n    <script>\\n    const ui = SwaggerUIBundle({\\n        url: '/openapi.json',\\n    \\\"dom_id\\\": \\\"#swagger-ui\\\",\\n\\\"layout\\\": \\\"BaseLayout\\\",\\n\\\"deepLinking\\\": true,\\n\\\"showExtensions\\\": true,\\n\\\"showCommonExtensions\\\": true,\\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\\n    presets: [\\n        SwaggerUIBundle.presets.apis,\\n        SwaggerUIBundle.SwaggerUIStandalonePreset\\n        ],\\n    })\\n    </script>\\n    </body>\\n    </html>\\n    \",\"response_stream\":false},\"error\":null},{\"request_id\":\"bda9a42ae8524af0982f450b21d1829b\",\"ts\":\"2026-04-17T15:35:58.512702Z\",\"duration_ms\":2.783,\"method\":\"GET\",\"path\":\"/v1/admin/logs\",\"query\":\"limit=4\",\"operation_id\":\"get_api_call_log_v1_admin_logs_get\",\"client_ip\":\"192.168.29.10\",\"user_agent\":\"curl/8.5.0\",\"auth\":{\"scheme\":null,\"scope\":\"admin\",\"auth_enabled\":false,\"recognized\":true},\"request\":{\"headers\":{\"host\":\"singing-bird.benac.dev\",\"user-agent\":\"curl/8.5.0\",\"accept\":\"*/*\",\"via\":\"2.0 Caddy\",\"x-forwarded-for\":\"192.168.29.10\",\"x-forwarded-host\":\"singing-bird.benac.dev\",\"x-forwarded-proto\":\"https\",\"x-real-ip\":\"192.168.29.10\",\"accept-encoding\":\"gzip\"},\"request_body_size\":0,\"request_body_truncated\":false,\"request_body_kind\":\"empty\",\"request_body\":null},\"status\":200,\"response\":{\"headers\":{\"content-length\":\"12170\",\"content-type\":\"application/json\",\"x-request-id\":\"bda9a42ae8524af0982f450b21d1829b\"},\"response_body_size\":12170,\"response_body_truncated\":false,\"response_body_kind\":\"json\",\"response_body\":{\"count\":4,\"records\":[{\"request_id\":\"df143dc04ef143f595baa0ffbc6a41be\",\"ts\":\"2026-04-17T15:35:58.282356Z\",\"duration_ms\":104.015,\"method\":\"GET\",\"path\":\"/v1/scenarios\",\"query\":\"\",\"operation_id\":\"list_scenarios_v1_scenarios_get\",\"client_ip\":\"192.168.29.10\",\"user_agent\":\"curl/8.5.0\",\"auth\":{\"scheme\":null,\"scope\":\"admin\",\"auth_enabled\":false,\"recognized\":true},\"request\":{\"headers\":{\"host\":\"singing-bird.benac.dev\",\"user-agent\":\"curl/8.5.0\",\"accept\":\"*/*\",\"via\":\"2.0 Caddy\",\"x-forwarded-for\":\"192.168.29.10\",\"x-forwarded-host\":\"singing-bird.benac.dev\",\"x-forwarded-proto\":\"https\",\"x-real-ip\":\"192.168.29.10\",\"accept-encoding\":\"gzip\"},\"request_body_size\":0,\"request_body_truncated\":false,\"request_body_kind\":\"empty\",\"request_body\":null},\"status\":200,\"response\":{\"headers\":{\"content-length\":\"1249\",\"content-type\":\"application/json\",\"x-request-id\":\"df143dc04ef143f595baa0ffbc6a41be\"},\"response_body_size\":1249,\"response_body_truncated\":false,\"response_body_kind\":\"json\",\"response_body\":{\"scenarios\":[{\"path\":\"scenarios/dockside_outpost.yaml\",\"scenario_id\":\"dockside_outpost\",\"ruleset_ref\":\"physical_social_v1\",\"chronon_interval_seconds\":240,\"random_seed\":777,\"locations\":3,\"entities\":8,\"processes\":2,\"synths\":3},{\"path\":\"scenarios/lighthouse.yaml\",\"scenario_id\":\"lighthouse\",\"ruleset_ref\":\"physical_social_v1\",\"chronon_interval_seconds\":300,\"random_seed\":42,\"locations\":4,\"entities\":12,\"processes\":2,\"synths\":3},{\"path\":\"scenarios/night_clinic.yaml\",\"scenario_id\":\"night_clinic\",\"ruleset_ref\":\"physical_social_v1\",\"chronon_interval_seconds\":180,\"random_seed\":2718,\"locations\":3,\"entities\":7,\"processes\":1,\"synths\":3},{\"path\":\"scenarios/park_bench.yaml\",\"scenario_id\":\"park_bench\",\"ruleset_ref\":\"physical_social_v1\",\"chronon_interval_seconds\":180,\"random_seed\":99,\"locations\":3,\"entities\":5,\"processes\":1,\"synths\":2},{\"path\":\"scenarios/storm_cellar.yaml\",\"scenario_id\":\"storm_cellar\",\"ruleset_ref\":\"physical_social_v1\",\"chronon_interval_seconds\":240,\"random_seed\":314,\"locations\":3,\"entities\":8,\"processes\":2,\"synths\":3},{\"path\":\"scenarios/workshop_blackout.yaml\",\"scenario_id\":\"workshop_blackout\",\"ruleset_ref\":\"physical_social_v1\",\"chronon_interval_seconds\":240,\"random_seed\":123,\"locations\":3,\"entities\":8,\"processes\":2,\"synths\":3}]},\"response_stream\":false},\"error\":null},{\"request_id\":\"86d7ccef5c2a4db5bc1b3fe9e7ca8383\",\"ts\":\"2026-04-17T15:35:58.400328Z\",\"duration_ms\":33.589,\"method\":\"GET\",\"path\":\"/v1/sessions/not-real\",\"query\":\"\",\"operation_id\":\"get_session_v1_sessions__session_id__get\",\"client_ip\":\"192.168.29.10\",\"user_agent\":\"curl/8.5.0\",\"auth\":{\"scheme\":null,\"scope\":\"admin\",\"auth_enabled\":false,\"recognized\":true},\"request\":{\"headers\":{\"host\":\"singing-bird.benac.dev\",\"user-agent\":\"curl/8.5.0\",\"accept\":\"*/*\",\"via\":\"2.0 Caddy\",\"x-forwarded-for\":\"192.168.29.10\",\"x-forwarded-host\":\"singing-bird.benac.dev\",\"x-forwarded-proto\":\"https\",\"x-real-ip\":\"192.168.29.10\",\"accept-encoding\":\"gzip\"},\"request_body_size\":0,\"request_body_truncated\":false,\"request_body_kind\":\"empty\",\"request_body\":null},\"status\":404,\"response\":{\"headers\":{\"content-length\":\"30\",\"content-type\":\"application/json\",\"x-request-id\":\"86d7ccef5c2a4db5bc1b3fe9e7ca8383\"},\"response_body_size\":30,\"response_body_truncated\":false,\"response_body_kind\":\"json\",\"response_body\":{\"detail\":\"Session not found\"},\"response_stream\":false},\"error\":null},{\"type\":\"mcp_call\",\"request_id\":null,\"ts\":\"2026-04-17T15:35:58.499348Z\",\"duration_ms\":50.906,\"mcp_method\":\"tools/list\",\"mcp_id\":1,\"tool_name\":null,\"arguments\":null,\"is_error\":false,\"result_text_size\":0,\"error\":null},{\"request_id\":\"bfd39f45ccbd4ce29c8db48a2cc81e98\",\"ts\":\"2026-04-17T15:35:58.448239Z\",\"duration_ms\":51.495,\"method\":\"POST\",\"path\":\"/mcp\",\"query\":\"\",\"operation_id\":\"mcp_post_mcp_post\",\"client_ip\":\"192.168.29.10\",\"user_agent\":\"curl/8.5.0\",\"auth\":{\"scheme\":null,\"scope\":\"admin\",\"auth_enabled\":false,\"recognized\":true},\"request\":{\"headers\":{\"host\":\"singing-bird.benac.dev\",\"user-agent\":\"curl/8.5.0\",\"content-length\":\"58\",\"accept\":\"*/*\",\"content-type\":\"application/json\",\"via\":\"2.0 Caddy\",\"x-forwarded-for\":\"192.168.29.10\",\"x-forwarded-host\":\"singing-bird.benac.dev\",\"x-forwarded-proto\":\"https\",\"x-real-ip\":\"192.168.29.10\",\"accept-encoding\":\"gzip\"},\"request_body_size\":58,\"request_body_truncated\":false,\"request_body_kind\":\"json\",\"request_body\":{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"tools/list\",\"params\":{}}},\"status\":200,\"response\":{\"headers\":{\"content-length\":\"7559\",\"content-type\":\"application/json\",\"x-request-id\":\"bfd39f45ccbd4ce29c8db48a2cc81e98\"},\"response_body_size\":7559,\"response_body_truncated\":false,\"response_body_kind\":\"json\",\"response_body\":{\"jsonrpc\":\"2.0\",\"id\":1,\"result\":{\"tools\":[{\"name\":\"apply_patch\",\"description\":\"Apply Patch\",\"inputSchema\":{\"type\":\"object\",\"properties\":{\"session_id\":{\"type\":\"string\",\"title\":\"Session Id\"},\"operations\":{\"items\":{\"properties\":{\"op\":{\"type\":\"string\",\"title\":\"Op\"},\"entity_ref\":{\"type\":\"string\",\"title\":\"Entity Ref\"},\"destination_ref\":{\"type\":\"string\",\"title\":\"Destination Ref\"},\"location_ref\":{\"type\":\"string\",\"title\":\"Location Ref\"},\"synth_ref\":{\"type\":\"string\",\"title\":\"Synth Ref\"},\"name\":{\"type\":\"string\",\"title\":\"Name\"},\"description\":{\"type\":\"string\",\"title\":\"Description\"},\"mobility\":{\"type\":\"string\",\"title\":\"Mobility\"},\"components\":{\"items\":{\"type\":\"object\"},\"type\":\"array\",\"title\":\"Components\"},\"component_type\":{\"type\":\"string\",\"title\":\"Component Type\"},\"property\":{\"type\":\"string\",\"title\":\"Property\"},\"value\":{\"title\":\"Value\"},\"field_path\":{\"type\":\"string\",\"title\":\"Field Path\"},\"subject\":{\"type\":\"string\",\"title\":\"Subject\"},\"predicate\":{\"type\":\"string\",\"title\":\"Predicate\"},\"content\":{\"type\":\"string\",\"title\":\"Content\"},\"confidence\":{\"type\":\"number\",\"title\":\"Confidence\"},\"source_modality\":{\"type\":\"string\",\"title\":\"Source Modality\"},\"source_agent\":{\"type\":\"string\",\"title\":\"Source Agent\"},\"memory_type\":{\"type\":\"string\",\"title\":\"Memory Type\"},\"salience\":{\"type\":\"number\",\"title\":\"Salience\"},\"mood\":{\"type\":\"string\",\"title\":\"Mood\"},\"valence\":{\"type\":\"number\",\"title\":\"Valence\"},\"arousal\":{\"type\":\"number\",\"title\":\"Arousal\"},\"stress\":{\"type\":\"number\",\"title\":\"Stress\"}},\"type\":\"object\",\"required\":[\"op\"],\"title\":\"PatchOperation\"},\"type\":\"array\",\"title\":\"Operations\"},\"mode\":{\"type\":\"string\",\"title\":\"Mode\",\"default\":\"commit\"},\"idempotency_key\":{\"type\":\"string\",\"title\":\"Idempotency Key\"}},\"required\":[\"session_id\",\"operations\"]}},{\"name\":\"close_session\",\"description\":\"Close Session\",\"inputSchema\":{\"type\":\"object\",\"properties\":{\"session_id\":{\"type\":\"string\",\"title\":\"Session Id\"}},\"required\":[\"session_id\"]}},{\"name\":\"create_session\",\"description\":\"Create Session\",\"inputSchema\":{\"type\":\"object\",\"properties\":{\"scenario_path\":{\"type\":\"string\",\"title\":\"Scenario Path\"}},\"required\":[\"scenario_path\"]}},{\"name\":\"get_api_call_log_v1_admin_logs_get\",\"description\":\"Tail the API request/response audit log.\\n\\nEvery HTTP request (REST, MCP, dashboard) produces one JSONL record at\\ndata/audit/api_calls.jsonl. Each record carries a request_id that is\\nalso returned in the X-Request-Id response header for correlation.\",\"inputSchema\":{\"type\":\"object\",\"properties\":{\"limit\":{\"type\":\"integer\",\"title\":\"Limit\",\"default\":100},\"since_ts\":{\"type\":\"string\",\"title\":\"Since Ts\"}},\"required\":[]}},{\"name\":\"get_changes\",\"description\":\"Get Changes\",\"inputSchema\":{\"type\":\"object\",\"properties\":{\"session_id\":{\"type\":\"string\",\"title\":\"Session Id\"},\"since\":{\"type\":\"integer\",\"title\":\"Since\",\"default\":0},\"snapshot_ref\":{\"type\":\"string\",\"title\":\"Snapshot Ref\"}},\"required\":[\"session_id\"]}},{\"name\":\"get_events\",\"description\":\"Get Events\",\"inputSchema\":{\"type\":\"object\",\"properties\":{\"session_id\":{\"type\":\"string\",\"title\":\"Session Id\"},\"since\":{\"type\":\"integer\",\"title\":\"Since\",\"default\":0},\"limit\":{\"type\":\"integer\",\"title\":\"Limit\",\"default\":50}},\"required\":[\"session_id\"]}},{\"name\":\"get_last_cycle_report\",\"description\":\"Get Last Cycle Report\",\"inputSchema\":{\"type\":\"object\",\"properties\":{\"session_id\":{\"type\":\"string\",\"title\":\"Session Id\"}},\"required\":[\"session_id\"]}},{\"name\":\"get_object\",\"description\":\"Get Object\",\"inputSchema\":{\"type\":\"object\",\"properties\":{\"session_id\":{\"type\":\"string\",\"title\":\"Session Id\"},\"kind\":{\"type\":\"string\",\"title\":\"Kind\"},\"ref\":{\"type\":\"string\",\"title\":\"Ref\"},\"view\":{\"type\":\"string\",\"title\":\"View\",\"default\":\"both\"}},\"required\":[\"session_id\",\"kind\",\"ref\"]}},{\"name\":\"get_overview\",\"description\":\"Get Overview\",\"inputSchema\":{\"type\":\"object\",\"properties\":{\"session_id\":{\"type\":\"string\",\"title\":\"Session Id\"}},\"required\":[\"session_id\"]}},{\"name\":\"get_report_since\",\"description\":\"Report of everything that happened since a sequence cursor.\",\"inputSchema\":{\"type\":\"object\",\"properties\":{\"session_id\":{\"type\":\"string\",\"title\":\"Session Id\"},\"since\":{\"type\":\"integer\",\"title\":\"Since\",\"default\":0}},\"required\":[\"session_id\"]}},{\"name\":\"get_session\",\"description\":\"Get Session\",\"inputSchema\":{\"type\":\"object\",\"properties\":{\"session_id\":{\"type\":\"string\",\"title\":\"Session Id\"}},\"required\":[\"session_id\"]}},{\"name\":\"get_tool_manifest\",\"description\":\"Tool manifest generated from the OpenAPI schema. Schema is source of truth.\",\"inputSchema\":{\"type\":\"object\",\"properties\":{},\"required\":[]}},{\"name\":\"list_scenarios\",\"description\":\"List scenario packs available on disk (metadata only, no world load).\",\"inputSchema\":{\"type\":\"object\",\"properties\":{},\"required\":[]}},{\"name\":\"list_sessions\",\"description\":\"List Sessions\",\"inputSchema\":{\"type\":\"object\",\"properties\":{},\"required\":[]}},{\"name\":\"list_snapshots\",\"description\":\"List Snapshots\",\"inputSchema\":{\"type\":\"object\",\"properties\":{\"session_id\":{\"type\":\"string\",\"title\":\"Session Id\"}},\"required\":[\"session_id\"]}},{\"name\":\"pause_session\",\"description\":\"Pause Session\",\"inputSchema\":{\"type\":\"object\",\"properties\":{\"session_id\":{\"type\":\"string\",\"title\":\"Session Id\"}},\"required\":[\"session_id\"]}},{\"name\":\"queue_stimulus\",\"description\":\"Queue an external stimulus for delivery through the perception path.\\n\\nStimuli are mediated: they enter through compose_sensory_bundle on the\\nnext step or turn, not by scribbling into synth state directly.\",\"inputSchema\":{\"type\":\"object\",\"properties\":{\"session_id\":{\"type\":\"string\",\"title\":\"Session Id\"},\"target_synth_refs\":{\"items\":{\"type\":\"string\"},\"type\":\"array\",\"title\":\"Target Synth Refs\",\"default\":[]},\"channel\":{\"type\":\"string\",\"title\":\"Channel\",\"default\":\"auditory\"},\"content\":{\"type\":\"string\",\"title\":\"Content\"},\"source\":{\"type\":\"string\",\"title\":\"Source\",\"default\":\"external\"},\"source_agent\":{\"type\":\"string\",\"title\":\"Source Agent\",\"default\":\"director\"},\"salience\":{\"type\":\"number\",\"title\":\"Salience\",\"default\":0.8},\"delivery\":{\"type\":\"string\",\"title\":\"Delivery\",\"default\":\"next_cycle\"},\"idempotency_key\":{\"type\":\"string\",\"title\":\"Idempotency Key\"}},\"required\":[\"session_id\",\"content\"]}},{\"name\":\"resolve_ref\",\"description\":\"Resolve Ref\",\"inputSchema\":{\"type\":\"object\",\"properties\":{\"session_id\":{\"type\":\"string\",\"title\":\"Session Id\"},\"q\":{\"type\":\"string\",\"title\":\"Q\"},\"kind\":{\"type\":\"string\",\"title\":\"Kind\"}},\"required\":[\"session_id\",\"q\"]}},{\"name\":\"restore_snapshot\",\"description\":\"Restore Snapshot\",\"inputSchema\":{\"type\":\"object\",\"properties\":{\"session_id\":{\"type\":\"string\",\"title\":\"Session Id\"},\"snapshot_ref\":{\"type\":\"string\",\"title\":\"Snapshot Ref\"},\"idempotency_key\":{\"type\":\"string\",\"title\":\"Idempotency Key\"}},\"required\":[\"session_id\",\"snapshot_ref\"]}},{\"name\":\"resume_session\",\"description\":\"Resume Session\",\"inputSchema\":{\"type\":\"object\",\"properties\":{\"session_id\":{\"type\":\"string\",\"title\":\"Session Id\"}},\"required\":[\"session_id\"]}},{\"name\":\"step_session\",\"description\":\"Step Session\",\"inputSchema\":{\"type\":\"object\",\"properties\":{\"session_id\":{\"type\":\"string\",\"title\":\"Session Id\"},\"n\":{\"type\":\"integer\",\"title\":\"N\",\"default\":1},\"idempotency_key\":{\"type\":\"string\",\"title\":\"Idempotency Key\"}},\"required\":[\"session_id\"]}},{\"name\":\"submit_turn\",\"description\":\"Submit Turn\",\"inputSchema\":{\"type\":\"object\",\"properties\":{\"session_id\":{\"type\":\"string\",\"title\":\"Session Id\"},\"origin_type\":{\"type\":\"string\",\"title\":\"Origin Type\",\"default\":\"human\"},\"origin_ref\":{\"type\":\"string\",\"title\":\"Origin Ref\"},\"payload\":{\"type\":\"object\",\"title\":\"Payload\",\"default\":{}},\"idempotency_key\":{\"type\":\"string\",\"title\":\"Idempotency Key\"}},\"required\":[\"session_id\"]}}]}},\"response_stream\":false},\"error\":null}]},\"response_stream\":false},\"error\":null},{\"request_id\":\"bfd39f45ccbd4ce29c8db48a2cc81e98\",\"ts\":\"2026-04-17T15:35:58.448239Z\",\"duration_ms\":51.495,\"method\":\"POST\",\"path\":\"/mcp\",\"query\":\"\",\"operation_id\":\"mcp_post_mcp_post\",\"client_ip\":\"192.168.29.10\",\"user_agent\":\"curl/8.5.0\",\"auth\":{\"scheme\":null,\"scope\":\"admin\",\"auth_enabled\":false,\"recognized\":true},\"request\":{\"headers\":{\"host\":\"singing-bird.benac.dev\",\"user-agent\":\"curl/8.5.0\",\"content-length\":\"58\",\"accept\":\"*/*\",\"content-type\":\"application/json\",\"via\":\"2.0 Caddy\",\"x-forwarded-for\":\"192.168.29.10\",\"x-forwarded-host\":\"singing-bird.benac.dev\",\"x-forwarded-proto\":\"https\",\"x-real-ip\":\"192.168.29.10\",\"accept-encoding\":\"gzip\"},\"request_body_size\":58,\"request_body_truncated\":false,\"request_body_kind\":\"json\",\"request_body\":{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"tools/list\",\"params\":{}}},\"status\":200,\"response\":{\"headers\":{\"content-length\":\"7559\",\"content-type\":\"application/json\",\"x-request-id\":\"bfd39f45ccbd4ce29c8db48a2cc81e98\"},\"response_body_size\":7559,\"response_body_truncated\":false,\"response_body_kind\":\"json\",\"response_body\":{\"jsonrpc\":\"2.0\",\"id\":1,\"result\":{\"tools\":[{\"name\":\"apply_patch\",\"description\":\"Apply Patch\",\"inputSchema\":{\"type\":\"object\",\"properties\":{\"session_id\":{\"type\":\"string\",\"title\":\"Session Id\"},\"operations\":{\"items\":{\"properties\":{\"op\":{\"type\":\"string\",\"title\":\"Op\"},\"entity_ref\":{\"type\":\"string\",\"title\":\"Entity Ref\"},\"destination_ref\":{\"type\":\"string\",\"title\":\"Destination Ref\"},\"location_ref\":{\"type\":\"string\",\"title\":\"Location Ref\"},\"synth_ref\":{\"type\":\"string\",\"title\":\"Synth Ref\"},\"name\":{\"type\":\"string\",\"title\":\"Name\"},\"description\":{\"type\":\"string\",\"title\":\"Description\"},\"mobility\":{\"type\":\"string\",\"title\":\"Mobility\"},\"components\":{\"items\":{\"type\":\"object\"},\"type\":\"array\",\"title\":\"Components\"},\"component_type\":{\"type\":\"string\",\"title\":\"Component Type\"},\"property\":{\"type\":\"string\",\"title\":\"Property\"},\"value\":{\"title\":\"Value\"},\"field_path\":{\"type\":\"string\",\"title\":\"Field Path\"},\"subject\":{\"type\":\"string\",\"title\":\"Subject\"},\"predicate\":{\"type\":\"string\",\"title\":\"Predicate\"},\"content\":{\"type\":\"string\",\"title\":\"Content\"},\"confidence\":{\"type\":\"number\",\"title\":\"Confidence\"},\"source_modality\":{\"type\":\"string\",\"title\":\"Source Modality\"},\"source_agent\":{\"type\":\"string\",\"title\":\"Source Agent\"},\"memory_type\":{\"type\":\"string\",\"title\":\"Memory Type\"},\"salience\":{\"type\":\"number\",\"title\":\"Salience\"},\"mood\":{\"type\":\"string\",\"title\":\"Mood\"},\"valence\":{\"type\":\"number\",\"title\":\"Valence\"},\"arousal\":{\"type\":\"number\",\"title\":\"Arousal\"},\"stress\":{\"type\":\"number\",\"title\":\"Stress\"}},\"type\":\"object\",\"required\":[\"op\"],\"title\":\"PatchOperation\"},\"type\":\"array\",\"title\":\"Operations\"},\"mode\":{\"type\":\"string\",\"title\":\"Mode\",\"default\":\"commit\"},\"idempotency_key\":{\"type\":\"string\",\"title\":\"Idempotency Key\"}},\"required\":[\"session_id\",\"operations\"]}},{\"name\":\"close_session\",\"description\":\"Close Session\",\"inputSchema\":{\"type\":\"object\",\"properties\":{\"session_id\":{\"type\":\"string\",\"title\":\"Session Id\"}},\"required\":[\"session_id\"]}},{\"name\":\"create_session\",\"description\":\"Create Session\",\"inputSchema\":{\"type\":\"object\",\"properties\":{\"scenario_path\":{\"type\":\"string\",\"title\":\"Scenario Path\"}},\"required\":[\"scenario_path\"]}},{\"name\":\"get_api_call_log_v1_admin_logs_get\",\"description\":\"Tail the API request/response audit log.\\n\\nEvery HTTP request (REST, MCP, dashboard) produces one JSONL record at\\ndata/audit/api_calls.jsonl. Each record carries a request_id that is\\nalso returned in the X-Request-Id response header for correlation.\",\"inputSchema\":{\"type\":\"object\",\"properties\":{\"limit\":{\"type\":\"integer\",\"title\":\"Limit\",\"default\":100},\"since_ts\":{\"type\":\"string\",\"title\":\"Since Ts\"}},\"required\":[]}},{\"name\":\"get_changes\",\"description\":\"Get Changes\",\"inputSchema\":{\"type\":\"object\",\"properties\":{\"session_id\":{\"type\":\"string\",\"title\":\"Session Id\"},\"since\":{\"type\":\"integer\",\"title\":\"Since\",\"default\":0},\"snapshot_ref\":{\"type\":\"string\",\"title\":\"Snapshot Ref\"}},\"required\":[\"session_id\"]}},{\"name\":\"get_events\",\"description\":\"Get Events\",\"inputSchema\":{\"type\":\"object\",\"properties\":{\"session_id\":{\"type\":\"string\",\"title\":\"Session Id\"},\"since\":{\"type\":\"integer\",\"title\":\"Since\",\"default\":0},\"limit\":{\"type\":\"integer\",\"title\":\"Limit\",\"default\":50}},\"required\":[\"session_id\"]}},{\"name\":\"get_last_cycle_report\",\"description\":\"Get Last Cycle Report\",\"inputSchema\":{\"type\":\"object\",\"properties\":{\"session_id\":{\"type\":\"string\",\"title\":\"Session Id\"}},\"required\":[\"session_id\"]}},{\"name\":\"get_object\",\"description\":\"Get Object\",\"inputSchema\":{\"type\":\"object\",\"properties\":{\"session_id\":{\"type\":\"string\",\"title\":\"Session Id\"},\"kind\":{\"type\":\"string\",\"title\":\"Kind\"},\"ref\":{\"type\":\"string\",\"title\":\"Ref\"},\"view\":{\"type\":\"string\",\"title\":\"View\",\"default\":\"both\"}},\"required\":[\"session_id\",\"kind\",\"ref\"]}},{\"name\":\"get_overview\",\"description\":\"Get Overview\",\"inputSchema\":{\"type\":\"object\",\"properties\":{\"session_id\":{\"type\":\"string\",\"title\":\"Session Id\"}},\"required\":[\"session_id\"]}},{\"name\":\"get_report_since\",\"description\":\"Report of everything that happened since a sequence cursor.\",\"inputSchema\":{\"type\":\"object\",\"properties\":{\"session_id\":{\"type\":\"string\",\"title\":\"Session Id\"},\"since\":{\"type\":\"integer\",\"title\":\"Since\",\"default\":0}},\"required\":[\"session_id\"]}},{\"name\":\"get_session\",\"description\":\"Get Session\",\"inputSchema\":{\"type\":\"object\",\"properties\":{\"session_id\":{\"type\":\"string\",\"title\":\"Session Id\"}},\"required\":[\"session_id\"]}},{\"name\":\"get_tool_manifest\",\"description\":\"Tool manifest generated from the OpenAPI schema. Schema is source of truth.\",\"inputSchema\":{\"type\":\"object\",\"properties\":{},\"required\":[]}},{\"name\":\"list_scenarios\",\"description\":\"List scenario packs available on disk (metadata only, no world load).\",\"inputSchema\":{\"type\":\"object\",\"properties\":{},\"required\":[]}},{\"name\":\"list_sessions\",\"description\":\"List Sessions\",\"inputSchema\":{\"type\":\"object\",\"properties\":{},\"required\":[]}},{\"name\":\"list_snapshots\",\"description\":\"List Snapshots\",\"inputSchema\":{\"type\":\"object\",\"properties\":{\"session_id\":{\"type\":\"string\",\"title\":\"Session Id\"}},\"required\":[\"session_id\"]}},{\"name\":\"pause_session\",\"description\":\"Pause Session\",\"inputSchema\":{\"type\":\"object\",\"properties\":{\"session_id\":{\"type\":\"string\",\"title\":\"Session Id\"}},\"required\":[\"session_id\"]}},{\"name\":\"queue_stimulus\",\"description\":\"Queue an external stimulus for delivery through the perception path.\\n\\nStimuli are mediated: they enter through compose_sensory_bundle on the\\nnext step or turn, not by scribbling into synth state directly.\",\"inputSchema\":{\"type\":\"object\",\"properties\":{\"session_id\":{\"type\":\"string\",\"title\":\"Session Id\"},\"target_synth_refs\":{\"items\":{\"type\":\"string\"},\"type\":\"array\",\"title\":\"Target Synth Refs\",\"default\":[]},\"channel\":{\"type\":\"string\",\"title\":\"Channel\",\"default\":\"auditory\"},\"content\":{\"type\":\"string\",\"title\":\"Content\"},\"source\":{\"type\":\"string\",\"title\":\"Source\",\"default\":\"external\"},\"source_agent\":{\"type\":\"string\",\"title\":\"Source Agent\",\"default\":\"director\"},\"salience\":{\"type\":\"number\",\"title\":\"Salience\",\"default\":0.8},\"delivery\":{\"type\":\"string\",\"title\":\"Delivery\",\"default\":\"next_cycle\"},\"idempotency_key\":{\"type\":\"string\",\"title\":\"Idempotency Key\"}},\"required\":[\"session_id\",\"content\"]}},{\"name\":\"resolve_ref\",\"description\":\"Resolve Ref\",\"inputSchema\":{\"type\":\"object\",\"properties\":{\"session_id\":{\"type\":\"string\",\"title\":\"Session Id\"},\"q\":{\"type\":\"string\",\"title\":\"Q\"},\"kind\":{\"type\":\"string\",\"title\":\"Kind\"}},\"required\":[\"session_id\",\"q\"]}},{\"name\":\"restore_snapshot\",\"description\":\"Restore Snapshot\",\"inputSchema\":{\"type\":\"object\",\"properties\":{\"session_id\":{\"type\":\"string\",\"title\":\"Session Id\"},\"snapshot_ref\":{\"type\":\"string\",\"title\":\"Snapshot Ref\"},\"idempotency_key\":{\"type\":\"string\",\"title\":\"Idempotency Key\"}},\"required\":[\"session_id\",\"snapshot_ref\"]}},{\"name\":\"resume_session\",\"description\":\"Resume Session\",\"inputSchema\":{\"type\":\"object\",\"properties\":{\"session_id\":{\"type\":\"string\",\"title\":\"Session Id\"}},\"required\":[\"session_id\"]}},{\"name\":\"step_session\",\"description\":\"Step Session\",\"inputSchema\":{\"type\":\"object\",\"properties\":{\"session_id\":{\"type\":\"string\",\"title\":\"Session Id\"},\"n\":{\"type\":\"integer\",\"title\":\"N\",\"default\":1},\"idempotency_key\":{\"type\":\"string\",\"title\":\"Idempotency Key\"}},\"required\":[\"session_id\"]}},{\"name\":\"submit_turn\",\"description\":\"Submit Turn\",\"inputSchema\":{\"type\":\"object\",\"properties\":{\"session_id\":{\"type\":\"string\",\"title\":\"Session Id\"},\"origin_type\":{\"type\":\"string\",\"title\":\"Origin Type\",\"default\":\"human\"},\"origin_ref\":{\"type\":\"string\",\"title\":\"Origin Ref\"},\"payload\":{\"type\":\"object\",\"title\":\"Payload\",\"default\":{}},\"idempotency_key\":{\"type\":\"string\",\"title\":\"Idempotency Key\"}},\"required\":[\"session_id\"]}}]}},\"response_stream\":false},\"error\":null},{\"type\":\"mcp_call\",\"request_id\":null,\"ts\":\"2026-04-17T15:35:58.499348Z\",\"duration_ms\":50.906,\"mcp_method\":\"tools/list\",\"mcp_id\":1,\"tool_name\":null,\"arguments\":null,\"is_error\":false,\"result_text_size\":0,\"error\":null},{\"request_id\":\"86d7ccef5c2a4db5bc1b3fe9e7ca8383\",\"ts\":\"2026-04-17T15:35:58.400328Z\",\"duration_ms\":33.589,\"method\":\"GET\",\"path\":\"/v1/sessions/not-real\",\"query\":\"\",\"operation_id\":\"get_session_v1_sessions__session_id__get\",\"client_ip\":\"192.168.29.10\",\"user_agent\":\"curl/8.5.0\",\"auth\":{\"scheme\":null,\"scope\":\"admin\",\"auth_enabled\":false,\"recognized\":true},\"request\":{\"headers\":{\"host\":\"singing-bird.benac.dev\",\"user-agent\":\"curl/8.5.0\",\"accept\":\"*/*\",\"via\":\"2.0 Caddy\",\"x-forwarded-for\":\"192.168.29.10\",\"x-forwarded-host\":\"singing-bird.benac.dev\",\"x-forwarded-proto\":\"https\",\"x-real-ip\":\"192.168.29.10\",\"accept-encoding\":\"gzip\"},\"request_body_size\":0,\"request_body_truncated\":false,\"request_body_kind\":\"empty\",\"request_body\":null},\"status\":404,\"response\":{\"headers\":{\"content-length\":\"30\",\"content-type\":\"application/json\",\"x-request-id\":\"86d7ccef5c2a4db5bc1b3fe9e7ca8383\"},\"response_body_size\":30,\"response_body_truncated\":false,\"response_body_kind\":\"json\",\"response_body\":{\"detail\":\"Session not found\"},\"response_stream\":false},\"error\":null},{\"request_id\":\"df143dc04ef143f595baa0ffbc6a41be\",\"ts\":\"2026-04-17T15:35:58.282356Z\",\"duration_ms\":104.015,\"method\":\"GET\",\"path\":\"/v1/scenarios\",\"query\":\"\",\"operation_id\":\"list_scenarios_v1_scenarios_get\",\"client_ip\":\"192.168.29.10\",\"user_agent\":\"curl/8.5.0\",\"auth\":{\"scheme\":null,\"scope\":\"admin\",\"auth_enabled\":false,\"recognized\":true},\"request\":{\"headers\":{\"host\":\"singing-bird.benac.dev\",\"user-agent\":\"curl/8.5.0\",\"accept\":\"*/*\",\"via\":\"2.0 Caddy\",\"x-forwarded-for\":\"192.168.29.10\",\"x-forwarded-host\":\"singing-bird.benac.dev\",\"x-forwarded-proto\":\"https\",\"x-real-ip\":\"192.168.29.10\",\"accept-encoding\":\"gzip\"},\"request_body_size\":0,\"request_body_truncated\":false,\"request_body_kind\":\"empty\",\"request_body\":null},\"status\":200,\"response\":{\"headers\":{\"content-length\":\"1249\",\"content-type\":\"application/json\",\"x-request-id\":\"df143dc04ef143f595baa0ffbc6a41be\"},\"response_body_size\":1249,\"response_body_truncated\":false,\"response_body_kind\":\"json\",\"response_body\":{\"scenarios\":[{\"path\":\"scenarios/dockside_outpost.yaml\",\"scenario_id\":\"dockside_outpost\",\"ruleset_ref\":\"physical_social_v1\",\"chronon_interval_seconds\":240,\"random_seed\":777,\"locations\":3,\"entities\":8,\"processes\":2,\"synths\":3},{\"path\":\"scenarios/lighthouse.yaml\",\"scenario_id\":\"lighthouse\",\"ruleset_ref\":\"physical_social_v1\",\"chronon_interval_seconds\":300,\"random_seed\":42,\"locations\":4,\"entities\":12,\"processes\":2,\"synths\":3},{\"path\":\"scenarios/night_clinic.yaml\",\"scenario_id\":\"night_clinic\",\"ruleset_ref\":\"physical_social_v1\",\"chronon_interval_seconds\":180,\"random_seed\":2718,\"locations\":3,\"entities\":7,\"processes\":1,\"synths\":3},{\"path\":\"scenarios/park_bench.yaml\",\"scenario_id\":\"park_bench\",\"ruleset_ref\":\"physical_social_v1\",\"chronon_interval_seconds\":180,\"random_seed\":99,\"locations\":3,\"entities\":5,\"processes\":1,\"synths\":2},{\"path\":\"scenarios/storm_cellar.yaml\",\"scenario_id\":\"storm_cellar\",\"ruleset_ref\":\"physical_social_v1\",\"chronon_interval_seconds\":240,\"random_seed\":314,\"locations\":3,\"entities\":8,\"processes\":2,\"synths\":3},{\"path\":\"scenarios/workshop_blackout.yaml\",\"scenario_id\":\"workshop_blackout\",\"ruleset_ref\":\"physical_social_v1\",\"chronon_interval_seconds\":240,\"random_seed\":123,\"locations\":3,\"entities\":8,\"processes\":2,\"synths\":3}]},\"response_stream\":false},\"error\":null},{\"request_id\":\"b42a5a73ebbb440b834777303d3fbabd\",\"ts\":\"2026-04-17T15:35:52.493035Z\",\"duration_ms\":0.31,\"method\":\"GET\",\"path\":\"/docs\",\"query\":\"\",\"operation_id\":\"\",\"client_ip\":\"192.168.29.10\",\"user_agent\":\"kube-probe/1.31\",\"auth\":{\"scheme\":null,\"scope\":\"admin\",\"auth_enabled\":false,\"recognized\":true},\"request\":{\"headers\":{\"host\":\"10.244.112.162:8420\",\"user-agent\":\"kube-probe/1.31\",\"accept\":\"*/*\",\"connection\":\"close\"},\"request_body_size\":0,\"request_body_truncated\":false,\"request_body_kind\":\"empty\",\"request_body\":null},\"status\":200,\"response\":{\"headers\":{\"content-length\":\"936\",\"content-type\":\"text/html; charset=utf-8\",\"x-request-id\":\"b42a5a73ebbb440b834777303d3fbabd\"},\"response_body_size\":936,\"response_body_truncated\":false,\"response_body_kind\":\"text\",\"response_body\":\"\\n    <!DOCTYPE html>\\n    <html>\\n    <head>\\n    <link type=\\\"text/css\\\" rel=\\\"stylesheet\\\" href=\\\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\\\">\\n    <link rel=\\\"shortcut icon\\\" href=\\\"https://fastapi.tiangolo.com/img/favicon.png\\\">\\n    <title>Singing Bird - Swagger UI</title>\\n    </head>\\n    <body>\\n    <div id=\\\"swagger-ui\\\">\\n    </div>\\n    <script src=\\\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\\\"></script>\\n    <!-- `SwaggerUIBundle` is now available on the page -->\\n    <script>\\n    const ui = SwaggerUIBundle({\\n        url: '/openapi.json',\\n    \\\"dom_id\\\": \\\"#swagger-ui\\\",\\n\\\"layout\\\": \\\"BaseLayout\\\",\\n\\\"deepLinking\\\": true,\\n\\\"showExtensions\\\": true,\\n\\\"showCommonExtensions\\\": true,\\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\\n    presets: [\\n        SwaggerUIBundle.presets.apis,\\n        SwaggerUIBundle.SwaggerUIStandalonePreset\\n        ],\\n    })\\n    </script>\\n    </body>\\n    </html>\\n    \",\"response_stream\":false},\"error\":null},{\"request_id\":\"e23bf2521a254a14903150f3b328c588\",\"ts\":\"2026-04-17T15:35:42.492811Z\",\"duration_ms\":0.389,\"method\":\"GET\",\"path\":\"/docs\",\"query\":\"\",\"operation_id\":\"\",\"client_ip\":\"192.168.29.10\",\"user_agent\":\"kube-probe/1.31\",\"auth\":{\"scheme\":null,\"scope\":\"admin\",\"auth_enabled\":false,\"recognized\":true},\"request\":{\"headers\":{\"host\":\"10.244.112.162:8420\",\"user-agent\":\"kube-probe/1.31\",\"accept\":\"*/*\",\"connection\":\"close\"},\"request_body_size\":0,\"request_body_truncated\":false,\"request_body_kind\":\"empty\",\"request_body\":null},\"status\":200,\"response\":{\"headers\":{\"content-length\":\"936\",\"content-type\":\"text/html; charset=utf-8\",\"x-request-id\":\"e23bf2521a254a14903150f3b328c588\"},\"response_body_size\":936,\"response_body_truncated\":false,\"response_body_kind\":\"text\",\"response_body\":\"\\n    <!DOCTYPE html>\\n    <html>\\n    <head>\\n    <link type=\\\"text/css\\\" rel=\\\"stylesheet\\\" href=\\\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\\\">\\n    <link rel=\\\"shortcut icon\\\" href=\\\"https://fastapi.tiangolo.com/img/favicon.png\\\">\\n    <title>Singing Bird - Swagger UI</title>\\n    </head>\\n    <body>\\n    <div id=\\\"swagger-ui\\\">\\n    </div>\\n    <script src=\\\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\\\"></script>\\n    <!-- `SwaggerUIBundle` is now available on the page -->\\n    <script>\\n    const ui = SwaggerUIBundle({\\n        url: '/openapi.json',\\n    \\\"dom_id\\\": \\\"#swagger-ui\\\",\\n\\\"layout\\\": \\\"BaseLayout\\\",\\n\\\"deepLinking\\\": true,\\n\\\"showExtensions\\\": true,\\n\\\"showCommonExtensions\\\": true,\\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\\n    presets: [\\n        SwaggerUIBundle.presets.apis,\\n        SwaggerUIBundle.SwaggerUIStandalonePreset\\n        ],\\n    })\\n    </script>\\n    </body>\\n    </html>\\n    \",\"response_stream\":false},\"error\":null}],\"execution\":{\"method\":\"GET\",\"path\":\"/v1/admin/logs?limit=100\",\"label\":\"Get last 100 audit records\",\"url\":\"https://singing-bird.benac.dev/v1/admin/logs?limit=100\",\"execute_href\":\"/dashboard/execute?method=GET&path=%2Fv1%2Fadmin%2Flogs%3Flimit%3D100&label=Get+last+100+audit+records\"},\"url\":\"https://singing-bird.benac.dev/v1/admin/logs","response_stream":false},"error":null},{"request_id":"11b2fd9fe0ef4596ba418f50d2f67a94","ts":"2026-04-18T17:27:07.717478Z","duration_ms":29.297,"method":"GET","path":"/guides/architecture","query":"","operation_id":"guide_page_guides__slug__get","client_ip":"216.73.216.73","user_agent":"Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com)","auth":{"scheme":null,"scope":"admin","auth_enabled":false,"recognized":true},"request":{"headers":{"host":"singing-bird.benac.dev","user-agent":"Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com)","accept":"*/*","accept-encoding":"gzip, br, zstd, deflate","via":"2.0 Caddy","x-forwarded-for":"216.73.216.73","x-forwarded-host":"singing-bird.benac.dev","x-forwarded-proto":"https","x-real-ip":"216.73.216.73"},"request_body_size":0,"request_body_truncated":false,"request_body_kind":"empty","request_body":null},"status":200,"response":{"headers":{"content-length":"33395","content-type":"text/html; charset=utf-8","x-request-id":"11b2fd9fe0ef4596ba418f50d2f67a94"},"response_body_size":33395,"response_body_truncated":false,"response_body_kind":"text","response_body":"<!doctype html><html lang='en'><head><meta charset='utf-8'><meta name='viewport' content='width=device-width, initial-scale=1'><meta name='color-scheme' content='light dark'><title>Architecture · Singing Bird</title><style>\n:root {\n  color-scheme: light dark;\n  --bg: #f9fafb;\n  --fg: #1f2937;\n  --fg-muted: #6b7280;\n  --fg-dim: #9ca3af;\n  --surface: #ffffff;\n  --surface-2: #f3f4f6;\n  --border: #e5e7eb;\n  --border-soft: #f3f4f6;\n  --accent-bg: #dbeafe;\n  --accent-fg: #1e40af;\n  --link: #2563eb;\n  --error: #b91c1c;\n  --sidebar-bg: #ffffff;\n  --sidebar-hover: #f3f4f6;\n}\n@media (prefers-color-scheme: dark) {\n  :root {\n    --bg: #0f172a;\n    --fg: #e5e7eb;\n    --fg-muted: #94a3b8;\n    --fg-dim: #64748b;\n    --surface: #1e293b;\n    --surface-2: #0f172a;\n    --border: #334155;\n    --border-soft: #1e293b;\n    --accent-bg: #1e3a8a;\n    --accent-fg: #bfdbfe;\n    --link: #60a5fa;\n    --error: #fca5a5;\n    --sidebar-bg: #0f172a;\n    --sidebar-hover: #1e293b;\n  }\n}\n\n* { box-sizing: border-box; }\nhtml, body { margin: 0; padding: 0; }\nbody {\n  font-family: ui-sans-serif, system-ui, -apple-system, sans-serif;\n  color: var(--fg);\n  background: var(--bg);\n  min-height: 100vh;\n}\n\n.layout {\n  display: grid;\n  grid-template-columns: 240px minmax(0, 1fr);\n  max-width: 1280px;\n  margin: 0 auto;\n  min-height: 100vh;\n}\n\naside.sidebar {\n  background: var(--sidebar-bg);\n  border-right: 1px solid var(--border);\n  padding: 1.5rem 0;\n  position: sticky;\n  top: 0;\n  align-self: start;\n  height: 100vh;\n  overflow-y: auto;\n}\n.sidebar h1 { margin: 0 1.25rem 0.15rem; font-size: 1rem; letter-spacing: 0.02em; }\n.sidebar .brand-sub { margin: 0 1.25rem 1.5rem; color: var(--fg-muted); font-size: 0.75rem; }\n.sidebar nav { display: flex; flex-direction: column; }\n.sidebar a {\n  display: flex; justify-content: space-between; align-items: center;\n  padding: 0.5rem 1.25rem; text-decoration: none; color: var(--fg);\n  font-size: 0.88rem; border-left: 2px solid transparent;\n}\n.sidebar a:hover { background: var(--sidebar-hover); }\n.sidebar a.empty { color: var(--fg-dim); }\n.sidebar a.active {\n  background: var(--sidebar-hover);\n  border-left-color: var(--link);\n  color: var(--link);\n  font-weight: 600;\n}\n.sidebar a.active .count { color: var(--link); }\nhtml { scroll-behavior: smooth; }\n.sidebar .count {\n  font-variant-numeric: tabular-nums; font-size: 0.75rem;\n  color: var(--fg-muted); background: var(--surface-2);\n  padding: 0.05rem 0.45rem; border-radius: 999px;\n}\n.sidebar a.empty .count { background: transparent; }\n.sidebar .foot { margin: 1.5rem 1.25rem 0; color: var(--fg-dim); font-size: 0.7rem; line-height: 1.5; }\n.sidebar .foot a { display: inline; padding: 0; color: var(--link); border: 0; }\n\nmain { padding: 2rem 2.5rem 4rem; min-width: 0; }\nmain > header { margin-bottom: 2rem; }\nmain > header h2 { margin: 0 0 0.2rem; font-size: 1.5rem; }\nmain > header p { margin: 0; color: var(--fg-muted); font-size: 0.92rem; }\n\nsection.group { margin-bottom: 2.5rem; scroll-margin-top: 1rem; }\nsection.group > header { display: flex; align-items: baseline; gap: 0.75rem; margin-bottom: 0.85rem; }\nsection.group > header h3 { margin: 0; font-size: 1.1rem; }\nsection.group > header .desc { color: var(--fg-muted); font-size: 0.85rem; }\nsection.group.empty > .empty-state {\n  border: 1px dashed var(--border); border-radius: 8px;\n  padding: 1rem 1.25rem; color: var(--fg-dim);\n  font-size: 0.88rem; font-style: italic;\n  background: var(--surface-2);\n}\n\n.tile {\n  border: 1px solid var(--border); border-radius: 8px;\n  padding: 1.1rem 1.4rem; margin-bottom: 1rem;\n  background: var(--surface);\n}\n.tile-title {\n  margin: 0 0 0.35rem; font-size: 1.12rem; font-weight: 600;\n  color: var(--fg); letter-spacing: -0.005em; line-height: 1.3;\n}\n.tile-meta {\n  display: flex; align-items: baseline; gap: 0.6rem;\n  margin: 0 0 0.5rem; flex-wrap: wrap;\n}\n.tool-row {\n  display: flex; align-items: center; gap: 0.5rem;\n  margin: 0 0 0.65rem; flex-wrap: wrap;\n}\n.tool-row-label {\n  font-size: 0.72rem; text-transform: uppercase; letter-spacing: 0.08em;\n  color: var(--fg-muted);\n}\n.tool-chip {\n  display: inline-flex; align-items: baseline; gap: 0.45rem;\n  padding: 0.2rem 0.55rem; border-radius: 999px;\n  text-decoration: none;\n  background: var(--surface-2); color: var(--fg);\n  border: 1px solid var(--border);\n  font-size: 0.8rem;\n}\n.tool-chip:hover { border-color: var(--link); color: var(--link); text-decoration: none; }\n.tool-chip-name {\n  font: 600 0.75rem ui-monospace, SFMono-Regular, Menlo, monospace;\n  color: var(--fg-muted);\n}\n.tool-chip:hover .tool-chip-name { color: var(--link); }\n.tool-chip-title { font-size: 0.82rem; }\n\n.tile h4 { margin: 0 0 0.1rem; font-size: 1.02rem; display: flex; align-items: baseline; gap: 0.6rem; }\n.method {\n  font: 600 0.72rem ui-monospace, SFMono-Regular, Menlo, monospace;\n  padding: 0.1rem 0.45rem; border-radius: 4px;\n  background: var(--accent-bg); color: var(--accent-fg);\n}\n.tile-url {\n  font: 0.88rem ui-monospace, SFMono-Regular, Menlo, monospace;\n  color: var(--fg);\n  word-break: break-all;\n}\na.tile-url { color: var(--link); text-decoration: none; }\na.tile-url:hover { text-decoration: underline; }\n.scope {\n  font-size: 0.68rem; text-transform: uppercase; letter-spacing: 0.06em;\n  color: var(--fg-muted); margin-left: auto;\n}\n.tile p.summary { color: var(--fg); margin: 0.35rem 0 0.9rem; font-size: 0.92rem; }\n.hint { color: var(--fg-muted); font-size: 0.84rem; margin: 0 0 0.6rem; }\n\ntable { width: 100%; border-collapse: collapse; font-size: 0.87rem; }\nth, td { text-align: left; padding: 0.45rem 0.6rem; border-bottom: 1px solid var(--border-soft); }\nth {\n  font-weight: 600; color: var(--fg-muted);\n  font-size: 0.72rem; text-transform: uppercase; letter-spacing: 0.05em;\n}\ntd.pack { font: 0.87rem ui-monospace, monospace; color: var(--fg); }\ntd.path { font: 0.82rem ui-monospace, monospace; color: var(--fg-muted); }\ntd.num { text-align: right; font-variant-numeric: tabular-nums; color: var(--fg-muted); }\n.error { color: var(--error); font-style: italic; }\n\ncode {\n  background: var(--surface-2); padding: 0.05rem 0.35rem;\n  border-radius: 3px; font-size: 0.85em;\n}\na { color: var(--link); }\n\n/* API audit log tile */\n.log-table { font-size: 0.82rem; }\n.log-ts, .log-rid {\n  font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n  color: var(--fg-muted);\n  white-space: nowrap;\n}\n.log-rid { font-size: 0.78rem; }\n.log-path {\n  font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n  color: var(--fg);\n  max-width: 360px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;\n}\n.log-method {\n  display: inline-block; padding: 0.05rem 0.4rem; border-radius: 3px;\n  font: 600 0.72rem ui-monospace, monospace;\n  background: var(--surface-2); color: var(--fg);\n}\n.log-method.m-get    { background: #dbeafe; color: #1e40af; }\n.log-method.m-post   { background: #dcfce7; color: #14532d; }\n.log-method.m-delete { background: #fee2e2; color: #7f1d1d; }\n.log-method.m-put, .log-method.m-patch { background: #fef3c7; color: #78350f; }\n@media (prefers-color-scheme: dark) {\n  .log-method.m-get    { background: #1e3a8a; color: #bfdbfe; }\n  .log-method.m-post   { background: #14532d; color: #bbf7d0; }\n  .log-method.m-delete { background: #7f1d1d; color: #fecaca; }\n  .log-method.m-put, .log-method.m-patch { background: #78350f; color: #fcd34d; }\n}\n.log-mcp {\n  font: 600 0.72rem ui-monospace, monospace;\n  padding: 0.05rem 0.4rem; border-radius: 3px;\n  background: #ede9fe; color: #5b21b6;\n}\n@media (prefers-color-scheme: dark) {\n  .log-mcp { background: #4c1d95; color: #ddd6fe; }\n}\n.log-status {\n  display: inline-block; padding: 0.05rem 0.4rem; border-radius: 3px;\n  font: 600 0.78rem ui-monospace, monospace;\n  font-variant-numeric: tabular-nums;\n}\n.log-status-ok   { background: #dcfce7; color: #14532d; }\n.log-status-info { background: #dbeafe; color: #1e40af; }\n.log-status-warn { background: #fef3c7; color: #78350f; }\n.log-status-err  { background: #fee2e2; color: #7f1d1d; }\n.log-status-neutral { background: var(--surface-2); color: var(--fg-muted); }\n@media (prefers-color-scheme: dark) {\n  .log-status-ok   { background: #14532d; color: #bbf7d0; }\n  .log-status-info { background: #1e3a8a; color: #bfdbfe; }\n  .log-status-warn { background: #78350f; color: #fcd34d; }\n  .log-status-err  { background: #7f1d1d; color: #fecaca; }\n}\n.log-scope {\n  font: 0.75rem ui-monospace, monospace;\n  color: var(--fg-muted);\n}\n\n.health-table { margin: 0; }\n.health-table th {\n  text-align: left; padding: 0.35rem 0.8rem 0.35rem 0;\n  font-weight: 600; color: var(--fg-muted); font-size: 0.8rem;\n  text-transform: none; letter-spacing: 0; white-space: nowrap;\n  width: 10rem;\n}\n.health-table td {\n  padding: 0.35rem 0; font-size: 0.88rem;\n  font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n}\n\nul.pre-list {\n  margin: 0.15rem 0 0.75rem 1.25rem; padding: 0;\n  font-size: 0.85rem; color: var(--fg-muted); line-height: 1.55;\n}\ndetails.scenario-raw { margin: 0.75rem 0 0; }\ndetails.scenario-raw > summary {\n  cursor: pointer; color: var(--fg-muted); font-size: 0.85rem;\n  padding: 0.35rem 0; user-select: none;\n}\ndetails.scenario-raw > summary:hover { color: var(--link); }\npre.sample-body {\n  margin: 0 0 0.5rem; padding: 0.75rem 0.9rem;\n  background: var(--surface-2); color: var(--fg);\n  border-radius: 5px; font-size: 0.8rem; line-height: 1.45;\n  overflow-x: auto; white-space: pre-wrap; word-break: break-word;\n  font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n}\n\n.tile-actions { margin: 0 0 1rem; }\n.run {\n  display: inline-flex; align-items: center; gap: 0.5rem;\n  padding: 0.4rem 0.85rem; border-radius: 6px;\n  background: var(--accent-bg); color: var(--accent-fg);\n  font-size: 0.87rem; text-decoration: none;\n  font-family: ui-sans-serif, system-ui, sans-serif;\n  font-weight: 500;\n  border: 1px solid transparent;\n}\n.run:hover { filter: brightness(1.08); text-decoration: none; }\n.run-icon { font-size: 0.8rem; }\n.run-method { font: 600 0.78rem ui-monospace, SFMono-Regular, Menlo, monospace; }\n.run-label { font-weight: 500; }\n\n@media (max-width: 800px) {\n  .layout { grid-template-columns: 1fr; }\n  aside.sidebar { position: static; height: auto; border-right: 0; border-bottom: 1px solid var(--border); }\n  main { padding: 1.5rem 1.25rem 3rem; }\n}\n\n.home-wrap {\n  max-width: 1080px; margin: 0 auto; padding: 3rem 2rem 4rem;\n}\n.home-hero {\n  padding: 3rem 0 2rem; border-bottom: 1px solid var(--border); margin-bottom: 3rem;\n}\n.home-hero .kicker {\n  display: inline-block; font-size: 0.72rem; letter-spacing: 0.14em;\n  text-transform: uppercase; color: var(--accent-fg);\n  background: var(--accent-bg); padding: 0.2rem 0.55rem; border-radius: 4px;\n}\n.home-hero h1 {\n  font-size: 2.4rem; margin: 0.8rem 0 0.35rem; letter-spacing: -0.01em;\n  line-height: 1.1;\n}\n.home-hero .tagline { color: var(--fg-muted); font-size: 1.15rem; margin: 0 0 1.6rem; max-width: 56ch; }\n.home-hero .ctas { display: flex; gap: 0.8rem; flex-wrap: wrap; }\n.btn {\n  display: inline-flex; align-items: center; gap: 0.45rem;\n  padding: 0.6rem 1.1rem; border-radius: 6px;\n  font: 600 0.92rem ui-sans-serif, system-ui, sans-serif;\n  text-decoration: none; border: 1px solid transparent;\n}\n.btn-primary   { background: var(--accent-bg); color: var(--accent-fg); }\n.btn-secondary { background: transparent; color: var(--fg); border-color: var(--border); }\n.btn:hover { filter: brightness(1.08); text-decoration: none; }\n\n.stat-row {\n  display: grid; grid-template-columns: repeat(4, 1fr); gap: 1rem;\n  margin: 2.5rem 0 0;\n}\n.stat {\n  background: var(--surface); border: 1px solid var(--border);\n  border-radius: 8px; padding: 1rem 1.1rem;\n}\n.stat .n {\n  font: 700 1.6rem ui-sans-serif, system-ui, sans-serif;\n  font-variant-numeric: tabular-nums;\n}\n.stat .lbl { color: var(--fg-muted); font-size: 0.82rem; letter-spacing: 0.02em; }\n\nh2.section-h {\n  font-size: 1.3rem; margin: 3rem 0 0.3rem; letter-spacing: -0.005em;\n}\np.section-sub { color: var(--fg-muted); margin: 0 0 1.3rem; }\n\n.pillars, .audiences, .surfaces {\n  display: grid; gap: 1rem;\n}\n.pillars    { grid-template-columns: repeat(2, 1fr); }\n.audiences  { grid-template-columns: repeat(2, 1fr); }\n.surfaces   { grid-template-columns: repeat(3, 1fr); }\n@media (max-width: 720px) {\n  .pillars, .audiences, .surfaces, .stat-row { grid-template-columns: 1fr; }\n  .home-hero h1 { font-size: 1.9rem; }\n}\n\n.card {\n  background: var(--surface); border: 1px solid var(--border);\n  border-radius: 8px; padding: 1.25rem 1.4rem;\n}\n.card h3 {\n  margin: 0 0 0.35rem; font-size: 1rem;\n  display: flex; align-items: center; gap: 0.5rem;\n}\n.card .tag {\n  font: 600 0.68rem ui-monospace, monospace; text-transform: uppercase;\n  padding: 0.1rem 0.4rem; border-radius: 3px;\n  background: var(--accent-bg); color: var(--accent-fg); letter-spacing: 0.04em;\n}\n.card p { margin: 0 0 0.7rem; color: var(--fg); font-size: 0.92rem; line-height: 1.5; }\n.card ul { margin: 0.3rem 0 0.75rem 1.05rem; padding: 0; font-size: 0.88rem; line-height: 1.6; }\n.card .card-actions { display: flex; flex-wrap: wrap; gap: 0.45rem; margin-top: 0.5rem; }\n.card .chip {\n  display: inline-block; padding: 0.15rem 0.55rem; border-radius: 999px;\n  background: var(--surface-2); color: var(--fg-muted); font-size: 0.78rem;\n  text-decoration: none; border: 1px solid var(--border);\n}\n.card .chip:hover { color: var(--link); border-color: var(--link); text-decoration: none; }\n.card .chip.primary { background: var(--accent-bg); color: var(--accent-fg); border-color: transparent; }\n\npre.quickstart {\n  background: var(--surface-2); color: var(--fg);\n  border: 1px solid var(--border); border-radius: 6px;\n  padding: 0.9rem 1rem; overflow-x: auto;\n  font: 0.82rem/1.45 ui-monospace, SFMono-Regular, Menlo, monospace;\n  margin: 0.5rem 0;\n}\npre.quickstart .cmt { color: var(--fg-muted); }\n\n.links-grid {\n  display: grid; grid-template-columns: repeat(2, 1fr); gap: 0.6rem 1.5rem;\n  margin: 0.5rem 0 0;\n}\n.links-grid a {\n  display: flex; justify-content: space-between; align-items: baseline;\n  padding: 0.6rem 0.8rem; border-radius: 5px;\n  text-decoration: none; color: var(--fg); border: 1px solid var(--border);\n  background: var(--surface);\n}\n.links-grid a:hover { border-color: var(--link); color: var(--link); }\n.links-grid .lg-path { font-family: ui-monospace, monospace; font-size: 0.82rem; color: var(--fg-muted); }\n\n.home-footer {\n  margin-top: 4rem; padding-top: 1.5rem; border-top: 1px solid var(--border);\n  color: var(--fg-dim); font-size: 0.82rem; display: flex; justify-content: space-between;\n  flex-wrap: wrap; gap: 0.5rem;\n}\n\n.guide-nav { margin: 0 0 1.5rem; color: var(--fg-muted); font-size: 0.88rem; }\n.guide-nav a { color: var(--link); text-decoration: none; }\n.guide {\n  background: var(--surface); border: 1px solid var(--border);\n  border-radius: 8px; padding: 2rem 2.5rem;\n  color: var(--fg); line-height: 1.6;\n}\n.guide h1, .guide h2, .guide h3, .guide h4 { letter-spacing: -0.01em; }\n.guide h1 { font-size: 1.8rem; margin: 0 0 0.8rem; }\n.guide h2 { font-size: 1.3rem; margin: 2rem 0 0.5rem; padding-top: 1rem;\n            border-top: 1px solid var(--border-soft); }\n.guide h3 { font-size: 1.05rem; margin: 1.5rem 0 0.4rem; }\n.guide p  { margin: 0.5rem 0 1rem; }\n.guide a  { color: var(--link); }\n.guide code {\n  background: var(--surface-2); padding: 0.1rem 0.35rem;\n  border-radius: 3px; font: 0.88em ui-monospace, monospace;\n}\n.guide pre {\n  background: var(--surface-2); padding: 0.9rem 1.1rem; border-radius: 6px;\n  overflow-x: auto; font: 0.85rem/1.5 ui-monospace, monospace;\n}\n.guide pre code { background: transparent; padding: 0; }\n.guide ul, .guide ol { padding-left: 1.4rem; }\n.guide li { margin: 0.2rem 0; }\n.guide table { border-collapse: collapse; width: 100%; margin: 1rem 0; }\n.guide th, .guide td { border: 1px solid var(--border); padding: 0.4rem 0.6rem; text-align: left; }\n.guide th { background: var(--surface-2); }\n.guide blockquote {\n  border-left: 3px solid var(--border); padding: 0.3rem 0.9rem;\n  color: var(--fg-muted); margin: 0.8rem 0;\n}\n</style></head><body><div class='home-wrap'><p class='guide-nav'><a href='/'>← Home</a> · <span class='lg-path'>docs/guides/architecture.md</span></p><article class='guide'><h1 id=\"architecture-guide\">Architecture Guide</h1>\n<h2 id=\"three-layer-architecture\">Three-Layer Architecture</h2>\n<p>Singing Bird separates concerns into three strict layers:</p>\n<pre><code>+--------------------------------------------------+\n|  Content Pack (YAML)                             |\n|  Locations, entities, synths, processes,          |\n|  latent facts, initial conditions                 |\n+--------------------------------------------------+\n                      |\n                      v\n+--------------------------------------------------+\n|  Ruleset (physical_social_v1)                    |\n|  Component schemas, affordance definitions,       |\n|  validation rules                                 |\n+--------------------------------------------------+\n                      |\n                      v\n+--------------------------------------------------+\n|  Kernel                                          |\n|  Scheduling, transactions, event propagation,     |\n|  perception delivery, snapshots, replay           |\n+--------------------------------------------------+\n</code></pre>\n<p><strong>The kernel does not know what any scenario entity means.</strong> It knows locations, adjacency, entities with typed components, sensory channels, and world processes. The ruleset defines what component types are valid. The content pack defines the specific world.</p>\n<p>A content pack references a <code>ruleset_ref</code>. The loader validates all components against the ruleset schemas at load time. Unknown component types generate warnings; missing required properties generate errors.</p>\n<h2 id=\"the-director-cycle\">The Director Cycle</h2>\n<p>Each cycle follows the normative execution sequence from the spec:</p>\n<pre><code>1. Deep-copy canonical state into working copies\n2. Advance simulation clock on working copy\n3. Evaluate due world processes (statechart transitions)\n4. Begin fixed-point microcycle loop:\n   a. Compose sensory bundles (channel-filtered + action surface)\n   b. Run synth cognitive cycles concurrently (LLM calls)\n   c. Collect intents from synths\n   d. Resolve communication intents -&gt; CommunicationEvents\n   e. Resolve other intents sequentially (priority order)\n   f. Check for new events (communication, world changes)\n   g. If new events: re-compose affected bundles, continue loop\n   h. If quiescent or budget exhausted: exit loop\n5. Validate invariants against working state\n6. On success: promote working copies to canonical, commit snapshot\n7. On failure: discard working copies (canonical state unchanged)\n</code></pre>\n<p><strong>Transactional rollback</strong> is real: the runtime deep-copies world, director, synths, clock, and pending outcomes before any mutation. If invariant validation fails, the working copies are discarded. The canonical state on <code>self.world</code>, <code>self.director</code>, <code>self.synths</code>, <code>self.clock</code>, and <code>self._pending_outcomes</code> is never touched until commit.</p>\n<p><strong>Fixed-point microcycles</strong> allow intra-cycle propagation. If Thomas speaks to Margaret in microcycle 1, she hears it and can respond in microcycle 2 of the same director cycle. The loop continues until no new events are generated (quiescent) or the event budget is exhausted.</p>\n<h2 id=\"perception-pipeline\">Perception Pipeline</h2>\n<p>Perception enforces epistemic separation (SYS-03): a synth never reads canonical state directly.</p>\n<h3 id=\"stage-1-structured-observations\">Stage 1: Structured Observations</h3>\n<p>The perception engine scans the synth's canonical location and adjacent locations, filtered by the synth's sensory capabilities:</p>\n<ul>\n<li><strong>Visual</strong>: entities, light sources, ambient light, celestial state (only if synth has visual channel)</li>\n<li><strong>Auditory</strong>: sound sources, speech events, weather sounds (only if synth has auditory channel)</li>\n<li><strong>Tactile</strong>: temperature, environmental touch (only if synth has tactile channel)</li>\n<li><strong>Proprioceptive</strong>: self-location awareness (always available)</li>\n</ul>\n<p>A blind synth (no visual channel) receives zero visual observations. This is enforced at the perception layer, not by prompt tricks.</p>\n<h3 id=\"stage-2-action-surface\">Stage 2: Action Surface</h3>\n<p>The director builds a grounded action menu for each synth each cycle:</p>\n<pre><code>Available actions:\n  - move_to_&lt;uuid&gt;: Move to Ground Floor\n  - inspect_&lt;uuid&gt;: Examine Beacon Lamp closely\n  - repair_&lt;uuid&gt;: Attempt to repair Beacon Lamp (jammed)\n  - switch_&lt;uuid&gt;: Switch Flashlight on\n  - take_&lt;uuid&gt;: Pick up Wrench\n  - open_&lt;uuid&gt;: Open Tool Chest\n  - wait: Do nothing this turn\n  - communicate: Speak (Margaret, James can hear you)\n</code></pre>\n<p>Every action has a stable symbolic <code>action_id</code>. Every entity ref is a UUID. The synth LLM selects from this menu by ID. The resolver looks up refs directly -- no substring matching, no English parsing.</p>\n<h3 id=\"stage-3-perception-policy-optional\">Stage 3: Perception Policy (Optional)</h3>\n<p>A <code>PerceptionPolicy</code> hook can modify observations before delivery. The default is a no-op pass-through. An example <code>LowLightAmbiguityPolicy</code> reduces visual salience in dim conditions.</p>\n<h2 id=\"intent-resolution\">Intent Resolution</h2>\n<p>The resolver is component-based. It dispatches on <code>action_id</code> prefix:</p>\n<ul>\n<li><code>repair_&lt;ref&gt;</code> -&gt; check Repairable component, enforce tool requirements, apply cascade to linked LightSource/Switchable</li>\n<li><code>switch_&lt;ref&gt;</code> -&gt; toggle Switchable component, cascade to linked LightSource</li>\n<li><code>take_&lt;ref&gt;</code> -&gt; check Portable, check not already carried, set canonical carrying relationship</li>\n<li><code>consume_&lt;ref&gt;</code> -&gt; decrement Consumable uses, apply effect</li>\n<li><code>open_&lt;ref&gt;</code> -&gt; set container <code>open=True</code> (canonical state change), reveal contents</li>\n<li><code>move_to_&lt;ref&gt;</code> -&gt; check adjacency, check constraints, move entity + carried items</li>\n</ul>\n<p><strong>Tool-gated repair</strong>: if a Repairable component specifies <code>repair_requirements.tools</code>, the resolver checks whether the synth's body entity carries entities with matching Tool components. Missing tools result in <code>blocked</code> outcome.</p>\n<p><strong>Conflict resolution</strong>: intents are resolved sequentially in priority order. If two synths try to take the same item, the first succeeds and the second gets <code>blocked</code> (item already carried).</p>\n<h2 id=\"llm-integration\">LLM Integration</h2>\n<h3 id=\"single-call-architecture\">Single-Call Architecture</h3>\n<p>Each synth gets one LLM call per microcycle. The system prompt IS the synth's current mind:</p>\n<pre><code>System prompt = identity + body + inner state + beliefs + projects + mental models + memories + instructions\nUser message  = structured observations + action surface + previous outcomes\nResponse      = InnerMonologue + belief updates + mood + intents + memories + theory of mind\n</code></pre>\n<p>No conversation history is maintained. State is carried in the system prompt via beliefs, memories, and theory of mind. This keeps token costs bounded.</p>\n<h3 id=\"structured-output\">Structured Output</h3>\n<p>The LLM returns a <code>SynthCognitiveResponse</code> via OpenAI's <code>.parse()</code> with a pydantic response model. All fields are typed and validated. The <code>InnerMonologue</code> (react -&gt; interpret -&gt; deliberate -&gt; resolve) forces genuine cognitive processing before action selection.</p>\n<h3 id=\"live-vs-replay-modes\">Live vs Replay Modes</h3>\n<ul>\n<li><strong>Live mode</strong>: calls OpenAI, logs every prompt + response to <code>audit/llm_calls.jsonl</code></li>\n<li><strong>Replay mode</strong>: reads logged responses, no API calls, deterministic</li>\n</ul>\n<p>In live mode, the world's <code>random_seed</code> is passed to OpenAI calls for approximate reproducibility. True determinism requires replay mode.</p>\n<h2 id=\"containment-model\">Containment Model</h2>\n<p>Containment is first-class in the canonical world model:</p>\n<ul>\n<li><strong>Location contains entity</strong>: <code>LocationNode.contained_entity_ids</code></li>\n<li><strong>Entity contains entity</strong>: <code>EntityNode.contained_entity_ids</code></li>\n<li><strong>Synth carries entity</strong>: <code>EntityNode.carried_by_synth_id</code> + carrier's <code>contained_entity_ids</code></li>\n<li><strong>Carried items move with carrier</strong>: move resolution updates carried entity locations automatically</li>\n</ul>\n<p>Opening a container sets <code>open=True</code> on the container component (canonical state change). The action surface respects this: an already-open container does not re-offer the \"open\" affordance.</p>\n<h2 id=\"theory-of-mind\">Theory of Mind</h2>\n<p>Each synth carries thin mental models of other known synths:</p>\n<pre><code>MentalModel:\n  name, believed_location, believed_mood, believed_goals,\n  believed_knowledge, believed_beliefs_about_me, confidence\n</code></pre>\n<p>The recursive layer is <code>believed_beliefs_about_me</code> -- what I think they think about me. This is populated from the LLM's <code>TheoryOfMindEntry</code> response and fed back into the next cycle's system prompt. Depth is capped at 1.</p>\n<h2 id=\"snapshot-and-persistence\">Snapshot and Persistence</h2>\n<ul>\n<li><strong>Snapshots</strong>: full system state (World + Director + Synths) serialized as JSON, atomic write via temp-file-then-rename</li>\n<li><strong>Audit log</strong>: JSONL append-only event trail (cycle events, synth responses, intent resolutions, communications)</li>\n<li><strong>LLM call log</strong>: JSONL with full prompt, model, seed, temperature, response for every LLM call</li>\n<li><strong>Schema migration</strong>: migration registry chains versioned transforms (0.1.0 -&gt; 0.2.0 -&gt; 0.3.0); snapshot loader auto-migrates</li>\n</ul>\n<h2 id=\"module-map\">Module Map</h2>\n<h3 id=\"models-srcsinging_birdmodels\">Models (<code>src/singing_bird/models/</code>)</h3>\n<table>\n<thead>\n<tr>\n<th>File</th>\n<th>What it defines</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>enums.py</code></td>\n<td>All enumerations used across the system</td>\n</tr>\n<tr>\n<td><code>components.py</code></td>\n<td>Component/affordance ontology and query utilities</td>\n</tr>\n<tr>\n<td><code>world.py</code></td>\n<td>World, LocationNode, EntityNode, WorldProcess, LatentFact, Environment</td>\n</tr>\n<tr>\n<td><code>synth.py</code></td>\n<td>Synth, Identity, Belief, MentalModel, Phenomenology, Affect, Project, Memory</td>\n</tr>\n<tr>\n<td><code>director.py</code></td>\n<td>Director configuration and runtime state</td>\n</tr>\n<tr>\n<td><code>payloads.py</code></td>\n<td>SensoryBundle, ActionSurface, ActuationIntent, ActionOutcome, CommunicationEvent</td>\n</tr>\n<tr>\n<td><code>ruleset.py</code></td>\n<td>Ruleset with ComponentSchema registry; PHYSICAL_SOCIAL_V1 definition</td>\n</tr>\n</tbody>\n</table>\n<h3 id=\"engine-srcsinging_birdengine\">Engine (<code>src/singing_bird/engine/</code>)</h3>\n<table>\n<thead>\n<tr>\n<th>File</th>\n<th>What it does</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>director_runtime.py</code></td>\n<td>The cycle orchestrator: rollback, microcycles, commit</td>\n</tr>\n<tr>\n<td><code>clock.py</code></td>\n<td>Simulation clock with configurable chronon and turn advance</td>\n</tr>\n<tr>\n<td><code>perception.py</code></td>\n<td>Channel-filtered observation assembly + action surface generation</td>\n</tr>\n<tr>\n<td><code>perception_policy.py</code></td>\n<td>PerceptionPolicy hook + LowLightAmbiguityPolicy example</td>\n</tr>\n<tr>\n<td><code>communication.py</code></td>\n<td>Speech resolution: communicate intent -&gt; CommunicationEvent</td>\n</tr>\n<tr>\n<td><code>resolver.py</code></td>\n<td>Symbolic intent resolution against canonical state</td>\n</tr>\n<tr>\n<td><code>processes.py</code></td>\n<td>Statechart-driven world process evaluation</td>\n</tr>\n<tr>\n<td><code>statechart.py</code></td>\n<td>Generic hierarchical state machine interpreter</td>\n</tr>\n<tr>\n<td><code>invariants.py</code></td>\n<td>Scenario-agnostic invariant checks + containment consistency</td>\n</tr>\n</tbody>\n</table>\n<h3 id=\"llm-srcsinging_birdllm\">LLM (<code>src/singing_bird/llm/</code>)</h3>\n<table>\n<thead>\n<tr>\n<th>File</th>\n<th>What it does</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>client.py</code></td>\n<td>Async OpenAI client with live/replay modes and call logging</td>\n</tr>\n<tr>\n<td><code>schemas.py</code></td>\n<td>Pydantic response models for structured LLM output</td>\n</tr>\n<tr>\n<td><code>prompts.py</code></td>\n<td>System prompt builder and templates</td>\n</tr>\n</tbody>\n</table>\n<h3 id=\"synth-srcsinging_birdsynth\">Synth (<code>src/singing_bird/synth/</code>)</h3>\n<table>\n<thead>\n<tr>\n<th>File</th>\n<th>What it does</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>agent.py</code></td>\n<td>Cognitive cycle: build prompt, call LLM, apply state updates, convert intents</td>\n</tr>\n<tr>\n<td><code>theory_of_mind.py</code></td>\n<td>Mental model management from LLM responses</td>\n</tr>\n</tbody>\n</table>\n<h3 id=\"content-srcsinging_birdcontent\">Content (<code>src/singing_bird/content/</code>)</h3>\n<table>\n<thead>\n<tr>\n<th>File</th>\n<th>What it does</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>loader.py</code></td>\n<td>YAML scenario loader with stable ID compilation and ruleset validation</td>\n</tr>\n</tbody>\n</table>\n<h3 id=\"persistence-srcsinging_birdpersistence\">Persistence (<code>src/singing_bird/persistence/</code>)</h3>\n<table>\n<thead>\n<tr>\n<th>File</th>\n<th>What it does</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>snapshot.py</code></td>\n<td>Save/load/restore full system state as JSON</td>\n</tr>\n<tr>\n<td><code>audit.py</code></td>\n<td>JSONL event log + token/cost summary</td>\n</tr>\n<tr>\n<td><code>migration.py</code></td>\n<td>Schema migration registry and chain</td>\n</tr>\n</tbody>\n</table>\n<h3 id=\"api-control-plane-srcsinging_birdapi\">API Control Plane (<code>src/singing_bird/api/</code>)</h3>\n<table>\n<thead>\n<tr>\n<th>File</th>\n<th>What it does</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>app.py</code></td>\n<td>FastAPI application with all routes under <code>/v1/</code></td>\n</tr>\n<tr>\n<td><code>session_manager.py</code></td>\n<td>Session lifecycle: create, list, close, snapshot restore</td>\n</tr>\n<tr>\n<td><code>refs.py</code></td>\n<td>Stable ref resolution (name → UUID lookup)</td>\n</tr>\n<tr>\n<td><code>auth.py</code></td>\n<td>Bearer token auth with read/operate/admin scopes</td>\n</tr>\n<tr>\n<td><code>diff.py</code></td>\n<td>Change computation: what changed since a cursor or snapshot</td>\n</tr>\n<tr>\n<td><code>streaming.py</code></td>\n<td>SSE event stream generator</td>\n</tr>\n<tr>\n<td><code>services/observation.py</code></td>\n<td>Overview, object detail, events, cycle reports</td>\n</tr>\n<tr>\n<td><code>services/intervention.py</code></td>\n<td>Typed admin patches with dry_run/commit/commit_and_step</td>\n</tr>\n</tbody>\n</table>\n<h2 id=\"api-control-plane\">API Control Plane</h2>\n<p>The API layer sits above the kernel and exposes it as an HTTP/JSON service. It does not reimplement simulation logic.</p>\n<h3 id=\"three-execution-lanes\">Three Execution Lanes</h3>\n<pre><code>Query Lane (GET)          Turn Lane (POST /turns)       Admin Patch Lane (POST /patches)\n  |                         |                              |\n  | read-only               | director-mediated            | working copy\n  | no mutation              | payload → stimulus           | invariant validation\n  | no cycle                 | triggers cycle               | commit or discard\n  |                         | full rollback semantics       | optional step-after\n  v                         v                              v\n  JSON response             CycleResult                    PatchResult\n</code></pre>\n<ul>\n<li><strong>Query</strong>: overview, resolve, object detail, events, changes, reports, SSE stream</li>\n<li><strong>Turn</strong>: external input converted to mediated stimulus, delivered through perception</li>\n<li><strong>Admin patch</strong>: typed operations (move_entity, create_entity, set_component_property, add_belief, etc.) applied to working copy, validated, committed as snapshot</li>\n</ul>\n<h3 id=\"session-model\">Session Model</h3>\n<p>One session = one simulation lineage. Each session owns a scenario, a DirectorRuntime, a snapshot chain, and an audit trail. Sessions start paused. Snapshot restore provides undo.</p>\n<h3 id=\"stimulus-queue\">Stimulus Queue</h3>\n<p>External stimuli are queued on the session and delivered through <code>compose_sensory_bundle</code> on the next step or turn. They enter through the same mediated perception path as all other observations — the API never writes directly into synth state.</p>\n<h3 id=\"auth-and-scopes\">Auth and Scopes</h3>\n<ul>\n<li><code>read</code> — query lane only</li>\n<li><code>operate</code> — query + control (step, pause, turns)</li>\n<li><code>admin</code> — full access including patches, stimuli, inner monologue</li>\n</ul>\n<p>Enabled via <code>SINGING_BIRD_API_TOKEN</code> environment variable. Open access when auth is disabled.</p></article></div></body></html>","response_stream":false},"error":null},{"request_id":"c3623c0ca4f445df803859d6bfd2bdeb","ts":"2026-04-18T17:27:02.821736Z","duration_ms":0.141,"method":"GET","path":"/docs","query":"","operation_id":"","client_ip":"192.168.29.10","user_agent":"kube-probe/1.31","auth":{"scheme":null,"scope":"admin","auth_enabled":false,"recognized":true},"request":{"headers":{"host":"10.244.112.209:8420","user-agent":"kube-probe/1.31","accept":"*/*","connection":"close"},"request_body_size":0,"request_body_truncated":false,"request_body_kind":"empty","request_body":null},"status":200,"response":{"headers":{"content-length":"936","content-type":"text/html; charset=utf-8","x-request-id":"c3623c0ca4f445df803859d6bfd2bdeb"},"response_body_size":936,"response_body_truncated":false,"response_body_kind":"text","response_body":"\n    <!DOCTYPE html>\n    <html>\n    <head>\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\">\n    <link rel=\"shortcut icon\" href=\"https://fastapi.tiangolo.com/img/favicon.png\">\n    <title>Singing Bird - Swagger UI</title>\n    </head>\n    <body>\n    <div id=\"swagger-ui\">\n    </div>\n    <script src=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\"></script>\n    <!-- `SwaggerUIBundle` is now available on the page -->\n    <script>\n    const ui = SwaggerUIBundle({\n        url: '/openapi.json',\n    \"dom_id\": \"#swagger-ui\",\n\"layout\": \"BaseLayout\",\n\"deepLinking\": true,\n\"showExtensions\": true,\n\"showCommonExtensions\": true,\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\n    presets: [\n        SwaggerUIBundle.presets.apis,\n        SwaggerUIBundle.SwaggerUIStandalonePreset\n        ],\n    })\n    </script>\n    </body>\n    </html>\n    ","response_stream":false},"error":null},{"request_id":"084e9bfbe90b451abd047d2e7cdb158d","ts":"2026-04-18T17:27:02.821155Z","duration_ms":0.228,"method":"GET","path":"/docs","query":"","operation_id":"","client_ip":"192.168.29.10","user_agent":"kube-probe/1.31","auth":{"scheme":null,"scope":"admin","auth_enabled":false,"recognized":true},"request":{"headers":{"host":"10.244.112.209:8420","user-agent":"kube-probe/1.31","accept":"*/*","connection":"close"},"request_body_size":0,"request_body_truncated":false,"request_body_kind":"empty","request_body":null},"status":200,"response":{"headers":{"content-length":"936","content-type":"text/html; charset=utf-8","x-request-id":"084e9bfbe90b451abd047d2e7cdb158d"},"response_body_size":936,"response_body_truncated":false,"response_body_kind":"text","response_body":"\n    <!DOCTYPE html>\n    <html>\n    <head>\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\">\n    <link rel=\"shortcut icon\" href=\"https://fastapi.tiangolo.com/img/favicon.png\">\n    <title>Singing Bird - Swagger UI</title>\n    </head>\n    <body>\n    <div id=\"swagger-ui\">\n    </div>\n    <script src=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\"></script>\n    <!-- `SwaggerUIBundle` is now available on the page -->\n    <script>\n    const ui = SwaggerUIBundle({\n        url: '/openapi.json',\n    \"dom_id\": \"#swagger-ui\",\n\"layout\": \"BaseLayout\",\n\"deepLinking\": true,\n\"showExtensions\": true,\n\"showCommonExtensions\": true,\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\n    presets: [\n        SwaggerUIBundle.presets.apis,\n        SwaggerUIBundle.SwaggerUIStandalonePreset\n        ],\n    })\n    </script>\n    </body>\n    </html>\n    ","response_stream":false},"error":null},{"request_id":"3618d01331654f88afea0be5ad482293","ts":"2026-04-18T17:27:02.515496Z","duration_ms":0.263,"method":"GET","path":"/docs","query":"","operation_id":"","client_ip":"216.73.216.73","user_agent":"Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com)","auth":{"scheme":null,"scope":"admin","auth_enabled":false,"recognized":true},"request":{"headers":{"host":"singing-bird.benac.dev","user-agent":"Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com)","accept":"*/*","accept-encoding":"gzip, br, zstd, deflate","via":"2.0 Caddy","x-forwarded-for":"216.73.216.73","x-forwarded-host":"singing-bird.benac.dev","x-forwarded-proto":"https","x-real-ip":"216.73.216.73"},"request_body_size":0,"request_body_truncated":false,"request_body_kind":"empty","request_body":null},"status":200,"response":{"headers":{"content-length":"936","content-type":"text/html; charset=utf-8","x-request-id":"3618d01331654f88afea0be5ad482293"},"response_body_size":936,"response_body_truncated":false,"response_body_kind":"text","response_body":"\n    <!DOCTYPE html>\n    <html>\n    <head>\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\">\n    <link rel=\"shortcut icon\" href=\"https://fastapi.tiangolo.com/img/favicon.png\">\n    <title>Singing Bird - Swagger UI</title>\n    </head>\n    <body>\n    <div id=\"swagger-ui\">\n    </div>\n    <script src=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\"></script>\n    <!-- `SwaggerUIBundle` is now available on the page -->\n    <script>\n    const ui = SwaggerUIBundle({\n        url: '/openapi.json',\n    \"dom_id\": \"#swagger-ui\",\n\"layout\": \"BaseLayout\",\n\"deepLinking\": true,\n\"showExtensions\": true,\n\"showCommonExtensions\": true,\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\n    presets: [\n        SwaggerUIBundle.presets.apis,\n        SwaggerUIBundle.SwaggerUIStandalonePreset\n        ],\n    })\n    </script>\n    </body>\n    </html>\n    ","response_stream":false},"error":null},{"request_id":"1233781d2557411d84a046fd92cd9c7c","ts":"2026-04-18T17:26:52.821326Z","duration_ms":0.256,"method":"GET","path":"/docs","query":"","operation_id":"","client_ip":"192.168.29.10","user_agent":"kube-probe/1.31","auth":{"scheme":null,"scope":"admin","auth_enabled":false,"recognized":true},"request":{"headers":{"host":"10.244.112.209:8420","user-agent":"kube-probe/1.31","accept":"*/*","connection":"close"},"request_body_size":0,"request_body_truncated":false,"request_body_kind":"empty","request_body":null},"status":200,"response":{"headers":{"content-length":"936","content-type":"text/html; charset=utf-8","x-request-id":"1233781d2557411d84a046fd92cd9c7c"},"response_body_size":936,"response_body_truncated":false,"response_body_kind":"text","response_body":"\n    <!DOCTYPE html>\n    <html>\n    <head>\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\">\n    <link rel=\"shortcut icon\" href=\"https://fastapi.tiangolo.com/img/favicon.png\">\n    <title>Singing Bird - Swagger UI</title>\n    </head>\n    <body>\n    <div id=\"swagger-ui\">\n    </div>\n    <script src=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\"></script>\n    <!-- `SwaggerUIBundle` is now available on the page -->\n    <script>\n    const ui = SwaggerUIBundle({\n        url: '/openapi.json',\n    \"dom_id\": \"#swagger-ui\",\n\"layout\": \"BaseLayout\",\n\"deepLinking\": true,\n\"showExtensions\": true,\n\"showCommonExtensions\": true,\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\n    presets: [\n        SwaggerUIBundle.presets.apis,\n        SwaggerUIBundle.SwaggerUIStandalonePreset\n        ],\n    })\n    </script>\n    </body>\n    </html>\n    ","response_stream":false},"error":null},{"request_id":"c7ddd9f663b842abb90ea357f1e72c66","ts":"2026-04-18T17:26:42.821086Z","duration_ms":0.246,"method":"GET","path":"/docs","query":"","operation_id":"","client_ip":"192.168.29.10","user_agent":"kube-probe/1.31","auth":{"scheme":null,"scope":"admin","auth_enabled":false,"recognized":true},"request":{"headers":{"host":"10.244.112.209:8420","user-agent":"kube-probe/1.31","accept":"*/*","connection":"close"},"request_body_size":0,"request_body_truncated":false,"request_body_kind":"empty","request_body":null},"status":200,"response":{"headers":{"content-length":"936","content-type":"text/html; charset=utf-8","x-request-id":"c7ddd9f663b842abb90ea357f1e72c66"},"response_body_size":936,"response_body_truncated":false,"response_body_kind":"text","response_body":"\n    <!DOCTYPE html>\n    <html>\n    <head>\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\">\n    <link rel=\"shortcut icon\" href=\"https://fastapi.tiangolo.com/img/favicon.png\">\n    <title>Singing Bird - Swagger UI</title>\n    </head>\n    <body>\n    <div id=\"swagger-ui\">\n    </div>\n    <script src=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\"></script>\n    <!-- `SwaggerUIBundle` is now available on the page -->\n    <script>\n    const ui = SwaggerUIBundle({\n        url: '/openapi.json',\n    \"dom_id\": \"#swagger-ui\",\n\"layout\": \"BaseLayout\",\n\"deepLinking\": true,\n\"showExtensions\": true,\n\"showCommonExtensions\": true,\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\n    presets: [\n        SwaggerUIBundle.presets.apis,\n        SwaggerUIBundle.SwaggerUIStandalonePreset\n        ],\n    })\n    </script>\n    </body>\n    </html>\n    ","response_stream":false},"error":null},{"request_id":"a4cff35efac94d7786004f91aaff4556","ts":"2026-04-18T17:26:32.821507Z","duration_ms":0.179,"method":"GET","path":"/docs","query":"","operation_id":"","client_ip":"192.168.29.10","user_agent":"kube-probe/1.31","auth":{"scheme":null,"scope":"admin","auth_enabled":false,"recognized":true},"request":{"headers":{"host":"10.244.112.209:8420","user-agent":"kube-probe/1.31","accept":"*/*","connection":"close"},"request_body_size":0,"request_body_truncated":false,"request_body_kind":"empty","request_body":null},"status":200,"response":{"headers":{"content-length":"936","content-type":"text/html; charset=utf-8","x-request-id":"a4cff35efac94d7786004f91aaff4556"},"response_body_size":936,"response_body_truncated":false,"response_body_kind":"text","response_body":"\n    <!DOCTYPE html>\n    <html>\n    <head>\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\">\n    <link rel=\"shortcut icon\" href=\"https://fastapi.tiangolo.com/img/favicon.png\">\n    <title>Singing Bird - Swagger UI</title>\n    </head>\n    <body>\n    <div id=\"swagger-ui\">\n    </div>\n    <script src=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\"></script>\n    <!-- `SwaggerUIBundle` is now available on the page -->\n    <script>\n    const ui = SwaggerUIBundle({\n        url: '/openapi.json',\n    \"dom_id\": \"#swagger-ui\",\n\"layout\": \"BaseLayout\",\n\"deepLinking\": true,\n\"showExtensions\": true,\n\"showCommonExtensions\": true,\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\n    presets: [\n        SwaggerUIBundle.presets.apis,\n        SwaggerUIBundle.SwaggerUIStandalonePreset\n        ],\n    })\n    </script>\n    </body>\n    </html>\n    ","response_stream":false},"error":null},{"request_id":"b987aa79f8374663a13e871a5727a5b7","ts":"2026-04-18T17:26:32.820794Z","duration_ms":0.26,"method":"GET","path":"/docs","query":"","operation_id":"","client_ip":"192.168.29.10","user_agent":"kube-probe/1.31","auth":{"scheme":null,"scope":"admin","auth_enabled":false,"recognized":true},"request":{"headers":{"host":"10.244.112.209:8420","user-agent":"kube-probe/1.31","accept":"*/*","connection":"close"},"request_body_size":0,"request_body_truncated":false,"request_body_kind":"empty","request_body":null},"status":200,"response":{"headers":{"content-length":"936","content-type":"text/html; charset=utf-8","x-request-id":"b987aa79f8374663a13e871a5727a5b7"},"response_body_size":936,"response_body_truncated":false,"response_body_kind":"text","response_body":"\n    <!DOCTYPE html>\n    <html>\n    <head>\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\">\n    <link rel=\"shortcut icon\" href=\"https://fastapi.tiangolo.com/img/favicon.png\">\n    <title>Singing Bird - Swagger UI</title>\n    </head>\n    <body>\n    <div id=\"swagger-ui\">\n    </div>\n    <script src=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\"></script>\n    <!-- `SwaggerUIBundle` is now available on the page -->\n    <script>\n    const ui = SwaggerUIBundle({\n        url: '/openapi.json',\n    \"dom_id\": \"#swagger-ui\",\n\"layout\": \"BaseLayout\",\n\"deepLinking\": true,\n\"showExtensions\": true,\n\"showCommonExtensions\": true,\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\n    presets: [\n        SwaggerUIBundle.presets.apis,\n        SwaggerUIBundle.SwaggerUIStandalonePreset\n        ],\n    })\n    </script>\n    </body>\n    </html>\n    ","response_stream":false},"error":null},{"request_id":"d4e6e838094740d195097524eff12365","ts":"2026-04-18T17:26:22.820855Z","duration_ms":0.242,"method":"GET","path":"/docs","query":"","operation_id":"","client_ip":"192.168.29.10","user_agent":"kube-probe/1.31","auth":{"scheme":null,"scope":"admin","auth_enabled":false,"recognized":true},"request":{"headers":{"host":"10.244.112.209:8420","user-agent":"kube-probe/1.31","accept":"*/*","connection":"close"},"request_body_size":0,"request_body_truncated":false,"request_body_kind":"empty","request_body":null},"status":200,"response":{"headers":{"content-length":"936","content-type":"text/html; charset=utf-8","x-request-id":"d4e6e838094740d195097524eff12365"},"response_body_size":936,"response_body_truncated":false,"response_body_kind":"text","response_body":"\n    <!DOCTYPE html>\n    <html>\n    <head>\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\">\n    <link rel=\"shortcut icon\" href=\"https://fastapi.tiangolo.com/img/favicon.png\">\n    <title>Singing Bird - Swagger UI</title>\n    </head>\n    <body>\n    <div id=\"swagger-ui\">\n    </div>\n    <script src=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\"></script>\n    <!-- `SwaggerUIBundle` is now available on the page -->\n    <script>\n    const ui = SwaggerUIBundle({\n        url: '/openapi.json',\n    \"dom_id\": \"#swagger-ui\",\n\"layout\": \"BaseLayout\",\n\"deepLinking\": true,\n\"showExtensions\": true,\n\"showCommonExtensions\": true,\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\n    presets: [\n        SwaggerUIBundle.presets.apis,\n        SwaggerUIBundle.SwaggerUIStandalonePreset\n        ],\n    })\n    </script>\n    </body>\n    </html>\n    ","response_stream":false},"error":null},{"request_id":"f084043b64a64838a20729d2994473bd","ts":"2026-04-18T17:26:20.602628Z","duration_ms":0.39,"method":"GET","path":"/mcp","query":"","operation_id":"mcp_get_mcp_get","client_ip":"216.73.216.73","user_agent":"Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com)","auth":{"scheme":null,"scope":"admin","auth_enabled":false,"recognized":true},"request":{"headers":{"host":"singing-bird.benac.dev","user-agent":"Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com)","accept":"*/*","accept-encoding":"gzip, br, zstd, deflate","via":"2.0 Caddy","x-forwarded-for":"216.73.216.73","x-forwarded-host":"singing-bird.benac.dev","x-forwarded-proto":"https","x-real-ip":"216.73.216.73"},"request_body_size":0,"request_body_truncated":false,"request_body_kind":"empty","request_body":null},"status":405,"response":{"headers":{"content-length":"45","content-type":"application/json","x-request-id":"f084043b64a64838a20729d2994473bd"},"response_body_size":45,"response_body_truncated":false,"response_body_kind":"json","response_body":{"detail":"GET /mcp not supported; use POST"},"response_stream":false},"error":null},{"request_id":"799834d59716427a9af6f7f2d668d5be","ts":"2026-04-18T17:26:12.820896Z","duration_ms":0.251,"method":"GET","path":"/docs","query":"","operation_id":"","client_ip":"192.168.29.10","user_agent":"kube-probe/1.31","auth":{"scheme":null,"scope":"admin","auth_enabled":false,"recognized":true},"request":{"headers":{"host":"10.244.112.209:8420","user-agent":"kube-probe/1.31","accept":"*/*","connection":"close"},"request_body_size":0,"request_body_truncated":false,"request_body_kind":"empty","request_body":null},"status":200,"response":{"headers":{"content-length":"936","content-type":"text/html; charset=utf-8","x-request-id":"799834d59716427a9af6f7f2d668d5be"},"response_body_size":936,"response_body_truncated":false,"response_body_kind":"text","response_body":"\n    <!DOCTYPE html>\n    <html>\n    <head>\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\">\n    <link rel=\"shortcut icon\" href=\"https://fastapi.tiangolo.com/img/favicon.png\">\n    <title>Singing Bird - Swagger UI</title>\n    </head>\n    <body>\n    <div id=\"swagger-ui\">\n    </div>\n    <script src=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\"></script>\n    <!-- `SwaggerUIBundle` is now available on the page -->\n    <script>\n    const ui = SwaggerUIBundle({\n        url: '/openapi.json',\n    \"dom_id\": \"#swagger-ui\",\n\"layout\": \"BaseLayout\",\n\"deepLinking\": true,\n\"showExtensions\": true,\n\"showCommonExtensions\": true,\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\n    presets: [\n        SwaggerUIBundle.presets.apis,\n        SwaggerUIBundle.SwaggerUIStandalonePreset\n        ],\n    })\n    </script>\n    </body>\n    </html>\n    ","response_stream":false},"error":null},{"request_id":"34ffb972b8e14eb1b91125608ba71db1","ts":"2026-04-18T17:26:02.821803Z","duration_ms":0.144,"method":"GET","path":"/docs","query":"","operation_id":"","client_ip":"192.168.29.10","user_agent":"kube-probe/1.31","auth":{"scheme":null,"scope":"admin","auth_enabled":false,"recognized":true},"request":{"headers":{"host":"10.244.112.209:8420","user-agent":"kube-probe/1.31","accept":"*/*","connection":"close"},"request_body_size":0,"request_body_truncated":false,"request_body_kind":"empty","request_body":null},"status":200,"response":{"headers":{"content-length":"936","content-type":"text/html; charset=utf-8","x-request-id":"34ffb972b8e14eb1b91125608ba71db1"},"response_body_size":936,"response_body_truncated":false,"response_body_kind":"text","response_body":"\n    <!DOCTYPE html>\n    <html>\n    <head>\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\">\n    <link rel=\"shortcut icon\" href=\"https://fastapi.tiangolo.com/img/favicon.png\">\n    <title>Singing Bird - Swagger UI</title>\n    </head>\n    <body>\n    <div id=\"swagger-ui\">\n    </div>\n    <script src=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\"></script>\n    <!-- `SwaggerUIBundle` is now available on the page -->\n    <script>\n    const ui = SwaggerUIBundle({\n        url: '/openapi.json',\n    \"dom_id\": \"#swagger-ui\",\n\"layout\": \"BaseLayout\",\n\"deepLinking\": true,\n\"showExtensions\": true,\n\"showCommonExtensions\": true,\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\n    presets: [\n        SwaggerUIBundle.presets.apis,\n        SwaggerUIBundle.SwaggerUIStandalonePreset\n        ],\n    })\n    </script>\n    </body>\n    </html>\n    ","response_stream":false},"error":null},{"request_id":"ea7f0a8ee3a64a3080fc0354fe75b63d","ts":"2026-04-18T17:26:02.821193Z","duration_ms":0.235,"method":"GET","path":"/docs","query":"","operation_id":"","client_ip":"192.168.29.10","user_agent":"kube-probe/1.31","auth":{"scheme":null,"scope":"admin","auth_enabled":false,"recognized":true},"request":{"headers":{"host":"10.244.112.209:8420","user-agent":"kube-probe/1.31","accept":"*/*","connection":"close"},"request_body_size":0,"request_body_truncated":false,"request_body_kind":"empty","request_body":null},"status":200,"response":{"headers":{"content-length":"936","content-type":"text/html; charset=utf-8","x-request-id":"ea7f0a8ee3a64a3080fc0354fe75b63d"},"response_body_size":936,"response_body_truncated":false,"response_body_kind":"text","response_body":"\n    <!DOCTYPE html>\n    <html>\n    <head>\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\">\n    <link rel=\"shortcut icon\" href=\"https://fastapi.tiangolo.com/img/favicon.png\">\n    <title>Singing Bird - Swagger UI</title>\n    </head>\n    <body>\n    <div id=\"swagger-ui\">\n    </div>\n    <script src=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\"></script>\n    <!-- `SwaggerUIBundle` is now available on the page -->\n    <script>\n    const ui = SwaggerUIBundle({\n        url: '/openapi.json',\n    \"dom_id\": \"#swagger-ui\",\n\"layout\": \"BaseLayout\",\n\"deepLinking\": true,\n\"showExtensions\": true,\n\"showCommonExtensions\": true,\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\n    presets: [\n        SwaggerUIBundle.presets.apis,\n        SwaggerUIBundle.SwaggerUIStandalonePreset\n        ],\n    })\n    </script>\n    </body>\n    </html>\n    ","response_stream":false},"error":null},{"request_id":"18679b7aa0d74972bde9ea799561c621","ts":"2026-04-18T17:25:52.821440Z","duration_ms":0.262,"method":"GET","path":"/docs","query":"","operation_id":"","client_ip":"192.168.29.10","user_agent":"kube-probe/1.31","auth":{"scheme":null,"scope":"admin","auth_enabled":false,"recognized":true},"request":{"headers":{"host":"10.244.112.209:8420","user-agent":"kube-probe/1.31","accept":"*/*","connection":"close"},"request_body_size":0,"request_body_truncated":false,"request_body_kind":"empty","request_body":null},"status":200,"response":{"headers":{"content-length":"936","content-type":"text/html; charset=utf-8","x-request-id":"18679b7aa0d74972bde9ea799561c621"},"response_body_size":936,"response_body_truncated":false,"response_body_kind":"text","response_body":"\n    <!DOCTYPE html>\n    <html>\n    <head>\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\">\n    <link rel=\"shortcut icon\" href=\"https://fastapi.tiangolo.com/img/favicon.png\">\n    <title>Singing Bird - Swagger UI</title>\n    </head>\n    <body>\n    <div id=\"swagger-ui\">\n    </div>\n    <script src=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\"></script>\n    <!-- `SwaggerUIBundle` is now available on the page -->\n    <script>\n    const ui = SwaggerUIBundle({\n        url: '/openapi.json',\n    \"dom_id\": \"#swagger-ui\",\n\"layout\": \"BaseLayout\",\n\"deepLinking\": true,\n\"showExtensions\": true,\n\"showCommonExtensions\": true,\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\n    presets: [\n        SwaggerUIBundle.presets.apis,\n        SwaggerUIBundle.SwaggerUIStandalonePreset\n        ],\n    })\n    </script>\n    </body>\n    </html>\n    ","response_stream":false},"error":null},{"request_id":"6781d58e0cf2465abcbcfa8317d0c621","ts":"2026-04-18T17:25:42.820999Z","duration_ms":0.266,"method":"GET","path":"/docs","query":"","operation_id":"","client_ip":"192.168.29.10","user_agent":"kube-probe/1.31","auth":{"scheme":null,"scope":"admin","auth_enabled":false,"recognized":true},"request":{"headers":{"host":"10.244.112.209:8420","user-agent":"kube-probe/1.31","accept":"*/*","connection":"close"},"request_body_size":0,"request_body_truncated":false,"request_body_kind":"empty","request_body":null},"status":200,"response":{"headers":{"content-length":"936","content-type":"text/html; charset=utf-8","x-request-id":"6781d58e0cf2465abcbcfa8317d0c621"},"response_body_size":936,"response_body_truncated":false,"response_body_kind":"text","response_body":"\n    <!DOCTYPE html>\n    <html>\n    <head>\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\">\n    <link rel=\"shortcut icon\" href=\"https://fastapi.tiangolo.com/img/favicon.png\">\n    <title>Singing Bird - Swagger UI</title>\n    </head>\n    <body>\n    <div id=\"swagger-ui\">\n    </div>\n    <script src=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\"></script>\n    <!-- `SwaggerUIBundle` is now available on the page -->\n    <script>\n    const ui = SwaggerUIBundle({\n        url: '/openapi.json',\n    \"dom_id\": \"#swagger-ui\",\n\"layout\": \"BaseLayout\",\n\"deepLinking\": true,\n\"showExtensions\": true,\n\"showCommonExtensions\": true,\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\n    presets: [\n        SwaggerUIBundle.presets.apis,\n        SwaggerUIBundle.SwaggerUIStandalonePreset\n        ],\n    })\n    </script>\n    </body>\n    </html>\n    ","response_stream":false},"error":null},{"request_id":"f50e95ee16114063b93388d738e6023e","ts":"2026-04-18T17:25:41.419784Z","duration_ms":0.221,"method":"GET","path":"/redoc","query":"","operation_id":"","client_ip":"216.73.216.73","user_agent":"Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com)","auth":{"scheme":null,"scope":"admin","auth_enabled":false,"recognized":true},"request":{"headers":{"host":"singing-bird.benac.dev","user-agent":"Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com)","accept":"*/*","accept-encoding":"gzip, br, zstd, deflate","via":"2.0 Caddy","x-forwarded-for":"216.73.216.73","x-forwarded-host":"singing-bird.benac.dev","x-forwarded-proto":"https","x-real-ip":"216.73.216.73"},"request_body_size":0,"request_body_truncated":false,"request_body_kind":"empty","request_body":null},"status":200,"response":{"headers":{"content-length":"896","content-type":"text/html; charset=utf-8","x-request-id":"f50e95ee16114063b93388d738e6023e"},"response_body_size":896,"response_body_truncated":false,"response_body_kind":"text","response_body":"\n    <!DOCTYPE html>\n    <html>\n    <head>\n    <title>Singing Bird - ReDoc</title>\n    <!-- needed for adaptive design -->\n    <meta charset=\"utf-8\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    \n    <link href=\"https://fonts.googleapis.com/css?family=Montserrat:300,400,700|Roboto:300,400,700\" rel=\"stylesheet\">\n    \n    <link rel=\"shortcut icon\" href=\"https://fastapi.tiangolo.com/img/favicon.png\">\n    <!--\n    ReDoc doesn't change outer page styles\n    -->\n    <style>\n      body {\n        margin: 0;\n        padding: 0;\n      }\n    </style>\n    </head>\n    <body>\n    <noscript>\n        ReDoc requires Javascript to function. Please enable it to browse the documentation.\n    </noscript>\n    <redoc spec-url=\"/openapi.json\"></redoc>\n    <script src=\"https://cdn.jsdelivr.net/npm/redoc@next/bundles/redoc.standalone.js\"> </script>\n    </body>\n    </html>\n    ","response_stream":false},"error":null},{"request_id":"d337a915f996455ba944a1caaf7324eb","ts":"2026-04-18T17:25:32.821156Z","duration_ms":0.146,"method":"GET","path":"/docs","query":"","operation_id":"","client_ip":"192.168.29.10","user_agent":"kube-probe/1.31","auth":{"scheme":null,"scope":"admin","auth_enabled":false,"recognized":true},"request":{"headers":{"host":"10.244.112.209:8420","user-agent":"kube-probe/1.31","accept":"*/*","connection":"close"},"request_body_size":0,"request_body_truncated":false,"request_body_kind":"empty","request_body":null},"status":200,"response":{"headers":{"content-length":"936","content-type":"text/html; charset=utf-8","x-request-id":"d337a915f996455ba944a1caaf7324eb"},"response_body_size":936,"response_body_truncated":false,"response_body_kind":"text","response_body":"\n    <!DOCTYPE html>\n    <html>\n    <head>\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\">\n    <link rel=\"shortcut icon\" href=\"https://fastapi.tiangolo.com/img/favicon.png\">\n    <title>Singing Bird - Swagger UI</title>\n    </head>\n    <body>\n    <div id=\"swagger-ui\">\n    </div>\n    <script src=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\"></script>\n    <!-- `SwaggerUIBundle` is now available on the page -->\n    <script>\n    const ui = SwaggerUIBundle({\n        url: '/openapi.json',\n    \"dom_id\": \"#swagger-ui\",\n\"layout\": \"BaseLayout\",\n\"deepLinking\": true,\n\"showExtensions\": true,\n\"showCommonExtensions\": true,\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\n    presets: [\n        SwaggerUIBundle.presets.apis,\n        SwaggerUIBundle.SwaggerUIStandalonePreset\n        ],\n    })\n    </script>\n    </body>\n    </html>\n    ","response_stream":false},"error":null},{"request_id":"a87b250b677546e0a7a5cf7ff54112f6","ts":"2026-04-18T17:25:32.820573Z","duration_ms":0.235,"method":"GET","path":"/docs","query":"","operation_id":"","client_ip":"192.168.29.10","user_agent":"kube-probe/1.31","auth":{"scheme":null,"scope":"admin","auth_enabled":false,"recognized":true},"request":{"headers":{"host":"10.244.112.209:8420","user-agent":"kube-probe/1.31","accept":"*/*","connection":"close"},"request_body_size":0,"request_body_truncated":false,"request_body_kind":"empty","request_body":null},"status":200,"response":{"headers":{"content-length":"936","content-type":"text/html; charset=utf-8","x-request-id":"a87b250b677546e0a7a5cf7ff54112f6"},"response_body_size":936,"response_body_truncated":false,"response_body_kind":"text","response_body":"\n    <!DOCTYPE html>\n    <html>\n    <head>\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\">\n    <link rel=\"shortcut icon\" href=\"https://fastapi.tiangolo.com/img/favicon.png\">\n    <title>Singing Bird - Swagger UI</title>\n    </head>\n    <body>\n    <div id=\"swagger-ui\">\n    </div>\n    <script src=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\"></script>\n    <!-- `SwaggerUIBundle` is now available on the page -->\n    <script>\n    const ui = SwaggerUIBundle({\n        url: '/openapi.json',\n    \"dom_id\": \"#swagger-ui\",\n\"layout\": \"BaseLayout\",\n\"deepLinking\": true,\n\"showExtensions\": true,\n\"showCommonExtensions\": true,\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\n    presets: [\n        SwaggerUIBundle.presets.apis,\n        SwaggerUIBundle.SwaggerUIStandalonePreset\n        ],\n    })\n    </script>\n    </body>\n    </html>\n    ","response_stream":false},"error":null},{"request_id":"fdf9a6f4c1fe4a2a94d8b99667dbf28d","ts":"2026-04-18T17:25:22.821263Z","duration_ms":0.247,"method":"GET","path":"/docs","query":"","operation_id":"","client_ip":"192.168.29.10","user_agent":"kube-probe/1.31","auth":{"scheme":null,"scope":"admin","auth_enabled":false,"recognized":true},"request":{"headers":{"host":"10.244.112.209:8420","user-agent":"kube-probe/1.31","accept":"*/*","connection":"close"},"request_body_size":0,"request_body_truncated":false,"request_body_kind":"empty","request_body":null},"status":200,"response":{"headers":{"content-length":"936","content-type":"text/html; charset=utf-8","x-request-id":"fdf9a6f4c1fe4a2a94d8b99667dbf28d"},"response_body_size":936,"response_body_truncated":false,"response_body_kind":"text","response_body":"\n    <!DOCTYPE html>\n    <html>\n    <head>\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\">\n    <link rel=\"shortcut icon\" href=\"https://fastapi.tiangolo.com/img/favicon.png\">\n    <title>Singing Bird - Swagger UI</title>\n    </head>\n    <body>\n    <div id=\"swagger-ui\">\n    </div>\n    <script src=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\"></script>\n    <!-- `SwaggerUIBundle` is now available on the page -->\n    <script>\n    const ui = SwaggerUIBundle({\n        url: '/openapi.json',\n    \"dom_id\": \"#swagger-ui\",\n\"layout\": \"BaseLayout\",\n\"deepLinking\": true,\n\"showExtensions\": true,\n\"showCommonExtensions\": true,\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\n    presets: [\n        SwaggerUIBundle.presets.apis,\n        SwaggerUIBundle.SwaggerUIStandalonePreset\n        ],\n    })\n    </script>\n    </body>\n    </html>\n    ","response_stream":false},"error":null},{"request_id":"5f513b69e83a4830944e5c6b8c5e1686","ts":"2026-04-18T17:25:12.820812Z","duration_ms":0.244,"method":"GET","path":"/docs","query":"","operation_id":"","client_ip":"192.168.29.10","user_agent":"kube-probe/1.31","auth":{"scheme":null,"scope":"admin","auth_enabled":false,"recognized":true},"request":{"headers":{"host":"10.244.112.209:8420","user-agent":"kube-probe/1.31","accept":"*/*","connection":"close"},"request_body_size":0,"request_body_truncated":false,"request_body_kind":"empty","request_body":null},"status":200,"response":{"headers":{"content-length":"936","content-type":"text/html; charset=utf-8","x-request-id":"5f513b69e83a4830944e5c6b8c5e1686"},"response_body_size":936,"response_body_truncated":false,"response_body_kind":"text","response_body":"\n    <!DOCTYPE html>\n    <html>\n    <head>\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\">\n    <link rel=\"shortcut icon\" href=\"https://fastapi.tiangolo.com/img/favicon.png\">\n    <title>Singing Bird - Swagger UI</title>\n    </head>\n    <body>\n    <div id=\"swagger-ui\">\n    </div>\n    <script src=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\"></script>\n    <!-- `SwaggerUIBundle` is now available on the page -->\n    <script>\n    const ui = SwaggerUIBundle({\n        url: '/openapi.json',\n    \"dom_id\": \"#swagger-ui\",\n\"layout\": \"BaseLayout\",\n\"deepLinking\": true,\n\"showExtensions\": true,\n\"showCommonExtensions\": true,\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\n    presets: [\n        SwaggerUIBundle.presets.apis,\n        SwaggerUIBundle.SwaggerUIStandalonePreset\n        ],\n    })\n    </script>\n    </body>\n    </html>\n    ","response_stream":false},"error":null},{"request_id":"f779203118c24c49ad34ba7662a77a76","ts":"2026-04-18T17:25:02.821232Z","duration_ms":0.14,"method":"GET","path":"/docs","query":"","operation_id":"","client_ip":"192.168.29.10","user_agent":"kube-probe/1.31","auth":{"scheme":null,"scope":"admin","auth_enabled":false,"recognized":true},"request":{"headers":{"host":"10.244.112.209:8420","user-agent":"kube-probe/1.31","accept":"*/*","connection":"close"},"request_body_size":0,"request_body_truncated":false,"request_body_kind":"empty","request_body":null},"status":200,"response":{"headers":{"content-length":"936","content-type":"text/html; charset=utf-8","x-request-id":"f779203118c24c49ad34ba7662a77a76"},"response_body_size":936,"response_body_truncated":false,"response_body_kind":"text","response_body":"\n    <!DOCTYPE html>\n    <html>\n    <head>\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\">\n    <link rel=\"shortcut icon\" href=\"https://fastapi.tiangolo.com/img/favicon.png\">\n    <title>Singing Bird - Swagger UI</title>\n    </head>\n    <body>\n    <div id=\"swagger-ui\">\n    </div>\n    <script src=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\"></script>\n    <!-- `SwaggerUIBundle` is now available on the page -->\n    <script>\n    const ui = SwaggerUIBundle({\n        url: '/openapi.json',\n    \"dom_id\": \"#swagger-ui\",\n\"layout\": \"BaseLayout\",\n\"deepLinking\": true,\n\"showExtensions\": true,\n\"showCommonExtensions\": true,\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\n    presets: [\n        SwaggerUIBundle.presets.apis,\n        SwaggerUIBundle.SwaggerUIStandalonePreset\n        ],\n    })\n    </script>\n    </body>\n    </html>\n    ","response_stream":false},"error":null},{"request_id":"99d7706b651a4d9ea0025e1c75a44cba","ts":"2026-04-18T17:25:02.820622Z","duration_ms":0.27,"method":"GET","path":"/docs","query":"","operation_id":"","client_ip":"192.168.29.10","user_agent":"kube-probe/1.31","auth":{"scheme":null,"scope":"admin","auth_enabled":false,"recognized":true},"request":{"headers":{"host":"10.244.112.209:8420","user-agent":"kube-probe/1.31","accept":"*/*","connection":"close"},"request_body_size":0,"request_body_truncated":false,"request_body_kind":"empty","request_body":null},"status":200,"response":{"headers":{"content-length":"936","content-type":"text/html; charset=utf-8","x-request-id":"99d7706b651a4d9ea0025e1c75a44cba"},"response_body_size":936,"response_body_truncated":false,"response_body_kind":"text","response_body":"\n    <!DOCTYPE html>\n    <html>\n    <head>\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\">\n    <link rel=\"shortcut icon\" href=\"https://fastapi.tiangolo.com/img/favicon.png\">\n    <title>Singing Bird - Swagger UI</title>\n    </head>\n    <body>\n    <div id=\"swagger-ui\">\n    </div>\n    <script src=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\"></script>\n    <!-- `SwaggerUIBundle` is now available on the page -->\n    <script>\n    const ui = SwaggerUIBundle({\n        url: '/openapi.json',\n    \"dom_id\": \"#swagger-ui\",\n\"layout\": \"BaseLayout\",\n\"deepLinking\": true,\n\"showExtensions\": true,\n\"showCommonExtensions\": true,\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\n    presets: [\n        SwaggerUIBundle.presets.apis,\n        SwaggerUIBundle.SwaggerUIStandalonePreset\n        ],\n    })\n    </script>\n    </body>\n    </html>\n    ","response_stream":false},"error":null},{"request_id":"907eaba9a4194940a4534e783643c4e4","ts":"2026-04-18T17:24:52.820571Z","duration_ms":0.256,"method":"GET","path":"/docs","query":"","operation_id":"","client_ip":"192.168.29.10","user_agent":"kube-probe/1.31","auth":{"scheme":null,"scope":"admin","auth_enabled":false,"recognized":true},"request":{"headers":{"host":"10.244.112.209:8420","user-agent":"kube-probe/1.31","accept":"*/*","connection":"close"},"request_body_size":0,"request_body_truncated":false,"request_body_kind":"empty","request_body":null},"status":200,"response":{"headers":{"content-length":"936","content-type":"text/html; charset=utf-8","x-request-id":"907eaba9a4194940a4534e783643c4e4"},"response_body_size":936,"response_body_truncated":false,"response_body_kind":"text","response_body":"\n    <!DOCTYPE html>\n    <html>\n    <head>\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\">\n    <link rel=\"shortcut icon\" href=\"https://fastapi.tiangolo.com/img/favicon.png\">\n    <title>Singing Bird - Swagger UI</title>\n    </head>\n    <body>\n    <div id=\"swagger-ui\">\n    </div>\n    <script src=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\"></script>\n    <!-- `SwaggerUIBundle` is now available on the page -->\n    <script>\n    const ui = SwaggerUIBundle({\n        url: '/openapi.json',\n    \"dom_id\": \"#swagger-ui\",\n\"layout\": \"BaseLayout\",\n\"deepLinking\": true,\n\"showExtensions\": true,\n\"showCommonExtensions\": true,\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\n    presets: [\n        SwaggerUIBundle.presets.apis,\n        SwaggerUIBundle.SwaggerUIStandalonePreset\n        ],\n    })\n    </script>\n    </body>\n    </html>\n    ","response_stream":false},"error":null},{"request_id":"42f05a4a7ae049249338d511489c840c","ts":"2026-04-18T17:24:42.820749Z","duration_ms":0.25,"method":"GET","path":"/docs","query":"","operation_id":"","client_ip":"192.168.29.10","user_agent":"kube-probe/1.31","auth":{"scheme":null,"scope":"admin","auth_enabled":false,"recognized":true},"request":{"headers":{"host":"10.244.112.209:8420","user-agent":"kube-probe/1.31","accept":"*/*","connection":"close"},"request_body_size":0,"request_body_truncated":false,"request_body_kind":"empty","request_body":null},"status":200,"response":{"headers":{"content-length":"936","content-type":"text/html; charset=utf-8","x-request-id":"42f05a4a7ae049249338d511489c840c"},"response_body_size":936,"response_body_truncated":false,"response_body_kind":"text","response_body":"\n    <!DOCTYPE html>\n    <html>\n    <head>\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\">\n    <link rel=\"shortcut icon\" href=\"https://fastapi.tiangolo.com/img/favicon.png\">\n    <title>Singing Bird - Swagger UI</title>\n    </head>\n    <body>\n    <div id=\"swagger-ui\">\n    </div>\n    <script src=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\"></script>\n    <!-- `SwaggerUIBundle` is now available on the page -->\n    <script>\n    const ui = SwaggerUIBundle({\n        url: '/openapi.json',\n    \"dom_id\": \"#swagger-ui\",\n\"layout\": \"BaseLayout\",\n\"deepLinking\": true,\n\"showExtensions\": true,\n\"showCommonExtensions\": true,\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\n    presets: [\n        SwaggerUIBundle.presets.apis,\n        SwaggerUIBundle.SwaggerUIStandalonePreset\n        ],\n    })\n    </script>\n    </body>\n    </html>\n    ","response_stream":false},"error":null},{"request_id":"9fc606215994473a9624f01edc43f60c","ts":"2026-04-18T17:24:32.821567Z","duration_ms":0.178,"method":"GET","path":"/docs","query":"","operation_id":"","client_ip":"192.168.29.10","user_agent":"kube-probe/1.31","auth":{"scheme":null,"scope":"admin","auth_enabled":false,"recognized":true},"request":{"headers":{"host":"10.244.112.209:8420","user-agent":"kube-probe/1.31","accept":"*/*","connection":"close"},"request_body_size":0,"request_body_truncated":false,"request_body_kind":"empty","request_body":null},"status":200,"response":{"headers":{"content-length":"936","content-type":"text/html; charset=utf-8","x-request-id":"9fc606215994473a9624f01edc43f60c"},"response_body_size":936,"response_body_truncated":false,"response_body_kind":"text","response_body":"\n    <!DOCTYPE html>\n    <html>\n    <head>\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\">\n    <link rel=\"shortcut icon\" href=\"https://fastapi.tiangolo.com/img/favicon.png\">\n    <title>Singing Bird - Swagger UI</title>\n    </head>\n    <body>\n    <div id=\"swagger-ui\">\n    </div>\n    <script src=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\"></script>\n    <!-- `SwaggerUIBundle` is now available on the page -->\n    <script>\n    const ui = SwaggerUIBundle({\n        url: '/openapi.json',\n    \"dom_id\": \"#swagger-ui\",\n\"layout\": \"BaseLayout\",\n\"deepLinking\": true,\n\"showExtensions\": true,\n\"showCommonExtensions\": true,\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\n    presets: [\n        SwaggerUIBundle.presets.apis,\n        SwaggerUIBundle.SwaggerUIStandalonePreset\n        ],\n    })\n    </script>\n    </body>\n    </html>\n    ","response_stream":false},"error":null},{"request_id":"9a39f913fb484de0b5d7dcaad754d250","ts":"2026-04-18T17:24:32.820973Z","duration_ms":0.251,"method":"GET","path":"/docs","query":"","operation_id":"","client_ip":"192.168.29.10","user_agent":"kube-probe/1.31","auth":{"scheme":null,"scope":"admin","auth_enabled":false,"recognized":true},"request":{"headers":{"host":"10.244.112.209:8420","user-agent":"kube-probe/1.31","accept":"*/*","connection":"close"},"request_body_size":0,"request_body_truncated":false,"request_body_kind":"empty","request_body":null},"status":200,"response":{"headers":{"content-length":"936","content-type":"text/html; charset=utf-8","x-request-id":"9a39f913fb484de0b5d7dcaad754d250"},"response_body_size":936,"response_body_truncated":false,"response_body_kind":"text","response_body":"\n    <!DOCTYPE html>\n    <html>\n    <head>\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\">\n    <link rel=\"shortcut icon\" href=\"https://fastapi.tiangolo.com/img/favicon.png\">\n    <title>Singing Bird - Swagger UI</title>\n    </head>\n    <body>\n    <div id=\"swagger-ui\">\n    </div>\n    <script src=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\"></script>\n    <!-- `SwaggerUIBundle` is now available on the page -->\n    <script>\n    const ui = SwaggerUIBundle({\n        url: '/openapi.json',\n    \"dom_id\": \"#swagger-ui\",\n\"layout\": \"BaseLayout\",\n\"deepLinking\": true,\n\"showExtensions\": true,\n\"showCommonExtensions\": true,\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\n    presets: [\n        SwaggerUIBundle.presets.apis,\n        SwaggerUIBundle.SwaggerUIStandalonePreset\n        ],\n    })\n    </script>\n    </body>\n    </html>\n    ","response_stream":false},"error":null},{"request_id":"e38654a338874c2cb2100ebd9bcef8d5","ts":"2026-04-18T17:24:22.820867Z","duration_ms":0.259,"method":"GET","path":"/docs","query":"","operation_id":"","client_ip":"192.168.29.10","user_agent":"kube-probe/1.31","auth":{"scheme":null,"scope":"admin","auth_enabled":false,"recognized":true},"request":{"headers":{"host":"10.244.112.209:8420","user-agent":"kube-probe/1.31","accept":"*/*","connection":"close"},"request_body_size":0,"request_body_truncated":false,"request_body_kind":"empty","request_body":null},"status":200,"response":{"headers":{"content-length":"936","content-type":"text/html; charset=utf-8","x-request-id":"e38654a338874c2cb2100ebd9bcef8d5"},"response_body_size":936,"response_body_truncated":false,"response_body_kind":"text","response_body":"\n    <!DOCTYPE html>\n    <html>\n    <head>\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\">\n    <link rel=\"shortcut icon\" href=\"https://fastapi.tiangolo.com/img/favicon.png\">\n    <title>Singing Bird - Swagger UI</title>\n    </head>\n    <body>\n    <div id=\"swagger-ui\">\n    </div>\n    <script src=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\"></script>\n    <!-- `SwaggerUIBundle` is now available on the page -->\n    <script>\n    const ui = SwaggerUIBundle({\n        url: '/openapi.json',\n    \"dom_id\": \"#swagger-ui\",\n\"layout\": \"BaseLayout\",\n\"deepLinking\": true,\n\"showExtensions\": true,\n\"showCommonExtensions\": true,\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\n    presets: [\n        SwaggerUIBundle.presets.apis,\n        SwaggerUIBundle.SwaggerUIStandalonePreset\n        ],\n    })\n    </script>\n    </body>\n    </html>\n    ","response_stream":false},"error":null},{"request_id":"2307c8e7d0fb4c0d9dc2eeb86f5ddb17","ts":"2026-04-18T17:24:12.820367Z","duration_ms":0.263,"method":"GET","path":"/docs","query":"","operation_id":"","client_ip":"192.168.29.10","user_agent":"kube-probe/1.31","auth":{"scheme":null,"scope":"admin","auth_enabled":false,"recognized":true},"request":{"headers":{"host":"10.244.112.209:8420","user-agent":"kube-probe/1.31","accept":"*/*","connection":"close"},"request_body_size":0,"request_body_truncated":false,"request_body_kind":"empty","request_body":null},"status":200,"response":{"headers":{"content-length":"936","content-type":"text/html; charset=utf-8","x-request-id":"2307c8e7d0fb4c0d9dc2eeb86f5ddb17"},"response_body_size":936,"response_body_truncated":false,"response_body_kind":"text","response_body":"\n    <!DOCTYPE html>\n    <html>\n    <head>\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\">\n    <link rel=\"shortcut icon\" href=\"https://fastapi.tiangolo.com/img/favicon.png\">\n    <title>Singing Bird - Swagger UI</title>\n    </head>\n    <body>\n    <div id=\"swagger-ui\">\n    </div>\n    <script src=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\"></script>\n    <!-- `SwaggerUIBundle` is now available on the page -->\n    <script>\n    const ui = SwaggerUIBundle({\n        url: '/openapi.json',\n    \"dom_id\": \"#swagger-ui\",\n\"layout\": \"BaseLayout\",\n\"deepLinking\": true,\n\"showExtensions\": true,\n\"showCommonExtensions\": true,\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\n    presets: [\n        SwaggerUIBundle.presets.apis,\n        SwaggerUIBundle.SwaggerUIStandalonePreset\n        ],\n    })\n    </script>\n    </body>\n    </html>\n    ","response_stream":false},"error":null},{"request_id":"aa2f9edc4a7c4d45ba0b30e9f55f54d4","ts":"2026-04-18T17:24:12.688285Z","duration_ms":19.734,"method":"GET","path":"/guides/readme","query":"","operation_id":"guide_page_guides__slug__get","client_ip":"216.73.216.73","user_agent":"Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com)","auth":{"scheme":null,"scope":"admin","auth_enabled":false,"recognized":true},"request":{"headers":{"host":"singing-bird.benac.dev","user-agent":"Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com)","accept":"*/*","accept-encoding":"gzip, br, zstd, deflate","via":"2.0 Caddy","x-forwarded-for":"216.73.216.73","x-forwarded-host":"singing-bird.benac.dev","x-forwarded-proto":"https","x-real-ip":"216.73.216.73"},"request_body_size":0,"request_body_truncated":false,"request_body_kind":"empty","request_body":null},"status":200,"response":{"headers":{"content-length":"28642","content-type":"text/html; charset=utf-8","x-request-id":"aa2f9edc4a7c4d45ba0b30e9f55f54d4"},"response_body_size":28642,"response_body_truncated":false,"response_body_kind":"text","response_body":"<!doctype html><html lang='en'><head><meta charset='utf-8'><meta name='viewport' content='width=device-width, initial-scale=1'><meta name='color-scheme' content='light dark'><title>Readme · Singing Bird</title><style>\n:root {\n  color-scheme: light dark;\n  --bg: #f9fafb;\n  --fg: #1f2937;\n  --fg-muted: #6b7280;\n  --fg-dim: #9ca3af;\n  --surface: #ffffff;\n  --surface-2: #f3f4f6;\n  --border: #e5e7eb;\n  --border-soft: #f3f4f6;\n  --accent-bg: #dbeafe;\n  --accent-fg: #1e40af;\n  --link: #2563eb;\n  --error: #b91c1c;\n  --sidebar-bg: #ffffff;\n  --sidebar-hover: #f3f4f6;\n}\n@media (prefers-color-scheme: dark) {\n  :root {\n    --bg: #0f172a;\n    --fg: #e5e7eb;\n    --fg-muted: #94a3b8;\n    --fg-dim: #64748b;\n    --surface: #1e293b;\n    --surface-2: #0f172a;\n    --border: #334155;\n    --border-soft: #1e293b;\n    --accent-bg: #1e3a8a;\n    --accent-fg: #bfdbfe;\n    --link: #60a5fa;\n    --error: #fca5a5;\n    --sidebar-bg: #0f172a;\n    --sidebar-hover: #1e293b;\n  }\n}\n\n* { box-sizing: border-box; }\nhtml, body { margin: 0; padding: 0; }\nbody {\n  font-family: ui-sans-serif, system-ui, -apple-system, sans-serif;\n  color: var(--fg);\n  background: var(--bg);\n  min-height: 100vh;\n}\n\n.layout {\n  display: grid;\n  grid-template-columns: 240px minmax(0, 1fr);\n  max-width: 1280px;\n  margin: 0 auto;\n  min-height: 100vh;\n}\n\naside.sidebar {\n  background: var(--sidebar-bg);\n  border-right: 1px solid var(--border);\n  padding: 1.5rem 0;\n  position: sticky;\n  top: 0;\n  align-self: start;\n  height: 100vh;\n  overflow-y: auto;\n}\n.sidebar h1 { margin: 0 1.25rem 0.15rem; font-size: 1rem; letter-spacing: 0.02em; }\n.sidebar .brand-sub { margin: 0 1.25rem 1.5rem; color: var(--fg-muted); font-size: 0.75rem; }\n.sidebar nav { display: flex; flex-direction: column; }\n.sidebar a {\n  display: flex; justify-content: space-between; align-items: center;\n  padding: 0.5rem 1.25rem; text-decoration: none; color: var(--fg);\n  font-size: 0.88rem; border-left: 2px solid transparent;\n}\n.sidebar a:hover { background: var(--sidebar-hover); }\n.sidebar a.empty { color: var(--fg-dim); }\n.sidebar a.active {\n  background: var(--sidebar-hover);\n  border-left-color: var(--link);\n  color: var(--link);\n  font-weight: 600;\n}\n.sidebar a.active .count { color: var(--link); }\nhtml { scroll-behavior: smooth; }\n.sidebar .count {\n  font-variant-numeric: tabular-nums; font-size: 0.75rem;\n  color: var(--fg-muted); background: var(--surface-2);\n  padding: 0.05rem 0.45rem; border-radius: 999px;\n}\n.sidebar a.empty .count { background: transparent; }\n.sidebar .foot { margin: 1.5rem 1.25rem 0; color: var(--fg-dim); font-size: 0.7rem; line-height: 1.5; }\n.sidebar .foot a { display: inline; padding: 0; color: var(--link); border: 0; }\n\nmain { padding: 2rem 2.5rem 4rem; min-width: 0; }\nmain > header { margin-bottom: 2rem; }\nmain > header h2 { margin: 0 0 0.2rem; font-size: 1.5rem; }\nmain > header p { margin: 0; color: var(--fg-muted); font-size: 0.92rem; }\n\nsection.group { margin-bottom: 2.5rem; scroll-margin-top: 1rem; }\nsection.group > header { display: flex; align-items: baseline; gap: 0.75rem; margin-bottom: 0.85rem; }\nsection.group > header h3 { margin: 0; font-size: 1.1rem; }\nsection.group > header .desc { color: var(--fg-muted); font-size: 0.85rem; }\nsection.group.empty > .empty-state {\n  border: 1px dashed var(--border); border-radius: 8px;\n  padding: 1rem 1.25rem; color: var(--fg-dim);\n  font-size: 0.88rem; font-style: italic;\n  background: var(--surface-2);\n}\n\n.tile {\n  border: 1px solid var(--border); border-radius: 8px;\n  padding: 1.1rem 1.4rem; margin-bottom: 1rem;\n  background: var(--surface);\n}\n.tile-title {\n  margin: 0 0 0.35rem; font-size: 1.12rem; font-weight: 600;\n  color: var(--fg); letter-spacing: -0.005em; line-height: 1.3;\n}\n.tile-meta {\n  display: flex; align-items: baseline; gap: 0.6rem;\n  margin: 0 0 0.5rem; flex-wrap: wrap;\n}\n.tool-row {\n  display: flex; align-items: center; gap: 0.5rem;\n  margin: 0 0 0.65rem; flex-wrap: wrap;\n}\n.tool-row-label {\n  font-size: 0.72rem; text-transform: uppercase; letter-spacing: 0.08em;\n  color: var(--fg-muted);\n}\n.tool-chip {\n  display: inline-flex; align-items: baseline; gap: 0.45rem;\n  padding: 0.2rem 0.55rem; border-radius: 999px;\n  text-decoration: none;\n  background: var(--surface-2); color: var(--fg);\n  border: 1px solid var(--border);\n  font-size: 0.8rem;\n}\n.tool-chip:hover { border-color: var(--link); color: var(--link); text-decoration: none; }\n.tool-chip-name {\n  font: 600 0.75rem ui-monospace, SFMono-Regular, Menlo, monospace;\n  color: var(--fg-muted);\n}\n.tool-chip:hover .tool-chip-name { color: var(--link); }\n.tool-chip-title { font-size: 0.82rem; }\n\n.tile h4 { margin: 0 0 0.1rem; font-size: 1.02rem; display: flex; align-items: baseline; gap: 0.6rem; }\n.method {\n  font: 600 0.72rem ui-monospace, SFMono-Regular, Menlo, monospace;\n  padding: 0.1rem 0.45rem; border-radius: 4px;\n  background: var(--accent-bg); color: var(--accent-fg);\n}\n.tile-url {\n  font: 0.88rem ui-monospace, SFMono-Regular, Menlo, monospace;\n  color: var(--fg);\n  word-break: break-all;\n}\na.tile-url { color: var(--link); text-decoration: none; }\na.tile-url:hover { text-decoration: underline; }\n.scope {\n  font-size: 0.68rem; text-transform: uppercase; letter-spacing: 0.06em;\n  color: var(--fg-muted); margin-left: auto;\n}\n.tile p.summary { color: var(--fg); margin: 0.35rem 0 0.9rem; font-size: 0.92rem; }\n.hint { color: var(--fg-muted); font-size: 0.84rem; margin: 0 0 0.6rem; }\n\ntable { width: 100%; border-collapse: collapse; font-size: 0.87rem; }\nth, td { text-align: left; padding: 0.45rem 0.6rem; border-bottom: 1px solid var(--border-soft); }\nth {\n  font-weight: 600; color: var(--fg-muted);\n  font-size: 0.72rem; text-transform: uppercase; letter-spacing: 0.05em;\n}\ntd.pack { font: 0.87rem ui-monospace, monospace; color: var(--fg); }\ntd.path { font: 0.82rem ui-monospace, monospace; color: var(--fg-muted); }\ntd.num { text-align: right; font-variant-numeric: tabular-nums; color: var(--fg-muted); }\n.error { color: var(--error); font-style: italic; }\n\ncode {\n  background: var(--surface-2); padding: 0.05rem 0.35rem;\n  border-radius: 3px; font-size: 0.85em;\n}\na { color: var(--link); }\n\n/* API audit log tile */\n.log-table { font-size: 0.82rem; }\n.log-ts, .log-rid {\n  font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n  color: var(--fg-muted);\n  white-space: nowrap;\n}\n.log-rid { font-size: 0.78rem; }\n.log-path {\n  font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n  color: var(--fg);\n  max-width: 360px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;\n}\n.log-method {\n  display: inline-block; padding: 0.05rem 0.4rem; border-radius: 3px;\n  font: 600 0.72rem ui-monospace, monospace;\n  background: var(--surface-2); color: var(--fg);\n}\n.log-method.m-get    { background: #dbeafe; color: #1e40af; }\n.log-method.m-post   { background: #dcfce7; color: #14532d; }\n.log-method.m-delete { background: #fee2e2; color: #7f1d1d; }\n.log-method.m-put, .log-method.m-patch { background: #fef3c7; color: #78350f; }\n@media (prefers-color-scheme: dark) {\n  .log-method.m-get    { background: #1e3a8a; color: #bfdbfe; }\n  .log-method.m-post   { background: #14532d; color: #bbf7d0; }\n  .log-method.m-delete { background: #7f1d1d; color: #fecaca; }\n  .log-method.m-put, .log-method.m-patch { background: #78350f; color: #fcd34d; }\n}\n.log-mcp {\n  font: 600 0.72rem ui-monospace, monospace;\n  padding: 0.05rem 0.4rem; border-radius: 3px;\n  background: #ede9fe; color: #5b21b6;\n}\n@media (prefers-color-scheme: dark) {\n  .log-mcp { background: #4c1d95; color: #ddd6fe; }\n}\n.log-status {\n  display: inline-block; padding: 0.05rem 0.4rem; border-radius: 3px;\n  font: 600 0.78rem ui-monospace, monospace;\n  font-variant-numeric: tabular-nums;\n}\n.log-status-ok   { background: #dcfce7; color: #14532d; }\n.log-status-info { background: #dbeafe; color: #1e40af; }\n.log-status-warn { background: #fef3c7; color: #78350f; }\n.log-status-err  { background: #fee2e2; color: #7f1d1d; }\n.log-status-neutral { background: var(--surface-2); color: var(--fg-muted); }\n@media (prefers-color-scheme: dark) {\n  .log-status-ok   { background: #14532d; color: #bbf7d0; }\n  .log-status-info { background: #1e3a8a; color: #bfdbfe; }\n  .log-status-warn { background: #78350f; color: #fcd34d; }\n  .log-status-err  { background: #7f1d1d; color: #fecaca; }\n}\n.log-scope {\n  font: 0.75rem ui-monospace, monospace;\n  color: var(--fg-muted);\n}\n\n.health-table { margin: 0; }\n.health-table th {\n  text-align: left; padding: 0.35rem 0.8rem 0.35rem 0;\n  font-weight: 600; color: var(--fg-muted); font-size: 0.8rem;\n  text-transform: none; letter-spacing: 0; white-space: nowrap;\n  width: 10rem;\n}\n.health-table td {\n  padding: 0.35rem 0; font-size: 0.88rem;\n  font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n}\n\nul.pre-list {\n  margin: 0.15rem 0 0.75rem 1.25rem; padding: 0;\n  font-size: 0.85rem; color: var(--fg-muted); line-height: 1.55;\n}\ndetails.scenario-raw { margin: 0.75rem 0 0; }\ndetails.scenario-raw > summary {\n  cursor: pointer; color: var(--fg-muted); font-size: 0.85rem;\n  padding: 0.35rem 0; user-select: none;\n}\ndetails.scenario-raw > summary:hover { color: var(--link); }\npre.sample-body {\n  margin: 0 0 0.5rem; padding: 0.75rem 0.9rem;\n  background: var(--surface-2); color: var(--fg);\n  border-radius: 5px; font-size: 0.8rem; line-height: 1.45;\n  overflow-x: auto; white-space: pre-wrap; word-break: break-word;\n  font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n}\n\n.tile-actions { margin: 0 0 1rem; }\n.run {\n  display: inline-flex; align-items: center; gap: 0.5rem;\n  padding: 0.4rem 0.85rem; border-radius: 6px;\n  background: var(--accent-bg); color: var(--accent-fg);\n  font-size: 0.87rem; text-decoration: none;\n  font-family: ui-sans-serif, system-ui, sans-serif;\n  font-weight: 500;\n  border: 1px solid transparent;\n}\n.run:hover { filter: brightness(1.08); text-decoration: none; }\n.run-icon { font-size: 0.8rem; }\n.run-method { font: 600 0.78rem ui-monospace, SFMono-Regular, Menlo, monospace; }\n.run-label { font-weight: 500; }\n\n@media (max-width: 800px) {\n  .layout { grid-template-columns: 1fr; }\n  aside.sidebar { position: static; height: auto; border-right: 0; border-bottom: 1px solid var(--border); }\n  main { padding: 1.5rem 1.25rem 3rem; }\n}\n\n.home-wrap {\n  max-width: 1080px; margin: 0 auto; padding: 3rem 2rem 4rem;\n}\n.home-hero {\n  padding: 3rem 0 2rem; border-bottom: 1px solid var(--border); margin-bottom: 3rem;\n}\n.home-hero .kicker {\n  display: inline-block; font-size: 0.72rem; letter-spacing: 0.14em;\n  text-transform: uppercase; color: var(--accent-fg);\n  background: var(--accent-bg); padding: 0.2rem 0.55rem; border-radius: 4px;\n}\n.home-hero h1 {\n  font-size: 2.4rem; margin: 0.8rem 0 0.35rem; letter-spacing: -0.01em;\n  line-height: 1.1;\n}\n.home-hero .tagline { color: var(--fg-muted); font-size: 1.15rem; margin: 0 0 1.6rem; max-width: 56ch; }\n.home-hero .ctas { display: flex; gap: 0.8rem; flex-wrap: wrap; }\n.btn {\n  display: inline-flex; align-items: center; gap: 0.45rem;\n  padding: 0.6rem 1.1rem; border-radius: 6px;\n  font: 600 0.92rem ui-sans-serif, system-ui, sans-serif;\n  text-decoration: none; border: 1px solid transparent;\n}\n.btn-primary   { background: var(--accent-bg); color: var(--accent-fg); }\n.btn-secondary { background: transparent; color: var(--fg); border-color: var(--border); }\n.btn:hover { filter: brightness(1.08); text-decoration: none; }\n\n.stat-row {\n  display: grid; grid-template-columns: repeat(4, 1fr); gap: 1rem;\n  margin: 2.5rem 0 0;\n}\n.stat {\n  background: var(--surface); border: 1px solid var(--border);\n  border-radius: 8px; padding: 1rem 1.1rem;\n}\n.stat .n {\n  font: 700 1.6rem ui-sans-serif, system-ui, sans-serif;\n  font-variant-numeric: tabular-nums;\n}\n.stat .lbl { color: var(--fg-muted); font-size: 0.82rem; letter-spacing: 0.02em; }\n\nh2.section-h {\n  font-size: 1.3rem; margin: 3rem 0 0.3rem; letter-spacing: -0.005em;\n}\np.section-sub { color: var(--fg-muted); margin: 0 0 1.3rem; }\n\n.pillars, .audiences, .surfaces {\n  display: grid; gap: 1rem;\n}\n.pillars    { grid-template-columns: repeat(2, 1fr); }\n.audiences  { grid-template-columns: repeat(2, 1fr); }\n.surfaces   { grid-template-columns: repeat(3, 1fr); }\n@media (max-width: 720px) {\n  .pillars, .audiences, .surfaces, .stat-row { grid-template-columns: 1fr; }\n  .home-hero h1 { font-size: 1.9rem; }\n}\n\n.card {\n  background: var(--surface); border: 1px solid var(--border);\n  border-radius: 8px; padding: 1.25rem 1.4rem;\n}\n.card h3 {\n  margin: 0 0 0.35rem; font-size: 1rem;\n  display: flex; align-items: center; gap: 0.5rem;\n}\n.card .tag {\n  font: 600 0.68rem ui-monospace, monospace; text-transform: uppercase;\n  padding: 0.1rem 0.4rem; border-radius: 3px;\n  background: var(--accent-bg); color: var(--accent-fg); letter-spacing: 0.04em;\n}\n.card p { margin: 0 0 0.7rem; color: var(--fg); font-size: 0.92rem; line-height: 1.5; }\n.card ul { margin: 0.3rem 0 0.75rem 1.05rem; padding: 0; font-size: 0.88rem; line-height: 1.6; }\n.card .card-actions { display: flex; flex-wrap: wrap; gap: 0.45rem; margin-top: 0.5rem; }\n.card .chip {\n  display: inline-block; padding: 0.15rem 0.55rem; border-radius: 999px;\n  background: var(--surface-2); color: var(--fg-muted); font-size: 0.78rem;\n  text-decoration: none; border: 1px solid var(--border);\n}\n.card .chip:hover { color: var(--link); border-color: var(--link); text-decoration: none; }\n.card .chip.primary { background: var(--accent-bg); color: var(--accent-fg); border-color: transparent; }\n\npre.quickstart {\n  background: var(--surface-2); color: var(--fg);\n  border: 1px solid var(--border); border-radius: 6px;\n  padding: 0.9rem 1rem; overflow-x: auto;\n  font: 0.82rem/1.45 ui-monospace, SFMono-Regular, Menlo, monospace;\n  margin: 0.5rem 0;\n}\npre.quickstart .cmt { color: var(--fg-muted); }\n\n.links-grid {\n  display: grid; grid-template-columns: repeat(2, 1fr); gap: 0.6rem 1.5rem;\n  margin: 0.5rem 0 0;\n}\n.links-grid a {\n  display: flex; justify-content: space-between; align-items: baseline;\n  padding: 0.6rem 0.8rem; border-radius: 5px;\n  text-decoration: none; color: var(--fg); border: 1px solid var(--border);\n  background: var(--surface);\n}\n.links-grid a:hover { border-color: var(--link); color: var(--link); }\n.links-grid .lg-path { font-family: ui-monospace, monospace; font-size: 0.82rem; color: var(--fg-muted); }\n\n.home-footer {\n  margin-top: 4rem; padding-top: 1.5rem; border-top: 1px solid var(--border);\n  color: var(--fg-dim); font-size: 0.82rem; display: flex; justify-content: space-between;\n  flex-wrap: wrap; gap: 0.5rem;\n}\n\n.guide-nav { margin: 0 0 1.5rem; color: var(--fg-muted); font-size: 0.88rem; }\n.guide-nav a { color: var(--link); text-decoration: none; }\n.guide {\n  background: var(--surface); border: 1px solid var(--border);\n  border-radius: 8px; padding: 2rem 2.5rem;\n  color: var(--fg); line-height: 1.6;\n}\n.guide h1, .guide h2, .guide h3, .guide h4 { letter-spacing: -0.01em; }\n.guide h1 { font-size: 1.8rem; margin: 0 0 0.8rem; }\n.guide h2 { font-size: 1.3rem; margin: 2rem 0 0.5rem; padding-top: 1rem;\n            border-top: 1px solid var(--border-soft); }\n.guide h3 { font-size: 1.05rem; margin: 1.5rem 0 0.4rem; }\n.guide p  { margin: 0.5rem 0 1rem; }\n.guide a  { color: var(--link); }\n.guide code {\n  background: var(--surface-2); padding: 0.1rem 0.35rem;\n  border-radius: 3px; font: 0.88em ui-monospace, monospace;\n}\n.guide pre {\n  background: var(--surface-2); padding: 0.9rem 1.1rem; border-radius: 6px;\n  overflow-x: auto; font: 0.85rem/1.5 ui-monospace, monospace;\n}\n.guide pre code { background: transparent; padding: 0; }\n.guide ul, .guide ol { padding-left: 1.4rem; }\n.guide li { margin: 0.2rem 0; }\n.guide table { border-collapse: collapse; width: 100%; margin: 1rem 0; }\n.guide th, .guide td { border: 1px solid var(--border); padding: 0.4rem 0.6rem; text-align: left; }\n.guide th { background: var(--surface-2); }\n.guide blockquote {\n  border-left: 3px solid var(--border); padding: 0.3rem 0.9rem;\n  color: var(--fg-muted); margin: 0.8rem 0;\n}\n</style></head><body><div class='home-wrap'><p class='guide-nav'><a href='/'>← Home</a> · <span class='lg-path'>README.md</span></p><article class='guide'><h1 id=\"singing-bird\">Singing Bird</h1>\n<p>A declarative, scenario-driven, LLM-mediated embodied simulation kernel.</p>\n<p>Singing Bird simulates canonical worlds containing synthetic agents (synths) whose subjective experience may differ from reality. A director maintains authoritative world truth. Synths receive filtered sensory input, deliberate via real LLM calls, and emit grounded action intents. The engine resolves those intents against canonical physics, propagates consequences, and commits transactional snapshots.</p>\n<p>Scenarios are declarative YAML content packs. The engine does not know what a lighthouse is, or a clinic, or a dock. It knows locations, adjacency, entities with typed components, sensory channels, and world processes. All scenario-specific content lives in the packs, not in engine code.</p>\n<h2 id=\"key-concepts\">Key Concepts</h2>\n<table>\n<thead>\n<tr>\n<th>Concept</th>\n<th>What it is</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>Director</strong></td>\n<td>The sole authority over canonical world truth. Runs the cycle, delivers perceptions, resolves actions, commits snapshots.</td>\n</tr>\n<tr>\n<td><strong>World</strong></td>\n<td>The canonical simulation state: topology, entities, environment, processes. Ground truth.</td>\n</tr>\n<tr>\n<td><strong>Synth</strong></td>\n<td>A subjective agent with identity, beliefs, mood, projects, memories, and theory of mind. Receives sensory bundles, emits intents. Never directly reads canonical state.</td>\n</tr>\n<tr>\n<td><strong>Content Pack</strong></td>\n<td>A YAML file defining a complete scenario: locations, entities, synths, processes, latent facts. Loaded and validated against a ruleset.</td>\n</tr>\n<tr>\n<td><strong>Ruleset</strong></td>\n<td>The ontology layer: defines what component types exist, validates content at load time. Currently ships <code>physical_social_v1</code>.</td>\n</tr>\n<tr>\n<td><strong>Action Surface</strong></td>\n<td>A grounded menu of available actions presented to each synth each cycle. Synths select by symbolic ID, not free text.</td>\n</tr>\n</tbody>\n</table>\n<h2 id=\"quick-start\">Quick Start</h2>\n<pre><code class=\"language-bash\"># By default, singing_bird calls the Centroid LLM router (llm.benac.dev).\n# The router picks whichever backend is currently scaled up (local GGUF or\n# OpenAI pipe). Models are addressed by capability alias — &quot;@chat&quot; in the\n# shipped scenarios — so consumers don't need to be reconfigured when the\n# backend changes.\n#\n# Override with: export OPENAI_BASE_URL=https://api.openai.com/v1  (direct)\n#                export OPENAI_API_KEY=sk-...                     (needed for direct)\n\n# Run the lighthouse scenario (3 cycles)\nPYTHONPATH=src python -m singing_bird.cli run --scenario scenarios/lighthouse.yaml --cycles 3\n\n# Run the workshop blackout (different world, same kernel)\nPYTHONPATH=src python -m singing_bird.cli run --scenario scenarios/workshop_blackout.yaml --cycles 3\n\n# Start the API control plane (observe, step, intervene via HTTP)\nPYTHONPATH=src uvicorn singing_bird.api.app:app --host 0.0.0.0 --port 8420\n\n# Run unit tests (no API key needed)\nPYTHONPATH=src pytest tests/ -m &quot;not llm&quot; -v\n\n# Run full test suite including LLM integration (needs API key)\nPYTHONPATH=src pytest tests/ --run-llm -v\n</code></pre>\n<h2 id=\"architecture\">Architecture</h2>\n<pre><code>Content Pack (YAML) --&gt; Loader/Compiler --&gt; Initial Snapshot\n                                                  |\n                                           DirectorRuntime\n                                        (pure transition kernel)\n                                                  |\n                   +------------------------------+------------------------------+\n                   |                              |                              |\n              Perception                     SynthAgent                     Resolver\n          (channel-filtered,              (LLM cognition,             (component-based,\n           action surface)                structured I/O)              symbolic refs)\n                   |                              |                              |\n              SensoryBundle              CognitiveResponse               ActionOutcome\n          (observations +                (intents, beliefs,            (success/failure +\n           grounded menu)                speech, memories)             canonical effects)\n</code></pre>\n<p>Three layers, strictly separated:</p>\n<ul>\n<li><strong>Kernel</strong>: scheduling, transactions, event propagation, perception delivery, snapshots, replay</li>\n<li><strong>Ruleset</strong>: component schemas, affordance definitions, validation rules</li>\n<li><strong>Content Pack</strong>: locations, entities, synths, processes, initial conditions</li>\n</ul>\n<p>See <a href=\"docs/guides/architecture.md\">Architecture Guide</a> for details.</p>\n<h2 id=\"api-control-plane\">API Control Plane</h2>\n<p>An HTTP/JSON service lets external agents observe, control, and intervene in running simulations:</p>\n<pre><code class=\"language-bash\"># Start the server\nPYTHONPATH=src uvicorn singing_bird.api.app:app --host 0.0.0.0 --port 8420\n\n# Create a session, step it, see what happened\ncurl -X POST localhost:8420/v1/sessions -d '{&quot;scenario_path&quot;:&quot;scenarios/lighthouse.yaml&quot;}'\ncurl -X POST localhost:8420/v1/sessions/{id}/step -d '{&quot;n&quot;:1}'\ncurl localhost:8420/v1/sessions/{id}/reports/last-cycle\n</code></pre>\n<p>Three execution lanes:\n- <strong>Query</strong>: read-only inspection (overview, resolve, object detail, events, changes, reports)\n- <strong>Turn</strong>: external input routed through the director as mediated stimuli\n- <strong>Admin patch</strong>: typed interventions (move/create entities, change weather, inject beliefs) with dry_run/commit/commit_and_step modes</p>\n<p>Plus SSE live event streaming, queued stimuli, auth scopes, idempotency, and a 20-tool manifest for LLM agent consumption. See the <a href=\"docs/guides/observer_guide.md\">Observer Guide</a> for full details.</p>\n<h2 id=\"scenario-packs\">Scenario Packs</h2>\n<p>Six scenarios ship with the project, all running on the same kernel with zero engine code changes:</p>\n<table>\n<thead>\n<tr>\n<th>Scenario</th>\n<th>Setting</th>\n<th>Synths</th>\n<th>Focus</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>lighthouse</code></td>\n<td>Island lighthouse, 1847</td>\n<td>Thomas (keeper), Margaret (blind wife), James (castaway)</td>\n<td>Blind embodiment, repair, weather, epistemic asymmetry</td>\n</tr>\n<tr>\n<td><code>park_bench</code></td>\n<td>Lakeside boardwalk</td>\n<td>Alice (artist), Bob (retiree)</td>\n<td>Social deliberation, low-stakes conversation</td>\n</tr>\n<tr>\n<td><code>workshop_blackout</code></td>\n<td>Auto repair shop</td>\n<td>Mara (owner), Eli (apprentice), June (courier)</td>\n<td>Local repair, switchable light, weather pressure</td>\n</tr>\n<tr>\n<td><code>storm_cellar</code></td>\n<td>Farmhouse in a storm</td>\n<td>Ruth, Ben, Alma</td>\n<td>Shelter, consumption, testimony, worsening weather</td>\n</tr>\n<tr>\n<td><code>night_clinic</code></td>\n<td>Late-night clinic</td>\n<td>Ana (nurse), Victor (patient), Hale (orderly)</td>\n<td>Care, waiting, low-light, small-object handling</td>\n</tr>\n<tr>\n<td><code>dockside_outpost</code></td>\n<td>Harbor dock at dawn</td>\n<td>Inez, Pavel, Sora</td>\n<td>Fog, signal maintenance, mixed interior/exterior</td>\n</tr>\n</tbody>\n</table>\n<p>See the <a href=\"docs/interfaces/ICD-0001-scenario-authoring-contract.md\">Scenario Authoring Contract</a> for how to write new packs.</p>\n<h2 id=\"test-suite\">Test Suite</h2>\n<p>107 tests total (96 unit + 11 LLM integration):</p>\n<pre><code class=\"language-bash\"># Unit tests only (fast, no API key)\nPYTHONPATH=src pytest tests/ -m &quot;not llm&quot; -v\n\n# Full suite (slower, needs OPENAI_API_KEY)\nPYTHONPATH=src pytest tests/ --run-llm -v\n</code></pre>\n<table>\n<thead>\n<tr>\n<th>Test file</th>\n<th>What it proves</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>test_models</code></td>\n<td>Serialization, components, belief provenance, theory of mind</td>\n</tr>\n<tr>\n<td><code>test_statechart</code></td>\n<td>Generic HSM: events, timers, guards, history states</td>\n</tr>\n<tr>\n<td><code>test_perception</code></td>\n<td>Channel filtering, communication delivery, action surface grounding</td>\n</tr>\n<tr>\n<td><code>test_content_loader</code></td>\n<td>YAML loading, referential integrity, ruleset validation</td>\n</tr>\n<tr>\n<td><code>test_invariants</code></td>\n<td>Engine invariants, rollback isolation</td>\n</tr>\n<tr>\n<td><code>test_kernel</code></td>\n<td>Component validation, anonymized scenario, symbolic grounding, replay log</td>\n</tr>\n<tr>\n<td><code>test_hardening</code></td>\n<td>Snapshot roundtrip, forced rollback, container reveal, tool-gated repair, containment invariants</td>\n</tr>\n<tr>\n<td><code>test_preplay</code></td>\n<td>Schema migration, conflict arbitration, cascade regression</td>\n</tr>\n<tr>\n<td><code>test_scenario_matrix</code></td>\n<td>All 6 packs load and run on same kernel; stable IDs across loads</td>\n</tr>\n<tr>\n<td><code>test_engine</code></td>\n<td>Full LLM integration: single cycle, blind synth, intent production, multi-scenario</td>\n</tr>\n<tr>\n<td><code>test_api</code></td>\n<td>API control plane: sessions, observation, intervention, stimuli, idempotency, auth</td>\n</tr>\n</tbody>\n</table>\n<h2 id=\"project-status\">Project Status</h2>\n<p><strong>Version</strong>: 0.3.0 (experimental)</p>\n<table>\n<thead>\n<tr>\n<th>Category</th>\n<th>Met</th>\n<th>Partial</th>\n<th>Total</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>System requirements</td>\n<td>18</td>\n<td>2</td>\n<td>20</td>\n</tr>\n<tr>\n<td>Non-functional</td>\n<td>7</td>\n<td>1</td>\n<td>8</td>\n</tr>\n<tr>\n<td>Director</td>\n<td>15</td>\n<td>1</td>\n<td>16</td>\n</tr>\n<tr>\n<td>Synth</td>\n<td>14</td>\n<td>2</td>\n<td>16</td>\n</tr>\n<tr>\n<td>Hierarchical state</td>\n<td>7</td>\n<td>1</td>\n<td>8</td>\n</tr>\n<tr>\n<td>Invariants</td>\n<td>8</td>\n<td>0</td>\n<td>8</td>\n</tr>\n<tr>\n<td><strong>Total</strong></td>\n<td><strong>69</strong></td>\n<td><strong>7</strong></td>\n<td><strong>76</strong></td>\n</tr>\n</tbody>\n</table>\n<p>See the full <a href=\"docs/requirements/verification/RTM-0001-kernel-compliance.md\">Compliance Matrix</a>.</p>\n<p><strong>What works</strong>: Content decoupling, symbolic grounding, transactional rollback, replay infrastructure, six-scenario matrix, containment model, tool-gated repair, schema migration.</p>\n<p><strong>What is partial</strong>: Percept distortion (hook exists, rich system not built), recursive cascade (communication + world events, not all types), synth internal statechart (field exists, not engine-evaluated), sensory range/occlusion (channel + location heuristics, not true physics).</p>\n<h2 id=\"documentation\">Documentation</h2>\n<table>\n<thead>\n<tr>\n<th>Document</th>\n<th>Audience</th>\n<th>What it covers</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><a href=\"docs/guides/architecture.md\">Architecture Guide</a></td>\n<td>Developers</td>\n<td>How the system works, module map, design decisions</td>\n</tr>\n<tr>\n<td><a href=\"docs/guides/development.md\">Development Guide</a></td>\n<td>Developers</td>\n<td>Setup, testing, extending, debugging, cost management</td>\n</tr>\n<tr>\n<td><a href=\"docs/interfaces/ICD-0001-scenario-authoring-contract.md\">Scenario Authoring Contract</a></td>\n<td>Scenario authors</td>\n<td>Pack format, component types, what works and what doesn't</td>\n</tr>\n<tr>\n<td><a href=\"docs/requirements/system/SYS-0001-canonical-world-simulation.md\">Requirements Spec</a></td>\n<td>Architects</td>\n<td>Full system/director/synth requirements</td>\n</tr>\n<tr>\n<td><a href=\"docs/requirements/verification/RTM-0001-kernel-compliance.md\">Compliance Matrix</a></td>\n<td>QA/reviewers</td>\n<td>Requirement-by-requirement implementation status</td>\n</tr>\n<tr>\n<td><a href=\"docs/guides/observer_guide.md\">Observer Guide</a></td>\n<td>Operators/agents</td>\n<td>API control plane: observe, step, intervene, stream</td>\n</tr>\n<tr>\n<td><a href=\"CONTRIBUTING.md\">Contributing</a></td>\n<td>Contributors</td>\n<td>How to work with the codebase, areas for expansion</td>\n</tr>\n</tbody>\n</table>\n<h2 id=\"dependencies\">Dependencies</h2>\n<ul>\n<li>Python 3.10+</li>\n<li><code>openai</code> &gt;= 1.50</li>\n<li><code>pydantic</code> &gt;= 1.10, &lt; 2</li>\n<li><code>pyyaml</code> &gt;= 6.0</li>\n<li><code>fastapi</code> &gt;= 0.99, &lt; 0.100 (API control plane)</li>\n<li><code>uvicorn</code> &gt;= 0.20 (API server)</li>\n<li><code>OPENAI_API_KEY</code> or Centroid LLM router (for LLM-powered simulation)</li>\n</ul></article></div></body></html>","response_stream":false},"error":null},{"request_id":"04a0757d773b42e180d55f50e4620ad9","ts":"2026-04-18T17:24:02.821694Z","duration_ms":0.136,"method":"GET","path":"/docs","query":"","operation_id":"","client_ip":"192.168.29.10","user_agent":"kube-probe/1.31","auth":{"scheme":null,"scope":"admin","auth_enabled":false,"recognized":true},"request":{"headers":{"host":"10.244.112.209:8420","user-agent":"kube-probe/1.31","accept":"*/*","connection":"close"},"request_body_size":0,"request_body_truncated":false,"request_body_kind":"empty","request_body":null},"status":200,"response":{"headers":{"content-length":"936","content-type":"text/html; charset=utf-8","x-request-id":"04a0757d773b42e180d55f50e4620ad9"},"response_body_size":936,"response_body_truncated":false,"response_body_kind":"text","response_body":"\n    <!DOCTYPE html>\n    <html>\n    <head>\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\">\n    <link rel=\"shortcut icon\" href=\"https://fastapi.tiangolo.com/img/favicon.png\">\n    <title>Singing Bird - Swagger UI</title>\n    </head>\n    <body>\n    <div id=\"swagger-ui\">\n    </div>\n    <script src=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\"></script>\n    <!-- `SwaggerUIBundle` is now available on the page -->\n    <script>\n    const ui = SwaggerUIBundle({\n        url: '/openapi.json',\n    \"dom_id\": \"#swagger-ui\",\n\"layout\": \"BaseLayout\",\n\"deepLinking\": true,\n\"showExtensions\": true,\n\"showCommonExtensions\": true,\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\n    presets: [\n        SwaggerUIBundle.presets.apis,\n        SwaggerUIBundle.SwaggerUIStandalonePreset\n        ],\n    })\n    </script>\n    </body>\n    </html>\n    ","response_stream":false},"error":null},{"request_id":"864a1510772f4caf9f96e57a7eb045d9","ts":"2026-04-18T17:24:02.821084Z","duration_ms":0.25,"method":"GET","path":"/docs","query":"","operation_id":"","client_ip":"192.168.29.10","user_agent":"kube-probe/1.31","auth":{"scheme":null,"scope":"admin","auth_enabled":false,"recognized":true},"request":{"headers":{"host":"10.244.112.209:8420","user-agent":"kube-probe/1.31","accept":"*/*","connection":"close"},"request_body_size":0,"request_body_truncated":false,"request_body_kind":"empty","request_body":null},"status":200,"response":{"headers":{"content-length":"936","content-type":"text/html; charset=utf-8","x-request-id":"864a1510772f4caf9f96e57a7eb045d9"},"response_body_size":936,"response_body_truncated":false,"response_body_kind":"text","response_body":"\n    <!DOCTYPE html>\n    <html>\n    <head>\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\">\n    <link rel=\"shortcut icon\" href=\"https://fastapi.tiangolo.com/img/favicon.png\">\n    <title>Singing Bird - Swagger UI</title>\n    </head>\n    <body>\n    <div id=\"swagger-ui\">\n    </div>\n    <script src=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\"></script>\n    <!-- `SwaggerUIBundle` is now available on the page -->\n    <script>\n    const ui = SwaggerUIBundle({\n        url: '/openapi.json',\n    \"dom_id\": \"#swagger-ui\",\n\"layout\": \"BaseLayout\",\n\"deepLinking\": true,\n\"showExtensions\": true,\n\"showCommonExtensions\": true,\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\n    presets: [\n        SwaggerUIBundle.presets.apis,\n        SwaggerUIBundle.SwaggerUIStandalonePreset\n        ],\n    })\n    </script>\n    </body>\n    </html>\n    ","response_stream":false},"error":null},{"request_id":"727ffc9771cc499ead5d25d467f83c12","ts":"2026-04-18T17:23:52.820887Z","duration_ms":0.223,"method":"GET","path":"/docs","query":"","operation_id":"","client_ip":"192.168.29.10","user_agent":"kube-probe/1.31","auth":{"scheme":null,"scope":"admin","auth_enabled":false,"recognized":true},"request":{"headers":{"host":"10.244.112.209:8420","user-agent":"kube-probe/1.31","accept":"*/*","connection":"close"},"request_body_size":0,"request_body_truncated":false,"request_body_kind":"empty","request_body":null},"status":200,"response":{"headers":{"content-length":"936","content-type":"text/html; charset=utf-8","x-request-id":"727ffc9771cc499ead5d25d467f83c12"},"response_body_size":936,"response_body_truncated":false,"response_body_kind":"text","response_body":"\n    <!DOCTYPE html>\n    <html>\n    <head>\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\">\n    <link rel=\"shortcut icon\" href=\"https://fastapi.tiangolo.com/img/favicon.png\">\n    <title>Singing Bird - Swagger UI</title>\n    </head>\n    <body>\n    <div id=\"swagger-ui\">\n    </div>\n    <script src=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\"></script>\n    <!-- `SwaggerUIBundle` is now available on the page -->\n    <script>\n    const ui = SwaggerUIBundle({\n        url: '/openapi.json',\n    \"dom_id\": \"#swagger-ui\",\n\"layout\": \"BaseLayout\",\n\"deepLinking\": true,\n\"showExtensions\": true,\n\"showCommonExtensions\": true,\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\n    presets: [\n        SwaggerUIBundle.presets.apis,\n        SwaggerUIBundle.SwaggerUIStandalonePreset\n        ],\n    })\n    </script>\n    </body>\n    </html>\n    ","response_stream":false},"error":null},{"request_id":"590e228263504a0391beb65112398524","ts":"2026-04-18T17:23:42.821151Z","duration_ms":0.245,"method":"GET","path":"/docs","query":"","operation_id":"","client_ip":"192.168.29.10","user_agent":"kube-probe/1.31","auth":{"scheme":null,"scope":"admin","auth_enabled":false,"recognized":true},"request":{"headers":{"host":"10.244.112.209:8420","user-agent":"kube-probe/1.31","accept":"*/*","connection":"close"},"request_body_size":0,"request_body_truncated":false,"request_body_kind":"empty","request_body":null},"status":200,"response":{"headers":{"content-length":"936","content-type":"text/html; charset=utf-8","x-request-id":"590e228263504a0391beb65112398524"},"response_body_size":936,"response_body_truncated":false,"response_body_kind":"text","response_body":"\n    <!DOCTYPE html>\n    <html>\n    <head>\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\">\n    <link rel=\"shortcut icon\" href=\"https://fastapi.tiangolo.com/img/favicon.png\">\n    <title>Singing Bird - Swagger UI</title>\n    </head>\n    <body>\n    <div id=\"swagger-ui\">\n    </div>\n    <script src=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\"></script>\n    <!-- `SwaggerUIBundle` is now available on the page -->\n    <script>\n    const ui = SwaggerUIBundle({\n        url: '/openapi.json',\n    \"dom_id\": \"#swagger-ui\",\n\"layout\": \"BaseLayout\",\n\"deepLinking\": true,\n\"showExtensions\": true,\n\"showCommonExtensions\": true,\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\n    presets: [\n        SwaggerUIBundle.presets.apis,\n        SwaggerUIBundle.SwaggerUIStandalonePreset\n        ],\n    })\n    </script>\n    </body>\n    </html>\n    ","response_stream":false},"error":null},{"request_id":"0a285b3a37f24f66a14adf67a50f657f","ts":"2026-04-18T17:23:32.821966Z","duration_ms":0.105,"method":"GET","path":"/docs","query":"","operation_id":"","client_ip":"192.168.29.10","user_agent":"kube-probe/1.31","auth":{"scheme":null,"scope":"admin","auth_enabled":false,"recognized":true},"request":{"headers":{"host":"10.244.112.209:8420","user-agent":"kube-probe/1.31","accept":"*/*","connection":"close"},"request_body_size":0,"request_body_truncated":false,"request_body_kind":"empty","request_body":null},"status":200,"response":{"headers":{"content-length":"936","content-type":"text/html; charset=utf-8","x-request-id":"0a285b3a37f24f66a14adf67a50f657f"},"response_body_size":936,"response_body_truncated":false,"response_body_kind":"text","response_body":"\n    <!DOCTYPE html>\n    <html>\n    <head>\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\">\n    <link rel=\"shortcut icon\" href=\"https://fastapi.tiangolo.com/img/favicon.png\">\n    <title>Singing Bird - Swagger UI</title>\n    </head>\n    <body>\n    <div id=\"swagger-ui\">\n    </div>\n    <script src=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\"></script>\n    <!-- `SwaggerUIBundle` is now available on the page -->\n    <script>\n    const ui = SwaggerUIBundle({\n        url: '/openapi.json',\n    \"dom_id\": \"#swagger-ui\",\n\"layout\": \"BaseLayout\",\n\"deepLinking\": true,\n\"showExtensions\": true,\n\"showCommonExtensions\": true,\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\n    presets: [\n        SwaggerUIBundle.presets.apis,\n        SwaggerUIBundle.SwaggerUIStandalonePreset\n        ],\n    })\n    </script>\n    </body>\n    </html>\n    ","response_stream":false},"error":null},{"request_id":"ea6fa4aa498b44ae93b12bcde2224909","ts":"2026-04-18T17:23:32.821389Z","duration_ms":0.27,"method":"GET","path":"/docs","query":"","operation_id":"","client_ip":"192.168.29.10","user_agent":"kube-probe/1.31","auth":{"scheme":null,"scope":"admin","auth_enabled":false,"recognized":true},"request":{"headers":{"host":"10.244.112.209:8420","user-agent":"kube-probe/1.31","accept":"*/*","connection":"close"},"request_body_size":0,"request_body_truncated":false,"request_body_kind":"empty","request_body":null},"status":200,"response":{"headers":{"content-length":"936","content-type":"text/html; charset=utf-8","x-request-id":"ea6fa4aa498b44ae93b12bcde2224909"},"response_body_size":936,"response_body_truncated":false,"response_body_kind":"text","response_body":"\n    <!DOCTYPE html>\n    <html>\n    <head>\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\">\n    <link rel=\"shortcut icon\" href=\"https://fastapi.tiangolo.com/img/favicon.png\">\n    <title>Singing Bird - Swagger UI</title>\n    </head>\n    <body>\n    <div id=\"swagger-ui\">\n    </div>\n    <script src=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\"></script>\n    <!-- `SwaggerUIBundle` is now available on the page -->\n    <script>\n    const ui = SwaggerUIBundle({\n        url: '/openapi.json',\n    \"dom_id\": \"#swagger-ui\",\n\"layout\": \"BaseLayout\",\n\"deepLinking\": true,\n\"showExtensions\": true,\n\"showCommonExtensions\": true,\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\n    presets: [\n        SwaggerUIBundle.presets.apis,\n        SwaggerUIBundle.SwaggerUIStandalonePreset\n        ],\n    })\n    </script>\n    </body>\n    </html>\n    ","response_stream":false},"error":null},{"request_id":"711000a91560457f9b9e8ce369f6228c","ts":"2026-04-18T17:23:22.820522Z","duration_ms":0.255,"method":"GET","path":"/docs","query":"","operation_id":"","client_ip":"192.168.29.10","user_agent":"kube-probe/1.31","auth":{"scheme":null,"scope":"admin","auth_enabled":false,"recognized":true},"request":{"headers":{"host":"10.244.112.209:8420","user-agent":"kube-probe/1.31","accept":"*/*","connection":"close"},"request_body_size":0,"request_body_truncated":false,"request_body_kind":"empty","request_body":null},"status":200,"response":{"headers":{"content-length":"936","content-type":"text/html; charset=utf-8","x-request-id":"711000a91560457f9b9e8ce369f6228c"},"response_body_size":936,"response_body_truncated":false,"response_body_kind":"text","response_body":"\n    <!DOCTYPE html>\n    <html>\n    <head>\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\">\n    <link rel=\"shortcut icon\" href=\"https://fastapi.tiangolo.com/img/favicon.png\">\n    <title>Singing Bird - Swagger UI</title>\n    </head>\n    <body>\n    <div id=\"swagger-ui\">\n    </div>\n    <script src=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\"></script>\n    <!-- `SwaggerUIBundle` is now available on the page -->\n    <script>\n    const ui = SwaggerUIBundle({\n        url: '/openapi.json',\n    \"dom_id\": \"#swagger-ui\",\n\"layout\": \"BaseLayout\",\n\"deepLinking\": true,\n\"showExtensions\": true,\n\"showCommonExtensions\": true,\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\n    presets: [\n        SwaggerUIBundle.presets.apis,\n        SwaggerUIBundle.SwaggerUIStandalonePreset\n        ],\n    })\n    </script>\n    </body>\n    </html>\n    ","response_stream":false},"error":null},{"request_id":"872ce501216c4f46aa5fdf5a5dc20fcd","ts":"2026-04-18T17:23:16.254240Z","duration_ms":437.189,"method":"GET","path":"/","query":"","operation_id":"homepage__get","client_ip":"107.189.2.108","user_agent":"Mozilla/5.0 (Linux; Android 15; Seeker Build/AP3A.251027.900.A2; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/146.0.7680.164 Mobile Safari/537.36","auth":{"scheme":null,"scope":"admin","auth_enabled":false,"recognized":true},"request":{"headers":{"host":"singing-bird.benac.dev","user-agent":"Mozilla/5.0 (Linux; Android 15; Seeker Build/AP3A.251027.900.A2; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/146.0.7680.164 Mobile Safari/537.36","accept-charset":"utf-8","accept-encoding":"gzip","via":"1.1 Caddy","x-forwarded-for":"107.189.2.108","x-forwarded-host":"singing-bird.benac.dev","x-forwarded-proto":"https","x-real-ip":"107.189.2.108"},"request_body_size":0,"request_body_truncated":false,"request_body_kind":"empty","request_body":null},"status":200,"response":{"headers":{"content-length":"24871","content-type":"text/html; charset=utf-8","x-request-id":"872ce501216c4f46aa5fdf5a5dc20fcd"},"response_body_size":24871,"response_body_truncated":false,"response_body_kind":"text","response_body":"<!doctype html><html lang='en'><head><meta charset='utf-8'><meta name='viewport' content='width=device-width, initial-scale=1'><meta name='color-scheme' content='light dark'><title>Singing Bird</title><style>\n:root {\n  color-scheme: light dark;\n  --bg: #f9fafb;\n  --fg: #1f2937;\n  --fg-muted: #6b7280;\n  --fg-dim: #9ca3af;\n  --surface: #ffffff;\n  --surface-2: #f3f4f6;\n  --border: #e5e7eb;\n  --border-soft: #f3f4f6;\n  --accent-bg: #dbeafe;\n  --accent-fg: #1e40af;\n  --link: #2563eb;\n  --error: #b91c1c;\n  --sidebar-bg: #ffffff;\n  --sidebar-hover: #f3f4f6;\n}\n@media (prefers-color-scheme: dark) {\n  :root {\n    --bg: #0f172a;\n    --fg: #e5e7eb;\n    --fg-muted: #94a3b8;\n    --fg-dim: #64748b;\n    --surface: #1e293b;\n    --surface-2: #0f172a;\n    --border: #334155;\n    --border-soft: #1e293b;\n    --accent-bg: #1e3a8a;\n    --accent-fg: #bfdbfe;\n    --link: #60a5fa;\n    --error: #fca5a5;\n    --sidebar-bg: #0f172a;\n    --sidebar-hover: #1e293b;\n  }\n}\n\n* { box-sizing: border-box; }\nhtml, body { margin: 0; padding: 0; }\nbody {\n  font-family: ui-sans-serif, system-ui, -apple-system, sans-serif;\n  color: var(--fg);\n  background: var(--bg);\n  min-height: 100vh;\n}\n\n.layout {\n  display: grid;\n  grid-template-columns: 240px minmax(0, 1fr);\n  max-width: 1280px;\n  margin: 0 auto;\n  min-height: 100vh;\n}\n\naside.sidebar {\n  background: var(--sidebar-bg);\n  border-right: 1px solid var(--border);\n  padding: 1.5rem 0;\n  position: sticky;\n  top: 0;\n  align-self: start;\n  height: 100vh;\n  overflow-y: auto;\n}\n.sidebar h1 { margin: 0 1.25rem 0.15rem; font-size: 1rem; letter-spacing: 0.02em; }\n.sidebar .brand-sub { margin: 0 1.25rem 1.5rem; color: var(--fg-muted); font-size: 0.75rem; }\n.sidebar nav { display: flex; flex-direction: column; }\n.sidebar a {\n  display: flex; justify-content: space-between; align-items: center;\n  padding: 0.5rem 1.25rem; text-decoration: none; color: var(--fg);\n  font-size: 0.88rem; border-left: 2px solid transparent;\n}\n.sidebar a:hover { background: var(--sidebar-hover); }\n.sidebar a.empty { color: var(--fg-dim); }\n.sidebar a.active {\n  background: var(--sidebar-hover);\n  border-left-color: var(--link);\n  color: var(--link);\n  font-weight: 600;\n}\n.sidebar a.active .count { color: var(--link); }\nhtml { scroll-behavior: smooth; }\n.sidebar .count {\n  font-variant-numeric: tabular-nums; font-size: 0.75rem;\n  color: var(--fg-muted); background: var(--surface-2);\n  padding: 0.05rem 0.45rem; border-radius: 999px;\n}\n.sidebar a.empty .count { background: transparent; }\n.sidebar .foot { margin: 1.5rem 1.25rem 0; color: var(--fg-dim); font-size: 0.7rem; line-height: 1.5; }\n.sidebar .foot a { display: inline; padding: 0; color: var(--link); border: 0; }\n\nmain { padding: 2rem 2.5rem 4rem; min-width: 0; }\nmain > header { margin-bottom: 2rem; }\nmain > header h2 { margin: 0 0 0.2rem; font-size: 1.5rem; }\nmain > header p { margin: 0; color: var(--fg-muted); font-size: 0.92rem; }\n\nsection.group { margin-bottom: 2.5rem; scroll-margin-top: 1rem; }\nsection.group > header { display: flex; align-items: baseline; gap: 0.75rem; margin-bottom: 0.85rem; }\nsection.group > header h3 { margin: 0; font-size: 1.1rem; }\nsection.group > header .desc { color: var(--fg-muted); font-size: 0.85rem; }\nsection.group.empty > .empty-state {\n  border: 1px dashed var(--border); border-radius: 8px;\n  padding: 1rem 1.25rem; color: var(--fg-dim);\n  font-size: 0.88rem; font-style: italic;\n  background: var(--surface-2);\n}\n\n.tile {\n  border: 1px solid var(--border); border-radius: 8px;\n  padding: 1.1rem 1.4rem; margin-bottom: 1rem;\n  background: var(--surface);\n}\n.tile-title {\n  margin: 0 0 0.35rem; font-size: 1.12rem; font-weight: 600;\n  color: var(--fg); letter-spacing: -0.005em; line-height: 1.3;\n}\n.tile-meta {\n  display: flex; align-items: baseline; gap: 0.6rem;\n  margin: 0 0 0.5rem; flex-wrap: wrap;\n}\n.tool-row {\n  display: flex; align-items: center; gap: 0.5rem;\n  margin: 0 0 0.65rem; flex-wrap: wrap;\n}\n.tool-row-label {\n  font-size: 0.72rem; text-transform: uppercase; letter-spacing: 0.08em;\n  color: var(--fg-muted);\n}\n.tool-chip {\n  display: inline-flex; align-items: baseline; gap: 0.45rem;\n  padding: 0.2rem 0.55rem; border-radius: 999px;\n  text-decoration: none;\n  background: var(--surface-2); color: var(--fg);\n  border: 1px solid var(--border);\n  font-size: 0.8rem;\n}\n.tool-chip:hover { border-color: var(--link); color: var(--link); text-decoration: none; }\n.tool-chip-name {\n  font: 600 0.75rem ui-monospace, SFMono-Regular, Menlo, monospace;\n  color: var(--fg-muted);\n}\n.tool-chip:hover .tool-chip-name { color: var(--link); }\n.tool-chip-title { font-size: 0.82rem; }\n\n.tile h4 { margin: 0 0 0.1rem; font-size: 1.02rem; display: flex; align-items: baseline; gap: 0.6rem; }\n.method {\n  font: 600 0.72rem ui-monospace, SFMono-Regular, Menlo, monospace;\n  padding: 0.1rem 0.45rem; border-radius: 4px;\n  background: var(--accent-bg); color: var(--accent-fg);\n}\n.tile-url {\n  font: 0.88rem ui-monospace, SFMono-Regular, Menlo, monospace;\n  color: var(--fg);\n  word-break: break-all;\n}\na.tile-url { color: var(--link); text-decoration: none; }\na.tile-url:hover { text-decoration: underline; }\n.scope {\n  font-size: 0.68rem; text-transform: uppercase; letter-spacing: 0.06em;\n  color: var(--fg-muted); margin-left: auto;\n}\n.tile p.summary { color: var(--fg); margin: 0.35rem 0 0.9rem; font-size: 0.92rem; }\n.hint { color: var(--fg-muted); font-size: 0.84rem; margin: 0 0 0.6rem; }\n\ntable { width: 100%; border-collapse: collapse; font-size: 0.87rem; }\nth, td { text-align: left; padding: 0.45rem 0.6rem; border-bottom: 1px solid var(--border-soft); }\nth {\n  font-weight: 600; color: var(--fg-muted);\n  font-size: 0.72rem; text-transform: uppercase; letter-spacing: 0.05em;\n}\ntd.pack { font: 0.87rem ui-monospace, monospace; color: var(--fg); }\ntd.path { font: 0.82rem ui-monospace, monospace; color: var(--fg-muted); }\ntd.num { text-align: right; font-variant-numeric: tabular-nums; color: var(--fg-muted); }\n.error { color: var(--error); font-style: italic; }\n\ncode {\n  background: var(--surface-2); padding: 0.05rem 0.35rem;\n  border-radius: 3px; font-size: 0.85em;\n}\na { color: var(--link); }\n\n/* API audit log tile */\n.log-table { font-size: 0.82rem; }\n.log-ts, .log-rid {\n  font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n  color: var(--fg-muted);\n  white-space: nowrap;\n}\n.log-rid { font-size: 0.78rem; }\n.log-path {\n  font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n  color: var(--fg);\n  max-width: 360px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;\n}\n.log-method {\n  display: inline-block; padding: 0.05rem 0.4rem; border-radius: 3px;\n  font: 600 0.72rem ui-monospace, monospace;\n  background: var(--surface-2); color: var(--fg);\n}\n.log-method.m-get    { background: #dbeafe; color: #1e40af; }\n.log-method.m-post   { background: #dcfce7; color: #14532d; }\n.log-method.m-delete { background: #fee2e2; color: #7f1d1d; }\n.log-method.m-put, .log-method.m-patch { background: #fef3c7; color: #78350f; }\n@media (prefers-color-scheme: dark) {\n  .log-method.m-get    { background: #1e3a8a; color: #bfdbfe; }\n  .log-method.m-post   { background: #14532d; color: #bbf7d0; }\n  .log-method.m-delete { background: #7f1d1d; color: #fecaca; }\n  .log-method.m-put, .log-method.m-patch { background: #78350f; color: #fcd34d; }\n}\n.log-mcp {\n  font: 600 0.72rem ui-monospace, monospace;\n  padding: 0.05rem 0.4rem; border-radius: 3px;\n  background: #ede9fe; color: #5b21b6;\n}\n@media (prefers-color-scheme: dark) {\n  .log-mcp { background: #4c1d95; color: #ddd6fe; }\n}\n.log-status {\n  display: inline-block; padding: 0.05rem 0.4rem; border-radius: 3px;\n  font: 600 0.78rem ui-monospace, monospace;\n  font-variant-numeric: tabular-nums;\n}\n.log-status-ok   { background: #dcfce7; color: #14532d; }\n.log-status-info { background: #dbeafe; color: #1e40af; }\n.log-status-warn { background: #fef3c7; color: #78350f; }\n.log-status-err  { background: #fee2e2; color: #7f1d1d; }\n.log-status-neutral { background: var(--surface-2); color: var(--fg-muted); }\n@media (prefers-color-scheme: dark) {\n  .log-status-ok   { background: #14532d; color: #bbf7d0; }\n  .log-status-info { background: #1e3a8a; color: #bfdbfe; }\n  .log-status-warn { background: #78350f; color: #fcd34d; }\n  .log-status-err  { background: #7f1d1d; color: #fecaca; }\n}\n.log-scope {\n  font: 0.75rem ui-monospace, monospace;\n  color: var(--fg-muted);\n}\n\n.health-table { margin: 0; }\n.health-table th {\n  text-align: left; padding: 0.35rem 0.8rem 0.35rem 0;\n  font-weight: 600; color: var(--fg-muted); font-size: 0.8rem;\n  text-transform: none; letter-spacing: 0; white-space: nowrap;\n  width: 10rem;\n}\n.health-table td {\n  padding: 0.35rem 0; font-size: 0.88rem;\n  font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n}\n\nul.pre-list {\n  margin: 0.15rem 0 0.75rem 1.25rem; padding: 0;\n  font-size: 0.85rem; color: var(--fg-muted); line-height: 1.55;\n}\ndetails.scenario-raw { margin: 0.75rem 0 0; }\ndetails.scenario-raw > summary {\n  cursor: pointer; color: var(--fg-muted); font-size: 0.85rem;\n  padding: 0.35rem 0; user-select: none;\n}\ndetails.scenario-raw > summary:hover { color: var(--link); }\npre.sample-body {\n  margin: 0 0 0.5rem; padding: 0.75rem 0.9rem;\n  background: var(--surface-2); color: var(--fg);\n  border-radius: 5px; font-size: 0.8rem; line-height: 1.45;\n  overflow-x: auto; white-space: pre-wrap; word-break: break-word;\n  font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n}\n\n.tile-actions { margin: 0 0 1rem; }\n.run {\n  display: inline-flex; align-items: center; gap: 0.5rem;\n  padding: 0.4rem 0.85rem; border-radius: 6px;\n  background: var(--accent-bg); color: var(--accent-fg);\n  font-size: 0.87rem; text-decoration: none;\n  font-family: ui-sans-serif, system-ui, sans-serif;\n  font-weight: 500;\n  border: 1px solid transparent;\n}\n.run:hover { filter: brightness(1.08); text-decoration: none; }\n.run-icon { font-size: 0.8rem; }\n.run-method { font: 600 0.78rem ui-monospace, SFMono-Regular, Menlo, monospace; }\n.run-label { font-weight: 500; }\n\n@media (max-width: 800px) {\n  .layout { grid-template-columns: 1fr; }\n  aside.sidebar { position: static; height: auto; border-right: 0; border-bottom: 1px solid var(--border); }\n  main { padding: 1.5rem 1.25rem 3rem; }\n}\n\n.home-wrap {\n  max-width: 1080px; margin: 0 auto; padding: 3rem 2rem 4rem;\n}\n.home-hero {\n  padding: 3rem 0 2rem; border-bottom: 1px solid var(--border); margin-bottom: 3rem;\n}\n.home-hero .kicker {\n  display: inline-block; font-size: 0.72rem; letter-spacing: 0.14em;\n  text-transform: uppercase; color: var(--accent-fg);\n  background: var(--accent-bg); padding: 0.2rem 0.55rem; border-radius: 4px;\n}\n.home-hero h1 {\n  font-size: 2.4rem; margin: 0.8rem 0 0.35rem; letter-spacing: -0.01em;\n  line-height: 1.1;\n}\n.home-hero .tagline { color: var(--fg-muted); font-size: 1.15rem; margin: 0 0 1.6rem; max-width: 56ch; }\n.home-hero .ctas { display: flex; gap: 0.8rem; flex-wrap: wrap; }\n.btn {\n  display: inline-flex; align-items: center; gap: 0.45rem;\n  padding: 0.6rem 1.1rem; border-radius: 6px;\n  font: 600 0.92rem ui-sans-serif, system-ui, sans-serif;\n  text-decoration: none; border: 1px solid transparent;\n}\n.btn-primary   { background: var(--accent-bg); color: var(--accent-fg); }\n.btn-secondary { background: transparent; color: var(--fg); border-color: var(--border); }\n.btn:hover { filter: brightness(1.08); text-decoration: none; }\n\n.stat-row {\n  display: grid; grid-template-columns: repeat(4, 1fr); gap: 1rem;\n  margin: 2.5rem 0 0;\n}\n.stat {\n  background: var(--surface); border: 1px solid var(--border);\n  border-radius: 8px; padding: 1rem 1.1rem;\n}\n.stat .n {\n  font: 700 1.6rem ui-sans-serif, system-ui, sans-serif;\n  font-variant-numeric: tabular-nums;\n}\n.stat .lbl { color: var(--fg-muted); font-size: 0.82rem; letter-spacing: 0.02em; }\n\nh2.section-h {\n  font-size: 1.3rem; margin: 3rem 0 0.3rem; letter-spacing: -0.005em;\n}\np.section-sub { color: var(--fg-muted); margin: 0 0 1.3rem; }\n\n.pillars, .audiences, .surfaces {\n  display: grid; gap: 1rem;\n}\n.pillars    { grid-template-columns: repeat(2, 1fr); }\n.audiences  { grid-template-columns: repeat(2, 1fr); }\n.surfaces   { grid-template-columns: repeat(3, 1fr); }\n@media (max-width: 720px) {\n  .pillars, .audiences, .surfaces, .stat-row { grid-template-columns: 1fr; }\n  .home-hero h1 { font-size: 1.9rem; }\n}\n\n.card {\n  background: var(--surface); border: 1px solid var(--border);\n  border-radius: 8px; padding: 1.25rem 1.4rem;\n}\n.card h3 {\n  margin: 0 0 0.35rem; font-size: 1rem;\n  display: flex; align-items: center; gap: 0.5rem;\n}\n.card .tag {\n  font: 600 0.68rem ui-monospace, monospace; text-transform: uppercase;\n  padding: 0.1rem 0.4rem; border-radius: 3px;\n  background: var(--accent-bg); color: var(--accent-fg); letter-spacing: 0.04em;\n}\n.card p { margin: 0 0 0.7rem; color: var(--fg); font-size: 0.92rem; line-height: 1.5; }\n.card ul { margin: 0.3rem 0 0.75rem 1.05rem; padding: 0; font-size: 0.88rem; line-height: 1.6; }\n.card .card-actions { display: flex; flex-wrap: wrap; gap: 0.45rem; margin-top: 0.5rem; }\n.card .chip {\n  display: inline-block; padding: 0.15rem 0.55rem; border-radius: 999px;\n  background: var(--surface-2); color: var(--fg-muted); font-size: 0.78rem;\n  text-decoration: none; border: 1px solid var(--border);\n}\n.card .chip:hover { color: var(--link); border-color: var(--link); text-decoration: none; }\n.card .chip.primary { background: var(--accent-bg); color: var(--accent-fg); border-color: transparent; }\n\npre.quickstart {\n  background: var(--surface-2); color: var(--fg);\n  border: 1px solid var(--border); border-radius: 6px;\n  padding: 0.9rem 1rem; overflow-x: auto;\n  font: 0.82rem/1.45 ui-monospace, SFMono-Regular, Menlo, monospace;\n  margin: 0.5rem 0;\n}\npre.quickstart .cmt { color: var(--fg-muted); }\n\n.links-grid {\n  display: grid; grid-template-columns: repeat(2, 1fr); gap: 0.6rem 1.5rem;\n  margin: 0.5rem 0 0;\n}\n.links-grid a {\n  display: flex; justify-content: space-between; align-items: baseline;\n  padding: 0.6rem 0.8rem; border-radius: 5px;\n  text-decoration: none; color: var(--fg); border: 1px solid var(--border);\n  background: var(--surface);\n}\n.links-grid a:hover { border-color: var(--link); color: var(--link); }\n.links-grid .lg-path { font-family: ui-monospace, monospace; font-size: 0.82rem; color: var(--fg-muted); }\n\n.home-footer {\n  margin-top: 4rem; padding-top: 1.5rem; border-top: 1px solid var(--border);\n  color: var(--fg-dim); font-size: 0.82rem; display: flex; justify-content: space-between;\n  flex-wrap: wrap; gap: 0.5rem;\n}\n</style></head><body><div class='home-wrap'><section class='home-hero'><span class='kicker'>Control plane · simulation kernel</span><h1>Singing Bird</h1><p class='tagline'>A canonical-world simulation kernel with LLM-powered synths, exposed as REST, MCP, and SSE over a single OpenAPI schema.</p><div class='ctas'><a class='btn btn-primary' href='/dashboard'>Open the dashboard →</a><a class='btn btn-secondary' href='/docs'>Explore the API</a><a class='btn btn-secondary' href='/v1/admin/logs?limit=20'>Read the audit log</a></div><div class='stat-row'><div class='stat'><div class='n'>46</div><div class='lbl'>API tools</div></div><div class='stat'><div class='n'>8</div><div class='lbl'>scenario packs</div></div><div class='stat'><div class='n'>1</div><div class='lbl'>live sessions</div></div><div class='stat'><div class='n'>13736</div><div class='lbl'>audit records</div></div></div></section><h2 class='section-h'>What this is</h2><p class='section-sub'>Four pillars that define the system under the control plane.</p><div class='pillars'><article class='card'><h3><span class='tag'>Kernel</span>Canonical world with transactional cycles</h3><p>Every cognitive cycle runs against a working copy. The Director commits only after invariants pass; on failure, the working copy is discarded and canonical state is unchanged. Snapshots land at cycle boundaries.</p></article><article class='card'><h3><span class='tag'>Synths</span>LLM-powered agents with theory of mind</h3><p>Each synth owns a phenomenology — self-model, beliefs, mental models of other synths, affect, projects, memories. Perception is mediated through sensory bundles; actions flow through symbolic intent resolution.</p></article><article class='card'><h3><span class='tag'>Audit</span>Append-only replayable event trail</h3><p>Every canonical change is journaled to per-session JSONL. Runs are deterministic (stable IDs from scenario_id + authored_id) and fully replayable from cached LLM responses.</p></article><article class='card'><h3><span class='tag'>Surfaces</span>HTTP/JSON + MCP + SSE, one OpenAPI schema</h3><p>The same OpenAPI spec drives REST, Swagger UI, ReDoc, the LLM tool manifest, the MCP tools/list for agent discovery, and this dashboard. Six consumers, one source of truth.</p></article></div><h2 class='section-h'>Who it's for</h2><p class='section-sub'>Each role has a direct entry point. Scopes are checked on every call.</p><div class='audiences'><article class='card'><h3><span class='tag'>Observer</span>For watchers</h3><p>Attach to a running simulation without disturbing it. <span class='chip'>scope: read</span></p><ul><li><a href='/dashboard#group-sessions'>Dashboard → Sessions</a> — live session list with sim time</li><li><a href='/dashboard#group-observation'>Dashboard → Observation</a> — overviews, events, changes, reports</li><li>SSE streaming at <code>/v1/sessions/{id}/stream</code> — browser-native live feed</li><li>Natural-language ref resolver (<code>resolve_ref</code>) for finding synths by name</li></ul><div class='card-actions'><a class='chip primary' href='/dashboard'>Open dashboard</a><a class='chip' href='/guides/observer_guide'>Observer guide</a></div></article><article class='card'><h3><span class='tag'>Operator</span>For drivers</h3><p>Step the simulation, submit turns, manage sessions. <span class='chip'>scope: operate</span></p><ul><li>Create sessions from scenario packs (<code>list_scenarios</code> → <code>create_session</code>)</li><li>Advance cycles (<code>step_session</code>) or auto-advance (<code>resume_session</code>)</li><li>Inject human turns via <code>submit_turn</code></li><li>Snapshot and roll back with <code>list_snapshots</code> + <code>restore_snapshot</code></li></ul><div class='card-actions'><a class='chip primary' href='/dashboard#group-control'>Control tiles</a><a class='chip' href='/docs'>Swagger UI</a></div></article><article class='card'><h3><span class='tag'>Builder</span>For integrators</h3><p>Build on top of the control plane — agents, UIs, or new synths. <span class='chip'>scope: any</span></p><ul><li>OpenAPI 3.1 at <a href='/openapi.json'><code>/openapi.json</code></a> — authoritative contract</li><li>MCP streamable HTTP at <code>POST /mcp</code> — JSON-RPC 2.0 tool discovery for agents</li><li>Scenario authoring — YAML at <code>scenarios/*.yaml</code>; contract in <a href='/guides/architecture'>Architecture</a></li><li>Extending the kernel — dev guide covers ruleset boundaries, invariants, persistence</li></ul><div class='card-actions'><a class='chip primary' href='/guides/architecture'>Architecture</a><a class='chip' href='/guides/development'>Development guide</a><a class='chip' href='#mcp-card'>MCP endpoint</a></div></article><article class='card'><h3><span class='tag'>Admin</span>For debuggers &amp; ops</h3><p>See what happened, find what broke, drop a new scenario without code changes. <span class='chip'>scope: admin</span></p><ul><li>Full request/response audit at <a href='/v1/admin/logs?limit=20'><code>/v1/admin/logs</code></a> — 15 filters</li><li>Every response carries <code>X-Request-Id</code> — grep the log by ID for full context</li><li>Dashboard log tile renders the tail with colored status + MCP markers</li><li>Apply live patches (<code>apply_patch</code>) and queue stimuli (<code>queue_stimulus</code>) — admin only</li></ul><div class='card-actions'><a class='chip primary' href='/v1/admin/logs?limit=20'>Audit log</a><a class='chip' href='/dashboard#group-tooling'>Dashboard log tile</a></div></article></div><h2 class='section-h'>Quick starts</h2><p class='section-sub'>Copy-paste, LAN-accessible. No auth by default; set <code>SINGING_BIRD_API_TOKEN</code> to turn it on.</p><div class='pillars'><article class='card'><h3>Discover scenarios</h3><pre class='quickstart'><span class='cmt'># List available scenario packs</span>\ncurl -s https://singing-bird.benac.dev/v1/scenarios | jq</pre></article><article class='card'><h3>Create and step a session</h3><pre class='quickstart'><span class='cmt'># Create a session and keep the id</span>\nSID=$(curl -s -X POST https://singing-bird.benac.dev/v1/sessions \\\n  -H 'content-type: application/json' \\\n  -d '{\"scenario_path\":\"scenarios/park_bench.yaml\"}' | jq -r .session_id)\n<span class='cmt'># Advance one cognitive cycle</span>\ncurl -X POST https://singing-bird.benac.dev/v1/sessions/$SID/step \\\n  -H 'content-type: application/json' -d '{\"n\":1}'</pre></article><article class='card'><h3>MCP tool discovery</h3><pre class='quickstart'><span class='cmt'># Any MCP-aware client (Claude Desktop, agent, etc.)</span>\ncurl -X POST https://singing-bird.benac.dev/mcp \\\n  -H 'content-type: application/json' \\\n  -d '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"tools/list\",\"params\":{}}' | jq</pre></article><article class='card'><h3>Debug a request by ID</h3><pre class='quickstart'><span class='cmt'># Every response carries X-Request-Id; use it to pull the record</span>\ncurl -D - https://singing-bird.benac.dev/v1/scenarios -o /dev/null | grep -i request-id\ncurl 'https://singing-bird.benac.dev/v1/admin/logs?request_id=&lt;id&gt;' | jq</pre></article></div><h2 class='section-h'>Every surface, one schema</h2><p class='section-sub'>All six are derived from the same OpenAPI document. Change the code, all six update.</p><div class='surfaces'><article class='card' id='dash-card'><h3>Dashboard</h3><p>Operator UI — 22 tiles across five lanes, live status, audit tail, theme-aware.</p><div class='card-actions'><a class='chip primary' href='/dashboard'>Open /dashboard</a></div></article><article class='card' id='openapi-card'><h3>OpenAPI schema</h3><p>OpenAPI 3.1 JSON. Source of truth for every other surface. Load into any generator.</p><div class='card-actions'><a class='chip primary' href='/openapi.json'>Open /openapi.json</a></div></article><article class='card' id='swagger-card'><h3>Swagger UI</h3><p>Interactive API explorer with try-it-out forms for every endpoint.</p><div class='card-actions'><a class='chip primary' href='/docs'>Open /docs</a></div></article><article class='card' id='redoc-card'><h3>ReDoc</h3><p>Reference-style API docs, easier to read in long form than Swagger.</p><div class='card-actions'><a class='chip primary' href='/redoc'>Open /redoc</a></div></article><article class='card' id='manifest-card'><h3>Tool manifest</h3><p>Compact LLM-friendly JSON tool list (name, method, path, scope, description).</p><div class='card-actions'><a class='chip primary' href='/v1/tooling/manifest'>Open /v1/tooling/manifest</a></div></article><article class='card' id='mcp-card'><h3>MCP endpoint</h3><p>JSON-RPC 2.0 over POST /mcp. tools/list, tools/call, ping. GET returns 405.</p><div class='card-actions'><a class='chip primary' href='/mcp'>Open /mcp</a></div></article></div><h2 class='section-h'>Everything, one click</h2><p class='section-sub'>Bookmarkable index of every URL on this host.</p><div class='links-grid'><a href='/dashboard'><span>Operator dashboard</span><span class='lg-path'>/dashboard</span></a><a href='/v1/admin/logs?limit=20'><span>Audit log (admin)</span><span class='lg-path'>/v1/admin/logs?limit=20</span></a><a href='/docs'><span>Swagger UI</span><span class='lg-path'>/docs</span></a><a href='/redoc'><span>ReDoc</span><span class='lg-path'>/redoc</span></a><a href='/openapi.json'><span>OpenAPI schema</span><span class='lg-path'>/openapi.json</span></a><a href='/v1/tooling/manifest'><span>Tool manifest</span><span class='lg-path'>/v1/tooling/manifest</span></a><a href='/mcp'><span>MCP endpoint (POST)</span><span class='lg-path'>/mcp</span></a><a href='/dashboard/data'><span>Dashboard JSON</span><span class='lg-path'>/dashboard/data</span></a><a href='/guides/observer_guide'><span>Observer guide</span><span class='lg-path'>/guides/observer_guide</span></a><a href='/guides/architecture'><span>Architecture</span><span class='lg-path'>/guides/architecture</span></a><a href='/guides/development'><span>Development guide</span><span class='lg-path'>/guides/development</span></a><a href='/guides/readme'><span>Project README</span><span class='lg-path'>/guides/readme</span></a></div><footer class='home-footer'><span>Singing Bird version 0.3.0</span><span><a href='/dashboard'>dashboard</a> · <a href='/docs'>api docs</a> · <a href='/openapi.json'>openapi</a> · <a href='/mcp'>mcp</a></span></footer></div></body></html>","response_stream":false},"error":null},{"request_id":"b5827d65f8484b67904a5d97d907dcb6","ts":"2026-04-18T17:23:12.820947Z","duration_ms":0.286,"method":"GET","path":"/docs","query":"","operation_id":"","client_ip":"192.168.29.10","user_agent":"kube-probe/1.31","auth":{"scheme":null,"scope":"admin","auth_enabled":false,"recognized":true},"request":{"headers":{"host":"10.244.112.209:8420","user-agent":"kube-probe/1.31","accept":"*/*","connection":"close"},"request_body_size":0,"request_body_truncated":false,"request_body_kind":"empty","request_body":null},"status":200,"response":{"headers":{"content-length":"936","content-type":"text/html; charset=utf-8","x-request-id":"b5827d65f8484b67904a5d97d907dcb6"},"response_body_size":936,"response_body_truncated":false,"response_body_kind":"text","response_body":"\n    <!DOCTYPE html>\n    <html>\n    <head>\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\">\n    <link rel=\"shortcut icon\" href=\"https://fastapi.tiangolo.com/img/favicon.png\">\n    <title>Singing Bird - Swagger UI</title>\n    </head>\n    <body>\n    <div id=\"swagger-ui\">\n    </div>\n    <script src=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\"></script>\n    <!-- `SwaggerUIBundle` is now available on the page -->\n    <script>\n    const ui = SwaggerUIBundle({\n        url: '/openapi.json',\n    \"dom_id\": \"#swagger-ui\",\n\"layout\": \"BaseLayout\",\n\"deepLinking\": true,\n\"showExtensions\": true,\n\"showCommonExtensions\": true,\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\n    presets: [\n        SwaggerUIBundle.presets.apis,\n        SwaggerUIBundle.SwaggerUIStandalonePreset\n        ],\n    })\n    </script>\n    </body>\n    </html>\n    ","response_stream":false},"error":null},{"request_id":"5924507349404589be95f17d101b5231","ts":"2026-04-18T17:23:09.260034Z","duration_ms":1.22,"method":"GET","path":"/v1/tooling/manifest","query":"","operation_id":"get_tool_manifest_v1_tooling_manifest_get","client_ip":"216.73.216.73","user_agent":"Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com)","auth":{"scheme":null,"scope":"admin","auth_enabled":false,"recognized":true},"request":{"headers":{"host":"singing-bird.benac.dev","user-agent":"Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com)","accept":"*/*","accept-encoding":"gzip, br, zstd, deflate","via":"2.0 Caddy","x-forwarded-for":"216.73.216.73","x-forwarded-host":"singing-bird.benac.dev","x-forwarded-proto":"https","x-real-ip":"216.73.216.73"},"request_body_size":0,"request_body_truncated":false,"request_body_kind":"empty","request_body":null},"status":200,"response":{"headers":{"content-length":"15069","content-type":"application/json","x-request-id":"5924507349404589be95f17d101b5231"},"response_body_size":15069,"response_body_truncated":false,"response_body_kind":"json","response_body":{"name":"singing_bird","version":"0.3.0","description":"Control plane for the Singing Bird embodied simulation kernel","tool_count":46,"tools":[{"name":"list_sessions","method":"GET","path":"/v1/sessions","scope":"read","kind":"read","idempotent":true,"description":"List all active simulation sessions.\n\nReturns session_id, scenario_path, created_at, and paused state for each.\nUse before create_session to see what is already running, or to pick a\nsession_id for ot"},{"name":"create_session","method":"POST","path":"/v1/sessions","scope":"operate","kind":"mutate","idempotent":false,"description":"Start a new simulation from a scenario pack.\n\nIdentify the scenario via `scenario_ref` (preferred) or `scenario_path`\n(legacy alias). Both accept id, filename stem, or a path — all normalize.\nCall lis"},{"name":"get_session","method":"GET","path":"/v1/sessions/{session_id}","scope":"read","kind":"read","idempotent":true,"description":"Get a single session's current state — same shape as get_overview.\n\nExists for REST-idiomatic lookup-by-id; prefer get_overview when you\nare calling by session_id anyway, or list_sessions for discover"},{"name":"close_session","method":"DELETE","path":"/v1/sessions/{session_id}","scope":"operate","kind":"destructive","idempotent":true,"description":"Close a session and release its resources.\n\nDestroys the session's in-memory state. If you may want to go back,\ntake or reference a snapshot first (list_snapshots + restore_snapshot)."},{"name":"get_scenario","method":"GET","path":"/v1/scenarios/{scenario_id}","scope":"read","kind":"read","idempotent":true,"description":"Inspect a scenario pack in detail.\n\nscenario_id accepts id, filename stem, or a scenario_path — all\nnormalize to the same scenario.\n\nview modes (use view='authoring' when you plan to edit and write ba"},{"name":"update_scenario","method":"PUT","path":"/v1/scenarios/{scenario_id}","scope":"operate","kind":"destructive","idempotent":true,"description":"Full replace. The body `content` must match the authoring shape from\nget_scenario(view='authoring') — i.e. the raw YAML dict with\nworld.topology.locations, world.entities, synths, profiles, etc. (NOT\n"},{"name":"delete_scenario","method":"DELETE","path":"/v1/scenarios/{scenario_id}","scope":"operate","kind":"destructive","idempotent":true,"description":"Removes a user-authored scenario. Shipped scenarios cannot be deleted —\nfork them first if you want a deletable copy. Accepts scenario_id (id,\nfilename stem, or scenario_path — all normalize to the sa"},{"name":"list_scenarios","method":"GET","path":"/v1/scenarios","scope":"read","kind":"read","idempotent":true,"description":"List scenario packs available on disk.\n\nMetadata-only — no world is loaded. Use before create_session to\ndiscover what simulations can be started; pass a returned path\nas the scenario_path argument to"},{"name":"create_scenario","method":"POST","path":"/v1/scenarios","scope":"operate","kind":"mutate","idempotent":false,"description":"Author a new scenario. If content is omitted a minimal valid scaffold\n(one location, no entities, no synths) is written so you can fill it in\npiece by piece with the component-level add_* tools.\n\nPass"},{"name":"fork_scenario","method":"POST","path":"/v1/scenarios/{scenario_id}/fork","scope":"operate","kind":"mutate","idempotent":false,"description":"Duplicate the source scenario under new_scenario_id. Optional overrides\nare merged at the top level (e.g. {\"random_seed\": 123}). scenario_id\naccepts id, filename stem, or a scenario_path — all normali"},{"name":"add_location","method":"POST","path":"/v1/scenarios/{scenario_id}/locations","scope":"operate","kind":"mutate","idempotent":false,"description":"Add a location to a scenario"},{"name":"replace_location","method":"PUT","path":"/v1/scenarios/{scenario_id}/locations/{loc_id}","scope":"operate","kind":"destructive","idempotent":true,"description":"Full replace. Every unsent field on the prior location is dropped.\nIf you only want to change a few fields, use patch_location."},{"name":"remove_location","method":"DELETE","path":"/v1/scenarios/{scenario_id}/locations/{loc_id}","scope":"operate","kind":"destructive","idempotent":true,"description":"Remove a location (and its adjacency edges)"},{"name":"patch_location","method":"PATCH","path":"/v1/scenarios/{scenario_id}/locations/{loc_id}","scope":"operate","kind":"mutate","idempotent":false,"description":"Deep-merge partial update. Fields you don't send are preserved.\nSend `{\"key\": null}` to delete a key. Returns the full location after\nthe merge, so you can see both the changed and unchanged fields.\n\n"},{"name":"add_entity","method":"POST","path":"/v1/scenarios/{scenario_id}/entities","scope":"operate","kind":"mutate","idempotent":false,"description":"Add an entity to a scenario (ruleset-validated)"},{"name":"replace_entity","method":"PUT","path":"/v1/scenarios/{scenario_id}/entities/{entity_id}","scope":"operate","kind":"destructive","idempotent":true,"description":"Full replace. Every unsent field on the prior entity is dropped.\nComponents are revalidated against the ruleset. Use patch_entity for\npartial updates."},{"name":"remove_entity","method":"DELETE","path":"/v1/scenarios/{scenario_id}/entities/{entity_id}","scope":"operate","kind":"destructive","idempotent":true,"description":"Remove an entity from a scenario"},{"name":"patch_entity","method":"PATCH","path":"/v1/scenarios/{scenario_id}/entities/{entity_id}","scope":"operate","kind":"mutate","idempotent":false,"description":"Deep-merge partial update. Fields you don't send are preserved.\nIf you include 'components', the whole list is replaced (list merging is\nambiguous). Returns the full entity after the merge.\n\nBody must"},{"name":"add_synth","method":"POST","path":"/v1/scenarios/{scenario_id}/synths","scope":"operate","kind":"mutate","idempotent":false,"description":"Add a synth. Required fields (id, entity, identity) are validated at\nthe edge; the full synth shape — identity, cognition, initial_state\n(affect, beliefs, projects, memories, mental_models) — is publi"},{"name":"replace_synth","method":"PUT","path":"/v1/scenarios/{scenario_id}/synths/{synth_id}","scope":"operate","kind":"destructive","idempotent":true,"description":"Full replace. Every unsent field on the prior synth is dropped. This is\nintentionally risky — use patch_synth when you only want to change a few\nfields (e.g. initial_state.beliefs)."},{"name":"remove_synth","method":"DELETE","path":"/v1/scenarios/{scenario_id}/synths/{synth_id}","scope":"operate","kind":"destructive","idempotent":true,"description":"Remove a synth from a scenario"},{"name":"patch_synth","method":"PATCH","path":"/v1/scenarios/{scenario_id}/synths/{synth_id}","scope":"operate","kind":"mutate","idempotent":false,"description":"Deep-merge partial update of one synth.\n\nBody must be `{\"patch\": {...}}` — wrap your merge under the `patch` key.\nExample to clear James's prior knowledge of the shore without losing\nhis identity, emb"},{"name":"add_adjacency","method":"POST","path":"/v1/scenarios/{scenario_id}/adjacency","scope":"operate","kind":"mutate","idempotent":false,"description":"Add an adjacency edge between two locations"},{"name":"remove_adjacency","method":"DELETE","path":"/v1/scenarios/{scenario_id}/adjacency","scope":"operate","kind":"destructive","idempotent":true,"description":"Remove an adjacency edge (by from+to)"},{"name":"list_snapshots","method":"GET","path":"/v1/sessions/{session_id}/snapshots","scope":"read","kind":"read","idempotent":true,"description":"List snapshots taken for a session.\n\nSnapshots are automatic checkpoints taken at cycle boundaries. Pair\nwith restore_snapshot to undo recent changes or roll back after a bad\npatch or an unintended st"},{"name":"diff_snapshots","method":"GET","path":"/v1/sessions/{session_id}/snapshots/diff","scope":"read","kind":"read","idempotent":true,"description":"Event-level diff between two persisted snapshots (RFC-0001).\n\nGeneralizes get_changes to arbitrary snapshot pairs: returns changed_refs,\nevent counts by type, event details, and compact summaries for "},{"name":"get_snapshot_overview","method":"GET","path":"/v1/sessions/{session_id}/snapshots/{snapshot_ref}/overview","scope":"read","kind":"read","idempotent":true,"description":"RFC-0001 tool #1: full world overview materialized from a past snapshot.\n\nSame shape as get_overview, but read from a persisted snapshot. The live\nsession is not modified — this is how you scrub throu"},{"name":"get_snapshot_object","method":"GET","path":"/v1/sessions/{session_id}/snapshots/{snapshot_ref}/objects/{kind}/{ref}","scope":"read","kind":"read","idempotent":true,"description":"RFC-0001 tool #2: object detail as of a persisted snapshot.\n\nSame shape as get_object. Returns 404 if the object did not exist yet at\nthat snapshot (e.g. an entity created at a later cycle). Read-only"},{"name":"restore_snapshot","method":"POST","path":"/v1/sessions/{session_id}/restore","scope":"operate","kind":"destructive","idempotent":false,"description":"Rewind a session to a previous snapshot — the undo button.\n\nReplaces the current session state with the snapshot; anything after\nthat point is discarded unless it was itself snapshotted. Get\nsnapshot_"},{"name":"step_session","method":"POST","path":"/v1/sessions/{session_id}/step","scope":"operate","kind":"mutate","idempotent":false,"description":"Advance the simulation by n cycles (default 1).\n\nEach cycle runs perception → cognition → intent resolution → commit:\nsynths observe their surroundings, decide, and act. Any stimuli queued\nvia queue_s"},{"name":"pause_session","method":"POST","path":"/v1/sessions/{session_id}/pause","scope":"operate","kind":"mutate","idempotent":false,"description":"Pause a session's auto-advance.\n\nStops any timed cycle loop; manual step_session calls still work.\nPair with resume_session to restart the loop."},{"name":"resume_session","method":"POST","path":"/v1/sessions/{session_id}/resume","scope":"operate","kind":"mutate","idempotent":false,"description":"Resume a session's auto-advance after pause_session.\n\nCycles run on the configured cadence. No-op if the session is already\nrunning."},{"name":"submit_turn","method":"POST","path":"/v1/sessions/{session_id}/turns","scope":"operate","kind":"mutate","idempotent":false,"description":"Inject an external event through the director and run a cycle.\n\nUse for in-world events: a spoken announcement, a narrated action, a\nscripted intervention from the operator. The event flows through th"},{"name":"get_overview","method":"GET","path":"/v1/sessions/{session_id}/overview","scope":"read","kind":"read","idempotent":true,"description":"Compact snapshot of the current session state.\n\nReturns synths (with brief status), environment, time, and locations —\nthe go-to call for a status update. Cheaper than inspecting individual\nobjects; u"},{"name":"resolve_ref","method":"GET","path":"/v1/sessions/{session_id}/resolve","scope":"read","kind":"read","idempotent":true,"description":"Resolve a human-readable name to its stable UUID ref.\n\nPass q (the name) and optionally kind (synth, entity, or location) to\nnarrow the search. Use before any tool that takes a ref argument —\nnotably "},{"name":"get_object","method":"GET","path":"/v1/sessions/{session_id}/objects/{kind}/{ref}","scope":"read","kind":"read","idempotent":true,"description":"Detailed view of a specific synth, entity, or location by ref.\n\nkind must be one of: synth, entity, location.\n- synth: beliefs, mood, memories, available actions.\n- entity: components, location, mobil"},{"name":"get_events","method":"GET","path":"/v1/sessions/{session_id}/events","scope":"read","kind":"read","idempotent":true,"description":"Raw audit events from the session since a sequence number.\n\nFull fidelity — every perception, thought, action, and world change.\nBest for detailed history or debugging. For a narrative summary, use\nge"},{"name":"get_changes","method":"GET","path":"/v1/sessions/{session_id}/changes","scope":"read","kind":"read","idempotent":true,"description":"Structured diff of world state: what refs changed and by how much.\n\nAggregated event counts, short summaries, and the set of changed refs —\nsince a given sequence cursor or against a snapshot (snapsho"},{"name":"get_last_cycle_report","method":"GET","path":"/v1/sessions/{session_id}/reports/last-cycle","scope":"read","kind":"read","idempotent":true,"description":"Narrative report of the most recent cycle.\n\nWorld events, synth speech and actions, belief changes, mood shifts —\nhuman-readable. Call after step_session to see what just happened.\nFor multiple cycles"},{"name":"get_report_since","method":"GET","path":"/v1/sessions/{session_id}/reports/since","scope":"read","kind":"read","idempotent":true,"description":"Narrative report spanning every cycle since a sequence cursor.\n\nLike get_last_cycle_report but multi-cycle — use to catch up after\nseveral steps without walking raw events. Returns summaries, event\nco"},{"name":"stream_events","method":"GET","path":"/v1/sessions/{session_id}/stream","scope":"read","kind":"read","idempotent":true,"description":"SSE event stream. Connect and receive events as they happen."},{"name":"apply_patch","method":"POST","path":"/v1/sessions/{session_id}/patches","scope":"admin","kind":"destructive","idempotent":false,"description":"Apply typed operations to mutate world state directly.\n\nBypasses the perception path — synths do NOT necessarily perceive\nthese changes. For things synths should sense (sounds, sights, smells),\nprefer"},{"name":"queue_stimulus","method":"POST","path":"/v1/sessions/{session_id}/stimuli","scope":"admin","kind":"mutate","idempotent":false,"description":"Queue an external stimulus for delivery through the perception path.\n\nStimuli are mediated: they enter through compose_sensory_bundle on the\nnext step or turn, so synths perceive them naturally — a so"},{"name":"check_llm_health","method":"GET","path":"/v1/health/llm","scope":"read","kind":"read","idempotent":true,"description":"Probe the LLM backend the synths would actually call.\n\nPer ADR-0001, silent cognition failure is an operational hazard. This\nendpoint surfaces reachability + TLS + auth state before anyone tries\nto st"},{"name":"get_tool_manifest","method":"GET","path":"/v1/tooling/manifest","scope":"read","kind":"read","idempotent":true,"description":"Tool manifest generated from the OpenAPI schema (the source of truth).\n\nLists every tool with name, method, path, scope, and description. The\nsame tool set is available over MCP at POST /mcp — MCP cli"},{"name":"get_api_call_log","method":"GET","path":"/v1/admin/logs","scope":"admin","kind":"read","idempotent":true,"description":"Search the API request/response audit log.\n\nEvery HTTP request (REST, MCP, dashboard) produces one JSONL record at\ndata/audit/api_calls.jsonl. MCP JSON-RPC messages produce a second record\nwith type=\""}]},"response_stream":false},"error":null},{"request_id":"312820a181414fe5a47c78d1d337ad99","ts":"2026-04-18T17:23:09.224211Z","duration_ms":0.361,"method":"GET","path":"/robots.txt","query":"","operation_id":"","client_ip":"216.73.216.73","user_agent":"Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com)","auth":{"scheme":null,"scope":"admin","auth_enabled":false,"recognized":true},"request":{"headers":{"host":"singing-bird.benac.dev","user-agent":"Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com)","accept":"*/*","accept-encoding":"gzip, br, zstd, deflate","via":"2.0 Caddy","x-forwarded-for":"216.73.216.73","x-forwarded-host":"singing-bird.benac.dev","x-forwarded-proto":"https","x-real-ip":"216.73.216.73"},"request_body_size":0,"request_body_truncated":false,"request_body_kind":"empty","request_body":null},"status":404,"response":{"headers":{"content-length":"22","content-type":"application/json","x-request-id":"312820a181414fe5a47c78d1d337ad99"},"response_body_size":22,"response_body_truncated":false,"response_body_kind":"json","response_body":{"detail":"Not Found"},"response_stream":false},"error":null},{"request_id":"a2a29ef660da472187e1457d28c6d4bc","ts":"2026-04-18T17:23:02.821264Z","duration_ms":0.129,"method":"GET","path":"/docs","query":"","operation_id":"","client_ip":"192.168.29.10","user_agent":"kube-probe/1.31","auth":{"scheme":null,"scope":"admin","auth_enabled":false,"recognized":true},"request":{"headers":{"host":"10.244.112.209:8420","user-agent":"kube-probe/1.31","accept":"*/*","connection":"close"},"request_body_size":0,"request_body_truncated":false,"request_body_kind":"empty","request_body":null},"status":200,"response":{"headers":{"content-length":"936","content-type":"text/html; charset=utf-8","x-request-id":"a2a29ef660da472187e1457d28c6d4bc"},"response_body_size":936,"response_body_truncated":false,"response_body_kind":"text","response_body":"\n    <!DOCTYPE html>\n    <html>\n    <head>\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\">\n    <link rel=\"shortcut icon\" href=\"https://fastapi.tiangolo.com/img/favicon.png\">\n    <title>Singing Bird - Swagger UI</title>\n    </head>\n    <body>\n    <div id=\"swagger-ui\">\n    </div>\n    <script src=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\"></script>\n    <!-- `SwaggerUIBundle` is now available on the page -->\n    <script>\n    const ui = SwaggerUIBundle({\n        url: '/openapi.json',\n    \"dom_id\": \"#swagger-ui\",\n\"layout\": \"BaseLayout\",\n\"deepLinking\": true,\n\"showExtensions\": true,\n\"showCommonExtensions\": true,\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\n    presets: [\n        SwaggerUIBundle.presets.apis,\n        SwaggerUIBundle.SwaggerUIStandalonePreset\n        ],\n    })\n    </script>\n    </body>\n    </html>\n    ","response_stream":false},"error":null},{"request_id":"5a890d12068940a48191101e601e6395","ts":"2026-04-18T17:23:02.820704Z","duration_ms":0.235,"method":"GET","path":"/docs","query":"","operation_id":"","client_ip":"192.168.29.10","user_agent":"kube-probe/1.31","auth":{"scheme":null,"scope":"admin","auth_enabled":false,"recognized":true},"request":{"headers":{"host":"10.244.112.209:8420","user-agent":"kube-probe/1.31","accept":"*/*","connection":"close"},"request_body_size":0,"request_body_truncated":false,"request_body_kind":"empty","request_body":null},"status":200,"response":{"headers":{"content-length":"936","content-type":"text/html; charset=utf-8","x-request-id":"5a890d12068940a48191101e601e6395"},"response_body_size":936,"response_body_truncated":false,"response_body_kind":"text","response_body":"\n    <!DOCTYPE html>\n    <html>\n    <head>\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\">\n    <link rel=\"shortcut icon\" href=\"https://fastapi.tiangolo.com/img/favicon.png\">\n    <title>Singing Bird - Swagger UI</title>\n    </head>\n    <body>\n    <div id=\"swagger-ui\">\n    </div>\n    <script src=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\"></script>\n    <!-- `SwaggerUIBundle` is now available on the page -->\n    <script>\n    const ui = SwaggerUIBundle({\n        url: '/openapi.json',\n    \"dom_id\": \"#swagger-ui\",\n\"layout\": \"BaseLayout\",\n\"deepLinking\": true,\n\"showExtensions\": true,\n\"showCommonExtensions\": true,\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\n    presets: [\n        SwaggerUIBundle.presets.apis,\n        SwaggerUIBundle.SwaggerUIStandalonePreset\n        ],\n    })\n    </script>\n    </body>\n    </html>\n    ","response_stream":false},"error":null},{"request_id":"82b2dd4195d54d6fac9c552f1a9eefb9","ts":"2026-04-18T17:22:52.820511Z","duration_ms":0.275,"method":"GET","path":"/docs","query":"","operation_id":"","client_ip":"192.168.29.10","user_agent":"kube-probe/1.31","auth":{"scheme":null,"scope":"admin","auth_enabled":false,"recognized":true},"request":{"headers":{"host":"10.244.112.209:8420","user-agent":"kube-probe/1.31","accept":"*/*","connection":"close"},"request_body_size":0,"request_body_truncated":false,"request_body_kind":"empty","request_body":null},"status":200,"response":{"headers":{"content-length":"936","content-type":"text/html; charset=utf-8","x-request-id":"82b2dd4195d54d6fac9c552f1a9eefb9"},"response_body_size":936,"response_body_truncated":false,"response_body_kind":"text","response_body":"\n    <!DOCTYPE html>\n    <html>\n    <head>\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\">\n    <link rel=\"shortcut icon\" href=\"https://fastapi.tiangolo.com/img/favicon.png\">\n    <title>Singing Bird - Swagger UI</title>\n    </head>\n    <body>\n    <div id=\"swagger-ui\">\n    </div>\n    <script src=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\"></script>\n    <!-- `SwaggerUIBundle` is now available on the page -->\n    <script>\n    const ui = SwaggerUIBundle({\n        url: '/openapi.json',\n    \"dom_id\": \"#swagger-ui\",\n\"layout\": \"BaseLayout\",\n\"deepLinking\": true,\n\"showExtensions\": true,\n\"showCommonExtensions\": true,\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\n    presets: [\n        SwaggerUIBundle.presets.apis,\n        SwaggerUIBundle.SwaggerUIStandalonePreset\n        ],\n    })\n    </script>\n    </body>\n    </html>\n    ","response_stream":false},"error":null},{"request_id":"aa3f8fca9bdf404cb029a79d64116f7f","ts":"2026-04-18T17:22:42.820891Z","duration_ms":0.246,"method":"GET","path":"/docs","query":"","operation_id":"","client_ip":"192.168.29.10","user_agent":"kube-probe/1.31","auth":{"scheme":null,"scope":"admin","auth_enabled":false,"recognized":true},"request":{"headers":{"host":"10.244.112.209:8420","user-agent":"kube-probe/1.31","accept":"*/*","connection":"close"},"request_body_size":0,"request_body_truncated":false,"request_body_kind":"empty","request_body":null},"status":200,"response":{"headers":{"content-length":"936","content-type":"text/html; charset=utf-8","x-request-id":"aa3f8fca9bdf404cb029a79d64116f7f"},"response_body_size":936,"response_body_truncated":false,"response_body_kind":"text","response_body":"\n    <!DOCTYPE html>\n    <html>\n    <head>\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\">\n    <link rel=\"shortcut icon\" href=\"https://fastapi.tiangolo.com/img/favicon.png\">\n    <title>Singing Bird - Swagger UI</title>\n    </head>\n    <body>\n    <div id=\"swagger-ui\">\n    </div>\n    <script src=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\"></script>\n    <!-- `SwaggerUIBundle` is now available on the page -->\n    <script>\n    const ui = SwaggerUIBundle({\n        url: '/openapi.json',\n    \"dom_id\": \"#swagger-ui\",\n\"layout\": \"BaseLayout\",\n\"deepLinking\": true,\n\"showExtensions\": true,\n\"showCommonExtensions\": true,\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\n    presets: [\n        SwaggerUIBundle.presets.apis,\n        SwaggerUIBundle.SwaggerUIStandalonePreset\n        ],\n    })\n    </script>\n    </body>\n    </html>\n    ","response_stream":false},"error":null},{"request_id":"cf12f09f9e304e74b240b103be324c79","ts":"2026-04-18T17:22:32.821915Z","duration_ms":0.137,"method":"GET","path":"/docs","query":"","operation_id":"","client_ip":"192.168.29.10","user_agent":"kube-probe/1.31","auth":{"scheme":null,"scope":"admin","auth_enabled":false,"recognized":true},"request":{"headers":{"host":"10.244.112.209:8420","user-agent":"kube-probe/1.31","accept":"*/*","connection":"close"},"request_body_size":0,"request_body_truncated":false,"request_body_kind":"empty","request_body":null},"status":200,"response":{"headers":{"content-length":"936","content-type":"text/html; charset=utf-8","x-request-id":"cf12f09f9e304e74b240b103be324c79"},"response_body_size":936,"response_body_truncated":false,"response_body_kind":"text","response_body":"\n    <!DOCTYPE html>\n    <html>\n    <head>\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\">\n    <link rel=\"shortcut icon\" href=\"https://fastapi.tiangolo.com/img/favicon.png\">\n    <title>Singing Bird - Swagger UI</title>\n    </head>\n    <body>\n    <div id=\"swagger-ui\">\n    </div>\n    <script src=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\"></script>\n    <!-- `SwaggerUIBundle` is now available on the page -->\n    <script>\n    const ui = SwaggerUIBundle({\n        url: '/openapi.json',\n    \"dom_id\": \"#swagger-ui\",\n\"layout\": \"BaseLayout\",\n\"deepLinking\": true,\n\"showExtensions\": true,\n\"showCommonExtensions\": true,\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\n    presets: [\n        SwaggerUIBundle.presets.apis,\n        SwaggerUIBundle.SwaggerUIStandalonePreset\n        ],\n    })\n    </script>\n    </body>\n    </html>\n    ","response_stream":false},"error":null},{"request_id":"9e4d733e1ec9471c8cdce705251e4e90","ts":"2026-04-18T17:22:32.821237Z","duration_ms":0.247,"method":"GET","path":"/docs","query":"","operation_id":"","client_ip":"192.168.29.10","user_agent":"kube-probe/1.31","auth":{"scheme":null,"scope":"admin","auth_enabled":false,"recognized":true},"request":{"headers":{"host":"10.244.112.209:8420","user-agent":"kube-probe/1.31","accept":"*/*","connection":"close"},"request_body_size":0,"request_body_truncated":false,"request_body_kind":"empty","request_body":null},"status":200,"response":{"headers":{"content-length":"936","content-type":"text/html; charset=utf-8","x-request-id":"9e4d733e1ec9471c8cdce705251e4e90"},"response_body_size":936,"response_body_truncated":false,"response_body_kind":"text","response_body":"\n    <!DOCTYPE html>\n    <html>\n    <head>\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\">\n    <link rel=\"shortcut icon\" href=\"https://fastapi.tiangolo.com/img/favicon.png\">\n    <title>Singing Bird - Swagger UI</title>\n    </head>\n    <body>\n    <div id=\"swagger-ui\">\n    </div>\n    <script src=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\"></script>\n    <!-- `SwaggerUIBundle` is now available on the page -->\n    <script>\n    const ui = SwaggerUIBundle({\n        url: '/openapi.json',\n    \"dom_id\": \"#swagger-ui\",\n\"layout\": \"BaseLayout\",\n\"deepLinking\": true,\n\"showExtensions\": true,\n\"showCommonExtensions\": true,\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\n    presets: [\n        SwaggerUIBundle.presets.apis,\n        SwaggerUIBundle.SwaggerUIStandalonePreset\n        ],\n    })\n    </script>\n    </body>\n    </html>\n    ","response_stream":false},"error":null},{"request_id":"169e0296862f4a9aba25dcf02c92d955","ts":"2026-04-18T17:22:22.821368Z","duration_ms":0.27,"method":"GET","path":"/docs","query":"","operation_id":"","client_ip":"192.168.29.10","user_agent":"kube-probe/1.31","auth":{"scheme":null,"scope":"admin","auth_enabled":false,"recognized":true},"request":{"headers":{"host":"10.244.112.209:8420","user-agent":"kube-probe/1.31","accept":"*/*","connection":"close"},"request_body_size":0,"request_body_truncated":false,"request_body_kind":"empty","request_body":null},"status":200,"response":{"headers":{"content-length":"936","content-type":"text/html; charset=utf-8","x-request-id":"169e0296862f4a9aba25dcf02c92d955"},"response_body_size":936,"response_body_truncated":false,"response_body_kind":"text","response_body":"\n    <!DOCTYPE html>\n    <html>\n    <head>\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\">\n    <link rel=\"shortcut icon\" href=\"https://fastapi.tiangolo.com/img/favicon.png\">\n    <title>Singing Bird - Swagger UI</title>\n    </head>\n    <body>\n    <div id=\"swagger-ui\">\n    </div>\n    <script src=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\"></script>\n    <!-- `SwaggerUIBundle` is now available on the page -->\n    <script>\n    const ui = SwaggerUIBundle({\n        url: '/openapi.json',\n    \"dom_id\": \"#swagger-ui\",\n\"layout\": \"BaseLayout\",\n\"deepLinking\": true,\n\"showExtensions\": true,\n\"showCommonExtensions\": true,\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\n    presets: [\n        SwaggerUIBundle.presets.apis,\n        SwaggerUIBundle.SwaggerUIStandalonePreset\n        ],\n    })\n    </script>\n    </body>\n    </html>\n    ","response_stream":false},"error":null},{"request_id":"5bce8ec338f64a28bf89cf0f778d2a03","ts":"2026-04-18T17:22:12.821354Z","duration_ms":0.228,"method":"GET","path":"/docs","query":"","operation_id":"","client_ip":"192.168.29.10","user_agent":"kube-probe/1.31","auth":{"scheme":null,"scope":"admin","auth_enabled":false,"recognized":true},"request":{"headers":{"host":"10.244.112.209:8420","user-agent":"kube-probe/1.31","accept":"*/*","connection":"close"},"request_body_size":0,"request_body_truncated":false,"request_body_kind":"empty","request_body":null},"status":200,"response":{"headers":{"content-length":"936","content-type":"text/html; charset=utf-8","x-request-id":"5bce8ec338f64a28bf89cf0f778d2a03"},"response_body_size":936,"response_body_truncated":false,"response_body_kind":"text","response_body":"\n    <!DOCTYPE html>\n    <html>\n    <head>\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\">\n    <link rel=\"shortcut icon\" href=\"https://fastapi.tiangolo.com/img/favicon.png\">\n    <title>Singing Bird - Swagger UI</title>\n    </head>\n    <body>\n    <div id=\"swagger-ui\">\n    </div>\n    <script src=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\"></script>\n    <!-- `SwaggerUIBundle` is now available on the page -->\n    <script>\n    const ui = SwaggerUIBundle({\n        url: '/openapi.json',\n    \"dom_id\": \"#swagger-ui\",\n\"layout\": \"BaseLayout\",\n\"deepLinking\": true,\n\"showExtensions\": true,\n\"showCommonExtensions\": true,\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\n    presets: [\n        SwaggerUIBundle.presets.apis,\n        SwaggerUIBundle.SwaggerUIStandalonePreset\n        ],\n    })\n    </script>\n    </body>\n    </html>\n    ","response_stream":false},"error":null},{"request_id":"567bb8b60b8d44ea9cc25b3f2f0758e4","ts":"2026-04-18T17:22:02.821244Z","duration_ms":0.13,"method":"GET","path":"/docs","query":"","operation_id":"","client_ip":"192.168.29.10","user_agent":"kube-probe/1.31","auth":{"scheme":null,"scope":"admin","auth_enabled":false,"recognized":true},"request":{"headers":{"host":"10.244.112.209:8420","user-agent":"kube-probe/1.31","accept":"*/*","connection":"close"},"request_body_size":0,"request_body_truncated":false,"request_body_kind":"empty","request_body":null},"status":200,"response":{"headers":{"content-length":"936","content-type":"text/html; charset=utf-8","x-request-id":"567bb8b60b8d44ea9cc25b3f2f0758e4"},"response_body_size":936,"response_body_truncated":false,"response_body_kind":"text","response_body":"\n    <!DOCTYPE html>\n    <html>\n    <head>\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\">\n    <link rel=\"shortcut icon\" href=\"https://fastapi.tiangolo.com/img/favicon.png\">\n    <title>Singing Bird - Swagger UI</title>\n    </head>\n    <body>\n    <div id=\"swagger-ui\">\n    </div>\n    <script src=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\"></script>\n    <!-- `SwaggerUIBundle` is now available on the page -->\n    <script>\n    const ui = SwaggerUIBundle({\n        url: '/openapi.json',\n    \"dom_id\": \"#swagger-ui\",\n\"layout\": \"BaseLayout\",\n\"deepLinking\": true,\n\"showExtensions\": true,\n\"showCommonExtensions\": true,\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\n    presets: [\n        SwaggerUIBundle.presets.apis,\n        SwaggerUIBundle.SwaggerUIStandalonePreset\n        ],\n    })\n    </script>\n    </body>\n    </html>\n    ","response_stream":false},"error":null},{"request_id":"97dd8dbecbd445ba96a8f50f79b502fe","ts":"2026-04-18T17:22:02.820625Z","duration_ms":0.256,"method":"GET","path":"/docs","query":"","operation_id":"","client_ip":"192.168.29.10","user_agent":"kube-probe/1.31","auth":{"scheme":null,"scope":"admin","auth_enabled":false,"recognized":true},"request":{"headers":{"host":"10.244.112.209:8420","user-agent":"kube-probe/1.31","accept":"*/*","connection":"close"},"request_body_size":0,"request_body_truncated":false,"request_body_kind":"empty","request_body":null},"status":200,"response":{"headers":{"content-length":"936","content-type":"text/html; charset=utf-8","x-request-id":"97dd8dbecbd445ba96a8f50f79b502fe"},"response_body_size":936,"response_body_truncated":false,"response_body_kind":"text","response_body":"\n    <!DOCTYPE html>\n    <html>\n    <head>\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\">\n    <link rel=\"shortcut icon\" href=\"https://fastapi.tiangolo.com/img/favicon.png\">\n    <title>Singing Bird - Swagger UI</title>\n    </head>\n    <body>\n    <div id=\"swagger-ui\">\n    </div>\n    <script src=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\"></script>\n    <!-- `SwaggerUIBundle` is now available on the page -->\n    <script>\n    const ui = SwaggerUIBundle({\n        url: '/openapi.json',\n    \"dom_id\": \"#swagger-ui\",\n\"layout\": \"BaseLayout\",\n\"deepLinking\": true,\n\"showExtensions\": true,\n\"showCommonExtensions\": true,\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\n    presets: [\n        SwaggerUIBundle.presets.apis,\n        SwaggerUIBundle.SwaggerUIStandalonePreset\n        ],\n    })\n    </script>\n    </body>\n    </html>\n    ","response_stream":false},"error":null},{"request_id":"f237f2116cd54f5596cff53f32e6b6b5","ts":"2026-04-18T17:21:52.821344Z","duration_ms":0.281,"method":"GET","path":"/docs","query":"","operation_id":"","client_ip":"192.168.29.10","user_agent":"kube-probe/1.31","auth":{"scheme":null,"scope":"admin","auth_enabled":false,"recognized":true},"request":{"headers":{"host":"10.244.112.209:8420","user-agent":"kube-probe/1.31","accept":"*/*","connection":"close"},"request_body_size":0,"request_body_truncated":false,"request_body_kind":"empty","request_body":null},"status":200,"response":{"headers":{"content-length":"936","content-type":"text/html; charset=utf-8","x-request-id":"f237f2116cd54f5596cff53f32e6b6b5"},"response_body_size":936,"response_body_truncated":false,"response_body_kind":"text","response_body":"\n    <!DOCTYPE html>\n    <html>\n    <head>\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\">\n    <link rel=\"shortcut icon\" href=\"https://fastapi.tiangolo.com/img/favicon.png\">\n    <title>Singing Bird - Swagger UI</title>\n    </head>\n    <body>\n    <div id=\"swagger-ui\">\n    </div>\n    <script src=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\"></script>\n    <!-- `SwaggerUIBundle` is now available on the page -->\n    <script>\n    const ui = SwaggerUIBundle({\n        url: '/openapi.json',\n    \"dom_id\": \"#swagger-ui\",\n\"layout\": \"BaseLayout\",\n\"deepLinking\": true,\n\"showExtensions\": true,\n\"showCommonExtensions\": true,\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\n    presets: [\n        SwaggerUIBundle.presets.apis,\n        SwaggerUIBundle.SwaggerUIStandalonePreset\n        ],\n    })\n    </script>\n    </body>\n    </html>\n    ","response_stream":false},"error":null},{"request_id":"e5c059c1360e43feb9cee6544ff60ea6","ts":"2026-04-18T17:21:42.820705Z","duration_ms":0.252,"method":"GET","path":"/docs","query":"","operation_id":"","client_ip":"192.168.29.10","user_agent":"kube-probe/1.31","auth":{"scheme":null,"scope":"admin","auth_enabled":false,"recognized":true},"request":{"headers":{"host":"10.244.112.209:8420","user-agent":"kube-probe/1.31","accept":"*/*","connection":"close"},"request_body_size":0,"request_body_truncated":false,"request_body_kind":"empty","request_body":null},"status":200,"response":{"headers":{"content-length":"936","content-type":"text/html; charset=utf-8","x-request-id":"e5c059c1360e43feb9cee6544ff60ea6"},"response_body_size":936,"response_body_truncated":false,"response_body_kind":"text","response_body":"\n    <!DOCTYPE html>\n    <html>\n    <head>\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\">\n    <link rel=\"shortcut icon\" href=\"https://fastapi.tiangolo.com/img/favicon.png\">\n    <title>Singing Bird - Swagger UI</title>\n    </head>\n    <body>\n    <div id=\"swagger-ui\">\n    </div>\n    <script src=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\"></script>\n    <!-- `SwaggerUIBundle` is now available on the page -->\n    <script>\n    const ui = SwaggerUIBundle({\n        url: '/openapi.json',\n    \"dom_id\": \"#swagger-ui\",\n\"layout\": \"BaseLayout\",\n\"deepLinking\": true,\n\"showExtensions\": true,\n\"showCommonExtensions\": true,\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\n    presets: [\n        SwaggerUIBundle.presets.apis,\n        SwaggerUIBundle.SwaggerUIStandalonePreset\n        ],\n    })\n    </script>\n    </body>\n    </html>\n    ","response_stream":false},"error":null},{"request_id":"5ca283259786400296804865c1dfd73c","ts":"2026-04-18T17:21:32.821097Z","duration_ms":0.152,"method":"GET","path":"/docs","query":"","operation_id":"","client_ip":"192.168.29.10","user_agent":"kube-probe/1.31","auth":{"scheme":null,"scope":"admin","auth_enabled":false,"recognized":true},"request":{"headers":{"host":"10.244.112.209:8420","user-agent":"kube-probe/1.31","accept":"*/*","connection":"close"},"request_body_size":0,"request_body_truncated":false,"request_body_kind":"empty","request_body":null},"status":200,"response":{"headers":{"content-length":"936","content-type":"text/html; charset=utf-8","x-request-id":"5ca283259786400296804865c1dfd73c"},"response_body_size":936,"response_body_truncated":false,"response_body_kind":"text","response_body":"\n    <!DOCTYPE html>\n    <html>\n    <head>\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\">\n    <link rel=\"shortcut icon\" href=\"https://fastapi.tiangolo.com/img/favicon.png\">\n    <title>Singing Bird - Swagger UI</title>\n    </head>\n    <body>\n    <div id=\"swagger-ui\">\n    </div>\n    <script src=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\"></script>\n    <!-- `SwaggerUIBundle` is now available on the page -->\n    <script>\n    const ui = SwaggerUIBundle({\n        url: '/openapi.json',\n    \"dom_id\": \"#swagger-ui\",\n\"layout\": \"BaseLayout\",\n\"deepLinking\": true,\n\"showExtensions\": true,\n\"showCommonExtensions\": true,\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\n    presets: [\n        SwaggerUIBundle.presets.apis,\n        SwaggerUIBundle.SwaggerUIStandalonePreset\n        ],\n    })\n    </script>\n    </body>\n    </html>\n    ","response_stream":false},"error":null},{"request_id":"4d2c0725f05c451cb94e2b741dfcbe3d","ts":"2026-04-18T17:21:32.820454Z","duration_ms":0.271,"method":"GET","path":"/docs","query":"","operation_id":"","client_ip":"192.168.29.10","user_agent":"kube-probe/1.31","auth":{"scheme":null,"scope":"admin","auth_enabled":false,"recognized":true},"request":{"headers":{"host":"10.244.112.209:8420","user-agent":"kube-probe/1.31","accept":"*/*","connection":"close"},"request_body_size":0,"request_body_truncated":false,"request_body_kind":"empty","request_body":null},"status":200,"response":{"headers":{"content-length":"936","content-type":"text/html; charset=utf-8","x-request-id":"4d2c0725f05c451cb94e2b741dfcbe3d"},"response_body_size":936,"response_body_truncated":false,"response_body_kind":"text","response_body":"\n    <!DOCTYPE html>\n    <html>\n    <head>\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\">\n    <link rel=\"shortcut icon\" href=\"https://fastapi.tiangolo.com/img/favicon.png\">\n    <title>Singing Bird - Swagger UI</title>\n    </head>\n    <body>\n    <div id=\"swagger-ui\">\n    </div>\n    <script src=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\"></script>\n    <!-- `SwaggerUIBundle` is now available on the page -->\n    <script>\n    const ui = SwaggerUIBundle({\n        url: '/openapi.json',\n    \"dom_id\": \"#swagger-ui\",\n\"layout\": \"BaseLayout\",\n\"deepLinking\": true,\n\"showExtensions\": true,\n\"showCommonExtensions\": true,\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\n    presets: [\n        SwaggerUIBundle.presets.apis,\n        SwaggerUIBundle.SwaggerUIStandalonePreset\n        ],\n    })\n    </script>\n    </body>\n    </html>\n    ","response_stream":false},"error":null},{"request_id":"5295007a42454c058e504d4155652afd","ts":"2026-04-18T17:21:22.821063Z","duration_ms":0.243,"method":"GET","path":"/docs","query":"","operation_id":"","client_ip":"192.168.29.10","user_agent":"kube-probe/1.31","auth":{"scheme":null,"scope":"admin","auth_enabled":false,"recognized":true},"request":{"headers":{"host":"10.244.112.209:8420","user-agent":"kube-probe/1.31","accept":"*/*","connection":"close"},"request_body_size":0,"request_body_truncated":false,"request_body_kind":"empty","request_body":null},"status":200,"response":{"headers":{"content-length":"936","content-type":"text/html; charset=utf-8","x-request-id":"5295007a42454c058e504d4155652afd"},"response_body_size":936,"response_body_truncated":false,"response_body_kind":"text","response_body":"\n    <!DOCTYPE html>\n    <html>\n    <head>\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\">\n    <link rel=\"shortcut icon\" href=\"https://fastapi.tiangolo.com/img/favicon.png\">\n    <title>Singing Bird - Swagger UI</title>\n    </head>\n    <body>\n    <div id=\"swagger-ui\">\n    </div>\n    <script src=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\"></script>\n    <!-- `SwaggerUIBundle` is now available on the page -->\n    <script>\n    const ui = SwaggerUIBundle({\n        url: '/openapi.json',\n    \"dom_id\": \"#swagger-ui\",\n\"layout\": \"BaseLayout\",\n\"deepLinking\": true,\n\"showExtensions\": true,\n\"showCommonExtensions\": true,\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\n    presets: [\n        SwaggerUIBundle.presets.apis,\n        SwaggerUIBundle.SwaggerUIStandalonePreset\n        ],\n    })\n    </script>\n    </body>\n    </html>\n    ","response_stream":false},"error":null},{"request_id":"733b062efc5444dbb19fc6126217d237","ts":"2026-04-18T17:21:12.821131Z","duration_ms":0.239,"method":"GET","path":"/docs","query":"","operation_id":"","client_ip":"192.168.29.10","user_agent":"kube-probe/1.31","auth":{"scheme":null,"scope":"admin","auth_enabled":false,"recognized":true},"request":{"headers":{"host":"10.244.112.209:8420","user-agent":"kube-probe/1.31","accept":"*/*","connection":"close"},"request_body_size":0,"request_body_truncated":false,"request_body_kind":"empty","request_body":null},"status":200,"response":{"headers":{"content-length":"936","content-type":"text/html; charset=utf-8","x-request-id":"733b062efc5444dbb19fc6126217d237"},"response_body_size":936,"response_body_truncated":false,"response_body_kind":"text","response_body":"\n    <!DOCTYPE html>\n    <html>\n    <head>\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\">\n    <link rel=\"shortcut icon\" href=\"https://fastapi.tiangolo.com/img/favicon.png\">\n    <title>Singing Bird - Swagger UI</title>\n    </head>\n    <body>\n    <div id=\"swagger-ui\">\n    </div>\n    <script src=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\"></script>\n    <!-- `SwaggerUIBundle` is now available on the page -->\n    <script>\n    const ui = SwaggerUIBundle({\n        url: '/openapi.json',\n    \"dom_id\": \"#swagger-ui\",\n\"layout\": \"BaseLayout\",\n\"deepLinking\": true,\n\"showExtensions\": true,\n\"showCommonExtensions\": true,\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\n    presets: [\n        SwaggerUIBundle.presets.apis,\n        SwaggerUIBundle.SwaggerUIStandalonePreset\n        ],\n    })\n    </script>\n    </body>\n    </html>\n    ","response_stream":false},"error":null},{"request_id":"53d2253ed98846aeaed94a9e262ed5ec","ts":"2026-04-18T17:21:02.821538Z","duration_ms":0.147,"method":"GET","path":"/docs","query":"","operation_id":"","client_ip":"192.168.29.10","user_agent":"kube-probe/1.31","auth":{"scheme":null,"scope":"admin","auth_enabled":false,"recognized":true},"request":{"headers":{"host":"10.244.112.209:8420","user-agent":"kube-probe/1.31","accept":"*/*","connection":"close"},"request_body_size":0,"request_body_truncated":false,"request_body_kind":"empty","request_body":null},"status":200,"response":{"headers":{"content-length":"936","content-type":"text/html; charset=utf-8","x-request-id":"53d2253ed98846aeaed94a9e262ed5ec"},"response_body_size":936,"response_body_truncated":false,"response_body_kind":"text","response_body":"\n    <!DOCTYPE html>\n    <html>\n    <head>\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\">\n    <link rel=\"shortcut icon\" href=\"https://fastapi.tiangolo.com/img/favicon.png\">\n    <title>Singing Bird - Swagger UI</title>\n    </head>\n    <body>\n    <div id=\"swagger-ui\">\n    </div>\n    <script src=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\"></script>\n    <!-- `SwaggerUIBundle` is now available on the page -->\n    <script>\n    const ui = SwaggerUIBundle({\n        url: '/openapi.json',\n    \"dom_id\": \"#swagger-ui\",\n\"layout\": \"BaseLayout\",\n\"deepLinking\": true,\n\"showExtensions\": true,\n\"showCommonExtensions\": true,\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\n    presets: [\n        SwaggerUIBundle.presets.apis,\n        SwaggerUIBundle.SwaggerUIStandalonePreset\n        ],\n    })\n    </script>\n    </body>\n    </html>\n    ","response_stream":false},"error":null},{"request_id":"b41835e7b2ae49b1a9c392c29de0ca44","ts":"2026-04-18T17:21:02.820923Z","duration_ms":0.241,"method":"GET","path":"/docs","query":"","operation_id":"","client_ip":"192.168.29.10","user_agent":"kube-probe/1.31","auth":{"scheme":null,"scope":"admin","auth_enabled":false,"recognized":true},"request":{"headers":{"host":"10.244.112.209:8420","user-agent":"kube-probe/1.31","accept":"*/*","connection":"close"},"request_body_size":0,"request_body_truncated":false,"request_body_kind":"empty","request_body":null},"status":200,"response":{"headers":{"content-length":"936","content-type":"text/html; charset=utf-8","x-request-id":"b41835e7b2ae49b1a9c392c29de0ca44"},"response_body_size":936,"response_body_truncated":false,"response_body_kind":"text","response_body":"\n    <!DOCTYPE html>\n    <html>\n    <head>\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\">\n    <link rel=\"shortcut icon\" href=\"https://fastapi.tiangolo.com/img/favicon.png\">\n    <title>Singing Bird - Swagger UI</title>\n    </head>\n    <body>\n    <div id=\"swagger-ui\">\n    </div>\n    <script src=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\"></script>\n    <!-- `SwaggerUIBundle` is now available on the page -->\n    <script>\n    const ui = SwaggerUIBundle({\n        url: '/openapi.json',\n    \"dom_id\": \"#swagger-ui\",\n\"layout\": \"BaseLayout\",\n\"deepLinking\": true,\n\"showExtensions\": true,\n\"showCommonExtensions\": true,\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\n    presets: [\n        SwaggerUIBundle.presets.apis,\n        SwaggerUIBundle.SwaggerUIStandalonePreset\n        ],\n    })\n    </script>\n    </body>\n    </html>\n    ","response_stream":false},"error":null},{"request_id":"7cdb3a1d940d4789bbdc15f4be357fa3","ts":"2026-04-18T17:20:52.821179Z","duration_ms":0.239,"method":"GET","path":"/docs","query":"","operation_id":"","client_ip":"192.168.29.10","user_agent":"kube-probe/1.31","auth":{"scheme":null,"scope":"admin","auth_enabled":false,"recognized":true},"request":{"headers":{"host":"10.244.112.209:8420","user-agent":"kube-probe/1.31","accept":"*/*","connection":"close"},"request_body_size":0,"request_body_truncated":false,"request_body_kind":"empty","request_body":null},"status":200,"response":{"headers":{"content-length":"936","content-type":"text/html; charset=utf-8","x-request-id":"7cdb3a1d940d4789bbdc15f4be357fa3"},"response_body_size":936,"response_body_truncated":false,"response_body_kind":"text","response_body":"\n    <!DOCTYPE html>\n    <html>\n    <head>\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\">\n    <link rel=\"shortcut icon\" href=\"https://fastapi.tiangolo.com/img/favicon.png\">\n    <title>Singing Bird - Swagger UI</title>\n    </head>\n    <body>\n    <div id=\"swagger-ui\">\n    </div>\n    <script src=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\"></script>\n    <!-- `SwaggerUIBundle` is now available on the page -->\n    <script>\n    const ui = SwaggerUIBundle({\n        url: '/openapi.json',\n    \"dom_id\": \"#swagger-ui\",\n\"layout\": \"BaseLayout\",\n\"deepLinking\": true,\n\"showExtensions\": true,\n\"showCommonExtensions\": true,\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\n    presets: [\n        SwaggerUIBundle.presets.apis,\n        SwaggerUIBundle.SwaggerUIStandalonePreset\n        ],\n    })\n    </script>\n    </body>\n    </html>\n    ","response_stream":false},"error":null},{"request_id":"6f07ed3ee053442eb9038c39c36361eb","ts":"2026-04-18T17:20:42.821134Z","duration_ms":0.256,"method":"GET","path":"/docs","query":"","operation_id":"","client_ip":"192.168.29.10","user_agent":"kube-probe/1.31","auth":{"scheme":null,"scope":"admin","auth_enabled":false,"recognized":true},"request":{"headers":{"host":"10.244.112.209:8420","user-agent":"kube-probe/1.31","accept":"*/*","connection":"close"},"request_body_size":0,"request_body_truncated":false,"request_body_kind":"empty","request_body":null},"status":200,"response":{"headers":{"content-length":"936","content-type":"text/html; charset=utf-8","x-request-id":"6f07ed3ee053442eb9038c39c36361eb"},"response_body_size":936,"response_body_truncated":false,"response_body_kind":"text","response_body":"\n    <!DOCTYPE html>\n    <html>\n    <head>\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\">\n    <link rel=\"shortcut icon\" href=\"https://fastapi.tiangolo.com/img/favicon.png\">\n    <title>Singing Bird - Swagger UI</title>\n    </head>\n    <body>\n    <div id=\"swagger-ui\">\n    </div>\n    <script src=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\"></script>\n    <!-- `SwaggerUIBundle` is now available on the page -->\n    <script>\n    const ui = SwaggerUIBundle({\n        url: '/openapi.json',\n    \"dom_id\": \"#swagger-ui\",\n\"layout\": \"BaseLayout\",\n\"deepLinking\": true,\n\"showExtensions\": true,\n\"showCommonExtensions\": true,\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\n    presets: [\n        SwaggerUIBundle.presets.apis,\n        SwaggerUIBundle.SwaggerUIStandalonePreset\n        ],\n    })\n    </script>\n    </body>\n    </html>\n    ","response_stream":false},"error":null},{"request_id":"f90be85cc9f54fdeb676b4bd917a1e2c","ts":"2026-04-18T17:20:32.821666Z","duration_ms":0.136,"method":"GET","path":"/docs","query":"","operation_id":"","client_ip":"192.168.29.10","user_agent":"kube-probe/1.31","auth":{"scheme":null,"scope":"admin","auth_enabled":false,"recognized":true},"request":{"headers":{"host":"10.244.112.209:8420","user-agent":"kube-probe/1.31","accept":"*/*","connection":"close"},"request_body_size":0,"request_body_truncated":false,"request_body_kind":"empty","request_body":null},"status":200,"response":{"headers":{"content-length":"936","content-type":"text/html; charset=utf-8","x-request-id":"f90be85cc9f54fdeb676b4bd917a1e2c"},"response_body_size":936,"response_body_truncated":false,"response_body_kind":"text","response_body":"\n    <!DOCTYPE html>\n    <html>\n    <head>\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\">\n    <link rel=\"shortcut icon\" href=\"https://fastapi.tiangolo.com/img/favicon.png\">\n    <title>Singing Bird - Swagger UI</title>\n    </head>\n    <body>\n    <div id=\"swagger-ui\">\n    </div>\n    <script src=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\"></script>\n    <!-- `SwaggerUIBundle` is now available on the page -->\n    <script>\n    const ui = SwaggerUIBundle({\n        url: '/openapi.json',\n    \"dom_id\": \"#swagger-ui\",\n\"layout\": \"BaseLayout\",\n\"deepLinking\": true,\n\"showExtensions\": true,\n\"showCommonExtensions\": true,\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\n    presets: [\n        SwaggerUIBundle.presets.apis,\n        SwaggerUIBundle.SwaggerUIStandalonePreset\n        ],\n    })\n    </script>\n    </body>\n    </html>\n    ","response_stream":false},"error":null},{"request_id":"18a7ce88daa444a1938c0194ed37eac5","ts":"2026-04-18T17:20:32.821084Z","duration_ms":0.23,"method":"GET","path":"/docs","query":"","operation_id":"","client_ip":"192.168.29.10","user_agent":"kube-probe/1.31","auth":{"scheme":null,"scope":"admin","auth_enabled":false,"recognized":true},"request":{"headers":{"host":"10.244.112.209:8420","user-agent":"kube-probe/1.31","accept":"*/*","connection":"close"},"request_body_size":0,"request_body_truncated":false,"request_body_kind":"empty","request_body":null},"status":200,"response":{"headers":{"content-length":"936","content-type":"text/html; charset=utf-8","x-request-id":"18a7ce88daa444a1938c0194ed37eac5"},"response_body_size":936,"response_body_truncated":false,"response_body_kind":"text","response_body":"\n    <!DOCTYPE html>\n    <html>\n    <head>\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\">\n    <link rel=\"shortcut icon\" href=\"https://fastapi.tiangolo.com/img/favicon.png\">\n    <title>Singing Bird - Swagger UI</title>\n    </head>\n    <body>\n    <div id=\"swagger-ui\">\n    </div>\n    <script src=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\"></script>\n    <!-- `SwaggerUIBundle` is now available on the page -->\n    <script>\n    const ui = SwaggerUIBundle({\n        url: '/openapi.json',\n    \"dom_id\": \"#swagger-ui\",\n\"layout\": \"BaseLayout\",\n\"deepLinking\": true,\n\"showExtensions\": true,\n\"showCommonExtensions\": true,\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\n    presets: [\n        SwaggerUIBundle.presets.apis,\n        SwaggerUIBundle.SwaggerUIStandalonePreset\n        ],\n    })\n    </script>\n    </body>\n    </html>\n    ","response_stream":false},"error":null},{"request_id":"2e3c1815928d4615b93f3d95ad34425b","ts":"2026-04-18T17:20:22.821330Z","duration_ms":0.23,"method":"GET","path":"/docs","query":"","operation_id":"","client_ip":"192.168.29.10","user_agent":"kube-probe/1.31","auth":{"scheme":null,"scope":"admin","auth_enabled":false,"recognized":true},"request":{"headers":{"host":"10.244.112.209:8420","user-agent":"kube-probe/1.31","accept":"*/*","connection":"close"},"request_body_size":0,"request_body_truncated":false,"request_body_kind":"empty","request_body":null},"status":200,"response":{"headers":{"content-length":"936","content-type":"text/html; charset=utf-8","x-request-id":"2e3c1815928d4615b93f3d95ad34425b"},"response_body_size":936,"response_body_truncated":false,"response_body_kind":"text","response_body":"\n    <!DOCTYPE html>\n    <html>\n    <head>\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\">\n    <link rel=\"shortcut icon\" href=\"https://fastapi.tiangolo.com/img/favicon.png\">\n    <title>Singing Bird - Swagger UI</title>\n    </head>\n    <body>\n    <div id=\"swagger-ui\">\n    </div>\n    <script src=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\"></script>\n    <!-- `SwaggerUIBundle` is now available on the page -->\n    <script>\n    const ui = SwaggerUIBundle({\n        url: '/openapi.json',\n    \"dom_id\": \"#swagger-ui\",\n\"layout\": \"BaseLayout\",\n\"deepLinking\": true,\n\"showExtensions\": true,\n\"showCommonExtensions\": true,\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\n    presets: [\n        SwaggerUIBundle.presets.apis,\n        SwaggerUIBundle.SwaggerUIStandalonePreset\n        ],\n    })\n    </script>\n    </body>\n    </html>\n    ","response_stream":false},"error":null},{"request_id":"e86e32d0d3884029a388343c92eb0519","ts":"2026-04-18T17:20:12.821419Z","duration_ms":0.236,"method":"GET","path":"/docs","query":"","operation_id":"","client_ip":"192.168.29.10","user_agent":"kube-probe/1.31","auth":{"scheme":null,"scope":"admin","auth_enabled":false,"recognized":true},"request":{"headers":{"host":"10.244.112.209:8420","user-agent":"kube-probe/1.31","accept":"*/*","connection":"close"},"request_body_size":0,"request_body_truncated":false,"request_body_kind":"empty","request_body":null},"status":200,"response":{"headers":{"content-length":"936","content-type":"text/html; charset=utf-8","x-request-id":"e86e32d0d3884029a388343c92eb0519"},"response_body_size":936,"response_body_truncated":false,"response_body_kind":"text","response_body":"\n    <!DOCTYPE html>\n    <html>\n    <head>\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\">\n    <link rel=\"shortcut icon\" href=\"https://fastapi.tiangolo.com/img/favicon.png\">\n    <title>Singing Bird - Swagger UI</title>\n    </head>\n    <body>\n    <div id=\"swagger-ui\">\n    </div>\n    <script src=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\"></script>\n    <!-- `SwaggerUIBundle` is now available on the page -->\n    <script>\n    const ui = SwaggerUIBundle({\n        url: '/openapi.json',\n    \"dom_id\": \"#swagger-ui\",\n\"layout\": \"BaseLayout\",\n\"deepLinking\": true,\n\"showExtensions\": true,\n\"showCommonExtensions\": true,\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\n    presets: [\n        SwaggerUIBundle.presets.apis,\n        SwaggerUIBundle.SwaggerUIStandalonePreset\n        ],\n    })\n    </script>\n    </body>\n    </html>\n    ","response_stream":false},"error":null},{"request_id":"1a357ab6aa814b6fab26dce6af71959d","ts":"2026-04-18T17:20:02.821545Z","duration_ms":0.184,"method":"GET","path":"/docs","query":"","operation_id":"","client_ip":"192.168.29.10","user_agent":"kube-probe/1.31","auth":{"scheme":null,"scope":"admin","auth_enabled":false,"recognized":true},"request":{"headers":{"host":"10.244.112.209:8420","user-agent":"kube-probe/1.31","accept":"*/*","connection":"close"},"request_body_size":0,"request_body_truncated":false,"request_body_kind":"empty","request_body":null},"status":200,"response":{"headers":{"content-length":"936","content-type":"text/html; charset=utf-8","x-request-id":"1a357ab6aa814b6fab26dce6af71959d"},"response_body_size":936,"response_body_truncated":false,"response_body_kind":"text","response_body":"\n    <!DOCTYPE html>\n    <html>\n    <head>\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\">\n    <link rel=\"shortcut icon\" href=\"https://fastapi.tiangolo.com/img/favicon.png\">\n    <title>Singing Bird - Swagger UI</title>\n    </head>\n    <body>\n    <div id=\"swagger-ui\">\n    </div>\n    <script src=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\"></script>\n    <!-- `SwaggerUIBundle` is now available on the page -->\n    <script>\n    const ui = SwaggerUIBundle({\n        url: '/openapi.json',\n    \"dom_id\": \"#swagger-ui\",\n\"layout\": \"BaseLayout\",\n\"deepLinking\": true,\n\"showExtensions\": true,\n\"showCommonExtensions\": true,\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\n    presets: [\n        SwaggerUIBundle.presets.apis,\n        SwaggerUIBundle.SwaggerUIStandalonePreset\n        ],\n    })\n    </script>\n    </body>\n    </html>\n    ","response_stream":false},"error":null},{"request_id":"f0407c088f5949bd9a13e25d4d153de7","ts":"2026-04-18T17:20:02.820905Z","duration_ms":0.254,"method":"GET","path":"/docs","query":"","operation_id":"","client_ip":"192.168.29.10","user_agent":"kube-probe/1.31","auth":{"scheme":null,"scope":"admin","auth_enabled":false,"recognized":true},"request":{"headers":{"host":"10.244.112.209:8420","user-agent":"kube-probe/1.31","accept":"*/*","connection":"close"},"request_body_size":0,"request_body_truncated":false,"request_body_kind":"empty","request_body":null},"status":200,"response":{"headers":{"content-length":"936","content-type":"text/html; charset=utf-8","x-request-id":"f0407c088f5949bd9a13e25d4d153de7"},"response_body_size":936,"response_body_truncated":false,"response_body_kind":"text","response_body":"\n    <!DOCTYPE html>\n    <html>\n    <head>\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\">\n    <link rel=\"shortcut icon\" href=\"https://fastapi.tiangolo.com/img/favicon.png\">\n    <title>Singing Bird - Swagger UI</title>\n    </head>\n    <body>\n    <div id=\"swagger-ui\">\n    </div>\n    <script src=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\"></script>\n    <!-- `SwaggerUIBundle` is now available on the page -->\n    <script>\n    const ui = SwaggerUIBundle({\n        url: '/openapi.json',\n    \"dom_id\": \"#swagger-ui\",\n\"layout\": \"BaseLayout\",\n\"deepLinking\": true,\n\"showExtensions\": true,\n\"showCommonExtensions\": true,\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\n    presets: [\n        SwaggerUIBundle.presets.apis,\n        SwaggerUIBundle.SwaggerUIStandalonePreset\n        ],\n    })\n    </script>\n    </body>\n    </html>\n    ","response_stream":false},"error":null},{"request_id":"2fab4670ca364197ad71905b8700dca9","ts":"2026-04-18T17:19:52.821345Z","duration_ms":0.241,"method":"GET","path":"/docs","query":"","operation_id":"","client_ip":"192.168.29.10","user_agent":"kube-probe/1.31","auth":{"scheme":null,"scope":"admin","auth_enabled":false,"recognized":true},"request":{"headers":{"host":"10.244.112.209:8420","user-agent":"kube-probe/1.31","accept":"*/*","connection":"close"},"request_body_size":0,"request_body_truncated":false,"request_body_kind":"empty","request_body":null},"status":200,"response":{"headers":{"content-length":"936","content-type":"text/html; charset=utf-8","x-request-id":"2fab4670ca364197ad71905b8700dca9"},"response_body_size":936,"response_body_truncated":false,"response_body_kind":"text","response_body":"\n    <!DOCTYPE html>\n    <html>\n    <head>\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\">\n    <link rel=\"shortcut icon\" href=\"https://fastapi.tiangolo.com/img/favicon.png\">\n    <title>Singing Bird - Swagger UI</title>\n    </head>\n    <body>\n    <div id=\"swagger-ui\">\n    </div>\n    <script src=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\"></script>\n    <!-- `SwaggerUIBundle` is now available on the page -->\n    <script>\n    const ui = SwaggerUIBundle({\n        url: '/openapi.json',\n    \"dom_id\": \"#swagger-ui\",\n\"layout\": \"BaseLayout\",\n\"deepLinking\": true,\n\"showExtensions\": true,\n\"showCommonExtensions\": true,\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\n    presets: [\n        SwaggerUIBundle.presets.apis,\n        SwaggerUIBundle.SwaggerUIStandalonePreset\n        ],\n    })\n    </script>\n    </body>\n    </html>\n    ","response_stream":false},"error":null},{"request_id":"8971086538764bb3bcab29c082074c9e","ts":"2026-04-18T17:19:42.820393Z","duration_ms":0.278,"method":"GET","path":"/docs","query":"","operation_id":"","client_ip":"192.168.29.10","user_agent":"kube-probe/1.31","auth":{"scheme":null,"scope":"admin","auth_enabled":false,"recognized":true},"request":{"headers":{"host":"10.244.112.209:8420","user-agent":"kube-probe/1.31","accept":"*/*","connection":"close"},"request_body_size":0,"request_body_truncated":false,"request_body_kind":"empty","request_body":null},"status":200,"response":{"headers":{"content-length":"936","content-type":"text/html; charset=utf-8","x-request-id":"8971086538764bb3bcab29c082074c9e"},"response_body_size":936,"response_body_truncated":false,"response_body_kind":"text","response_body":"\n    <!DOCTYPE html>\n    <html>\n    <head>\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\">\n    <link rel=\"shortcut icon\" href=\"https://fastapi.tiangolo.com/img/favicon.png\">\n    <title>Singing Bird - Swagger UI</title>\n    </head>\n    <body>\n    <div id=\"swagger-ui\">\n    </div>\n    <script src=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\"></script>\n    <!-- `SwaggerUIBundle` is now available on the page -->\n    <script>\n    const ui = SwaggerUIBundle({\n        url: '/openapi.json',\n    \"dom_id\": \"#swagger-ui\",\n\"layout\": \"BaseLayout\",\n\"deepLinking\": true,\n\"showExtensions\": true,\n\"showCommonExtensions\": true,\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\n    presets: [\n        SwaggerUIBundle.presets.apis,\n        SwaggerUIBundle.SwaggerUIStandalonePreset\n        ],\n    })\n    </script>\n    </body>\n    </html>\n    ","response_stream":false},"error":null},{"request_id":"9c45c299419b418dba5502cba197854e","ts":"2026-04-18T17:19:32.821283Z","duration_ms":0.13,"method":"GET","path":"/docs","query":"","operation_id":"","client_ip":"192.168.29.10","user_agent":"kube-probe/1.31","auth":{"scheme":null,"scope":"admin","auth_enabled":false,"recognized":true},"request":{"headers":{"host":"10.244.112.209:8420","user-agent":"kube-probe/1.31","accept":"*/*","connection":"close"},"request_body_size":0,"request_body_truncated":false,"request_body_kind":"empty","request_body":null},"status":200,"response":{"headers":{"content-length":"936","content-type":"text/html; charset=utf-8","x-request-id":"9c45c299419b418dba5502cba197854e"},"response_body_size":936,"response_body_truncated":false,"response_body_kind":"text","response_body":"\n    <!DOCTYPE html>\n    <html>\n    <head>\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\">\n    <link rel=\"shortcut icon\" href=\"https://fastapi.tiangolo.com/img/favicon.png\">\n    <title>Singing Bird - Swagger UI</title>\n    </head>\n    <body>\n    <div id=\"swagger-ui\">\n    </div>\n    <script src=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\"></script>\n    <!-- `SwaggerUIBundle` is now available on the page -->\n    <script>\n    const ui = SwaggerUIBundle({\n        url: '/openapi.json',\n    \"dom_id\": \"#swagger-ui\",\n\"layout\": \"BaseLayout\",\n\"deepLinking\": true,\n\"showExtensions\": true,\n\"showCommonExtensions\": true,\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\n    presets: [\n        SwaggerUIBundle.presets.apis,\n        SwaggerUIBundle.SwaggerUIStandalonePreset\n        ],\n    })\n    </script>\n    </body>\n    </html>\n    ","response_stream":false},"error":null},{"request_id":"904b0511eb1d4c9d8130fe0fcd1ae779","ts":"2026-04-18T17:19:32.820729Z","duration_ms":0.227,"method":"GET","path":"/docs","query":"","operation_id":"","client_ip":"192.168.29.10","user_agent":"kube-probe/1.31","auth":{"scheme":null,"scope":"admin","auth_enabled":false,"recognized":true},"request":{"headers":{"host":"10.244.112.209:8420","user-agent":"kube-probe/1.31","accept":"*/*","connection":"close"},"request_body_size":0,"request_body_truncated":false,"request_body_kind":"empty","request_body":null},"status":200,"response":{"headers":{"content-length":"936","content-type":"text/html; charset=utf-8","x-request-id":"904b0511eb1d4c9d8130fe0fcd1ae779"},"response_body_size":936,"response_body_truncated":false,"response_body_kind":"text","response_body":"\n    <!DOCTYPE html>\n    <html>\n    <head>\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\">\n    <link rel=\"shortcut icon\" href=\"https://fastapi.tiangolo.com/img/favicon.png\">\n    <title>Singing Bird - Swagger UI</title>\n    </head>\n    <body>\n    <div id=\"swagger-ui\">\n    </div>\n    <script src=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\"></script>\n    <!-- `SwaggerUIBundle` is now available on the page -->\n    <script>\n    const ui = SwaggerUIBundle({\n        url: '/openapi.json',\n    \"dom_id\": \"#swagger-ui\",\n\"layout\": \"BaseLayout\",\n\"deepLinking\": true,\n\"showExtensions\": true,\n\"showCommonExtensions\": true,\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\n    presets: [\n        SwaggerUIBundle.presets.apis,\n        SwaggerUIBundle.SwaggerUIStandalonePreset\n        ],\n    })\n    </script>\n    </body>\n    </html>\n    ","response_stream":false},"error":null},{"request_id":"35ec54b9ba88426d9b662a8a70f4b566","ts":"2026-04-18T17:19:22.820459Z","duration_ms":0.255,"method":"GET","path":"/docs","query":"","operation_id":"","client_ip":"192.168.29.10","user_agent":"kube-probe/1.31","auth":{"scheme":null,"scope":"admin","auth_enabled":false,"recognized":true},"request":{"headers":{"host":"10.244.112.209:8420","user-agent":"kube-probe/1.31","accept":"*/*","connection":"close"},"request_body_size":0,"request_body_truncated":false,"request_body_kind":"empty","request_body":null},"status":200,"response":{"headers":{"content-length":"936","content-type":"text/html; charset=utf-8","x-request-id":"35ec54b9ba88426d9b662a8a70f4b566"},"response_body_size":936,"response_body_truncated":false,"response_body_kind":"text","response_body":"\n    <!DOCTYPE html>\n    <html>\n    <head>\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\">\n    <link rel=\"shortcut icon\" href=\"https://fastapi.tiangolo.com/img/favicon.png\">\n    <title>Singing Bird - Swagger UI</title>\n    </head>\n    <body>\n    <div id=\"swagger-ui\">\n    </div>\n    <script src=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\"></script>\n    <!-- `SwaggerUIBundle` is now available on the page -->\n    <script>\n    const ui = SwaggerUIBundle({\n        url: '/openapi.json',\n    \"dom_id\": \"#swagger-ui\",\n\"layout\": \"BaseLayout\",\n\"deepLinking\": true,\n\"showExtensions\": true,\n\"showCommonExtensions\": true,\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\n    presets: [\n        SwaggerUIBundle.presets.apis,\n        SwaggerUIBundle.SwaggerUIStandalonePreset\n        ],\n    })\n    </script>\n    </body>\n    </html>\n    ","response_stream":false},"error":null},{"request_id":"c8cc7d5050b4403daab995cb98b62ecd","ts":"2026-04-18T17:19:12.820852Z","duration_ms":0.252,"method":"GET","path":"/docs","query":"","operation_id":"","client_ip":"192.168.29.10","user_agent":"kube-probe/1.31","auth":{"scheme":null,"scope":"admin","auth_enabled":false,"recognized":true},"request":{"headers":{"host":"10.244.112.209:8420","user-agent":"kube-probe/1.31","accept":"*/*","connection":"close"},"request_body_size":0,"request_body_truncated":false,"request_body_kind":"empty","request_body":null},"status":200,"response":{"headers":{"content-length":"936","content-type":"text/html; charset=utf-8","x-request-id":"c8cc7d5050b4403daab995cb98b62ecd"},"response_body_size":936,"response_body_truncated":false,"response_body_kind":"text","response_body":"\n    <!DOCTYPE html>\n    <html>\n    <head>\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\">\n    <link rel=\"shortcut icon\" href=\"https://fastapi.tiangolo.com/img/favicon.png\">\n    <title>Singing Bird - Swagger UI</title>\n    </head>\n    <body>\n    <div id=\"swagger-ui\">\n    </div>\n    <script src=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\"></script>\n    <!-- `SwaggerUIBundle` is now available on the page -->\n    <script>\n    const ui = SwaggerUIBundle({\n        url: '/openapi.json',\n    \"dom_id\": \"#swagger-ui\",\n\"layout\": \"BaseLayout\",\n\"deepLinking\": true,\n\"showExtensions\": true,\n\"showCommonExtensions\": true,\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\n    presets: [\n        SwaggerUIBundle.presets.apis,\n        SwaggerUIBundle.SwaggerUIStandalonePreset\n        ],\n    })\n    </script>\n    </body>\n    </html>\n    ","response_stream":false},"error":null},{"request_id":"802bec403c364a319e259e12ac4fa54b","ts":"2026-04-18T17:19:02.821820Z","duration_ms":0.131,"method":"GET","path":"/docs","query":"","operation_id":"","client_ip":"192.168.29.10","user_agent":"kube-probe/1.31","auth":{"scheme":null,"scope":"admin","auth_enabled":false,"recognized":true},"request":{"headers":{"host":"10.244.112.209:8420","user-agent":"kube-probe/1.31","accept":"*/*","connection":"close"},"request_body_size":0,"request_body_truncated":false,"request_body_kind":"empty","request_body":null},"status":200,"response":{"headers":{"content-length":"936","content-type":"text/html; charset=utf-8","x-request-id":"802bec403c364a319e259e12ac4fa54b"},"response_body_size":936,"response_body_truncated":false,"response_body_kind":"text","response_body":"\n    <!DOCTYPE html>\n    <html>\n    <head>\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\">\n    <link rel=\"shortcut icon\" href=\"https://fastapi.tiangolo.com/img/favicon.png\">\n    <title>Singing Bird - Swagger UI</title>\n    </head>\n    <body>\n    <div id=\"swagger-ui\">\n    </div>\n    <script src=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\"></script>\n    <!-- `SwaggerUIBundle` is now available on the page -->\n    <script>\n    const ui = SwaggerUIBundle({\n        url: '/openapi.json',\n    \"dom_id\": \"#swagger-ui\",\n\"layout\": \"BaseLayout\",\n\"deepLinking\": true,\n\"showExtensions\": true,\n\"showCommonExtensions\": true,\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\n    presets: [\n        SwaggerUIBundle.presets.apis,\n        SwaggerUIBundle.SwaggerUIStandalonePreset\n        ],\n    })\n    </script>\n    </body>\n    </html>\n    ","response_stream":false},"error":null},{"request_id":"95e973f131ce4104874893b4a4c5f973","ts":"2026-04-18T17:19:02.821218Z","duration_ms":0.237,"method":"GET","path":"/docs","query":"","operation_id":"","client_ip":"192.168.29.10","user_agent":"kube-probe/1.31","auth":{"scheme":null,"scope":"admin","auth_enabled":false,"recognized":true},"request":{"headers":{"host":"10.244.112.209:8420","user-agent":"kube-probe/1.31","accept":"*/*","connection":"close"},"request_body_size":0,"request_body_truncated":false,"request_body_kind":"empty","request_body":null},"status":200,"response":{"headers":{"content-length":"936","content-type":"text/html; charset=utf-8","x-request-id":"95e973f131ce4104874893b4a4c5f973"},"response_body_size":936,"response_body_truncated":false,"response_body_kind":"text","response_body":"\n    <!DOCTYPE html>\n    <html>\n    <head>\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\">\n    <link rel=\"shortcut icon\" href=\"https://fastapi.tiangolo.com/img/favicon.png\">\n    <title>Singing Bird - Swagger UI</title>\n    </head>\n    <body>\n    <div id=\"swagger-ui\">\n    </div>\n    <script src=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\"></script>\n    <!-- `SwaggerUIBundle` is now available on the page -->\n    <script>\n    const ui = SwaggerUIBundle({\n        url: '/openapi.json',\n    \"dom_id\": \"#swagger-ui\",\n\"layout\": \"BaseLayout\",\n\"deepLinking\": true,\n\"showExtensions\": true,\n\"showCommonExtensions\": true,\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\n    presets: [\n        SwaggerUIBundle.presets.apis,\n        SwaggerUIBundle.SwaggerUIStandalonePreset\n        ],\n    })\n    </script>\n    </body>\n    </html>\n    ","response_stream":false},"error":null},{"request_id":"a0fc8cc8692c458aa451314924f1b797","ts":"2026-04-18T17:18:52.821231Z","duration_ms":0.257,"method":"GET","path":"/docs","query":"","operation_id":"","client_ip":"192.168.29.10","user_agent":"kube-probe/1.31","auth":{"scheme":null,"scope":"admin","auth_enabled":false,"recognized":true},"request":{"headers":{"host":"10.244.112.209:8420","user-agent":"kube-probe/1.31","accept":"*/*","connection":"close"},"request_body_size":0,"request_body_truncated":false,"request_body_kind":"empty","request_body":null},"status":200,"response":{"headers":{"content-length":"936","content-type":"text/html; charset=utf-8","x-request-id":"a0fc8cc8692c458aa451314924f1b797"},"response_body_size":936,"response_body_truncated":false,"response_body_kind":"text","response_body":"\n    <!DOCTYPE html>\n    <html>\n    <head>\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\">\n    <link rel=\"shortcut icon\" href=\"https://fastapi.tiangolo.com/img/favicon.png\">\n    <title>Singing Bird - Swagger UI</title>\n    </head>\n    <body>\n    <div id=\"swagger-ui\">\n    </div>\n    <script src=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\"></script>\n    <!-- `SwaggerUIBundle` is now available on the page -->\n    <script>\n    const ui = SwaggerUIBundle({\n        url: '/openapi.json',\n    \"dom_id\": \"#swagger-ui\",\n\"layout\": \"BaseLayout\",\n\"deepLinking\": true,\n\"showExtensions\": true,\n\"showCommonExtensions\": true,\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\n    presets: [\n        SwaggerUIBundle.presets.apis,\n        SwaggerUIBundle.SwaggerUIStandalonePreset\n        ],\n    })\n    </script>\n    </body>\n    </html>\n    ","response_stream":false},"error":null},{"request_id":"897a9f39b7804f66903580de6d49f386","ts":"2026-04-18T17:18:42.820948Z","duration_ms":0.254,"method":"GET","path":"/docs","query":"","operation_id":"","client_ip":"192.168.29.10","user_agent":"kube-probe/1.31","auth":{"scheme":null,"scope":"admin","auth_enabled":false,"recognized":true},"request":{"headers":{"host":"10.244.112.209:8420","user-agent":"kube-probe/1.31","accept":"*/*","connection":"close"},"request_body_size":0,"request_body_truncated":false,"request_body_kind":"empty","request_body":null},"status":200,"response":{"headers":{"content-length":"936","content-type":"text/html; charset=utf-8","x-request-id":"897a9f39b7804f66903580de6d49f386"},"response_body_size":936,"response_body_truncated":false,"response_body_kind":"text","response_body":"\n    <!DOCTYPE html>\n    <html>\n    <head>\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\">\n    <link rel=\"shortcut icon\" href=\"https://fastapi.tiangolo.com/img/favicon.png\">\n    <title>Singing Bird - Swagger UI</title>\n    </head>\n    <body>\n    <div id=\"swagger-ui\">\n    </div>\n    <script src=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\"></script>\n    <!-- `SwaggerUIBundle` is now available on the page -->\n    <script>\n    const ui = SwaggerUIBundle({\n        url: '/openapi.json',\n    \"dom_id\": \"#swagger-ui\",\n\"layout\": \"BaseLayout\",\n\"deepLinking\": true,\n\"showExtensions\": true,\n\"showCommonExtensions\": true,\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\n    presets: [\n        SwaggerUIBundle.presets.apis,\n        SwaggerUIBundle.SwaggerUIStandalonePreset\n        ],\n    })\n    </script>\n    </body>\n    </html>\n    ","response_stream":false},"error":null},{"request_id":"2095462570ff4a089a5a7f1ad506ec72","ts":"2026-04-18T17:18:32.821842Z","duration_ms":0.137,"method":"GET","path":"/docs","query":"","operation_id":"","client_ip":"192.168.29.10","user_agent":"kube-probe/1.31","auth":{"scheme":null,"scope":"admin","auth_enabled":false,"recognized":true},"request":{"headers":{"host":"10.244.112.209:8420","user-agent":"kube-probe/1.31","accept":"*/*","connection":"close"},"request_body_size":0,"request_body_truncated":false,"request_body_kind":"empty","request_body":null},"status":200,"response":{"headers":{"content-length":"936","content-type":"text/html; charset=utf-8","x-request-id":"2095462570ff4a089a5a7f1ad506ec72"},"response_body_size":936,"response_body_truncated":false,"response_body_kind":"text","response_body":"\n    <!DOCTYPE html>\n    <html>\n    <head>\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\">\n    <link rel=\"shortcut icon\" href=\"https://fastapi.tiangolo.com/img/favicon.png\">\n    <title>Singing Bird - Swagger UI</title>\n    </head>\n    <body>\n    <div id=\"swagger-ui\">\n    </div>\n    <script src=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\"></script>\n    <!-- `SwaggerUIBundle` is now available on the page -->\n    <script>\n    const ui = SwaggerUIBundle({\n        url: '/openapi.json',\n    \"dom_id\": \"#swagger-ui\",\n\"layout\": \"BaseLayout\",\n\"deepLinking\": true,\n\"showExtensions\": true,\n\"showCommonExtensions\": true,\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\n    presets: [\n        SwaggerUIBundle.presets.apis,\n        SwaggerUIBundle.SwaggerUIStandalonePreset\n        ],\n    })\n    </script>\n    </body>\n    </html>\n    ","response_stream":false},"error":null},{"request_id":"95f6b4dc8c81480fa978f65710e600c1","ts":"2026-04-18T17:18:32.821254Z","duration_ms":0.244,"method":"GET","path":"/docs","query":"","operation_id":"","client_ip":"192.168.29.10","user_agent":"kube-probe/1.31","auth":{"scheme":null,"scope":"admin","auth_enabled":false,"recognized":true},"request":{"headers":{"host":"10.244.112.209:8420","user-agent":"kube-probe/1.31","accept":"*/*","connection":"close"},"request_body_size":0,"request_body_truncated":false,"request_body_kind":"empty","request_body":null},"status":200,"response":{"headers":{"content-length":"936","content-type":"text/html; charset=utf-8","x-request-id":"95f6b4dc8c81480fa978f65710e600c1"},"response_body_size":936,"response_body_truncated":false,"response_body_kind":"text","response_body":"\n    <!DOCTYPE html>\n    <html>\n    <head>\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\">\n    <link rel=\"shortcut icon\" href=\"https://fastapi.tiangolo.com/img/favicon.png\">\n    <title>Singing Bird - Swagger UI</title>\n    </head>\n    <body>\n    <div id=\"swagger-ui\">\n    </div>\n    <script src=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\"></script>\n    <!-- `SwaggerUIBundle` is now available on the page -->\n    <script>\n    const ui = SwaggerUIBundle({\n        url: '/openapi.json',\n    \"dom_id\": \"#swagger-ui\",\n\"layout\": \"BaseLayout\",\n\"deepLinking\": true,\n\"showExtensions\": true,\n\"showCommonExtensions\": true,\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\n    presets: [\n        SwaggerUIBundle.presets.apis,\n        SwaggerUIBundle.SwaggerUIStandalonePreset\n        ],\n    })\n    </script>\n    </body>\n    </html>\n    ","response_stream":false},"error":null},{"request_id":"cac6e311bfd54e0f9b4b0cb3e27546f0","ts":"2026-04-18T17:18:22.821151Z","duration_ms":0.262,"method":"GET","path":"/docs","query":"","operation_id":"","client_ip":"192.168.29.10","user_agent":"kube-probe/1.31","auth":{"scheme":null,"scope":"admin","auth_enabled":false,"recognized":true},"request":{"headers":{"host":"10.244.112.209:8420","user-agent":"kube-probe/1.31","accept":"*/*","connection":"close"},"request_body_size":0,"request_body_truncated":false,"request_body_kind":"empty","request_body":null},"status":200,"response":{"headers":{"content-length":"936","content-type":"text/html; charset=utf-8","x-request-id":"cac6e311bfd54e0f9b4b0cb3e27546f0"},"response_body_size":936,"response_body_truncated":false,"response_body_kind":"text","response_body":"\n    <!DOCTYPE html>\n    <html>\n    <head>\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\">\n    <link rel=\"shortcut icon\" href=\"https://fastapi.tiangolo.com/img/favicon.png\">\n    <title>Singing Bird - Swagger UI</title>\n    </head>\n    <body>\n    <div id=\"swagger-ui\">\n    </div>\n    <script src=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\"></script>\n    <!-- `SwaggerUIBundle` is now available on the page -->\n    <script>\n    const ui = SwaggerUIBundle({\n        url: '/openapi.json',\n    \"dom_id\": \"#swagger-ui\",\n\"layout\": \"BaseLayout\",\n\"deepLinking\": true,\n\"showExtensions\": true,\n\"showCommonExtensions\": true,\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\n    presets: [\n        SwaggerUIBundle.presets.apis,\n        SwaggerUIBundle.SwaggerUIStandalonePreset\n        ],\n    })\n    </script>\n    </body>\n    </html>\n    ","response_stream":false},"error":null},{"request_id":"2484c1e6d9da4c4d9731eeea36106323","ts":"2026-04-18T17:18:12.820708Z","duration_ms":0.254,"method":"GET","path":"/docs","query":"","operation_id":"","client_ip":"192.168.29.10","user_agent":"kube-probe/1.31","auth":{"scheme":null,"scope":"admin","auth_enabled":false,"recognized":true},"request":{"headers":{"host":"10.244.112.209:8420","user-agent":"kube-probe/1.31","accept":"*/*","connection":"close"},"request_body_size":0,"request_body_truncated":false,"request_body_kind":"empty","request_body":null},"status":200,"response":{"headers":{"content-length":"936","content-type":"text/html; charset=utf-8","x-request-id":"2484c1e6d9da4c4d9731eeea36106323"},"response_body_size":936,"response_body_truncated":false,"response_body_kind":"text","response_body":"\n    <!DOCTYPE html>\n    <html>\n    <head>\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\">\n    <link rel=\"shortcut icon\" href=\"https://fastapi.tiangolo.com/img/favicon.png\">\n    <title>Singing Bird - Swagger UI</title>\n    </head>\n    <body>\n    <div id=\"swagger-ui\">\n    </div>\n    <script src=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\"></script>\n    <!-- `SwaggerUIBundle` is now available on the page -->\n    <script>\n    const ui = SwaggerUIBundle({\n        url: '/openapi.json',\n    \"dom_id\": \"#swagger-ui\",\n\"layout\": \"BaseLayout\",\n\"deepLinking\": true,\n\"showExtensions\": true,\n\"showCommonExtensions\": true,\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\n    presets: [\n        SwaggerUIBundle.presets.apis,\n        SwaggerUIBundle.SwaggerUIStandalonePreset\n        ],\n    })\n    </script>\n    </body>\n    </html>\n    ","response_stream":false},"error":null},{"request_id":"d27ad127d58141ed828d3ec5b2e23059","ts":"2026-04-18T17:18:02.821666Z","duration_ms":0.136,"method":"GET","path":"/docs","query":"","operation_id":"","client_ip":"192.168.29.10","user_agent":"kube-probe/1.31","auth":{"scheme":null,"scope":"admin","auth_enabled":false,"recognized":true},"request":{"headers":{"host":"10.244.112.209:8420","user-agent":"kube-probe/1.31","accept":"*/*","connection":"close"},"request_body_size":0,"request_body_truncated":false,"request_body_kind":"empty","request_body":null},"status":200,"response":{"headers":{"content-length":"936","content-type":"text/html; charset=utf-8","x-request-id":"d27ad127d58141ed828d3ec5b2e23059"},"response_body_size":936,"response_body_truncated":false,"response_body_kind":"text","response_body":"\n    <!DOCTYPE html>\n    <html>\n    <head>\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\">\n    <link rel=\"shortcut icon\" href=\"https://fastapi.tiangolo.com/img/favicon.png\">\n    <title>Singing Bird - Swagger UI</title>\n    </head>\n    <body>\n    <div id=\"swagger-ui\">\n    </div>\n    <script src=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\"></script>\n    <!-- `SwaggerUIBundle` is now available on the page -->\n    <script>\n    const ui = SwaggerUIBundle({\n        url: '/openapi.json',\n    \"dom_id\": \"#swagger-ui\",\n\"layout\": \"BaseLayout\",\n\"deepLinking\": true,\n\"showExtensions\": true,\n\"showCommonExtensions\": true,\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\n    presets: [\n        SwaggerUIBundle.presets.apis,\n        SwaggerUIBundle.SwaggerUIStandalonePreset\n        ],\n    })\n    </script>\n    </body>\n    </html>\n    ","response_stream":false},"error":null},{"request_id":"2133c0c9fcae47b7933150db573038db","ts":"2026-04-18T17:18:02.821023Z","duration_ms":0.249,"method":"GET","path":"/docs","query":"","operation_id":"","client_ip":"192.168.29.10","user_agent":"kube-probe/1.31","auth":{"scheme":null,"scope":"admin","auth_enabled":false,"recognized":true},"request":{"headers":{"host":"10.244.112.209:8420","user-agent":"kube-probe/1.31","accept":"*/*","connection":"close"},"request_body_size":0,"request_body_truncated":false,"request_body_kind":"empty","request_body":null},"status":200,"response":{"headers":{"content-length":"936","content-type":"text/html; charset=utf-8","x-request-id":"2133c0c9fcae47b7933150db573038db"},"response_body_size":936,"response_body_truncated":false,"response_body_kind":"text","response_body":"\n    <!DOCTYPE html>\n    <html>\n    <head>\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\">\n    <link rel=\"shortcut icon\" href=\"https://fastapi.tiangolo.com/img/favicon.png\">\n    <title>Singing Bird - Swagger UI</title>\n    </head>\n    <body>\n    <div id=\"swagger-ui\">\n    </div>\n    <script src=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js\"></script>\n    <!-- `SwaggerUIBundle` is now available on the page -->\n    <script>\n    const ui = SwaggerUIBundle({\n        url: '/openapi.json',\n    \"dom_id\": \"#swagger-ui\",\n\"layout\": \"BaseLayout\",\n\"deepLinking\": true,\n\"showExtensions\": true,\n\"showCommonExtensions\": true,\noauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect',\n    presets: [\n        SwaggerUIBundle.presets.apis,\n        SwaggerUIBundle.SwaggerUIStandalonePreset\n        ],\n    })\n    </script>\n    </body>\n    </html>\n    ","response_stream":false},"error":null}],"count":100,"total_matched":13791,"total_in_log":13791,"limit":100,"offset":0,"has_more":true,"order":"desc"}