LydianAI Open-source tooling

← All docs

Assurance-as-Code

Release baselines

Create a baseline, run the release-gate check, approve, and release — with severity-based blocking and stale-gate protection.


Release baselines

A baseline is a named, timestamped snapshot of every compliance artefact in a project at a point in time. A baseline moves through its own controlled lifecycle before it becomes the record used for regulatory submission.


Baseline lifecycle

created → release_gate_running → passed → approved → released → obsolete
                                    ↓          ↓
                                  failed     stale
                                    ↑          ↑
                                    └─── re-evaluate ───┘

released is the only terminal state; a released baseline can never re-enter evaluation.


What the release gate checks

The gate runs every rule with execution_mode = release_gate plus a set of structural checks:

CheckBlocks release when
Mandatory artefact presenceA mandatory artefact type for the active profile has no artefacts in scope and no accepted tailoring decision
Traceability completenessAny safety requirement has no verifies relationship to a passing TestResult
Open suspect statesAny in-scope artefact has an unresolved SuspectState
Unresolved defectsAny DefectRecord linked to an in-scope artefact is not closed or wont_fix
Failed test resultsA TestResult in scope has verdict = fail without a linked DefectRecord
Incomplete tailoringA TailoringDecision used by this baseline is missing rationale, approver, or approval timestamp

Severity-based blocking

Not every validation issue blocks the gate. Whether an issue blocks depends on its severity and on the active profile.

SeverityASIL A / B / CASIL D
criticalAlways blocksAlways blocks
majorConfigurable per profile — warning by defaultAlways blocks
minorWarning onlyWarning only
infoRecorded onlyRecorded only

The ASIL D profile treats both critical and major severity issues as blocking at the release gate. critical issues always block, regardless of profile configuration.


The end-to-end flow

The typical workflow, and the role that performs each step:

StepEndpointRole
Create baseline (acquires update lock)POST /api/v1/projects/<pid>/baselinesProject Lead, Admin
Run release-gate evaluationPOST /api/v1/projects/<pid>/release-gate/runAny project role
Approve baselinePOST /api/v1/projects/<pid>/baselines/<bid>/approveProject Lead, Admin
Release baselinePOST /api/v1/projects/<pid>/baselines/<bid>/releaseQuality Engineer, Admin
Publish approval to GitHub (if repo connected)POST /api/v1/projects/<pid>/baselines/<bid>/repository-approvalsProject Lead, Quality Engineer, Admin

Baseline creation acquires a project-scoped update lock. While the lock is held, artefact and relationship writes for the project return 423 Locked. Reads are not affected.


Running the gate check

curl -X POST http://localhost/api/v1/projects/<project-id>/release-gate/run \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer <your-token>" \
  -d '{"baseline_id": "<baseline-id>"}'

Fetch the latest result:

curl http://localhost/api/v1/projects/<project-id>/baselines/<baseline-id>/release-gate/results/latest \
  -H "Authorization: Bearer <your-token>"

Example response:

{
  "release_gate_result_id": "RGR_014",
  "status": "failed",
  "result": "fail",
  "evaluated_rules_count": 42,
  "passed_rules_count": 40,
  "blocking_issues": [
    {
      "issue_id": "ISS_233",
      "rule_id": "AAC-RULE-054",
      "severity": "critical",
      "artefact_id": "TC_042",
      "summary": "Test case has no associated TestResult"
    }
  ],
  "open_suspect_states": []
}

Fix the blocking issues, then re-run the gate. Each run creates a new immutable ReleaseGateResult; the newest completed result is the one that counts, provided nothing blocking-relevant has happened since.


Stale gates and approval invalidation

A passed gate result stays current only as long as nothing changes that could alter the outcome. A blocking-relevant event during the window between gate pass and release makes the baseline stale.

Blocking-relevant events include:

When the baseline goes stale:

The release operation re-checks gate currency in the same transaction as the transition to released, so a stale baseline cannot slip through.


Approving and releasing

After a passed gate result that is still current:

curl -X POST http://localhost/api/v1/projects/<project-id>/baselines/<baseline-id>/approve \
  -H "Authorization: Bearer <your-token>"

curl -X POST http://localhost/api/v1/projects/<project-id>/baselines/<baseline-id>/release \
  -H "Authorization: Bearer <your-token>"

A released baseline records the exact artefact revisions, relationship revisions, validation state, suspect state, release-gate result, and any active repository connector commits at the moment of release.


What a released baseline contains