@blueforge-studio/visual-audit

Visual audit core: sidecar, pixel and vision checks for product imagery with one verdict schema (visual-audit/verdict@1) shared by the forge-git correctness gate and the blueforge promotion gate

Package Info

Latest Version0.1.2
Licensenone
Keywords-
Repositorygit+https://github.com/blueforge-studio/blueforge-org.git
Author-
Homepagehttps://github.com/blueforge-studio/blueforge-org#readme
Bugs[object Object]

Versions

VersionPublished
0.1.22026-10-21
0.1.12026-10-19
0.1.02026-10-19

Per-version supply chain

VersionSigSBOMAtt
0.1.2
0.1.1
0.1.0

Click a version to view its details.

Supply chain

Provenance

Published by
web:5
When
2026-10-21T12:32:02Z
sha256 (registry-computed)
c5d745dfaed2bd45726129fce6c11854bbf21ab28b911cd73747de91e929411e

Observed by the registry at publish.

Claimed by the build

The publisher claimed nothing about its build.

Attachments

Signature
none
SBOM
none

Dependencies

Loading dependency graph...

README

@blueforge-studio/visual-audit

One audit core for product imagery, shared by two gates so a verdict means the same thing everywhere:

  • forge-git (correctness, pre-merge): visual-audit check --profile correctness --changed-only origin/main --marker in CI.
  • blueforge (promotion, on upload): auditImage(bytes, subject, { profile: "promotion", vision }).

Design: blueforge docs/plans/2026-10-19-visual-audit.md.

Checks (cheapest first; a T0–T2 error skips the model)

TierCodes
T0 sidecar (blueforge.product.yml)META_MISSING, LABEL_PLACEHOLDER, FILE_MISSING, VARIANT_UNPAIRED, AUTH_PROMOTED
T1 pixels (sharp)MODE_MISMATCH (dark ≤ 90, light ≥ 150 mean luma), MODE_AMBIGUOUS, TOO_SMALL, BLANK, DUPLICATE (dHash ≤ 5), STALE (default 45 days; capture JSON date, else git date), UNREADABLE
T2 capture (<image>.capture.json written by capture tools)BROKEN_IMAGE, ERROR_STATE, LOGIN_WALL
T3 vision (rubric per profile)PII, SECRET, THIRD_PARTY_IP, ERROR_STATE, PLACEHOLDER, LOGIN_WALL, BROKEN_LAYOUT, DEBUG_UI, TEXT_MISMATCH, UNSAFE, BROKEN_IMAGE, MODE_MISMATCH, OUTDATED_BRAND, LOW_VALUE, CAPTION_MISMATCH (+ REVIEW_UNPARSEABLE, REVIEW_ERROR)

Every finding carries an imperative fix. Which codes fail depends on the profile (FAILING); every other error is reported as warn. Promotion scores 0–100; below 70 is warn.

Verdict schema

visual-audit/verdict@1 per image, visual-audit/report@1 per product, visual-audit/run@1 per CLI run — types and zod schemas (VerdictSchema, ReportSchema, RunSchema) are exported.

CLI

visual-audit check [dir] [--profile correctness|promotion] [--product id] [--changed-only <base>]
                   [--vision on|off] [--stale-days n] [--json] [--marker]

Exit 0 pass/warn/uncertain · 1 fail · 3 nothing to audit · 4 error/usage. --marker prints [visual-audit/v1] <base64 run JSON>; decodeMarker(log) reads it back (fgit does).

Capture notes (T2)

A capture tool writes <image>.capture.json next to the image:

{ "capturedAt": "2026-10-19T08:00:00Z", "findings": [{ "code": "BROKEN_IMAGE", "message": "img /logo.svg naturalWidth 0" }] }

Vision

Any evaluator shaped like vision-gateway's VisionEvaluator works (VisionEvaluatorLike). evaluatorFromEnv() uses forge-gateway when FORGE_GATEWAY_URL + FORGE_GATEWAY_TOKEN are set (model VISION_MODEL, default minimax-m3), else vision-gateway's own env selection; @blueforge-studio/vision-gateway is an optional peer. Without an evaluator the CLI runs T0–T2 only (--vision on makes that an error instead).