{
  "sola.cell:R1.1": {
    "statement": "When asked for health, cell shall report availability without owner data.",
    "source": "src/main/java/sola/cell/package-info.java",
    "implementation": [],
    "test": []
  },
  "sola.cell:R2.1": {
    "statement": "When an owner requests the manifest, cell shall identify itself as a zero cell with no business modules.",
    "source": "src/main/java/sola/cell/package-info.java",
    "implementation": [],
    "test": []
  },
  "sola.documentation:R1.1": {
    "statement": "When a visitor requests the homepage without credentials, documentation shall serve the generated homepage.",
    "source": "src/main/java/sola/documentation/package-info.java",
    "implementation": [
      {
        "method": "sola.documentation.boundary.DocumentationResource#home()",
        "source": "src/main/java/sola/documentation/boundary/DocumentationResource.java",
        "line": 21
      }
    ],
    "test": [
      {
        "method": "sola.documentation.DocumentationTest#publicHomepage()",
        "source": "src/test/java/sola/documentation/DocumentationTest.java",
        "line": 27
      }
    ]
  },
  "sola.documentation:R1.2": {
    "statement": "When a visitor requests a published document without credentials, documentation shall serve its content and declared media type.",
    "source": "src/main/java/sola/documentation/package-info.java",
    "implementation": [
      {
        "method": "sola.documentation.boundary.DocumentationResource#artifact(java.lang.String)",
        "source": "src/main/java/sola/documentation/boundary/DocumentationResource.java",
        "line": 26
      }
    ],
    "test": [
      {
        "method": "sola.documentation.DocumentationTest#publicArtifact()",
        "source": "src/test/java/sola/documentation/DocumentationTest.java",
        "line": 29
      }
    ]
  },
  "sola.documentation:R2.1": {
    "statement": "If a requested path escapes the publication root or names an unpublished file, documentation shall return not found.",
    "source": "src/main/java/sola/documentation/package-info.java",
    "implementation": [
      {
        "method": "sola.documentation.boundary.DocumentationResource#artifact(java.lang.String)",
        "source": "src/main/java/sola/documentation/boundary/DocumentationResource.java",
        "line": 26
      }
    ],
    "test": [
      {
        "method": "sola.documentation.DocumentationTest#refusesUnpublishedAndEscapes()",
        "source": "src/test/java/sola/documentation/DocumentationTest.java",
        "line": 31
      }
    ]
  },
  "sola.documentation:R3.1": {
    "statement": "When a visitor requests the manifest, documentation shall identify its build and distinguish annotation links from test and proof evidence.",
    "source": "src/main/java/sola/documentation/package-info.java",
    "implementation": [
      {
        "method": "sola.documentation.boundary.DocumentationResource#manifest()",
        "source": "src/main/java/sola/documentation/boundary/DocumentationResource.java",
        "line": 30
      }
    ],
    "test": [
      {
        "method": "sola.documentation.DocumentationTest#publicEvidence()",
        "source": "src/test/java/sola/documentation/DocumentationTest.java",
        "line": 36
      }
    ]
  },
  "sola.history:R1.1": {
    "statement": "When an iteration is accepted, history shall expose an event identifying its actor and request.",
    "source": "src/main/java/sola/history/package-info.java",
    "implementation": [],
    "test": []
  },
  "sola.history:R1.2": {
    "statement": "When an owner requests history, history shall exclude other owners' events.",
    "source": "src/main/java/sola/history/package-info.java",
    "implementation": [],
    "test": []
  },
  "sola.identity:R5.1": {
    "statement": "Unless an unexpired grant is supplied, identity shall refuse owner data access; neither factor credential shall act as a grant.",
    "source": "src/main/java/sola/identity/package-info.java",
    "implementation": [
      {
        "method": "sola.identity.boundary.IdentityResource#owner(java.lang.String)",
        "source": "src/main/java/sola/identity/boundary/IdentityResource.java",
        "line": 41
      }
    ],
    "test": [
      {
        "method": "sola.ZeroTest#factorsAreNotAccessTokens(java.lang.String)",
        "source": "src/test/java/sola/ZeroTest.java",
        "line": 49
      }
    ]
  },
  "sola.identity:R5.2": {
    "statement": "When the configured owner key is presented, identity shall issue a short-lived challenge and a private redemption secret.",
    "source": "src/main/java/sola/identity/package-info.java",
    "implementation": [
      {
        "method": "sola.identity.boundary.IdentityResource#challenge(java.lang.String,sola.identity.boundary.IdentityResource.Login)",
        "source": "src/main/java/sola/identity/boundary/IdentityResource.java",
        "line": 20
      }
    ],
    "test": [
      {
        "method": "sola.ZeroTest#challengeRequiresFirstFactor()",
        "source": "src/test/java/sola/ZeroTest.java",
        "line": 56
      }
    ]
  },
  "sola.identity:R5.3": {
    "statement": "While an unexpired challenge is pending, identity shall refuse another pending challenge for that owner.",
    "source": "src/main/java/sola/identity/package-info.java",
    "implementation": [
      {
        "method": "sola.identity.boundary.IdentityResource#challenge(java.lang.String,sola.identity.boundary.IdentityResource.Login)",
        "source": "src/main/java/sola/identity/boundary/IdentityResource.java",
        "line": 20
      }
    ],
    "test": [
      {
        "method": "sola.ZeroTest#onlyOnePending()",
        "source": "src/test/java/sola/ZeroTest.java",
        "line": 62
      }
    ]
  },
  "sola.identity:R6.1": {
    "statement": "Only after the configured factor approves a challenge shall identity exchange its private redemption secret for one grant.",
    "source": "src/main/java/sola/identity/package-info.java",
    "implementation": [
      {
        "method": "sola.identity.boundary.IdentityResource#redeem(java.lang.String,sola.identity.boundary.IdentityResource.Redemption)",
        "source": "src/main/java/sola/identity/boundary/IdentityResource.java",
        "line": 35
      }
    ],
    "test": [
      {
        "method": "sola.ZeroTest#requiresBothProofs()",
        "source": "src/test/java/sola/ZeroTest.java",
        "line": 68
      }
    ]
  },
  "sola.identity:R6.2": {
    "statement": "If approval is denied, identity shall refuse redemption.",
    "source": "src/main/java/sola/identity/package-info.java",
    "implementation": [
      {
        "method": "sola.identity.boundary.IdentityResource#redeem(java.lang.String,sola.identity.boundary.IdentityResource.Redemption)",
        "source": "src/main/java/sola/identity/boundary/IdentityResource.java",
        "line": 35
      }
    ],
    "test": [
      {
        "method": "sola.ZeroTest#denial()",
        "source": "src/test/java/sola/ZeroTest.java",
        "line": 81
      }
    ]
  },
  "sola.identity:R6.3": {
    "statement": "If the challenge expires, identity shall refuse proof and redemption.",
    "source": "src/main/java/sola/identity/package-info.java",
    "implementation": [
      {
        "method": "sola.identity.boundary.IdentityResource#prove(java.lang.String,java.lang.String,sola.identity.boundary.IdentityResource.Proof)",
        "source": "src/main/java/sola/identity/boundary/IdentityResource.java",
        "line": 29
      },
      {
        "method": "sola.identity.boundary.IdentityResource#redeem(java.lang.String,sola.identity.boundary.IdentityResource.Redemption)",
        "source": "src/main/java/sola/identity/boundary/IdentityResource.java",
        "line": 35
      }
    ],
    "test": [
      {
        "method": "sola.ZeroTest#expiry()",
        "source": "src/test/java/sola/ZeroTest.java",
        "line": 87
      }
    ]
  },
  "sola.identity:R6.4": {
    "statement": "If the proof names another owner, was already used, or targets a decided challenge, identity shall reject it.",
    "source": "src/main/java/sola/identity/package-info.java",
    "implementation": [
      {
        "method": "sola.identity.boundary.IdentityResource#prove(java.lang.String,java.lang.String,sola.identity.boundary.IdentityResource.Proof)",
        "source": "src/main/java/sola/identity/boundary/IdentityResource.java",
        "line": 29
      }
    ],
    "test": [
      {
        "method": "sola.ZeroTest#replayAndSubject()",
        "source": "src/test/java/sola/ZeroTest.java",
        "line": 95
      }
    ]
  },
  "sola.identity:R6.5": {
    "statement": "When redemptions race, identity shall issue at most one grant.",
    "source": "src/main/java/sola/identity/package-info.java",
    "implementation": [
      {
        "method": "sola.identity.boundary.IdentityResource#redeem(java.lang.String,sola.identity.boundary.IdentityResource.Redemption)",
        "source": "src/main/java/sola/identity/boundary/IdentityResource.java",
        "line": 35
      }
    ],
    "test": [
      {
        "method": "sola.ZeroTest#concurrentRedemption()",
        "source": "src/test/java/sola/ZeroTest.java",
        "line": 105
      }
    ]
  },
  "sola.identity:R7.1": {
    "statement": "Identity shall persist only grant/redemption hashes, expire grants, and revoke a grant on logout.",
    "source": "src/main/java/sola/identity/package-info.java",
    "implementation": [
      {
        "method": "sola.identity.boundary.IdentityResource#logout(java.lang.String)",
        "source": "src/main/java/sola/identity/boundary/IdentityResource.java",
        "line": 46
      }
    ],
    "test": [
      {
        "method": "sola.ZeroTest#grantLifetime()",
        "source": "src/test/java/sola/ZeroTest.java",
        "line": 116
      }
    ]
  },
  "sola.iteration:R1.1": {
    "statement": "When a nonblank prompt is submitted, iteration shall durably queue it with an identifier and creation time.",
    "source": "src/main/java/sola/iteration/package-info.java",
    "implementation": [],
    "test": []
  },
  "sola.iteration:R1.2": {
    "statement": "If the prompt or execution options are invalid, then iteration shall reject the request before creating a record.",
    "source": "src/main/java/sola/iteration/package-info.java",
    "implementation": [],
    "test": []
  },
  "sola.iteration:R1.3": {
    "statement": "Unless execution is requested, iteration shall leave the request queued without invoking a runner.",
    "source": "src/main/java/sola/iteration/package-info.java",
    "implementation": [],
    "test": []
  },
  "sola.iteration:R1.4": {
    "statement": "If source changes or archives are supplied, then iteration shall refuse them before creating a record.",
    "source": "src/main/java/sola/iteration/package-info.java",
    "implementation": [],
    "test": []
  },
  "sola.iteration:R1.5": {
    "statement": "When a submission repeats an idempotency key and payload, iteration shall return the original request; a changed payload shall conflict.",
    "source": "src/main/java/sola/iteration/package-info.java",
    "implementation": [],
    "test": []
  },
  "sola.iteration:R2.1": {
    "statement": "When an owner lists iterations, iteration shall return only that owner's requests.",
    "source": "src/main/java/sola/iteration/package-info.java",
    "implementation": [],
    "test": []
  },
  "sola.iteration:R3.1": {
    "statement": "If no runner is configured, then iteration shall refuse execution without consuming the queued request.",
    "source": "src/main/java/sola/iteration/package-info.java",
    "implementation": [],
    "test": []
  },
  "sola.iteration:R3.2": {
    "statement": "When execution succeeds, iteration shall record completion without claiming deployment.",
    "source": "src/main/java/sola/iteration/package-info.java",
    "implementation": [],
    "test": []
  },
  "sola.iteration:R3.3": {
    "statement": "If execution fails or exceeds its time limit, then iteration shall record `failed` or `timed-out` respectively.",
    "source": "src/main/java/sola/iteration/package-info.java",
    "implementation": [],
    "test": []
  },
  "sola.iteration:R3.4": {
    "statement": "If the request is unknown, belongs to another owner or has already started, then iteration shall refuse execution.",
    "source": "src/main/java/sola/iteration/package-info.java",
    "implementation": [],
    "test": []
  },
  "sola.iteration:R3.5": {
    "statement": "Where flight recording is enabled, iteration shall record the run's identifier, duration and outcome without the prompt or credentials.",
    "source": "src/main/java/sola/iteration/package-info.java",
    "implementation": [],
    "test": []
  },
  "sola.iteration:R3.6": {
    "statement": "When cancellation is accepted, iteration shall stop its process group and retain cancellation despite a racing completion.",
    "source": "src/main/java/sola/iteration/package-info.java",
    "implementation": [],
    "test": []
  },
  "sola.iteration:R3.7": {
    "statement": "After a process restart, iteration shall stop identified orphan runners, mark running requests interrupted, and preserve queued execution intent without replaying interrupted work.",
    "source": "src/main/java/sola/iteration/package-info.java",
    "implementation": [],
    "test": []
  },
  "sola.iteration:R3.8": {
    "statement": "Only after the configured verifier returns a matching receipt and patch hash shall iteration report completion and expose that patch to its owner.",
    "source": "src/main/java/sola/iteration/package-info.java",
    "implementation": [],
    "test": []
  }
}
