{
  "openapi": "3.1.0",
  "info": {
    "title": "TrajectoryLock runtime",
    "version": "0.1.0",
    "summary": "Auditable geometric trajectory test. Research prototype, not a certified forensic instrument.",
    "description": "THIS IS: research prototype / auditable geometric test. Compatibility vs declared official line. Independence groups so copies don't inflate certainty. CLI + local workbench + JSON API. THIS IS NOT: a certified forensic instrument; substitute for scene reconstruction, medical findings, lab exam; shooter/intent/guilt/narrative identifier; automatic detection of invisible projectiles; face recognition. Match probability is P(match | declared model), not P(official account is true). Synthetic example results must never be represented as real-case findings. No private case facts. Hosted API never stores media. Author: Aziel Eliab.",
    "license": {
      "name": "Apache-2.0",
      "identifier": "Apache-2.0"
    },
    "contact": {
      "name": "Aziel Eliab",
      "url": "https://github.com/AzielEliab/trajectorylock"
    }
  },
  "servers": [
    {
      "url": "https://trajectorylock-download-tracker.vibelock.workers.dev"
    }
  ],
  "paths": {
    "/v1/health": {
      "get": {
        "operationId": "trajectorylock_health",
        "summary": "Liveness. Does not increment download KV. Not a certified instrument. Never stores media.",
        "responses": {
          "200": {
            "description": "ok"
          }
        }
      }
    },
    "/v1/skill": {
      "get": {
        "operationId": "trajectorylock_skill",
        "summary": "Return TrajectoryLock skill markdown. Does not increment download KV.",
        "responses": {
          "200": {
            "description": "text/markdown"
          }
        }
      }
    },
    "/v1/example": {
      "get": {
        "operationId": "trajectorylock_example",
        "summary": "Synthetic small JSON case. Not a real case. Does not increment download KV.",
        "responses": {
          "200": {
            "description": "example case JSON"
          }
        }
      }
    },
    "/v1/analyze": {
      "post": {
        "operationId": "trajectorylock_analyze",
        "summary": "Small JSON case in, geometric result out. Cap size. NEVER store media. Not a certified instrument.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "case_id": "MINIMAL-DIRECT-LINE",
                "description": "Synthetic direct-line example; not real evidence.",
                "sources": [
                  {
                    "id": "survey-a",
                    "kind": "scene_survey",
                    "quality": 0.95,
                    "reliability": 1,
                    "calibrated": true,
                    "independence_group": "survey-a"
                  }
                ],
                "observations": [
                  {
                    "type": "direct_line",
                    "source_id": "survey-a",
                    "point": [
                      0,
                      0,
                      1.2
                    ],
                    "direction": [
                      1,
                      0.1,
                      0.02
                    ],
                    "angular_sigma_deg": 0.5,
                    "offset_sigma_m": 0.02
                  }
                ],
                "official_hypothesis": {
                  "point": [
                    0.01,
                    0.01,
                    1.19
                  ],
                  "direction": [
                    1,
                    0.11,
                    0.02
                  ],
                  "angular_sigma_deg": 0.7,
                  "offset_sigma_m": 0.04,
                  "angle_tolerance_deg": 3,
                  "offset_tolerance_m": 0.25
                },
                "analysis": {
                  "monte_carlo_samples": 800,
                  "random_seed": 7
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "result manifest"
          }
        }
      }
    }
  }
}