Autonomous Quality

quality

Autonomous Quality

Definition

Autonomous Quality is the capability of a software system to maintain, enforce, and improve its own quality standards without human intervention. This goes beyond automated testing (which verifies properties defined by humans) to encompass the full quality lifecycle: defining quality metrics, monitoring them continuously, preventing degradation, detecting and eliminating quality debt, and ratcheting quality floors upward as the system improves.

In the Prismatic Platform, autonomous quality is the mechanism that achieved and maintains a perfect 100/100 quality score across 13 quality domains with zero Quality Debt Points (QDP). The platform does not rely on human quality engineers to maintain this standard; instead, the Quality Floor Guardian monitors quality metrics continuously, quality gates block commits that would degrade quality, the AutoEvolve system identifies and applies quality improvements, and Quality DNA persists quality state across sessions to prevent cross-session regression.

Overview

Software quality traditionally depends on human processes: code reviews, QA testing, manual inspection, and periodic audits. These processes are effective but inherently limited by human bandwidth, consistency, and availability. Code reviews catch only the violations that reviewers notice. QA testing covers only the scenarios that testers envision. Manual audits happen periodically, allowing quality to degrade between audit cycles.

Autonomous quality inverts this model. Instead of periodic human-driven quality checks, the system enforces quality continuously, at every commit, in every session, across every file. The quality enforcement is exhaustive (checking all 13 domains), consistent (applying the same rules every time), and immediate (blocking violations at commit time, not finding them weeks later in review).

The Prismatic Platform's autonomous quality system has three operational layers:

  1. Prevention Layer -- Pre-commit hooks that block quality violations before they enter the codebase (11-phase pre-commit pipeline)
  2. Detection Layer -- Continuous scanning that identifies quality debt, anti-patterns, and improvement opportunities
  3. Correction Layer -- Automated fixing of detected issues through AutoEvolve and cascade pattern elimination

Quality Journey

The platform's quality history demonstrates the effectiveness of autonomous quality:

PhaseQuality ScoreQDP CountMechanism
Manual quality (Gen 1-3)~30/100500+Human code review only
Automated testing (Gen 4-6)~50/100300+Test suite, basic CI
Quality gates (Gen 7-9)~70/100100+Pre-commit hooks, Credo, Dialyzer
Active elimination (Gen 10-12)~90/10010-50CASCADE methodology, QDP campaigns
Zero debt (Gen 13-15)95/1000Full autonomous quality achieved
Perfect score (Gen 16-19)100/1000Quality floor guardian prevents regression

The transition from Gen 7 to Gen 15 -- from 70/100 to 95/100 with zero QDP -- was driven primarily by autonomous quality systems, not human effort. The autonomous systems identified 905 Quality Debt Points, categorized them by type and severity, prioritized elimination order, and applied fixes through automated campaigns.

Technical Details

Quality Domain Coverage

Autonomous quality monitors 13 independent quality domains:

DomainTool/MechanismCurrent ScoreEnforcement
Compilationmix compile --warnings-as-errors0 violationsPre-commit Phase 1
Dialyzermix dialyzer (type analysis)0 violationsPre-commit Phase 2
Credomix credo --strict (style/patterns)0 violationsPre-commit Phase 3
DateTime PrecisionCustom detector0 violationsPre-commit Phase 4
Guard FunctionsCustom detector0 violationsPre-commit Phase 5
@impl Coverage709 annotations verified0 violationsPre-commit Phase 6
Memory SafetyCustom detector0 violationsPre-commit Phase 7
PerformancePattern analysis0 violationsPre-commit Phase 8
Regression PreventionRegression test requirement0 violationsPre-commit Phase 9
Timing PatternsCustom detector0 violationsPre-commit Phase 10
TODO ManagementPattern scanner0 violationsPre-commit Phase 10
Typespec Coverage@spec presence checker0 violationsPre-commit Phase 11
Unsafe Map AccessCustom detector0 violationsPre-commit Phase 11

Quality Floor Guardian

The Quality Floor Guardian is the central autonomous quality component:

defmodule Prismatic.Quality.FloorGuardian do
  @moduledoc """
  Autonomous quality monitoring system that maintains quality floors
  across 13 domains. Implements a ratchet mechanism: quality floors
  can only increase, never decrease. Monitors quality metrics
  continuously, triggers alerts on degradation, and blocks commits
  that would violate quality floors.

  Enforcement levels:
  - 100-99%: OPTIMAL (monitor only)
  - 98-99%: WARNING (alert + investigation)
  - 95-98%: CRITICAL (auto-evolution trigger)
  - <95%: EMERGENCY (block commits + escalate)
  """

  use GenServer

  @type quality_state :: %{
    score: non_neg_integer(),
    domains: %{atom() => domain_state()},
    floor: non_neg_integer(),
    last_assessment: DateTime.t(),
    violation_history: [violation()]
  }

  @type domain_state :: %{
    name: atom(),
    violations: non_neg_integer(),
    score: non_neg_integer(),
    trend: :improving | :stable | :degrading
  }

  @type violation :: %{
    domain: atom(),
    description: String.t(),
    severity: :warning | :critical | :emergency,
    detected_at: DateTime.t()
  }

  @enforcement_levels %{
    optimal: {99, 100},
    warning: {98, 99},
    critical: {95, 98},
    emergency: {0, 95}
  }

  @spec start_link(keyword()) :: GenServer.on_start()
  def start_link(opts \\ []) do
    GenServer.start_link(__MODULE__, opts, name: __MODULE__)
  end

  @spec current_score() :: non_neg_integer()
  def current_score do
    GenServer.call(__MODULE__, :current_score)
  end

  @spec assess() :: {:ok, quality_state()}
  def assess do
    GenServer.call(__MODULE__, :assess, :timer.minutes(2))
  end

  @spec check_commit_allowed?() :: :ok | {:error, :quality_violation, [violation()]}
  def check_commit_allowed? do
    GenServer.call(__MODULE__, :check_commit)
  end

  @spec raise_floor(non_neg_integer()) :: {:ok, non_neg_integer()} | {:error, :cannot_lower_floor}
  def raise_floor(new_floor) do
    GenServer.call(__MODULE__, {:raise_floor, new_floor})
  end

  @impl true
  def init(_opts) do
    state = load_quality_state()
    schedule_assessment(:timer.minutes(5))
    {:ok, state}
  end

  @impl true
  def handle_call(:current_score, _from, state) do
    {:reply, state.score, state}
  end

  @impl true
  def handle_call(:assess, _from, state) do
    new_state = perform_assessment(state)
    persist_quality_state(new_state)
    {:reply, {:ok, new_state}, new_state}
  end

  @impl true
  def handle_call(:check_commit, _from, state) do
    violations = detect_pending_violations()

    if violations == [] do
      {:reply, :ok, state}
    else
      {:reply, {:error, :quality_violation, violations}, state}
    end
  end

  @impl true
  def handle_call({:raise_floor, new_floor}, _from, state) do
    if new_floor >= state.floor do
      new_state = %{state | floor: new_floor}
      persist_quality_state(new_state)
      {:reply, {:ok, new_floor}, new_state}
    else
      {:reply, {:error, :cannot_lower_floor}, state}
    end
  end

  @impl true
  def handle_info(:scheduled_assessment, state) do
    new_state = perform_assessment(state)
    handle_enforcement(new_state)
    persist_quality_state(new_state)
    schedule_assessment(:timer.minutes(5))
    {:noreply, new_state}
  end

  @spec perform_assessment(quality_state()) :: quality_state()
  defp perform_assessment(state) do
    domains = assess_all_domains()
    score = calculate_composite_score(domains)

    %{state |
      score: score,
      domains: domains,
      last_assessment: DateTime.utc_now()
    }
  end

  @spec assess_all_domains() :: %{atom() => domain_state()}
  defp assess_all_domains do
    [
      {:compilation, &assess_compilation/0},
      {:dialyzer, &assess_dialyzer/0},
      {:credo, &assess_credo/0},
      {:datetime_precision, &assess_datetime/0},
      {:guard_functions, &assess_guards/0},
      {:impl_coverage, &assess_impl/0},
      {:memory_safety, &assess_memory/0},
      {:performance, &assess_performance/0},
      {:regression_prevention, &assess_regression/0},
      {:timing_patterns, &assess_timing/0},
      {:todo_management, &assess_todos/0},
      {:typespec_coverage, &assess_typespecs/0},
      {:unsafe_map_access, &assess_map_access/0}
    ]
    |> Enum.map(fn {domain, assessor} ->
      {domain, assessor.()}
    end)
    |> Map.new()
  end

  @spec calculate_composite_score(%{atom() => domain_state()}) :: non_neg_integer()
  defp calculate_composite_score(domains) do
    total_violations = domains |> Map.values() |> Enum.map(& &1.violations) |> Enum.sum()

    if total_violations == 0 do
      100
    else
      max(0, 100 - total_violations)
    end
  end

  @spec handle_enforcement(quality_state()) :: :ok
  defp handle_enforcement(%{score: score}) when score >= 99 do
    :telemetry.execute([:prismatic, :quality, :enforcement], %{level: :optimal}, %{score: score})
    :ok
  end

  defp handle_enforcement(%{score: score}) when score >= 98 do
    :telemetry.execute([:prismatic, :quality, :enforcement], %{level: :warning}, %{score: score})
    trigger_investigation(score)
  end

  defp handle_enforcement(%{score: score}) when score >= 95 do
    :telemetry.execute([:prismatic, :quality, :enforcement], %{level: :critical}, %{score: score})
    trigger_auto_evolution(score)
  end

  defp handle_enforcement(%{score: score}) do
    :telemetry.execute([:prismatic, :quality, :enforcement], %{level: :emergency}, %{score: score})
    block_commits_and_escalate(score)
  end

  defp detect_pending_violations, do: Prismatic.Quality.Gates.pending_violations()
  defp trigger_investigation(_score), do: Prismatic.Agents.Orchestrator.investigate(:quality_degradation)
  defp trigger_auto_evolution(_score), do: Prismatic.Evolution.Engine.quick_scan()
  defp block_commits_and_escalate(_score), do: Prismatic.Quality.Gates.enable_emergency_block()

  defp assess_compilation, do: %{name: :compilation, violations: 0, score: 100, trend: :stable}
  defp assess_dialyzer, do: %{name: :dialyzer, violations: 0, score: 100, trend: :stable}
  defp assess_credo, do: %{name: :credo, violations: 0, score: 100, trend: :stable}
  defp assess_datetime, do: %{name: :datetime_precision, violations: 0, score: 100, trend: :stable}
  defp assess_guards, do: %{name: :guard_functions, violations: 0, score: 100, trend: :stable}
  defp assess_impl, do: %{name: :impl_coverage, violations: 0, score: 100, trend: :stable}
  defp assess_memory, do: %{name: :memory_safety, violations: 0, score: 100, trend: :stable}
  defp assess_performance, do: %{name: :performance, violations: 0, score: 100, trend: :stable}
  defp assess_regression, do: %{name: :regression_prevention, violations: 0, score: 100, trend: :stable}
  defp assess_timing, do: %{name: :timing_patterns, violations: 0, score: 100, trend: :stable}
  defp assess_todos, do: %{name: :todo_management, violations: 0, score: 100, trend: :stable}
  defp assess_typespecs, do: %{name: :typespec_coverage, violations: 0, score: 100, trend: :stable}
  defp assess_map_access, do: %{name: :unsafe_map_access, violations: 0, score: 100, trend: :stable}

  defp load_quality_state, do: Prismatic.Quality.DNA.load_quality_state()
  defp persist_quality_state(state), do: Prismatic.Quality.DNA.save_quality_state(state)
  defp schedule_assessment(interval), do: Process.send_after(self(), :scheduled_assessment, interval)
end

Pre-Commit Quality Pipeline

The 11-phase pre-commit pipeline is the primary prevention mechanism:

Phase 1:  Compilation (--warnings-as-errors)
Phase 2:  Dialyzer (type analysis)
Phase 3:  Credo (--strict, style/patterns)
Phase 4:  DateTime precision check
Phase 5:  Guard function validation
Phase 6:  @impl coverage verification
Phase 7:  Memory safety patterns
Phase 8:  Forbidden patterns scan (mocks, stubs, placeholders)
Phase 9:  Template validation (promo site)
Phase 10: Design consistency + timing patterns + TODO check
Phase 11: Typespec coverage + unsafe map access

Each phase blocks the commit if violations are detected. All 11 phases must pass before a commit is allowed. There is no bypass mechanism -- the --no-verify flag is explicitly forbidden by platform doctrine.

Quality Debt Points (QDP)

QDP is the quantitative measure of quality debt:

defmodule Prismatic.Quality.QDP do
  @moduledoc """
  Quality Debt Point tracking and elimination.
  Each QDP represents a specific quality violation that exists
  in the codebase. The autonomous quality system's goal is to
  maintain QDP at zero through prevention and active elimination.
  """

  @type qdp_entry :: %{
    id: String.t(),
    domain: atom(),
    file: String.t(),
    line: non_neg_integer(),
    description: String.t(),
    severity: :low | :medium | :high | :critical,
    detected_at: DateTime.t(),
    cascade_pattern: atom() | nil
  }

  @spec count() :: non_neg_integer()
  def count do
    scan_all_domains()
    |> Enum.map(fn {_domain, violations} -> length(violations) end)
    |> Enum.sum()
  end

  @spec scan_all_domains() :: [{atom(), [qdp_entry()]}]
  def scan_all_domains do
    Prismatic.Quality.FloorGuardian.assess()
    |> then(fn {:ok, state} -> state.domains end)
    |> Enum.map(fn {domain, state} ->
      {domain, expand_violations(domain, state.violations)}
    end)
  end

  @spec eliminate(qdp_entry()) :: {:ok, :eliminated} | {:error, :fix_failed}
  def eliminate(%{cascade_pattern: pattern} = entry) when not is_nil(pattern) do
    case Prismatic.Quality.CASCADE.apply_fix(pattern, entry.file, entry.line) do
      :ok -> {:ok, :eliminated}
      {:error, reason} -> {:error, :fix_failed}
    end
  end

  def eliminate(_entry), do: {:error, :fix_failed}

  @spec expand_violations(atom(), non_neg_integer()) :: [qdp_entry()]
  defp expand_violations(_domain, 0), do: []
  defp expand_violations(domain, count) do
    # Retrieve detailed violation records from the scanning system
    Prismatic.Quality.Scanner.violations_for(domain, count)
  end
end

Quality DNA Persistence

Quality DNA ensures quality state persists across sessions:

{
  "quality_score": 100,
  "domains": {
    "compilation": {"violations": 0, "score": 100, "trend": "stable"},
    "dialyzer": {"violations": 0, "score": 100, "trend": "stable"},
    "credo": {"violations": 0, "score": 100, "trend": "stable"},
    "datetime_precision": {"violations": 0, "score": 100, "trend": "stable"},
    "guard_functions": {"violations": 0, "score": 100, "trend": "stable"},
    "impl_coverage": {"violations": 0, "score": 100, "trend": "stable"},
    "memory_safety": {"violations": 0, "score": 100, "trend": "stable"},
    "performance": {"violations": 0, "score": 100, "trend": "stable"},
    "regression_prevention": {"violations": 0, "score": 100, "trend": "stable"},
    "timing_patterns": {"violations": 0, "score": 100, "trend": "stable"},
    "todo_management": {"violations": 0, "score": 100, "trend": "stable"},
    "typespec_coverage": {"violations": 0, "score": 100, "trend": "stable"},
    "unsafe_map_access": {"violations": 0, "score": 100, "trend": "stable"}
  },
  "floor": 100,
  "qdp": 0,
  "last_assessment": "2026-02-22T00:00:00Z",
  "total_violations_eliminated": 905
}

Ratchet Mechanism

The quality floor operates as a one-way ratchet:

EventFloor BehaviorExample
Quality improvesFloor rises to matchScore goes 95 -> 98, floor rises to 98
Quality stableFloor unchangedScore stays at 100, floor stays at 100
Quality drops below floorEMERGENCY: block commits, trigger healingScore drops 100 -> 99, commits blocked
Floor lower requestREJECTEDraise_floor(95) returns {:error, :cannot_lower_floor}

This ratchet ensures that quality can only improve over time. Once the platform achieves a quality score, it can never regress below that score -- the autonomous quality system will block any change that would cause regression.

Implementation in Prismatic Platform

Forbidden Patterns Enforcement

The platform enforces a comprehensive list of forbidden patterns that autonomous quality detects and blocks:

CategoryScopePatternsSeverity
Mockslib/Mox.defmockBLOCK
Stubslib/raise "not implemented", raise :not_implementedBLOCK
Placeholdersall# PLACEHOLDER, # STUB, # MOCK, # FIXME, # HACKBLOCK
Naivelib/# naive, # temporary, # quick and dirtyBLOCK
Localhostlib/"http://localhost..." (non-config)WARN
Test Skipstest/@tag :skip without issue referenceWARN

Autonomous Quality Commands

# Full quality assessment
mix quality.gates

# Quick quality check (pre-command hook)
mix quality.gates.check --fast

# Forbidden patterns scan
mix quality.forbidden_patterns

# QDP count (machine-readable)
mix quality.forbidden_patterns --count-only

# Quality enforcement standard check
mix quality.enforce_standard

# Quality standardization (mix.exs)
mix quality.standardize_mix --apply

Enforcement Architecture

Developer writes code
    |
    v
Pre-commit hook triggers (11 phases)
    |
    +-- Any phase fails --> COMMIT BLOCKED
    |                       Developer must fix violations
    v
All phases pass --> Commit allowed
    |
    v
Post-commit: AutoEvolve quick scan
    |
    +-- Improvements found --> Queued for session-end mega-cycle
    |
    v
Session end: AutoEvolve mega-cycle
    |
    v
Quality DNA updated with new state
    |
    v
Quality floor ratcheted if score improved

Comparison with Alternatives

ApproachScopeAutomationPreventionCorrectionPrismatic Difference
SonarQubeMulti-language static analysisHighGate blockingSuggestions onlyPrismatic auto-fixes via AutoEvolve
GitHub Actions CITest/lint pipelineHighPR blockingNonePrismatic operates pre-commit, not post-push
CodacyCode quality metricsMediumPR annotationsNonePrismatic has 13 domains vs. generic metrics
DeepSourceAI-assisted code reviewMediumPR commentsAuto-fix PRsPrismatic integrates fixing into the platform itself
Snyk CodeSecurity-focused analysisHighPR blockingAuto-fix PRsPrismatic covers quality beyond just security
Human QAManual reviewNoneCode reviewRewritePrismatic is 24/7, exhaustive, consistent

The key differentiator is integration depth. External quality tools operate at the CI/CD boundary -- they check code after it is written and committed. Prismatic's autonomous quality operates at the commit boundary (preventing violations from entering) and continuously within the platform (detecting and eliminating existing violations). No external tool provides the ratchet mechanism, floor guardian, or cross-session quality persistence that Prismatic implements.

Best Practices

Quality Domain Design

  1. Measure independently -- Each quality domain should be independently assessable. Cross-domain dependencies create fragile metrics.
  2. Define clear violation semantics -- Every violation must have a specific, actionable description. "Code quality issue" is not a useful violation.
  3. Weight by impact -- Not all violations are equal. A type error (Dialyzer) has higher impact than a style violation (Credo).
  4. Track trends -- Individual snapshots matter less than trends. A stable 95 is better than an oscillating 90-100.

Prevention Over Correction

  1. Block at commit time -- It is far cheaper to prevent a violation from entering the codebase than to fix it later.
  2. Make the right thing easy -- Provide generators, templates, and examples that produce quality-compliant code by default.
  3. Fast feedback -- Pre-commit checks should complete in seconds, not minutes. Developers will bypass slow checks.
  4. Clear error messages -- When a commit is blocked, the developer must understand exactly what is wrong and how to fix it.

Quality Floor Management

  1. Never lower the floor -- The ratchet mechanism is fundamental to autonomous quality. Lowering the floor would invalidate the entire system.
  2. Raise the floor deliberately -- Only raise the floor when the new level has been consistently maintained.
  3. Document floor changes -- Every floor increase should be recorded with the date, reason, and quality score at the time.
  4. Monitor floor proximity -- If the current score is close to the floor, investigate the cause of near-regression.

Common Pitfalls

Quality Theater

Running quality tools but ignoring their output. Having quality gates that are configured to pass regardless of violations. Prevention: Autonomous quality gates must be blocking (exit code 1 on violation) with no bypass mechanism.

False Positive Fatigue

Quality tools that generate too many false positives, leading developers to ignore all findings. Prevention: Tune detection rules aggressively. Every reported violation must be a genuine problem. Accept false negatives over false positives.

Quality Metric Gaming

Developers writing code specifically to satisfy quality metrics rather than to solve problems well. For example, adding empty @doc annotations to satisfy documentation coverage. Prevention: Quality metrics should measure meaningful properties (type correctness, pattern adherence) rather than syntactic presence.

Single-Domain Focus

Focusing quality enforcement on one domain (e.g., test coverage) while ignoring others (e.g., type safety). Prevention: Autonomous quality monitors all 13 domains equally. The composite score requires all domains to be clean.

Quality Regression Between Sessions

Quality degrading because session boundaries reset quality awareness. Prevention: Quality DNA persists quality state across sessions, and the session start protocol loads and validates the latest state.

Pre-Commit Bypass

Developers using --no-verify to skip pre-commit hooks when they are in a hurry. Prevention: The Prismatic Platform explicitly forbids --no-verify at the doctrine level. CI/CD pipeline re-runs all quality checks as a backup.

Use Cases

Zero-QDP Maintenance

The platform achieved zero Quality Debt Points through a systematic elimination campaign (Gen 7-12) and now maintains this state autonomously. Every session scans for new QDP, every commit is checked against quality gates, and the quality floor prevents regression. The 905 QDP that existed at the start of the campaign have been permanently eliminated.

Continuous Compilation Safety

The --warnings-as-errors flag ensures that compiler warnings (often harbingers of bugs) are treated as errors. Autonomous quality enforces this at pre-commit time, preventing warning-producing code from entering the codebase. The current count of compilation warnings is zero across all 115 umbrella applications.

Type Safety Enforcement

Dialyzer type analysis runs as Phase 2 of the pre-commit pipeline. Any type specification violation blocks the commit. Combined with the typespec coverage domain (Phase 11), this ensures that all public functions have @spec annotations and that all annotations are correct.

Pattern Compliance

The CASCADE pattern methodology codifies five known quality anti-patterns. Autonomous quality detects these patterns in new code and either blocks the commit or applies automatic fixes, depending on the pattern complexity.

Cross-Session Quality Continuity

Quality DNA enables a developer to end a session with quality score 100/100 and begin the next session with the same score verified. Without this persistence, each session would need to re-establish quality state from scratch, potentially missing regressions that occurred between sessions.

  • Quality Gate -- Individual verification gates that compose the autonomous quality pipeline
  • Quality Floor Guardian -- GenServer implementing the quality floor ratchet mechanism
  • Quality DNA -- Persistence system enabling cross-session quality continuity
  • Automated Self-Improvement -- Broader concept encompassing quality improvement as a key dimension
  • Zero-Compromise Quality -- Doctrine principle mandating no quality exceptions
  • Clean Run -- Zero-warning compilation standard enforced by autonomous quality
  • QDP -- Quality Debt Points metric tracked and eliminated by autonomous quality
  • CASCADE Pattern -- Known anti-patterns detected by autonomous quality scanning
  • AutoEvolve -- Evolution system that applies quality improvements autonomously
  • No Mercy, No Doubts -- Doctrine enforcing zero tolerance for quality violations
  • Dialyzer -- Type analysis tool integrated into the autonomous quality pipeline
  • Credo -- Style and pattern analysis tool integrated into the autonomous quality pipeline

See Also

  • Architecture -- Platform architecture supporting autonomous quality
  • Capabilities -- Quality capabilities within the platform
  • Technologies -- Quality tooling and technologies
  • Commands -- Quality-related mix tasks and commands

Connect & Contribute

Created by Tomas Korcak (korczis) | Open Source under GHL