{
  "build": {
    "generatorSha256": "dd185ed98a162fe49e0c58dfd959b59750d5031b367b5cb6b050923528041740",
    "packages": {
      "fastapi": "0.133.0",
      "pydantic": "2.13.4",
      "pydantic-settings": "2.15.0",
      "sqlalchemy": "2.0.52",
      "starlette": "1.3.1"
    },
    "python": "3.13.12"
  },
  "counts": {
    "advisor-connector": {
      "operations": 7,
      "paths": 7
    },
    "control": {
      "operations": 95,
      "paths": 83
    },
    "scanner": {
      "operations": 11,
      "paths": 9
    },
    "updater": {
      "operations": 5,
      "paths": 4
    }
  },
  "examples": {
    "count": 161,
    "validation": "JSON Schema 2020-12 shapes and formats; runtime custom validators and stateful behavior require separate source tests."
  },
  "exportBoundary": {
    "control": "Actual six router objects with FastAPI get_openapi; no production application factory.",
    "guard": "Scrubbed environment, Python audit denial of sockets/processes/writes and out-of-bound reads, thread/runtime/settings/engine denial. Python-level defense for reviewed source, not an OS or native-code sandbox. SystemVersion.plist and /proc/stat may be read for Python/Prometheus platform metadata.",
    "internal": "Actual updater router with unused executor plus exact scanner/connector/health declaration projections. Module top-level runtime settings and lifecycle are excluded.",
    "osSandbox": {
      "filesystem": "writes denied by OS",
      "network": "denied by OS; loopback and reserved TEST-NET connect probes refused",
      "platform": "Darwin",
      "process": "fork denied on macOS; isolated namespaces on Linux; Python subprocess/thread guard retained"
    },
    "runtimeAcceptance": false
  },
  "ideScopes": [
    {
      "method": "GET",
      "pattern": "/v1/git/push-protection(?:/[0-9a-f]{64})?\\Z",
      "scope": "project:resolve"
    },
    {
      "method": "POST",
      "pattern": "/v1/git/push-protection\\Z",
      "scope": "project:create"
    },
    {
      "method": "PATCH",
      "pattern": "/v1/git/push-protection/[0-9a-f]{64}\\Z",
      "scope": "project:resolve"
    },
    {
      "method": "POST",
      "pattern": "/v1/git/push-protection/[0-9a-f]{64}/(?:observation|check|trees|remove)\\Z",
      "scope": "project:resolve"
    },
    {
      "method": "POST",
      "pattern": "/v1/auth/ide/browser-invitations\\Z",
      "scope": "browser:invite"
    },
    {
      "method": "GET",
      "pattern": "/v1/auth/ide/browser-invitations/[A-Za-z0-9_-]{24}/membership\\Z",
      "scope": "browser:invite"
    },
    {
      "method": "GET",
      "pattern": "/v1/events\\Z",
      "scope": "event:read"
    },
    {
      "method": "POST",
      "pattern": "/v1/ide/source-open-commands/[0-9a-f]{32}/ack\\Z",
      "scope": "source:open-ack"
    },
    {
      "method": "GET",
      "pattern": "/v1/ide/source-open-commands/[0-9a-f]{32}/context\\Z",
      "scope": "source:open-context"
    },
    {
      "method": "GET",
      "pattern": "/v1/advisor/providers\\Z",
      "scope": "finding:advisor"
    },
    {
      "method": "GET",
      "pattern": "/v1/advisor/triage-request-audit\\Z",
      "scope": "finding:advisor"
    },
    {
      "method": "POST",
      "pattern": "/v1/projects/resolve\\Z",
      "scope": "project:resolve"
    },
    {
      "method": "POST",
      "pattern": "/v1/sources/preview\\Z",
      "scope": "project:resolve"
    },
    {
      "method": "POST",
      "pattern": "/v1/projects\\Z",
      "scope": "project:create"
    },
    {
      "method": "POST",
      "pattern": "/v1/source-snapshots\\Z",
      "scope": "source:snapshot"
    },
    {
      "method": "GET",
      "pattern": "/v1/projects/[1-9][0-9]*/scans/latest\\Z",
      "scope": "scan:read"
    },
    {
      "method": "POST",
      "pattern": "/v1/scans\\Z",
      "scope": "scan:create"
    },
    {
      "method": "GET",
      "pattern": "/v1/scans/[1-9][0-9]*\\Z",
      "scope": "scan:read"
    },
    {
      "method": "GET",
      "pattern": "/v1/scans/[1-9][0-9]*/summary\\Z",
      "scope": "scan:read"
    },
    {
      "method": "GET",
      "pattern": "/v1/scans/[1-9][0-9]*/finding-files\\Z",
      "scope": "finding:read"
    },
    {
      "method": "GET",
      "pattern": "/v1/scans/[1-9][0-9]*/finding-diagnostics\\Z",
      "scope": "finding:read"
    },
    {
      "method": "GET",
      "pattern": "/v1/scans/[1-9][0-9]*/findings\\Z",
      "scope": "finding:read"
    },
    {
      "method": "GET",
      "pattern": "/v1/scans/[1-9][0-9]*/findings/[1-9][0-9]*\\Z",
      "scope": "finding:read"
    },
    {
      "method": "POST",
      "pattern": "/v1/findings/[1-9][0-9]*/triage\\Z",
      "scope": "finding:advisor"
    },
    {
      "method": "PATCH",
      "pattern": "/v1/findings/[1-9][0-9]*/lifecycle\\Z",
      "scope": "finding:lifecycle"
    },
    {
      "method": "DELETE",
      "pattern": "/v1/findings/[1-9][0-9]*\\Z",
      "scope": "finding:delete"
    },
    {
      "method": "GET",
      "pattern": "/v1/jobs/[1-9][0-9]*\\Z",
      "scope": "job:read"
    },
    {
      "method": "POST",
      "pattern": "/v1/jobs/[1-9][0-9]*/cancel\\Z",
      "scope": "job:cancel"
    }
  ],
  "schema": "lomo-public-api-snapshot/v1",
  "schemaBase": "/api/0.1.0/bccff29",
  "schemas": {
    "advisor-connector.openapi.json": "becb8629a95f071e188018a9e2229412b61cd87fc780faf92bff7d89b4e7617c",
    "openapi.json": "55cb2491403c84c56c2d1403019a3acff0e2f3d4224db33c78845258ef387c30",
    "scanner.openapi.json": "cece880081d6cc8a5f2110f3d1c80d12bc600eee6eff669a9192c865788f91ba",
    "updater.openapi.json": "0d06b5e0f7b87f66c0af97c227090fc5933ff8ce7faf49a497888b3d6aa703dc"
  },
  "source": {
    "archiveBytes": 18733064,
    "archiveSha256": "5d9d8175eb3e832c6d70ae79b17a9ae195dda352ea904a1a556cbda10c8fc0ae",
    "commit": "bccff297ea36ba46f1af1f3849fa233b66c72ad3",
    "maxArchiveBytes": 150000000,
    "repository": "https://github.com/lomolabs/lomo-codesecurity",
    "version": "0.1.0"
  },
  "sourceFiles": {
    "apps/api/kodesec_api/app.py": "9bad321ce6d8873345cc85887d76b74d939843b67877950c9ff33605585695f2",
    "apps/api/kodesec_api/auth.py": "419beba8bd664a5b2d3895a820d3e27ab3bbfa60bc792d52b88488466bec66bc",
    "apps/api/kodesec_api/events.py": "deabd874686930403dd3c4749972327f2a91ab9bd9360bd7dc9f6733c8d53fd1",
    "apps/api/kodesec_api/git_push_evidence.py": "7ef263a99a06512cb5381af43abe268fe4872be97f753edcd198e7a95c895bf9",
    "apps/api/kodesec_api/git_push_policy.py": "f9234d730f67ea73bc08314d81ed32d18b3ff14b8cf2575e3d660f4ff3468d43",
    "apps/api/kodesec_api/ide_source.py": "4bc6778a7382297abea907582e118515caab525f05d5780efef3988ef947f683",
    "apps/api/kodesec_api/main.py": "cbbcabe823ec78fc617482e47dc63b7dbea15839395b7b1b7b08e90d8cf0ceca",
    "apps/api/kodesec_api/schemas.py": "3c6816a0dd0b977bb13fc7e5bb890ce450dfd4761248d3a61e49e3df499dede4",
    "apps/api/kodesec_api/security.py": "a98023bc66f2690533d0f29bc7b09a4c7ebc7e702a73e82a502ebb22829fb30e",
    "apps/api/requirements-production.lock": "19748bd8642a9f9f28e63725283d935f4a2d66ebfd7bb1dd393402655ddf7f5d",
    "services/advisor_connector/app.py": "d0a8a463392d3d9fef2aa545f4aad4a1cbc5403824e6d058a6d1f17a1f4841be",
    "services/scanner/kodesec_scanner/main.py": "c0135c0a765413af800c40e0abf0d237717f0c6d431e6f72484e8b313dd92714",
    "services/scanner/kodesec_scanner/updater_main.py": "36976ad5dd9ccd082b6bf69e7f725771e1f07954df09a01bce4ef94a5cd18d8a",
    "services/scanner/kodesec_scanner/updater_routes.py": "663b6e7ce283888187cc9148b2a20f40670bbb87bdb00450c32484fe1874dbeb"
  }
}
