Evaluate asset
Score a produced visual asset (image / graphic / carousel frame) against its brief — render fidelity + brand-fit — inside an existing eval loop, using the re-ingested asset (the return-leg). One asset (or picked variant) per cycle, verdict + brief-fidelity diagnosis. Not for video (use evaluate-shortform), a landing page (use evaluate-landing-page), live-post engagement (use evaluate-content / evaluate-ad), generating the asset (use produce-asset), or scaffolding the loop (use run-pipeline).From its SKILL.md
npx -y skills add hungv47/meta-skills --skill evaluate-assetAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
2 things to look at
- 14 stars14 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
- runs commandsInstructs the agent to run 3 commands, including `bun scripts/append-loop-result.ts` and 2 more.
SKILL.md
11.6 KB, ~2.6k tokens by cl100k_base, as published. Nobody here has run it
Asset Eval — Orchestrator
<!-- BUDGET_EXCEPTION: Eval skills carry artifact-schema-as-contract (8 body sections + 8-col results row + cross-stack consumer contract) that is load-bearing and cannot move to references/. Asset-eval also surfaces the return-leg gate (score the re-ingested render, never the prompt) + brief-fidelity-vs-render-quality discrimination, which are the point of a render eval. Cycle ledger discipline requires the schema be visible in the SKILL.md body. ~800 tokens over the standard cap is the legitimate cost (matches the evaluate-content / evaluate-ad siblings). -->Evaluation skill. Converts a re-ingested rendered asset into a cycle snapshot + ledger row + narrowly-scoped next action inside an existing eval loop. One asset (or one picked variant) per cycle; the loop closes only when the real render — not the prompt — is scored (CLOSED-LOOP.md §6 return-leg).
Core Question: "Did the rendered asset, scored against its brief's acceptance criteria and brand tokens, realize the brief well enough to keep / discard / watch / block — and what should the next brief-graphic / produce-asset cycle know?"
Why, methodology, history:
references/playbook.md[PLAYBOOK]. Capability metadata (route triggers, prerequisites, load map):routing.yaml.
Critical Gates
- Existing eval loop required.
program.md+context.mdabsent →NEEDS_CONTEXT, recommend/run-pipeline. This skill does not create loops. - Re-ingested asset required (the return-leg). Score the real render, never the prompt. The asset must be attached to its manifest via the return-leg (
asset_picked/assets, perreferences/_shared/execution-fork.md+ CLOSED-LOOP.md §6). Only a prompt/brief present →NEEDS_CONTEXT, route toproduce-asset+ re-ingest (forsvn-preview attach). - Source brief required. The brief-graphic / produce-asset artifact carrying the acceptance criteria to score against. Absent or unreadable →
BLOCKED. - Static-visual lane only. Image / graphic / carousel frame. Video →
evaluate-shortform; landing page →evaluate-landing-page; the asset's live-post engagement →evaluate-content/evaluate-ad. Otherwise →NEEDS_CONTEXT, route to sibling. - One asset (or picked variant) per cycle. When the option-picker returned a variant set, score the picked variant (
asset_picked); the rest archive. A 6-variant render = one cycle on the chosen variant, not six blended. - No fabricated quality claims. Judge only what is present in the attached render. Hallucinated visual detail, invented dimensions, or scoring an un-ingested asset are fabrication.
- Attribution confidence must be explicit. Every verdict states the render engine +
execution_mode, render settings, known-engine failure modes (text mangling, hand artifacts, aspect-ratio drift) as confounders, and confidence:high | medium | low | blocked. - Evaluation does not produce assets. Recommend changes; route re-rendering to
produce-asset, brief/spec changes tobrief-graphic, brand-token questions tocreate-brand.
Responsibility Split
/run-pipeline owns loop setup + program.md / context.md / results.tsv schema + durable learnings. This skill owns post-render brief-fidelity + brand-fit snapshots scored against one re-ingested asset. /produce-asset owns rendering. /brief-graphic owns the brief. /evaluate-content + /evaluate-ad own the asset's live-post performance lanes.
This skill is the formal return-leg gate (execution-fork.md → "Closing the loop"): a brand-critical render is not "done" until scored here against its brief and its realized surface. Inside an eval loop this is the required closing step; without a loop, the lighter fallback is an explicit squint-test against the cited realized surface (realized-surface-grounding.md). Either way, off-brief output is not accepted or committed — score the real re-ingested render, never the prompt.
Inputs
Required: loop slug/path · re-ingested asset path/id (the asset_picked / assets attachment on docs/forsvn/artifacts/marketing/produced-assets/[slug]/manifest.md — image / graphic / carousel frame) · source brief artifact (docs/forsvn/artifacts/marketing/design-briefs/[slug].md) · render engine + execution_mode (brief-only / assisted / direct) · primary metric (brief-fidelity score · acceptance-criteria pass rate · or a downstream metric if the asset is live).
Recommended: brand tokens (brand/BRAND.md + brand/DESIGN.md — palette, type, logo safe-zone, Leaf <10%) · the brief's explicit acceptance criteria (composition, required copy slots, aspect ratio/dimensions, art direction) · variant set with the picked variant flagged · baseline/prior-cycle render · downstream usage context (where the asset will ship).
Outputs
.forsvn/loops/[slug]/evals/YYYY-MM-DD-cycle-N.md + append one row to results.tsv via bun scripts/append-loop-result.ts (8-col helper) + update learnings.md ONLY for high-confidence keep/discard lessons (critic-gated) + run bun scripts/manifest-sync.ts.
Agent Manifest + Dispatch
4 sub-agents: Layer 1 parallel (Metric Ingest + Diagnosis) → Layer 2 (Recommendation) → Layer 3 (Critic). Critic FAIL → revise once; still FAIL → no ledger row + BLOCKED. Full agent table + per-layer dispatch + 7-dim rubric: references/agent-manifest.md. Domain rubric: references/rubric.md. Shared frame: references/_shared/evaluation-loop-rubric.md.
Pre-Dispatch
Canonical: references/_shared/pre-dispatch-protocol.md + references/_shared/eval-loop-spec.md. Hard-blocks (BEFORE Cold Start): missing program.md/context.md → NEEDS_CONTEXT + /run-pipeline; asset not re-ingested (only a prompt) → NEEDS_CONTEXT + /produce-asset + re-ingest; asset is video / landing page → route to evaluate-shortform / evaluate-landing-page; no source brief OR missing asset id → BLOCKED; custom 10+ col results.tsv → warn + hand-edit. Cold Start: 6 bundled questions (loop · asset path/id · source brief path · render engine + execution_mode · primary metric value/baseline · brief acceptance criteria + brand tokens). Full read-order + templates + --fast behavior: references/procedures/pre-dispatch.md [PROCEDURE].
Session execution profile (single-vs-multi): inherit per references/_shared/execution-policy.md.
Artifact Contract
- Path:
.forsvn/loops/[slug]/evals/YYYY-MM-DD-cycle-N.md. Lifecycle:evaluation. - Frontmatter (10 fields):
skill/version/date/status/summary/purpose/lifecycle/use_when/do_not_use_when/upstream/downstream+ provenance (input_artifacts= source brief-graphic artifact + the re-ingested asset +brand/BRAND.md;output_eval: null). - Body sections (8): Title · Verdict · Evidence (6-col table) · What Changed This Cycle · Diagnosis (Brief-Fidelity Check + Render-Quality Signals + Brand-Fit Signals + Confounders) · Next Cycle Recommendation · Results Row (8-col TSV) · Learning Promotion. Verdict block must name the asset id + render engine explicitly (Gate 7); Evidence table scopes to that one asset/variant.
- Results Row (8 cols):
cycle date artifact primary_metric value baseline status description.status∈keep|discard|watch|blocked(Critic Hard Fail otherwise); description includes the asset id + engine tag. - Cross-stack contract: consumed by future asset-eval cycles (fidelity trend) +
brief-graphic --rev=N+1/produce-asset(re-render seeding) + downstreamwrite-social/write-ad(which reference the kept asset) + human reviewers. Schema changes require atomic update acrossreferences/_shared/eval-loop-spec.md+ downstream callers.
Full template + Evidence/Brief-Fidelity/Results/Learning formats + helper invocation: references/format-conventions.md [PROCEDURE].
Results Row Helper
bun scripts/append-loop-result.ts "<loop slug>" \
--artifact evals/YYYY-MM-DD-cycle-N.md \
--metric "<primary metric>" --value "<current>" --baseline "<baseline>" \
--status "<keep|discard|watch|blocked>" --description "<one sentence — include asset id + engine>"
Do not append on Critic FAIL — return BLOCKED instead.
Critic Override Protocol
Operator ships despite critic FAIL (or accepts pass-with-concerns) — log BEFORE writing artifact or ledger row: bun scripts/log-critic-override.ts --skill evaluate-asset …. Three overrides → rubric-revision escalation. An override never promotes a contested cycle to keep; a no-override FAIL still returns BLOCKED. Full protocol: references/_shared/critic-override-protocol.md [PROCEDURE].
Anti-Patterns
references/anti-patterns.md [ANTI-PATTERN] — asset-eval rows + 4 cross-cutting marketing-stack rows. Most common: scoring the prompt instead of the re-ingested render (Gate 2 + Critic Hard Fail), a pretty render that misses a hard brief constraint read as keep (Gate 5 + Critic "Brief-Fidelity Discrimination"), off-brand palette / Leaf overrun ignored (Critic "Render-Quality & Brand-Fit"), scope drift to produce-asset re-rendering (Gate 8 + Critic "Decision Discipline").
Worked Example
End-to-end cycle (return-leg scored, hard-miss → discard, Critic PASS): references/examples/asset-eval-cycle-walkthrough.md.
Durable Rules (protected)
<!-- SLOW_UPDATE_START --> <!-- No pinned rules yet. Populate via the slow-update workflow (see references/slow-update-fence.md). Each pinned rule must (a) be procedural not instance-specific, (b) be earned from a regression or critic-flagged failure, (c) cite the artifact / decision record that justified pinning. --> <!-- SLOW_UPDATE_END -->Completion Status
- DONE — eval artifact written, ledger row appended, critic PASS.
- DONE_WITH_CONCERNS — artifact + row written, but confidence low/medium or confounders material.
- NEEDS_CONTEXT — missing loop, un-ingested asset, source brief, or asset id; OR the asset is video / a landing page / a live-post-engagement question (route to right sibling).
- BLOCKED — contradictory data, no re-ingested asset, filesystem failure, or critic failed after revision.
References
references/{playbook, agent-manifest, rubric, format-conventions, anti-patterns}.md+procedures/{pre-dispatch, dispatch-mechanics}.mdreferences/_shared/{eval-loop-spec, evaluation-loop-rubric, pre-dispatch-protocol, critic-override-protocol, quality-dashboard-spec, execution-fork}.md- Siblings:
produce-asset+brief-graphic(upstream/downstream),run-pipeline(loop scaffolding),evaluate-{content, ad, shortform, landing-page}(sibling lanes)
What ships with it: 31 files
295.9 KB alongside SKILL.md, 7 of them executable
agents/
- critic-agent.md5.2 KB
- diagnosis-agent.md4.0 KB
- metric-ingest-agent.md4.1 KB
- recommendation-agent.md4.8 KB
references/
- agent-manifest.md3.2 KB
- anti-patterns.md7.2 KB
- examples/asset-eval-cycle-walkthrough.md12.7 KB
- format-conventions.md12.7 KB
- playbook.md7.9 KB
- procedures/dispatch-mechanics.md10.6 KB
- procedures/pre-dispatch.md7.9 KB
- rubric.md11.1 KB
- _shared/artifact-contract-template.md28.8 KB
- _shared/critic-override-protocol.md2.7 KB
- _shared/eval-loop-spec.md12.2 KB
- _shared/evaluation-loop-rubric.md6.2 KB
- _shared/execution-fork.md5.6 KB
- _shared/execution-policy.md7.0 KB
- _shared/manifest-spec.md29.2 KB
- _shared/meter-instrumentation.md5.0 KB
- _shared/pre-dispatch-protocol.md20.2 KB
- _shared/quality-dashboard-spec.md4.2 KB
- _shared/realized-surface-grounding.md3.9 KB
scripts/
- append-loop-result.tsruns7.4 KB
- bootstrap-experience.tsruns3.6 KB
- forsvn-hosted.tsruns4.3 KB
- lib/hosted-api.tsruns8.7 KB
- lib/path-parser.tsruns11.6 KB
- log-critic-override.tsruns6.0 KB
- manifest-sync.tsruns33.1 KB
- routing.yaml4.8 KB