Reading classification results

A completed asset's classification groups its findings by capability. classification.moderation holds category scores, qualifiers, the policy assessment and the decision. Person detection, face detection and labels sit alongside it. Use Category definitions to interpret the findings and Policies and actions to understand the decision.

Reading reports safely

Check each category's status before reading its score: an unevaluated category is unknown, not safe.

const violence = asset.classification.moderation.categories?.violence;

if (violence?.status === "evaluated" || violence?.status === "partial") {
  console.log(violence.score, violence.likelihood);
} else if (violence) {
  console.log(`Violence was not evaluated: ${violence.reason}`);
}

Report shape

Every report contains all eight parent categories. Overlapping evidence within a category is nested under qualifiers. These are not additional top-level categories. A category disabled in your policy can still have raw findings; see preset defaults. Older reports show these categories as not assessed rather than inventing a zero score.

The report holds the classification evidence, plus a policy section: what your policy made of that evidence when the asset was decided. The action it took is the asset's classification.moderation.action, which is null when nothing was flagged.

Field in classificationMeaning
statuspending, processing, completed or failed.
updatedAtWhen the classification state last changed, in Unix milliseconds.
completedAtWhen classification completed, in Unix milliseconds. null until completion; unchanged by manual reviews.
moderation.categoriesSafety findings for all eight parent categories, once available.
moderation.scoreHighest evaluated category score. It does not account for policy thresholds.
moderation.decisionpending, approved or rejected; a reviewer's decision takes precedence.
moderation.actionThe saved policy action: flag, hide, purge or null.
moderation.policyThe saved policy scores, deciding rules, settings snapshots and automatic decision. Changing a policy later does not update these results.
moderation.timelineOptional audio/video sampling details and timed category evidence.
moderation.manualReviewsReview history, oldest first. Each entry records the decision, chosen action (approve, hide or purge), note, reviewer, time and whether it was applied to the asset.
personDetection, faceDetectionOptional detections requested through processingOptions.features. They do not affect the moderation decision.
labelsOptional detected content labels. They do not drive policy thresholds.

OCR text and transcripts live in content.extractedText, so their retention follows the source content. OCR safety findings contribute to classification.moderation.categories.

For example, a saved category includes the rules needed to explain its decision without loading the current policy:

{
  "score": 0.81,
  "action": "hide",
  "source": { "kind": "restriction", "index": 0 },
  "settings": {
    "threshold": 0.6,
    "categoryAction": "hide",
    "allowances": [{ "name": "Historical context", "when": ["violence-historical"], "action": "allow" }],
    "restrictions": [{ "name": "Graphic detail", "when": ["violence-graphic"], "action": "hide" }]
  }
}

Audio/video reports can include classification.moderation.timeline.segments with source: "clip" when CalmLens evaluates overlapping chunks directly. These are approximate evidence ranges. Direct evaluation produces parent-category scores without qualifier scores or a transcript; policies with allowances or restrictions use the frame/OCR/transcript pipeline instead. See audio and video limits.

Category and qualifier results

Each parent category nests its evidence under qualifiers. Qualifier IDs are category-specific; the current sets and their definitions are listed in Category definitions. Use the documented qualifier IDs for each category.

Qualifier fieldMeaning
someScoreEvidence that the qualifier is present in some of the category's qualifying content. See Some and All.
allScoreEvidence that the qualifier covers all qualifying content in the category. It never exceeds someScore.

For categories scoring at least 10%, CalmLens assesses every qualifier regardless of which rules your policy uses. Below that score, separate qualifier checks are not run. Older reports may lack evidence for qualifiers that their policy did not request.

Text and direct image classification both have separate presence and scope checks. Missing scope gives an allowance no coverage, and a missing qualifier gives neither an allowance nor a restriction any evidence.

For how those fields affect a decision, see Policy score.

Qualifiers have their own evaluation status and do not change the parent category's score. Their scores are diagnostic evidence, not probabilities of correctness.

Evaluation status

StatusMeaningScore fields
evaluatedThe parent category was directly evaluated. Individual qualifiers may still be unavailable.Includes score and likelihood.
partialA narrower signal was evaluated, but not the complete parent category.Includes the strongest available qualifying signal and its likelihood.
not-evaluatedNo usable score exists for this category. Policy thresholds are not applied to it.Includes reason; omits score and likelihood.

Qualifiers use evaluated or not-evaluated; they do not use partial.

Possible not-evaluated reasons are:

ReasonMeaning
not-supportedThe processing path used for this asset cannot assess this category or qualifier.
unavailableAssessment was attempted but produced no usable result. A complete moderation failure normally sets the asset's classification.status to failed instead of returning a successful report.

Coverage varies by input type and processing availability, and a parent result does not guarantee that every qualifier was evaluated.

Do not convert not-evaluated into a zero score. Zero means the signal was evaluated and received its lowest score; not-evaluated means CalmLens has no result.

Scores and likelihoods

Scores are normalized to the range 0–1. Likelihood labels use these boundaries:

ScoreLikelihood
< 0.2very-unlikely
0.2–< 0.4unlikely
0.4–< 0.6possible
0.6–< 0.8likely
>= 0.8very-likely

The parent category score retains the strongest supported category evidence, including directly evaluated narrower checks. Qualifiers do not change this score. classification.moderation.score is the maximum evaluated parent score. Scores are normalized into the same shape, but are not calibrated probabilities of correctness.

OCR and merged image reports

Enable OCR when written content in images matters. See OCR and image reports for setup, image-owned extracted text, combined scores and usage.

Audio and video reports

See Audio and video moderation for supported formats, sampling limits, timelines and usage.

Example report

This example includes all eight categories, selected qualifiers and the policy section an Education and support project records. Violence is wholly historical, but its graphic detail is a restricted form, so its policy score stays high.

{
  "status": "completed",
  "updatedAt": 1788364800000,
  "completedAt": 1788364800000,
  "moderation": {
    "categories": {
      "sexual": {
        "status": "evaluated",
        "score": 0.02,
        "likelihood": "very-unlikely"
      },
      "violence": {
        "status": "evaluated",
        "score": 0.9,
        "likelihood": "very-likely",
        "qualifiers": {
          "violence-attack": {
            "status": "evaluated",
            "someScore": 0.98,
            "allScore": 0.95,
            "likelihood": "very-likely"
          },
          "violence-historical": {
            "status": "evaluated",
            "someScore": 0.97,
            "allScore": 0.97,
            "likelihood": "very-likely"
          },
          "violence-graphic": {
            "status": "evaluated",
            "someScore": 0.9,
            "allScore": 0.9,
            "likelihood": "very-likely"
          }
        }
      },
      "self-harm": {
        "status": "evaluated",
        "score": 0,
        "likelihood": "very-unlikely"
      },
      "harassment": {
        "status": "evaluated",
        "score": 0.02,
        "likelihood": "very-unlikely"
      },
      "hate": {
        "status": "evaluated",
        "score": 0.73,
        "likelihood": "likely"
      },
      "criminal-activity": {
        "status": "evaluated",
        "score": 0.02,
        "likelihood": "very-unlikely"
      },
      "personal-information": {
        "status": "evaluated",
        "score": 0.03,
        "likelihood": "very-unlikely"
      },
      "profanity": {
        "status": "evaluated",
        "score": 0.04,
        "likelihood": "very-unlikely"
      }
    },
    "score": 0.9,
    "policy": {
      "score": 0.81,
      "categories": {
        "sexual": {
          "score": 0.02,
          "action": "allow"
        },
        "violence": {
          "score": 0.81,
          "action": "hide"
        },
        "self-harm": {
          "score": 0,
          "action": "allow"
        },
        "harassment": {
          "score": 0.02,
          "action": "allow"
        },
        "hate": {
          "score": 0.73,
          "action": "hide"
        },
        "criminal-activity": {
          "score": 0.02,
          "action": "allow"
        }
      }
    },
    "decision": "rejected",
    "action": "hide",
    "manualReviews": []
  }
}

Signing in

Signing out

Cookies on CalmLens

We use essential cookies for sign-in and security. With your permission, functional cookies remember your preferences and Google Analytics measures website use and signups. Optional ad measurement cookies link Google ad clicks to signups. Personalised advertising stays off. Manage cookies