<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:fh="http://purl.org/syndication/history/1.0"><channel><title>Mizan | Blog</title><description/><link>https://ghchinoy.github.io/</link><language>en</language><fh:complete/><atom:link rel="self" href="https://ghchinoy.github.io/mizan/blog/rss.xml"/><item><title>Developing for Mizan: extending the core</title><link>https://ghchinoy.github.io/mizan/blog/05-developing-for-mizan/</link><guid isPermaLink="true">https://ghchinoy.github.io/mizan/blog/05-developing-for-mizan/</guid><description>For contributors who do need to touch the core: an orientation to Mizan&apos;s architecture and where new metric kinds and behaviors plug in.</description><pubDate>Wed, 11 Nov 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;The &lt;a href=&quot;https://ghchinoy.github.io/mizan/blog/04-contribute-a-template-pack/&quot;&gt;previous piece&lt;/a&gt; made a promise:
you can extend Mizan without touching the core. A template pack is data, so
authoring one is a YAML file and a pull request against a separate repository, not
a change to the CLI. That covers most of what people want to add.&lt;/p&gt;
&lt;p&gt;This piece is for the other case. Sometimes the thing you want to add is not a
new template but a new kind of check, a new place results can live, or a new
behavior in the engine that runs the judge. That is a code change to &lt;code dir=&quot;auto&quot;&gt;mizan&lt;/code&gt;
itself, and it is the deep end of the series. The good news is that the core was
built to be extended along a small number of named seams, and once you can see
them, the change you want to make is usually smaller than you expect.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;the-shape-of-the-codebase&quot;&gt;The shape of the codebase&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Mizan is a single Go module. The entry points live under &lt;code dir=&quot;auto&quot;&gt;cmd/mizan/&lt;/code&gt;, the domain
logic lives under &lt;code dir=&quot;auto&quot;&gt;internal/&lt;/code&gt;, and one rule holds the whole thing together: the
command layer depends on a very small set of types and nothing else. Concretely,
&lt;code dir=&quot;auto&quot;&gt;cmd/mizan&lt;/code&gt; imports &lt;code dir=&quot;auto&quot;&gt;registry.Service&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;eval.Engine&lt;/code&gt;, and &lt;code dir=&quot;auto&quot;&gt;config&lt;/code&gt;, and never
imports the SQLite store, the sync code, the pack codec, or the Vertex AI protos
directly. The
&lt;a href=&quot;https://ghchinoy.github.io/mizan/reference/architecture-final/&quot;&gt;architecture reference&lt;/a&gt; calls this the
dependency direction, and it is enforced as an acceptance check rather than left
to good intentions.&lt;/p&gt;
&lt;p&gt;The place where concrete backends get attached to those abstract types is a
single file, &lt;code dir=&quot;auto&quot;&gt;internal/wire/wire.go&lt;/code&gt;, the composition root. It is the one spot
that knows a &lt;code dir=&quot;auto&quot;&gt;registry.Service&lt;/code&gt; is backed by SQLite, that the eval engine talks to
a regional Vertex client and a separate global one, and that the results store is
a SQLite file. The comment at the top of the package states the payoff plainly:
swapping SQLite for a future store, or changing the eval transport, “is a one-line
change here and nowhere else.” When you add something to the core, you are almost
always doing one of two things: implementing an interface, then wiring the
concrete type in &lt;code dir=&quot;auto&quot;&gt;wire.go&lt;/code&gt;, or adding a branch to a dispatch that already exists.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;the-metric-registry-and-its-three-seams&quot;&gt;The metric registry and its three seams&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;The registry is where metric templates are stored, authored, imported, and
exported. Everything the CLI and the eval engine touch goes through one facade,
&lt;code dir=&quot;auto&quot;&gt;registry.Service&lt;/code&gt;. Underneath it sit three separate interfaces, and the split is
the load-bearing design decision of the collaboration layer
(&lt;a href=&quot;https://github.com/ghchinoy/mizan/blob/main/docs/collaboration-design.md&quot;&gt;collaboration-design.md&lt;/a&gt;
holds the rationale):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;Store&lt;/code&gt; is local runtime persistence, the thing the eval engine reads at eval
time. Its methods are &lt;code dir=&quot;auto&quot;&gt;Get&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;List&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;Put&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;Delete&lt;/code&gt;, and a sync-friendly
&lt;code dir=&quot;auto&quot;&gt;ListChangedSince&lt;/code&gt;. SQLite implements it today; a future Firestore store is a
drop-in.&lt;/li&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;Codec&lt;/code&gt; is serialization, &lt;code dir=&quot;auto&quot;&gt;MetricTemplate&lt;/code&gt; to and from bytes, with a single
&lt;code dir=&quot;auto&quot;&gt;Marshal&lt;/code&gt; / &lt;code dir=&quot;auto&quot;&gt;Unmarshal&lt;/code&gt; / &lt;code dir=&quot;auto&quot;&gt;Ext&lt;/code&gt; shape. YAML implements it today.&lt;/li&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;SyncBackend&lt;/code&gt; is the contribution channel, where shared templates come from and
go to. Its methods are &lt;code dir=&quot;auto&quot;&gt;Load&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;Save&lt;/code&gt;, and &lt;code dir=&quot;auto&quot;&gt;Describe&lt;/code&gt;. The git pack backend
implements it today.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These are not aspirational interfaces from a design doc. They are the exact
signatures shipping in &lt;code dir=&quot;auto&quot;&gt;internal/registry/store.go&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;codec.go&lt;/code&gt;, and &lt;code dir=&quot;auto&quot;&gt;sync.go&lt;/code&gt;.
The reason to keep them apart is that each answers a different question, and a new
contributor usually only needs to change one. If you want templates to persist
somewhere other than a local SQLite file, you implement &lt;code dir=&quot;auto&quot;&gt;Store&lt;/code&gt; and change one
constructor in &lt;code dir=&quot;auto&quot;&gt;wire.OpenService&lt;/code&gt;. If you want a new on-disk format, you implement
&lt;code dir=&quot;auto&quot;&gt;Codec&lt;/code&gt;. Nothing in the command layer or the eval engine has to change, because
neither of them names the concrete type.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;the-evaluation-engine-and-dispatch-by-kind&quot;&gt;The evaluation engine and dispatch by kind&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;The engine turns a stored &lt;code dir=&quot;auto&quot;&gt;MetricTemplate&lt;/code&gt; into a real evaluation. It depends only
on the registry domain model and two narrow, mockable client seams:
&lt;code dir=&quot;auto&quot;&gt;EvaluationClient&lt;/code&gt; over the native Vertex AI &lt;code dir=&quot;auto&quot;&gt;EvaluateInstances&lt;/code&gt; RPC, and
&lt;code dir=&quot;auto&quot;&gt;GenaiClient&lt;/code&gt; over the single &lt;code dir=&quot;auto&quot;&gt;GenerateContent&lt;/code&gt; call the strict custom-schema path
uses. Because both are interfaces, the engine’s spec building and result mapping
are unit-tested with fakes and no network at all.&lt;/p&gt;
&lt;p&gt;The heart of the engine is one method, &lt;code dir=&quot;auto&quot;&gt;Engine.dispatch&lt;/code&gt;, and it is worth reading
in full because it is the seam every metric kind attaches to:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;func&lt;/span&gt;&lt;span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;e &lt;/span&gt;&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;Engine) &lt;/span&gt;&lt;span&gt;dispatch&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;ctx&lt;/span&gt;&lt;span&gt; context.Context, &lt;/span&gt;&lt;span&gt;tmpl&lt;/span&gt;&lt;span&gt; registry.MetricTemplate, &lt;/span&gt;&lt;span&gt;inst&lt;/span&gt;&lt;span&gt; Instance, &lt;/span&gt;&lt;span&gt;model&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;rc&lt;/span&gt;&lt;span&gt; runConfig) (Result, &lt;/span&gt;&lt;/span&gt;&lt;span&gt;error&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;switch&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;tmpl&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Kind&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;case&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;registry&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;KindPointwise&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;e&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;runPointwise&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;ctx&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;tmpl&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;inst&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;model&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;case&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;registry&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;KindRubric&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// ... rubric-detail routing ...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;e&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;runRubric&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;ctx&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;tmpl&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;inst&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;model&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;case&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;registry&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;KindCustomSchema&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;e&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;runCustomSchema&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;ctx&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;tmpl&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;inst&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;model&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;case&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;registry&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;KindPairwise&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;e&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;runPairwise&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;ctx&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;tmpl&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;inst&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;model&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;case&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;registry&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;KindHeuristic&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;runHeuristic&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;tmpl&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;inst&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; Result{}, &lt;/span&gt;&lt;span&gt;fmt&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Errorf&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;eval: unknown metric kind &lt;/span&gt;&lt;span&gt;%q&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;tmpl&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Kind&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;A metric kind is a value of &lt;code dir=&quot;auto&quot;&gt;registry.MetricKind&lt;/code&gt; plus a branch in this switch.
The shared work, resolving which autorater model to use, timing the run,
validating that every supplied field maps to a placeholder, and recording the
applied autorater, all happens once in &lt;code dir=&quot;auto&quot;&gt;Engine.Run&lt;/code&gt; before dispatch. Each per-kind
runner only has to produce a &lt;code dir=&quot;auto&quot;&gt;Result&lt;/code&gt;. That is why adding a kind is a bounded
change: you are filling in one case, not rewriting the engine.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;a-concrete-walkthrough-how-kind-heuristic-was-added&quot;&gt;A concrete walkthrough: how &lt;code dir=&quot;auto&quot;&gt;kind: heuristic&lt;/code&gt; was added&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;The newest metric kind is a good worked example, because it landed as a real
change against exactly the seams above. A heuristic is a deterministic,
credential-free check: does this text contain a string, match a regex, equal a
value, parse as JSON, or validate against a JSON Schema. There is no model and no
Vertex call. Here is everything it took to add it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The registry got a new kind and its config.&lt;/strong&gt; &lt;code dir=&quot;auto&quot;&gt;internal/registry/model.go&lt;/code&gt;
declares &lt;code dir=&quot;auto&quot;&gt;KindHeuristic&lt;/code&gt; alongside the four existing kinds, teaches &lt;code dir=&quot;auto&quot;&gt;NormalizeKind&lt;/code&gt;
to accept it, and adds a &lt;code dir=&quot;auto&quot;&gt;HeuristicSpec&lt;/code&gt; field to &lt;code dir=&quot;auto&quot;&gt;MetricTemplate&lt;/code&gt; that holds the
check type and its operand. The check type is a small closed enum
(&lt;code dir=&quot;auto&quot;&gt;contains&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;regex&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;equals&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;json-valid&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;json-schema-valid&lt;/code&gt;) validated at
the authoring boundary so a typo fails when you create the template, not when you
run it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The engine got a new case.&lt;/strong&gt; The &lt;code dir=&quot;auto&quot;&gt;KindHeuristic&lt;/code&gt; branch in &lt;code dir=&quot;auto&quot;&gt;dispatch&lt;/code&gt; calls
&lt;code dir=&quot;auto&quot;&gt;runHeuristic&lt;/code&gt;. One detail here is the most important interface decision in the
whole change: &lt;code dir=&quot;auto&quot;&gt;runHeuristic&lt;/code&gt; is a free function, not a method on &lt;code dir=&quot;auto&quot;&gt;*Engine&lt;/code&gt;. That
is deliberate. Because it is not a method, it structurally cannot reach
&lt;code dir=&quot;auto&quot;&gt;e.client&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;e.globalClient&lt;/code&gt;, or &lt;code dir=&quot;auto&quot;&gt;e.genai&lt;/code&gt;, so the “no network, no credentials”
guarantee is enforced by the compiler rather than by a comment. &lt;code dir=&quot;auto&quot;&gt;Engine.Run&lt;/code&gt; also
skips model resolution entirely for a heuristic, so a heuristic run stamps no
applied autorater and never validates a model it will not use.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The command layer got authoring flags and an honest pre-flight.&lt;/strong&gt; &lt;code dir=&quot;auto&quot;&gt;registry create&lt;/code&gt; gained &lt;code dir=&quot;auto&quot;&gt;--heuristic-type&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;--heuristic-target&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;--heuristic-value&lt;/code&gt;, and
the JSON-Schema operands, and &lt;code dir=&quot;auto&quot;&gt;eval run&lt;/code&gt; prints a pre-flight line that says no
autorater is involved.&lt;/p&gt;
&lt;p&gt;That is the whole surface area: one enum value and a struct in the registry, one
switch case and a free function in the engine, and a handful of flags in the CLI.
Now watch it run, with no project and no credentials configured:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;$ mizan registry create \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--id checks/ends-with-next \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--name &quot;Ends with a Read next section&quot; \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--kind heuristic --modality text \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--input &quot;response:text:true&quot; \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--heuristic-type contains \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--heuristic-target response \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--heuristic-value &quot;Read next&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;$ mizan eval run --metric checks/ends-with-next \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--field response=&quot;The mechanics hold steady. Read next&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;mizan: heuristic: no autorater (deterministic contains check, no network)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Score:        1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Explanation:  matched: text contains &quot;Read next&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;$ mizan eval run --metric checks/ends-with-next \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--field response=&quot;An abrupt stop with no pointer onward.&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;mizan: heuristic: no autorater (deterministic contains check, no network)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Score:        0&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Explanation:  no match: text does not contain &quot;Read next&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;The verdict maps to a &lt;code dir=&quot;auto&quot;&gt;Score&lt;/code&gt; of &lt;code dir=&quot;auto&quot;&gt;1.0&lt;/code&gt; for pass and &lt;code dir=&quot;auto&quot;&gt;0.0&lt;/code&gt; for fail, on purpose.
By reusing the same &lt;code dir=&quot;auto&quot;&gt;*float32&lt;/code&gt; score every other kind returns, a heuristic member
flows unchanged through eval-set aggregation, gating thresholds, and the results
store. It is a first-class metric, not a special case bolted onto the side. If you
pass &lt;code dir=&quot;auto&quot;&gt;--model&lt;/code&gt; to a heuristic run, the CLI tells you it is ignored rather than
silently pretending to honor it:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;$ mizan eval run --metric checks/ci --field response=&quot;all OK here&quot; --model gemini-2.5-pro&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;mizan: warning: --model is ignored for kind:heuristic metrics (deterministic, no autorater)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;The invariant that this path never touches the network is not a claim to take on
faith. The end-to-end test in &lt;code dir=&quot;auto&quot;&gt;cmd/mizan/eval_heuristic_cli_test.go&lt;/code&gt; drives the
real Cobra commands with no &lt;code dir=&quot;auto&quot;&gt;PROJECT_ID&lt;/code&gt; and no Application Default Credentials
set, for every check type, and asserts the exact score. If the path ever reached
Vertex, that test would fail:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;$ go test ./cmd/mizan/ -run TestCLIHeuristic -count=1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;ok    github.com/ghchinoy/mizan/cmd/mizan  0.511s&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h2 id=&quot;where-results-live&quot;&gt;Where results live&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Runs persist by default, and the results store follows the same seam pattern as
the registry. &lt;code dir=&quot;auto&quot;&gt;wire.OpenResultService&lt;/code&gt; returns a &lt;code dir=&quot;auto&quot;&gt;results.Service&lt;/code&gt; over a backend
selected by config. Today that is SQLite. A Firestore leg is a visible deferred
dependency, so an unknown backend returns a clear error rather than a silent stub.
The lesson for a contributor is that “add a place results can live” is the same
shape of change as “add a place templates can live”: implement the store
interface, wire the one constructor, leave everything above it alone.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;the-contribution-gates&quot;&gt;The contribution gates&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Before you open a pull request, run the checks CI runs. They all have Makefile
targets, and the
&lt;a href=&quot;https://github.com/ghchinoy/mizan/blob/main/CONTRIBUTING.md&quot;&gt;CONTRIBUTING guide&lt;/a&gt;
maps each CI gate to its local command:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;make&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fmt-check&lt;/span&gt;&lt;span&gt;   &lt;/span&gt;&lt;span&gt;# gofmt cleanliness&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;make&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;vet&lt;/span&gt;&lt;span&gt;         &lt;/span&gt;&lt;span&gt;# go vet ./...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;make&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;test&lt;/span&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;# unit tests&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;make&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;lint&lt;/span&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;# golangci-lint (v2)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;make&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;vuln&lt;/span&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;# govulncheck&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Two gates are worth knowing before they surprise you. The coverage floor is a soft
nudge: CI prints total coverage and warns if it dips, but never fails the build on
coverage alone. The doc-drift guard is not soft. If your pull request changes
&lt;code dir=&quot;auto&quot;&gt;cmd/mizan/&lt;/code&gt; or &lt;code dir=&quot;auto&quot;&gt;internal/eval/&lt;/code&gt; but updates none of the tracked docs, the job
fails. That is the guard doing its job: a change to the engine or the command
surface is expected to move a guide with it. If the docs genuinely do not apply,
you override it explicitly with a &lt;code dir=&quot;auto&quot;&gt;docs: N/A&lt;/code&gt; label or a &lt;code dir=&quot;auto&quot;&gt;docs: N/A&lt;/code&gt; line in the
pull request body. The build is CGO-free and the toolchain is pinned in &lt;code dir=&quot;auto&quot;&gt;go.mod&lt;/code&gt;,
so local and CI builds use the same compiler, and the author is never the
reviewer.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;read-next&quot;&gt;Read next&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;You have now seen the whole arc: run one eval, place your role on the spectrum,
follow a per-persona playbook, contribute a pack without touching the core, and
now extend the core itself. The two references that go deeper are the
&lt;a href=&quot;https://ghchinoy.github.io/mizan/reference/architecture-final/&quot;&gt;architecture reference&lt;/a&gt;, which lays out the
module layout and the engine dispatch, and
&lt;a href=&quot;https://github.com/ghchinoy/mizan/blob/main/CONTRIBUTING.md&quot;&gt;CONTRIBUTING.md&lt;/a&gt;,
which is the contributor-ready account of the gates. The best way in is to read
&lt;code dir=&quot;auto&quot;&gt;internal/eval/engine.go&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;internal/wire/wire.go&lt;/code&gt; side by side: one shows the
dispatch you extend, the other shows the single place you wire what you add.&lt;/p&gt;
&lt;hr&gt;
&lt;div&gt;&lt;h3 id=&quot;sidebar-graded-by-mizan&quot;&gt;Sidebar: graded by Mizan&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Each hands-on piece in this series closes by grading itself with Mizan. The draft
you just read was scored against a &lt;code dir=&quot;auto&quot;&gt;rubric&lt;/code&gt; metric that encodes the editorial
standard for these posts. You can build the same rubric with shipped commands:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;mizan&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;registry&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;create&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--id&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;docs-quality/technical-explanation&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--kind&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;rubric&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--name&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Technical explanation quality&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--rubric-group&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;quality=Is the explanation direct, stating claims not announcing them?;&lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Is it dense with no cuttable filler?;Is it accurate and correctly scoped?;&lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Does it read as written by someone who did the thing?&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--model&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;gemini-2.5-flash&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;mizan&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;eval&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;run&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--metric&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;docs-quality/technical-explanation&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--field&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;response=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;&amp;#x3C;draft of this article&gt;&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--rubric-detail&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Be clear about what that score does and does not mean. The rubric grades surface
style and clarity. It does not verify that the substance is correct, that the code
paths described match the shipped source, or that the walkthrough compiles. A clean
style score sits alongside the live-command checks and human review that catch
those things; it does not replace them. Read the scorecard as a repeatable check
that catches the obvious problems, not as a measurement of whether the piece is
right.&lt;/p&gt;
&lt;p&gt;(Any scorecard numbers shown in this series are manual review estimates unless
labeled as measured; the automated readability tooling was unavailable at the
time of writing.)&lt;/p&gt;
</content:encoded><category>architecture</category><category>contributing</category><category>adaptive-rubrics</category></item><item><title>Turn a writing skill into an eval: grading this series with Mizan</title><link>https://ghchinoy.github.io/mizan/blog/04-5-turn-a-writing-skill-into-an-eval/</link><guid isPermaLink="true">https://ghchinoy.github.io/mizan/blog/04-5-turn-a-writing-skill-into-an-eval/</guid><description>The capstone closes the loop: take the editorial standard behind these posts and encode it as a Mizan rubric that grades the series itself.</description><pubDate>Wed, 28 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Every hands-on piece in this series closes with a “graded by Mizan” sidebar. This
piece is about that sidebar. The
&lt;a href=&quot;https://ghchinoy.github.io/mizan/blog/04-contribute-a-template-pack/&quot;&gt;previous piece&lt;/a&gt; showed that a metric
template is data you can author, validate, and share without touching the core.
Here we point that machinery back at the series and answer a fair question: what
is the rubric in the sidebar, where did it come from, and what does its score
actually mean?&lt;/p&gt;
&lt;p&gt;The short version is that the editorial standard these posts are written to is
itself a set of criteria, and criteria are exactly what a Mizan &lt;code dir=&quot;auto&quot;&gt;rubric&lt;/code&gt; metric
holds. So the standard can stop living in a reviewer’s head and become a template
you run. This is the strongest form of dogfooding the series has: the product
grades the writing that documents the product.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;the-standard-is-already-a-rubric&quot;&gt;The standard is already a rubric&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;The posts are held to a small, named editorial standard. Five dimensions carry
most of it. &lt;strong&gt;Directness&lt;/strong&gt;: state a claim plainly instead of announcing that you
are about to make it. &lt;strong&gt;Rhythm&lt;/strong&gt;: vary sentence length instead of marching in a
metronome. &lt;strong&gt;Density&lt;/strong&gt;: make every sentence load-bearing, with no cuttable filler.
&lt;strong&gt;Authenticity&lt;/strong&gt;: read as someone who actually did the thing. &lt;strong&gt;Trust&lt;/strong&gt;: state
facts and let the reader conclude, without hype.&lt;/p&gt;
&lt;p&gt;Written out like that, the standard is a list of yes-or-no questions about a
draft. That is a rubric group. Encoding it is one &lt;code dir=&quot;auto&quot;&gt;registry create&lt;/code&gt;, exactly the
shape &lt;a href=&quot;https://ghchinoy.github.io/mizan/blog/04-contribute-a-template-pack/&quot;&gt;piece four&lt;/a&gt; used for a support
reply:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;mizan&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;registry&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;create&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--id&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;docs-quality/technical-explanation&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--kind&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;rubric&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--name&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Technical explanation quality&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--description&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Grades a technical blog draft on the series editorial standard.&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--prompt&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;Evaluate this technical blog draft against the editorial criteria. Draft: {{response}}&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--input&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;response:text:true&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--rubric-group&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;editorial=The draft states its claims plainly instead of announcing them.;Sentence lengths vary instead of marching in a metronome.;Every sentence is load-bearing, with no cuttable filler.;It reads as written by someone who did the thing.;It states facts and lets the reader conclude, without hype.&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--tag&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;docs-quality&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--tag&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;editorial&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--license&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Apache-2.0&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--author&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Build Evals with Mizan&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--model&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;gemini-2.5-flash&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;That is the whole metric. It is a prompt, one declared input, and five named
criteria. Nothing in it is executable, so anyone can read it, diff it, and reason
about what it scores before they run it.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;let-the-model-draft-the-criteria&quot;&gt;Let the model draft the criteria&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Writing five criteria by hand is fine when you already know the standard. When you
are deriving a rubric from a longer guidance document, Mizan has an authoring aid:
&lt;code dir=&quot;auto&quot;&gt;rubric generate&lt;/code&gt; asks Gemini to draft candidate criteria aligned to a
representative prompt, then writes a draft YAML for you to review. It touches the
registry for nothing; it only proposes. You keep your non-negotiables by unioning
them in with &lt;code dir=&quot;auto&quot;&gt;--add-criterion&lt;/code&gt;:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;mizan&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;rubric&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;generate&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--sample&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;A technical blog post that explains a Mizan feature to a Google Cloud developer, in direct, dense, plain-spoken prose.&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--id&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;docs-quality/technical-explanation-draft&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--out&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;draft-rubric.yaml&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--recipe&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;text_quality_v1&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--group-name&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;editorial&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--add-criterion&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;It reads as written by someone who did the thing.&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--add-criterion&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;It states facts and lets the reader conclude, without hype.&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;When I ran that, Gemini drafted a dozen candidate criteria (directness, density,
plain-spokenness, relevance, accuracy, and so on) and printed them in a table
whose &lt;code dir=&quot;auto&quot;&gt;ORIGIN&lt;/code&gt; column marks each row &lt;code dir=&quot;auto&quot;&gt;adaptive-generated&lt;/code&gt;, followed by the two
&lt;code dir=&quot;auto&quot;&gt;--add-criterion&lt;/code&gt; rows marked &lt;code dir=&quot;auto&quot;&gt;hand-authored&lt;/code&gt;. That separation is the point: the
draft keeps the model’s suggestions apart from your non-negotiables, and it records
a &lt;code dir=&quot;auto&quot;&gt;rubricProvenance&lt;/code&gt; block noting the generator model, the recipe, and a hash of
the sample prompt, so a reviewer can see later what came from the model and what
came from you. Adaptive generation is an authoring aid, not a source of truth:
Gemini drafts, you review and edit, and the moment you freeze the criteria the
template is an ordinary, reproducible static rubric. If you would rather generate
and freeze in one step, &lt;code dir=&quot;auto&quot;&gt;eval adaptive&lt;/code&gt; does the whole thing and, with &lt;code dir=&quot;auto&quot;&gt;--save-as&lt;/code&gt;,
writes the result straight into the registry:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;mizan&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;eval&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;adaptive&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--prompt&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;A technical blog paragraph that explains a Mizan concept, in direct, dense prose.&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--response&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;&amp;#x3C;a paragraph to score&gt;&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--recipe&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;text_quality_v1&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--group-name&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;editorial&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--save-as&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;docs-quality/technical-explanation-adaptive&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;That single command makes one generation call and one eval call, prints the score
and a &lt;code dir=&quot;auto&quot;&gt;mizan: froze generated rubric as docs-quality/technical-explanation-adaptive&lt;/code&gt;
line, and leaves a reusable template behind. The
&lt;a href=&quot;https://ghchinoy.github.io/mizan/guides/user-guide/#adaptive-rubrics-authoring-aid&quot;&gt;adaptive rubrics section&lt;/a&gt;
of the user guide covers the recipes and the provenance record in full, and the
shipped &lt;a href=&quot;https://ghchinoy.github.io/mizan/guides/agent-skills/&quot;&gt;rubric-generate-from-brand-book&lt;/a&gt; skill drives
exactly this loop when you ask an agent to derive a rubric from a guidance doc.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;grade-a-real-draft&quot;&gt;Grade a real draft&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;With the hand-authored metric frozen, run it against a real draft. Adding
&lt;code dir=&quot;auto&quot;&gt;--rubric-detail&lt;/code&gt; returns a verdict per criterion instead of one blended number.
The draft below is the actual opening of &lt;a href=&quot;https://ghchinoy.github.io/mizan/blog/01-why-evals/&quot;&gt;piece one&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;You shipped a generated image, a marketing line, or a model response, and you
asked yourself whether it was good enough. You answered by eye, once, and moved
on. The next person on your team answered differently. Neither of you wrote down
what “good enough” meant, so neither answer travels past the moment you made it.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Scoring it produced the following, pasted exactly as the CLI printed it:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;$ mizan eval run --metric docs-quality/technical-explanation \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--field response=&quot;You shipped a generated image, a marketing line, ...&quot; --rubric-detail&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;mizan: autorater → project=ghchinoy-genai-sa (src=env-file) location=global (src=global-path) model=gemini-2.5-flash (path=genai)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;mizan: samplingCount=4 is ignored on the genai/global structured path (it has no sampling-count concept); samplingCount applies only to the native evaluation path&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;mizan: flipEnabled is ignored on the genai/global structured path (it has no flip concept); flipEnabled applies only to the native pairwise evaluation path&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Score:        5&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Explanation:  This is an exceptionally strong opening for a technical blog post. It immediately engages the reader by presenting a highly relatable and common problem in a clear, concise, and authentic voice. The language is direct, every sentence serves a purpose, and it effectively sets the stage for further discussion without any unnecessary fluff or hype. The slight similarity in length of two sentences is a minor point in an otherwise excellent draft.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Per-criterion:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;GROUP      CRITERION                                                        SCORE  RATIONALE&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;editorial  The draft states its claims plainly instead of announcing them.  5      The draft immediately presents a common scenario and problem without any introductory announcements or preambles.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;editorial  Sentence lengths vary instead of marching in a metronome.        4      There is some variation in sentence length (23, 9, 9, 26 words), though two consecutive sentences are quite short and similar, slightly impacting flow.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;editorial  Every sentence is load-bearing, with no cuttable filler.         5      Every sentence directly contributes to establishing the problem and its implications; there is no discernible filler or redundant phrasing.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;editorial  It reads as written by someone who did the thing.                5      The scenario described is highly relatable and specific to real-world challenges in evaluating outputs, suggesting direct experience from the author.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;editorial  It states facts and lets the reader conclude, without hype.      5      The draft presents a common problem in a straightforward, factual manner without any hype or exaggerated language, allowing the reader to infer the significance.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Two things about that run are worth noticing. The autorater line reports
&lt;code dir=&quot;auto&quot;&gt;location=global&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;path=genai&lt;/code&gt;: &lt;code dir=&quot;auto&quot;&gt;--rubric-detail&lt;/code&gt; uses the structured
generative path rather than the native sampling path, which is why the run also
notes that &lt;code dir=&quot;auto&quot;&gt;samplingCount&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;flipEnabled&lt;/code&gt; do not apply here. And the
per-criterion table is the reason to reach for the flag at all. A single “5” tells
you little. The Rhythm row scoring a 4, with the judge counting the sentence
lengths (23, 9, 9, 26 words) and flagging the two short middle sentences, is the
kind of specific, actionable note that makes the score useful as revision feedback
rather than a grade you file away.&lt;/p&gt;
&lt;p&gt;Because Mizan persists every run by default, that feedback compounds. Score a
draft, take the Rhythm note, rewrite the two short sentences, and rerun the same
metric. &lt;code dir=&quot;auto&quot;&gt;mizan results list&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;mizan results show &amp;#x3C;run-id&gt;&lt;/code&gt; let you look back at
what each revision scored and why, so you can see a dimension climb as you work
rather than guessing whether an edit helped. The standard is the same each time,
which is the whole reason to write it down: the check is repeatable, so the
comparison across drafts is honest.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;ship-it-so-others-can-run-it&quot;&gt;Ship it so others can run it&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;A rubric that only grades this series is a curiosity. The value is that anyone can
run the same standard on their own writing, and that is the contribution loop from
&lt;a href=&quot;https://ghchinoy.github.io/mizan/blog/04-contribute-a-template-pack/&quot;&gt;piece four&lt;/a&gt;, applied to a rubric
instead of a support metric. Scaffold a pack, add the metric, and validate it with
no credentials:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;mizan&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;pack&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;init&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;packs/docs-quality&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--name&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;docs-quality&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;mizan&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;pack&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;add&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;packs/docs-quality&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;docs-quality/technical-explanation&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;mizan&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;pack&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;validate&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;packs/docs-quality&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;initialized pack &quot;packs/docs-quality&quot; (namespace &quot;docs-quality&quot;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;1 written, 0 skipped (dest: packs/docs-quality)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;written: docs-quality/technical-explanation -&gt; templates/technical-explanation.yaml&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;OK: no defects found.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;0 error(s), 0 warning(s)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;The validated pack is a directory of data you commit and open as a pull request,
the same way the &lt;a href=&quot;https://github.com/ghchinoy/mizan-templates/tree/main/packs/google-brand&quot;&gt;google-brand pack&lt;/a&gt;
travels. On the consuming side, importing it is one command, previewable with
&lt;code dir=&quot;auto&quot;&gt;--dry-run&lt;/code&gt; first:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;mizan&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;registry&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;packs/docs-quality&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;1 inserted, 0 updated, 0 skipped, 0 conflicted, 0 unchanged, 0 forked (source: packs/docs-quality)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;inserted: docs-quality/technical-explanation&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Now the reader has the exact rubric the series is graded by, ready to point at
their own drafts. The editorial standard stopped being tribal knowledge and became
an artifact that travels with the work.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;what-the-score-does-not-measure&quot;&gt;What the score does not measure&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Here is the honest part, and it is not a footnote. This rubric grades surface style
and clarity. It says nothing about whether the substance is correct.&lt;/p&gt;
&lt;p&gt;A draft can score a clean five while claiming a command that does not exist, citing
a flag that was renamed, or building an argument that does not hold. The judge is
reading prose, not running the CLI and not checking the reasoning. The rubric would
happily award full marks to a fluent, confident, completely wrong paragraph. Style
conformity is necessary, not sufficient: it is real signal about readability and it
catches the obvious problems, but it is silent on the question that matters most,
which is whether the piece is right.&lt;/p&gt;
&lt;p&gt;So the score sits alongside the checks that do test substance, and does not replace
them. Every command in this series was run live and its output pasted verbatim.
Every capability claim was verified against the shipped binary. A human read each
draft for whether the argument earns its conclusion. The rubric is one repeatable
check in that stack, not the top of it. Read a high score as “this reads cleanly,”
never as “this is correct.” Overselling a rubric number as objective quality is the
one failure mode this piece exists to warn against.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;read-next&quot;&gt;Read next&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;You have now seen the contribution loop turned on the series itself: a writing
standard encoded as five criteria, drafted with an authoring aid or hand-authored,
run live with a verdict per dimension, and shipped as a pack a reader can import.
That is as far as you can go without touching Mizan’s code. The
&lt;a href=&quot;https://ghchinoy.github.io/mizan/blog/05-developing-for-mizan/&quot;&gt;final piece&lt;/a&gt; crosses that line: it is the
orientation for contributors who need to add a new metric kind or behavior to the
core, and shows the seams where that work attaches.&lt;/p&gt;
&lt;hr&gt;
&lt;div&gt;&lt;h3 id=&quot;sidebar-graded-by-mizan&quot;&gt;Sidebar: graded by Mizan&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Each hands-on piece in this series closes by grading itself with Mizan. This piece
is the one that explains the sidebar. The draft you just read was scored against
the &lt;code dir=&quot;auto&quot;&gt;docs-quality/technical-explanation&lt;/code&gt; rubric it describes, built with shipped
commands:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;mizan&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;registry&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;create&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--id&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;docs-quality/technical-explanation&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--kind&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;rubric&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--name&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Technical explanation quality&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--rubric-group&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;editorial=The draft states its claims plainly instead of announcing them.;&lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Sentence lengths vary instead of marching in a metronome.;&lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Every sentence is load-bearing, with no cuttable filler.;&lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;It reads as written by someone who did the thing.;&lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;It states facts and lets the reader conclude, without hype.&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--model&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;gemini-2.5-flash&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;mizan&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;eval&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;run&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--metric&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;docs-quality/technical-explanation&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--field&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;response=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;&amp;#x3C;draft of this article&gt;&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--rubric-detail&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Be clear about what that score does and does not mean. The rubric grades surface
style and clarity. It does not verify that the substance is correct, that the
commands run as written, or that the honesty caveat above holds. A clean style
score sits alongside the live-command checks and human review that catch those
things; it does not replace them. Read the scorecard as a repeatable check that
catches the obvious problems, not as a measurement of whether the piece is right.&lt;/p&gt;
&lt;p&gt;(Any scorecard numbers shown in this series are manual review estimates unless
labeled as measured; the per-criterion table above is a real, verbatim Vertex AI
run.)&lt;/p&gt;
</content:encoded><category>evals</category><category>rubrics</category><category>adaptive-rubrics</category></item><item><title>Contribute a template pack: extend Mizan without touching the core</title><link>https://ghchinoy.github.io/mizan/blog/04-contribute-a-template-pack/</link><guid isPermaLink="true">https://ghchinoy.github.io/mizan/blog/04-contribute-a-template-pack/</guid><description>You do not have to fork Mizan to add value to it. This piece walks authoring, validating, and sharing a template pack that others can import.</description><pubDate>Wed, 14 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;The &lt;a href=&quot;https://ghchinoy.github.io/mizan/blog/03a-per-persona-playbooks-part-1/&quot;&gt;asset manager playbook&lt;/a&gt; ended
on a promise. The checks a manager curates for a class of assets are just metric
templates, so the presets a team settles on can travel as a template pack that
creators import once and reuse. This piece keeps that promise. It walks the whole
loop: author a pack, validate it, and share it so anyone can import it, without
changing a line of Mizan’s code.&lt;/p&gt;
&lt;p&gt;That last part is the point. A metric template is data, not code. It is a YAML
file that states a prompt, the inputs it expects, and the criteria a judge should
weigh. A pack is a directory of those files plus a small manifest. Contributing
one means writing data and opening a pull request, which is the lowest-barrier
way to extend Mizan. You are not compiling anything, and you are not touching the
engine that runs your template.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;a-pack-is-a-directory-of-data&quot;&gt;A pack is a directory of data&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Start by scaffolding the pack. &lt;code dir=&quot;auto&quot;&gt;mizan pack init&lt;/code&gt; writes the layout for you:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;mizan&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;pack&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;init&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;packs/acme-support&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--name&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;acme-support&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;initialized pack &quot;packs/acme-support&quot; (namespace &quot;acme-support&quot;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;That creates three things: a &lt;code dir=&quot;auto&quot;&gt;mizan-pack.yaml&lt;/code&gt; manifest, an empty &lt;code dir=&quot;auto&quot;&gt;templates/&lt;/code&gt;
directory, and an empty &lt;code dir=&quot;auto&quot;&gt;evalsets/&lt;/code&gt; directory. The &lt;code dir=&quot;auto&quot;&gt;templates/&lt;/code&gt; directory holds
one YAML file per metric. The &lt;code dir=&quot;auto&quot;&gt;evalsets/&lt;/code&gt; directory holds eval-set manifests, the
grouped, runnable sets &lt;a href=&quot;https://ghchinoy.github.io/mizan/blog/03a-per-persona-playbooks-part-1/&quot;&gt;part one&lt;/a&gt;
introduced; a pack can carry templates, eval-sets, or both. One file per template
is deliberate: it keeps merge conflicts small when several contributors add to the
same pack at once.&lt;/p&gt;
&lt;p&gt;The manifest itself is short. Its &lt;code dir=&quot;auto&quot;&gt;metadata.name&lt;/code&gt; is the namespace, and every
template id in the pack begins with it:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;apiVersion: mizan.dev/v1alpha1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;kind: Pack&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;metadata:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;name: acme-support&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;version: 0.1.0&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;spec:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;requiresApiVersion: mizan.dev/v1alpha1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h2 id=&quot;author-a-template-into-the-pack&quot;&gt;Author a template into the pack&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Author the metric in your local registry first, exactly as the earlier pieces
did, then write it into the pack. Here is a &lt;code dir=&quot;auto&quot;&gt;rubric&lt;/code&gt; metric that scores a
customer-support reply on three separate concerns:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;mizan&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;registry&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;create&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--id&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;acme-support/reply-quality&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--kind&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;rubric&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--name&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Support reply quality&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--description&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Scores a customer-support reply on clarity, tone, and whether it resolves the issue.&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--prompt&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;Evaluate this support reply against the criteria. Customer message: {{customer_message}} Reply: {{reply}}&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--input&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;customer_message:text:true&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--input&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;reply:text:true&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--rubric-group&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;clarity=Is the reply easy to follow?;Does it avoid jargon the customer would not know?&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--rubric-group&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;tone=Is the reply courteous and free of blame?&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--rubric-group&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;resolution=Does the reply actually resolve or advance the issue?&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--tag&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;support&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--tag&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;customer-comms&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--license&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Apache-2.0&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--author&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;ACME Support Guild&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--model&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;gemini-2.5-flash&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Now add it to the pack. &lt;code dir=&quot;auto&quot;&gt;pack add&lt;/code&gt; writes one schema-valid file under
&lt;code dir=&quot;auto&quot;&gt;templates/&lt;/code&gt;:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;mizan&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;pack&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;add&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;packs/acme-support&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;acme-support/reply-quality&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;1 written, 0 skipped (dest: packs/acme-support)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;written: acme-support/reply-quality -&gt; templates/reply-quality.yaml&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;The file it wrote is the whole metric, and it is readable enough to review in a
pull request:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;apiVersion&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;mizan.dev/v1alpha1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;kind&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;MetricTemplate&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;metadata&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;acme-support/reply-quality&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;Support reply quality&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;description&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;Scores a customer-support reply on clarity, tone, and whether it resolves the issue.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;version&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;0.1.0&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;authors&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;ACME Support Guild&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;license&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;Apache-2.0&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;tags&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;support&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;customer-comms&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;spec&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;kind&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;rubric&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;modalities&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;text&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;inputs&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;customer_message&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;modality&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;text&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;required&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;reply&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;modality&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;text&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;required&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;metricPromptTemplate&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;Evaluate this support reply against the criteria. Customer message: {{customer_message}} Reply: {{reply}}&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;rubricGroups&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;clarity&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;Is the reply easy to follow?&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;Does it avoid jargon the customer would not know?&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;resolution&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;Does the reply actually resolve or advance the issue?&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;tone&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;Is the reply courteous and free of blame?&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;autorater&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;model&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;gemini-2.5-flash&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;samplingCount&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;flipEnabled&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Nothing here is executable. It is a prompt, a list of declared inputs, and named
rubric groups. Anyone can read it, diff it, and reason about what it scores before
they ever run it. That is what “templates are data” buys you.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;the-validate-gate&quot;&gt;The validate gate&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Before you share a pack, you check it. &lt;code dir=&quot;auto&quot;&gt;mizan pack validate&lt;/code&gt; runs a set of
structural, identity, semantic, placeholder, and lint checks over every manifest
in the pack, and it does so with no credentials. It never calls Vertex AI, so it
costs nothing and needs no project:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;mizan&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;pack&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;validate&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;packs/acme-support&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;OK: no defects found.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;0 error(s), 0 warning(s)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;The reason this matters is that it is the same gate a shared templates repository
runs in continuous integration on every pull request. Because the checks are
credential-free, they run identically on your laptop and in CI. You catch the
problem before you publish, not after a reviewer’s build turns red.&lt;/p&gt;
&lt;p&gt;Here is the gate earning its place. Say you edit the prompt to reference an
account tier but forget to declare it as an input:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;mizan&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;pack&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;validate&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;packs/acme-support&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;templates/reply-quality.yaml:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;[ERROR] prompt references undeclared placeholder {{account_tier}} (add it to spec.inputs)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;1 error(s), 0 warning(s)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;error: pack validate: 1 error(s) found&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;The command exits non-zero and names the file, the defect, and the fix. Declare
the input (or drop the placeholder) and it passes again. Warnings behave
differently from errors: a missing license or a missing description is reported as
a warning and never fails the gate, so a pack can be accepted with advisories you
choose to act on later. Branch on the exit code for the accept-or-reject decision,
and read the trailing count line for the summary.&lt;/p&gt;
&lt;p&gt;This is exactly the loop the shipped
&lt;a href=&quot;https://ghchinoy.github.io/mizan/guides/agent-skills/&quot;&gt;author-and-validate-a-template-pack&lt;/a&gt; skill drives
when you ask an agent to package or check a pack: it scaffolds, authors, and runs
&lt;code dir=&quot;auto&quot;&gt;pack validate&lt;/code&gt;, reading the exit code and the text report rather than parsing
JSON. The &lt;a href=&quot;https://ghchinoy.github.io/mizan/guides/user-guide/#validating-a-pack-pack-validate&quot;&gt;user guide&lt;/a&gt;
documents each check the gate applies.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;share-it-then-import-it&quot;&gt;Share it, then import it&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;A validated pack directory is ready to share. &lt;code dir=&quot;auto&quot;&gt;registry export&lt;/code&gt; writes your local
templates into a pack directory (&lt;code dir=&quot;auto&quot;&gt;pack add&lt;/code&gt; is a thin convenience over it), and
from there the workflow is ordinary git. You commit the pack and open a pull
request against a templates repository; Mizan writes files but never pushes:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;mizan&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;registry&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--out&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;packs/acme-support&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--namespace&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;acme-support&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;1 written, 0 skipped (dest: packs/acme-support)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;written: acme-support/reply-quality -&gt; templates/reply-quality.yaml&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;The community repository, &lt;code dir=&quot;auto&quot;&gt;github.com/ghchinoy/mizan-templates&lt;/code&gt;, is the default
source, and the
&lt;a href=&quot;https://github.com/ghchinoy/mizan-templates/tree/main/packs/google-brand&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;google-brand&lt;/code&gt; pack&lt;/a&gt;
that &lt;a href=&quot;https://ghchinoy.github.io/mizan/blog/02-one-spectrum-four-users/&quot;&gt;piece two&lt;/a&gt; imported is the worked
model to copy: a manifest, a &lt;code dir=&quot;auto&quot;&gt;templates/&lt;/code&gt; directory, and one file per metric.&lt;/p&gt;
&lt;p&gt;On the consuming side, someone imports your pack. Preview first with &lt;code dir=&quot;auto&quot;&gt;--dry-run&lt;/code&gt;,
which computes the reconciliation without writing anything:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;mizan&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;registry&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;packs/acme-support&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--dry-run&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;dry run (no changes written): 1 inserted, 0 updated, 0 skipped, 0 conflicted, 0 unchanged, 0 forked (source: packs/acme-support)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;inserted: acme-support/reply-quality&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Drop the flag to commit it:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;mizan&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;registry&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;packs/acme-support&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;1 inserted, 0 updated, 0 skipped, 0 conflicted, 0 unchanged, 0 forked (source: packs/acme-support)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;inserted: acme-support/reply-quality&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Import reconciles by template id, so re-importing an unchanged pack does nothing:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;0 inserted, 0 updated, 0 skipped, 0 conflicted, 1 unchanged, 0 forked (source: packs/acme-support)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;unchanged: acme-support/reply-quality (unchanged (same content))&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;The imported template records where it came from, so a consumer always knows the
provenance of a metric in their registry:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;mizan&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;registry&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;acme-support/reply-quality&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;ID:                       acme-support/reply-quality&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Version:                  0.1.0&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Kind:                     rubric&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Source:                   pack:acme-support@packs/acme-support&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;By default, import takes the higher version and never clobbers a template you have
edited locally; &lt;code dir=&quot;auto&quot;&gt;--strategy&lt;/code&gt; lets you choose &lt;code dir=&quot;auto&quot;&gt;skip&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;overwrite&lt;/code&gt;, or &lt;code dir=&quot;auto&quot;&gt;fork&lt;/code&gt; when
you want different behavior. The shipped
&lt;a href=&quot;https://ghchinoy.github.io/mizan/guides/agent-skills/&quot;&gt;discover-and-import-templates&lt;/a&gt; skill wraps this half
of the loop, previewing, reconciling, and browsing what landed, and the
&lt;a href=&quot;https://ghchinoy.github.io/mizan/guides/user-guide/#import-from-a-local-pack-tree&quot;&gt;user guide&lt;/a&gt; covers the
import strategies in full. A source can be a local directory, a single pack, or a
git URL, so importing from your teammate’s checkout and importing from the
community repository are the same command.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;next&quot;&gt;Next&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;You have now extended Mizan the easy way: you wrote data, validated it for free,
and shared it through a pull request, with the engine untouched. The next piece
turns this contribution loop on the series itself. It builds a &lt;code dir=&quot;auto&quot;&gt;docs-quality&lt;/code&gt; pack
(the rubric that grades every entry, including this one, in the sidebar below) and
is honest about what such a rubric does and does not measure. After that, the
final piece moves from contributing data to extending the code, and shows the
seams where a new metric kind or behavior attaches to the core.&lt;/p&gt;
&lt;hr&gt;
&lt;div&gt;&lt;h3 id=&quot;sidebar-graded-by-mizan&quot;&gt;Sidebar: graded by Mizan&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Each hands-on piece in this series closes by grading itself with Mizan. The draft
you just read was scored against a &lt;code dir=&quot;auto&quot;&gt;rubric&lt;/code&gt; metric that encodes the editorial
standard for these posts. You can build the same rubric with shipped commands:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;mizan&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;registry&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;create&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--id&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;docs-quality/technical-explanation&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--kind&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;rubric&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--name&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Technical explanation quality&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--rubric-group&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;quality=Is the explanation direct, stating claims not announcing them?;&lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Is it dense with no cuttable filler?;Is it accurate and correctly scoped?;&lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Does it read as written by someone who did the thing?&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--model&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;gemini-2.5-flash&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;mizan&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;eval&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;run&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--metric&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;docs-quality/technical-explanation&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--field&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;response=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;&amp;#x3C;draft of this article&gt;&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--rubric-detail&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Be clear about what that score does and does not mean. The rubric grades surface
style and clarity. It does not verify that the substance is correct, that the
commands run as written against your project, or that the pack you author is the
right one for your team. A clean style score sits alongside the live-command
checks and human review that catch those things; it does not replace them. Read
the scorecard as a repeatable check that catches the obvious problems, not as a
measurement of whether the piece is right.&lt;/p&gt;
&lt;p&gt;(Any scorecard numbers shown in this series are manual review estimates unless
labeled as measured; the automated readability tooling was unavailable at the
time of writing.)&lt;/p&gt;
</content:encoded><category>templates</category><category>contributing</category><category>eval-sets</category></item><item><title>Using Mizan in your role: per-persona playbooks, part 2 (Genmedia configurator, Brand Lab)</title><link>https://ghchinoy.github.io/mizan/blog/03b-per-persona-playbooks-part-2/</link><guid isPermaLink="true">https://ghchinoy.github.io/mizan/blog/03b-per-persona-playbooks-part-2/</guid><description>The second pair of playbooks: the genmedia configurator embedding an eval-set as a calling shape, and the Brand Lab user generating a rubric from a brand book and freezing it into a reusable metric.</description><pubDate>Wed, 30 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://ghchinoy.github.io/mizan/blog/03a-per-persona-playbooks-part-1/&quot;&gt;Part one&lt;/a&gt; handed the two roles
closest to the work a playbook each: the asset creator running the shortest path
from one eval to a scorecard, and the asset manager curating a set that keeps
every concern on its own line. This part picks up the other two personae, both a
step back from the raw output. The &lt;strong&gt;genmedia configurator&lt;/strong&gt; does not grade one
asset by hand; they wire evaluation into an application so every asset it
produces is checked the same way. The &lt;strong&gt;Brand Lab user&lt;/strong&gt; does not write criteria
by hand; they hold a brand book and want the criteria drafted from it. Different
jobs, the same machinery, and each role’s standard ends up as a reusable Mizan
artifact.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;genmedia-configurator-the-eval-set-is-the-calling-shape&quot;&gt;Genmedia configurator: the eval-set is the calling shape&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;You build or configure a generative-media application, and you want evaluation
available inside it rather than as a manual step someone runs afterwards. What
you need from Mizan is not a single metric but a named, reusable way to call a
&lt;em&gt;set&lt;/em&gt; of metrics: point at one thing, get back one scorecard your application
can act on.&lt;/p&gt;
&lt;p&gt;That thing is the eval-set manifest. Part one ran eval-sets from the creator’s
and manager’s side; here the manifest matters as the &lt;strong&gt;calling shape&lt;/strong&gt;, the
stable unit your application embeds. It names its members by template id and says
how to aggregate them:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;spec&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;inputs&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;prompt&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;prompt&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;members&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;metric&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;quickstart/response-helpfulness&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;weight&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;metric&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;quickstart/response-conciseness&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;weight&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;aggregation&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;method&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;weighted-mean&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;threshold&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;3.0&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;gate&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Scope this honestly. Phase 1 is &lt;strong&gt;library-first&lt;/strong&gt;: you embed the set by pointing
the CLI or the Go library at a manifest on disk. There is no hosted service and
no network API to call. The calling &lt;em&gt;shape&lt;/em&gt; is fixed now, and it doubles as the
integration spec for a future API surface; that service is not built, and this
piece does not promise one.&lt;/p&gt;
&lt;p&gt;Two properties make the manifest safe to depend on from inside an application.&lt;/p&gt;
&lt;p&gt;First, it validates without credentials. Before your application commits to a
set, &lt;code dir=&quot;auto&quot;&gt;pack validate&lt;/code&gt; checks the manifest structure and every member with no
Vertex call, so it runs in CI as a gate:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;$ mizan pack validate docs/examples/evalset-quickstart&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;evalsets/answer-quality-badmember.yaml:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;[warn ] spec.members[0].metric &quot;quickstart/does-not-exist&quot; resolves to no template in this tree (ok if it lives in another pack)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;0 error(s), 1 warning(s)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;The one warning is deliberate: that example manifest references a member that
does not exist in the tree, and the validator flags it rather than failing,
because the member could live in another pack. A structural error, an empty
member list, or a malformed id would exit non-zero and block the change.&lt;/p&gt;
&lt;p&gt;Second, running the set returns one scorecard, not a pile of loose scores.
Import the member templates once, then run the set:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;$ mizan registry import docs/examples/evalset-quickstart&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;2 inserted, 0 updated, 0 skipped, 0 conflicted, 0 unchanged, 0 forked (source: docs/examples/evalset-quickstart)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;inserted: quickstart/response-conciseness&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;inserted: quickstart/response-helpfulness&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;$ mizan eval run --set docs/examples/evalset-quickstart/evalsets/answer-quality.yaml \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--field prompt=&quot;What is the capital of France?&quot; \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--field response=&quot;The capital of France is Paris, a major European city on the Seine.&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;EvalSet: quickstart/answer-quality (v1.0.0)  asset-class: text-answer&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;MEMBER                           STATUS  WEIGHT  SCORE  NOTE&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;quickstart/response-helpfulness  ok      2       5.00&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;quickstart/response-conciseness  ok      1       3.00&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Aggregate (weighted-mean over 2 scored): 4.33   threshold: 3   PASSED&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;For an application the table is the wrong surface, so add &lt;code dir=&quot;auto&quot;&gt;--output json&lt;/code&gt; and the
same run returns a structured object: a &lt;code dir=&quot;auto&quot;&gt;Members&lt;/code&gt; array where each entry carries
a flat &lt;code dir=&quot;auto&quot;&gt;Status&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;Score&lt;/code&gt; plus a nested &lt;code dir=&quot;auto&quot;&gt;Result&lt;/code&gt; object holding that member’s
&lt;code dir=&quot;auto&quot;&gt;Explanation&lt;/code&gt;, and an &lt;code dir=&quot;auto&quot;&gt;Aggregate&lt;/code&gt; block with the method, the numeric score, the
threshold, and a boolean &lt;code dir=&quot;auto&quot;&gt;Passed&lt;/code&gt;, alongside a top-level &lt;code dir=&quot;auto&quot;&gt;Verdict&lt;/code&gt;. Your
application branches on &lt;code dir=&quot;auto&quot;&gt;Passed&lt;/code&gt;, logs each member’s &lt;code dir=&quot;auto&quot;&gt;Result.Explanation&lt;/code&gt;, and
surfaces the aggregate to the user. That is the whole embedding contract: one
manifest in, one parseable verdict out.&lt;/p&gt;
&lt;p&gt;Because the members are ordinary metric templates, the whole set travels as a
template pack. You curate the evaluation your application enforces once, ship it
in a pack, and every instance of the application imports and runs the same
standard. The &lt;a href=&quot;https://ghchinoy.github.io/mizan/guides/user-guide/&quot;&gt;eval-set runner section of the user guide&lt;/a&gt;
documents the manifest fields, the partial-failure behavior, and the gate exit
code in full.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;brand-lab-draft-the-rubric-from-the-brand-book&quot;&gt;Brand Lab: draft the rubric from the brand book&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;You are a Brand Lab user. You hold a brand book, and you want evaluations
generated from it rather than authored by hand. Writing rubric criteria from
scratch for every brand rule is exactly the work you are trying to avoid.&lt;/p&gt;
&lt;p&gt;The shipped piece of this is adaptive rubric generation: Gemini drafts rubric
criteria from a sample prompt, and you review and freeze them. This is the
suggest-first shape the Brand Lab journey asks for. The model proposes criteria
from your source material, and you decide what to keep. There are two entry
points, one for each moment you reach for it.&lt;/p&gt;
&lt;p&gt;The first is the authoring aid. Feed &lt;code dir=&quot;auto&quot;&gt;mizan rubric generate&lt;/code&gt; a sample prompt that
encodes the brand book, and it drafts criteria for review, writing a draft YAML
and touching nothing in your registry:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;$ mizan rubric generate \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--sample &quot;Write a one-line product announcement that follows our brand book: warm and concise, never salesy, name the product exactly once, no superlatives, no competitor comparisons, plain language over jargon.&quot; \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--id brand-lab/announcement-voice \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--name &quot;Announcement brand voice&quot; \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--recipe general_quality_v1 \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--out brand-lab-draft.yaml&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;GROUP            CRITERION                                                               TYPE                                                   IMPORTANCE&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;general_quality  The response is in English.                                             LANGUAGE:PRIMARY_RESPONSE_LANGUAGE                     HIGH&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;general_quality  The response is a single line of text.                                  FORMAT_REQUIREMENT:SINGLE_LINE                         HIGH&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;general_quality  The response functions as a product announcement.                       CONTENT_REQUIREMENT:PURPOSE:PRODUCT_ANNOUNCEMENT       HIGH&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;general_quality  The announcement has a warm tone.                                       TONE_REQUIREMENT:WARM                                  MEDIUM&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;general_quality  The announcement is concise.                                            STYLE_REQUIREMENT:CONCISE                              MEDIUM&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;general_quality  The announcement avoids salesy language.                                TONE_REQUIREMENT:NON_SALESY                            HIGH&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;general_quality  The announcement mentions a product name exactly once.                  CONTENT_REQUIREMENT:PRODUCT_NAME_MENTION:EXACTLY_ONCE  HIGH&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;general_quality  The announcement contains no superlative adjectives or adverbs.         STYLE_REQUIREMENT:NO_SUPERLATIVES                      HIGH&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;general_quality  The announcement avoids direct or indirect comparisons to competitors.  CONTENT_REQUIREMENT:NO_COMPETITOR_COMPARISONS          HIGH&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;general_quality  The announcement uses plain language and avoids jargon.                 STYLE_REQUIREMENT:PLAIN_LANGUAGE_NO_JARGON             MEDIUM&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Read the criteria: the brand book decomposed into checkable statements, each
tagged with a type and an importance. The draft is a file, not a registry entry.
You review and edit it, then wrap it in a pack and import it as an ordinary
template. From that moment it is a static, reproducible rubric, not a fresh
generation on every run.&lt;/p&gt;
&lt;p&gt;The second entry point is for when you have an asset in front of you and want
feedback now. &lt;code dir=&quot;auto&quot;&gt;mizan eval adaptive&lt;/code&gt; generates the rubric from the prompt and
scores the response against it in one step, and &lt;code dir=&quot;auto&quot;&gt;--save-as&lt;/code&gt; freezes the rubric it
actually used into the registry so you do not lose it:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;$ mizan eval adaptive \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--prompt &quot;Write a one-line product announcement that follows our brand book: warm and concise, never salesy, name the product exactly once, no superlatives, no competitor comparisons, plain language over jargon.&quot; \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--response &quot;Meet Aria, the smart home hub that makes your mornings a little easier.&quot; \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--recipe general_quality_v1 \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--save-as brand-lab/announcement-voice&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Score:        10&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Explanation:  All ten criteria from the rubric were satisfied, as the announcement is in English, a single line, functions as an announcement, is warm and concise, avoids salesy language, names the product once, contains no superlatives or competitor comparisons, and uses plain language.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;The on-brand line scores full marks. The value of &lt;code dir=&quot;auto&quot;&gt;--save-as&lt;/code&gt; shows up on the
next run: the rubric is now frozen as &lt;code dir=&quot;auto&quot;&gt;brand-lab/announcement-voice&lt;/code&gt;, an ordinary
rubric metric you rerun with &lt;code dir=&quot;auto&quot;&gt;mizan eval run&lt;/code&gt; against any candidate, grading each
one against the same criteria. Hand it an off-brand line, and the same frozen
template catches every violation:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;$ mizan eval run --metric brand-lab/announcement-voice \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--field prompt=&quot;Write a one-line product announcement that follows our brand book: warm and concise, never salesy, name the product exactly once, no superlatives, no competitor comparisons, plain language over jargon.&quot; \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--field response=&quot;Introducing Aria, the world&apos;s #1 smartest home hub, way better than anything else, buy now!&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Score:        5&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Explanation:  The response is in English, a single line, functions as a product announcement, names the product once, and uses plain language. However, it fails on being warm and concise, contains salesy language and a call to action, uses a superlative (&apos;#1 smartest&apos;), and makes a comparison (&apos;way better than anything else&apos;), missing 5 out of 10 criteria.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Same template, same criteria, a different asset, and the score drops from 10 to 5
with a reason that names the superlative, the competitor comparison, and the
sales pitch. That is the Brand Lab standard encoded as a Mizan metric: generated
once from the brand book, frozen, and reusable. Curate a few of these and the
brand book itself travels as importable templates. The &lt;a href=&quot;https://ghchinoy.github.io/mizan/guides/user-guide/&quot;&gt;adaptive rubrics section
of the user guide&lt;/a&gt; covers the recipes, &lt;code dir=&quot;auto&quot;&gt;--save-as&lt;/code&gt;,
and the generation provenance Mizan records. Keep one caveat in view: generation
is a drafting aid, so review the criteria before you freeze them, exactly as you
would review any generated draft.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;next&quot;&gt;Next&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;That closes the per-persona playbooks. Across both parts the four roles ran the
same machinery and differed only in what they wrote down: the creator ran one
eval and then a set, the manager curated a set that keeps concerns apart, the
configurator embedded a set as a calling shape, and the Brand Lab user generated
a rubric from a brand book and froze it. Each standard ended up as the same kind
of artifact, a metric template or an eval-set, and each of those travels as a
template pack. Piece four is about that last step: authoring a pack, validating
it, and sharing it so other people import your standard without touching the
core.&lt;/p&gt;
&lt;hr&gt;
&lt;div&gt;&lt;h3 id=&quot;sidebar-graded-by-mizan&quot;&gt;Sidebar: graded by Mizan&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Each hands-on piece in this series closes by grading itself with Mizan. The draft
you just read was scored against a &lt;code dir=&quot;auto&quot;&gt;rubric&lt;/code&gt; metric that encodes the editorial
standard for these posts. You can build the same rubric with shipped commands:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;mizan&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;registry&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;create&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--id&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;docs-quality/technical-explanation&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--kind&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;rubric&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--name&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Technical explanation quality&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--rubric-group&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;quality=Is the explanation direct, stating claims not announcing them?;&lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Is it dense with no cuttable filler?;Is it accurate and correctly scoped?;&lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Does it read as written by someone who did the thing?&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--model&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;gemini-2.5-flash&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;mizan&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;eval&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;run&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--metric&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;docs-quality/technical-explanation&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--field&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;response=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;&amp;#x3C;draft of this article&gt;&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--rubric-detail&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Be clear about what that score does and does not mean. The rubric grades surface
style and clarity. It does not verify that the substance is correct, that the
commands run as written against your project, or that the two playbooks fit your
role. A clean style score sits alongside the live-command checks and human review
that catch those things; it does not replace them. Read the scorecard as a
repeatable check that catches the obvious problems, not as a measurement of
whether the piece is right.&lt;/p&gt;
&lt;p&gt;(Any scorecard numbers shown in this series are manual review estimates unless
labeled as measured; the automated readability tooling was unavailable at the
time of writing.)&lt;/p&gt;
</content:encoded><category>personae</category><category>brand-alignment</category><category>templates</category></item><item><title>Using Mizan in your role: per-persona playbooks, part 1 (Asset creator, Asset manager)</title><link>https://ghchinoy.github.io/mizan/blog/03a-per-persona-playbooks-part-1/</link><guid isPermaLink="true">https://ghchinoy.github.io/mizan/blog/03a-per-persona-playbooks-part-1/</guid><description>Two roles, two playbooks. How an asset creator finds the shortest path from one eval to a scorecard, and how an asset manager curates a set that reports each concern on its own.</description><pubDate>Wed, 16 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;The &lt;a href=&quot;https://ghchinoy.github.io/mizan/blog/01-why-evals/&quot;&gt;first piece&lt;/a&gt; turned one by-eye judgment into a
check you can rerun. The &lt;a href=&quot;https://ghchinoy.github.io/mizan/blog/02-one-spectrum-four-users/&quot;&gt;second&lt;/a&gt; placed
Mizan’s four users on a single spectrum and showed that the same machinery serves
all of them. This piece gets practical: it hands two of those users a playbook for
their actual job. Pick your role, and here is the shortest path to value.&lt;/p&gt;
&lt;p&gt;Mizan has four canonical personae. This part covers the two closest to the work
itself. The &lt;strong&gt;asset creator&lt;/strong&gt; produces candidate output; the &lt;strong&gt;asset manager&lt;/strong&gt;
decides what a class of assets must clear before it ships. Part 2 picks up the
other two.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;asset-creator-one-eval-then-a-set-then-a-scorecard&quot;&gt;Asset creator: one eval, then a set, then a scorecard&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;You make assets and you want to know they align with guidance before you send
them on. Your path has three steps, each shipped today.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Run one eval.&lt;/strong&gt; Piece one already walked this: author a metric, hand it a
response, read back a score and a reason. That is the atom, and it covers the
day you have exactly one question about one asset.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Run a set.&lt;/strong&gt; Your work rarely raises one question. A tagline needs to be
concise &lt;em&gt;and&lt;/em&gt; on-voice &lt;em&gt;and&lt;/em&gt; free of competitor names. Rather than run three
commands and reconcile three outputs by hand, bundle the metrics into an
&lt;strong&gt;eval-set&lt;/strong&gt; and score the asset against all of them in a single run. In Phase 1
the runner is path-based: &lt;code dir=&quot;auto&quot;&gt;eval run --set&lt;/code&gt; takes a filesystem path to an EvalSet
manifest and scores its members together. The set’s members reference metric
template ids, so import their templates first, then run the set:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;$ mizan registry import docs/examples/evalset-quickstart&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;2 inserted, 0 updated, 0 skipped, 0 conflicted, 0 unchanged, 0 forked (source: docs/examples/evalset-quickstart)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;inserted: quickstart/response-conciseness&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;inserted: quickstart/response-helpfulness&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;$ mizan eval run --set docs/examples/evalset-quickstart/evalsets/answer-quality.yaml \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--field prompt=&quot;What is the capital of France?&quot; \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--field response=&quot;The capital of France is Paris, a major European city on the Seine.&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Read the scorecard.&lt;/strong&gt; The run prints one table, a row per member, then an
aggregate line with the method, the count of scored members, the threshold, and
the always-computed verdict:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;EvalSet: quickstart/answer-quality (v1.0.0)  asset-class: text-answer&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;MEMBER                           STATUS  WEIGHT  SCORE  NOTE&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;quickstart/response-helpfulness  ok      2       5.00&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;quickstart/response-conciseness  ok      1       4.00&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Aggregate (weighted-mean over 2 scored): 4.67   threshold: 3   PASSED&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Read the member rows first, since they tell you &lt;em&gt;which&lt;/em&gt; criteria the asset met,
then read the aggregate line for the single go/no-go. A member that can’t resolve is
reported and the run continues, so a broken template never silently drops a
concern; add &lt;code dir=&quot;auto&quot;&gt;--fail-fast&lt;/code&gt; when you would rather stop at the first problem. Every
run persists by default, so &lt;code dir=&quot;auto&quot;&gt;mizan results list&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;mizan results show &amp;#x3C;run-id&gt;&lt;/code&gt; let you look back at what you scored and why. The
&lt;a href=&quot;https://ghchinoy.github.io/mizan/guides/user-guide/&quot;&gt;eval-set runner walkthrough&lt;/a&gt; in the user guide covers
the manifest fields, &lt;code dir=&quot;auto&quot;&gt;--output json&lt;/code&gt;, and partial failures in full.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;asset-manager-curate-a-set-that-keeps-concerns-apart&quot;&gt;Asset manager: curate a set that keeps concerns apart&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;You do not run assets one at a time. You decide what a &lt;em&gt;class&lt;/em&gt; of assets must
clear, curate the checks once, and hand creators something they can reuse. The
eval-set is that artifact. Its most valuable property for you is that it reports
each concern on its own line rather than blending everything into one opaque
number.&lt;/p&gt;
&lt;p&gt;Say a campaign asset has to satisfy five separate concerns: it aligns with the
prompt, adheres to brand, follows campaign guidelines, meets the advertising
channel’s requirements, and passes safety. Curate each as its own member so each
gets its own verdict, and aggregate with &lt;code dir=&quot;auto&quot;&gt;min&lt;/code&gt; so the set only passes when the
weakest concern does:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;apiVersion&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;mizan.dev/v1alpha1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;kind&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;EvalSet&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;metadata&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;campaign/spring-launch-readiness&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;version&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;1.0.0&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;assetClass&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;display-ad&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;spec&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;inputs&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;prompt&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;prompt&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;members&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;metric&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;campaign/prompt-alignment&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;metric&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;brand/adherence&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;metric&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;campaign/guidelines&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;metric&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;channel/display-requirements&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;metric&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;safety/content&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;aggregation&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;method&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;min&lt;/span&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;# mean | weighted-mean | min&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;threshold&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;3.0&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;gate&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;             &lt;/span&gt;&lt;span&gt;# non-zero exit only when the verdict is FAILED&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Run it and the scorecard names each concern independently, so a stakeholder can
see exactly which dimension an asset fails, not just that it failed somewhere:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;MEMBER                        STATUS  WEIGHT  SCORE  NOTE&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;campaign/prompt-alignment     ok      1       5.00&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;brand/adherence               ok      1       4.00&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;channel/display-requirements  ok      1       4.00&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;campaign/guidelines           ok      1       2.00&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;safety/content                ok      1       5.00&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Aggregate (min over 5 scored): 2.00   threshold: 3   FAILED&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Two things make this a manager’s tool rather than a creator’s. First, because
each member persists as its own result, you can track a &lt;em&gt;single&lt;/em&gt; concern’s trend
over time. &lt;code dir=&quot;auto&quot;&gt;mizan results list --metric campaign/guidelines --since 2026-10-01&lt;/code&gt;
shows only that dimension, run after run, so a slipping category is visible
before it becomes a pattern. Second, &lt;code dir=&quot;auto&quot;&gt;gate: true&lt;/code&gt; makes a failing verdict exit
non-zero, which is exactly what wires the set into a CI check that blocks a
release. The members themselves are just metric templates, so the industry
presets you curate travel as a template pack that creators import once and reuse,
the contribution loop piece four is built around. The
&lt;a href=&quot;https://ghchinoy.github.io/mizan/guides/testing-guide/&quot;&gt;testing guide&lt;/a&gt; has the eval-set recipe end to end,
including the gate exit-code behavior.&lt;/p&gt;
&lt;p&gt;Keep the runner’s scope in mind: Phase 1 is a &lt;strong&gt;library-first&lt;/strong&gt;, path-based
surface. There is no hosted service or API to call. You point the CLI (or the Go
library) at a manifest on disk. Store-backed resolution by set id is a documented
fast-follow, not something to build a pipeline around yet.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;next&quot;&gt;Next&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;That is the operational end of the spectrum: the creator running the shortest
path from one eval to a scorecard, and the manager curating a set that keeps
every concern on its own line. Part 2 picks up the other two personae: the
genmedia application configurator embedding an eval-set’s calling shape, and the
Brand Lab user auto-generating a rubric from a brand book.&lt;/p&gt;
&lt;hr&gt;
&lt;div&gt;&lt;h3 id=&quot;sidebar-graded-by-mizan&quot;&gt;Sidebar: graded by Mizan&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Each hands-on piece in this series closes by grading itself with Mizan. The draft
you just read was scored against a &lt;code dir=&quot;auto&quot;&gt;rubric&lt;/code&gt; metric that encodes the editorial
standard for these posts. You can build the same rubric with shipped commands:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;mizan&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;registry&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;create&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--id&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;docs-quality/technical-explanation&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--kind&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;rubric&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--name&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Technical explanation quality&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--rubric-group&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;quality=Is the explanation direct, stating claims not announcing them?;&lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Is it dense with no cuttable filler?;Is it accurate and correctly scoped?;&lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Does it read as written by someone who did the thing?&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--model&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;gemini-2.5-flash&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;mizan&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;eval&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;run&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--metric&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;docs-quality/technical-explanation&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--field&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;response=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;&amp;#x3C;draft of this article&gt;&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--rubric-detail&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Be clear about what that score does and does not mean. The rubric grades surface
style and clarity. It does not verify that the substance is correct, that the
commands run as written against your project, or that the two playbooks fit your
role. A clean style score sits alongside the live-command checks and human review
that catch those things; it does not replace them. Read the scorecard as a
repeatable check that catches the obvious problems, not as a measurement of
whether the piece is right.&lt;/p&gt;
&lt;p&gt;(Any scorecard numbers shown in this series are manual review estimates unless
labeled as measured; the automated readability tooling was unavailable at the
time of writing.)&lt;/p&gt;
</content:encoded><category>personae</category><category>eval-sets</category><category>getting-started</category></item><item><title>One spectrum, four users: from brand alignment to technical metrics</title><link>https://ghchinoy.github.io/mizan/blog/02-one-spectrum-four-users/</link><guid isPermaLink="true">https://ghchinoy.github.io/mizan/blog/02-one-spectrum-four-users/</guid><description>Four Mizan users sit on one spectrum, from &quot;is this on-brand?&quot; to &quot;is this grounded and accurate?&quot; The same machinery answers both. Only the criteria change.</description><pubDate>Tue, 15 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;The &lt;a href=&quot;https://ghchinoy.github.io/mizan/blog/01-why-evals/&quot;&gt;first piece&lt;/a&gt; took one judgment you used to make
by eye and turned it into a check you can rerun and hand to a colleague. That
piece stayed narrow by design: one pointwise metric, one response, one score.
This piece widens the frame to the people doing the judging, because who you are
changes what you ask a judge to check, and it is easy to assume that a different
question needs a different tool.&lt;/p&gt;
&lt;p&gt;It does not. The question a brand reviewer asks and the question a platform
engineer asks land on the same command. The criteria they write down separate
them, not the machinery that runs them.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;four-users-one-spectrum&quot;&gt;Four users, one spectrum&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Mizan has four canonical users. Line them up by the kind of question each one
brings to a generated asset, and they form a spectrum rather than four separate
worlds.&lt;/p&gt;
&lt;p&gt;At one end sits the &lt;strong&gt;Brand Lab user&lt;/strong&gt;. They hold a brand book and a set of
assets, and they want evaluations that check alignment: does this ad carry the
approved voice, show the logo where the guideline requires, stay off competitor
colors. Their criteria are qualitative and human-authored, and a good answer
reads like a careful reviewer’s note.&lt;/p&gt;
&lt;p&gt;At the other end sit the &lt;strong&gt;asset manager&lt;/strong&gt; and the &lt;strong&gt;genmedia application
creator or configurator&lt;/strong&gt;. The asset manager curates groups of evaluations for a
class of assets so that creators can reuse them, and wants each concern reported
as its own verdict rather than blended into one number. The genmedia configurator
wires evaluation into a generative-media application and wants a result the
application can parse and act on. Both live at the technical, metric end: they
want structured, gateable output that a pipeline can read.&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;asset creator&lt;/strong&gt; spans the middle. They run an eval against an asset to
check it against guidance, and they run sets of evals as their work matures. Some
days their question is a brand question; other days it is an accuracy question.
They move along the spectrum depending on the asset in front of them.&lt;/p&gt;
&lt;p&gt;Read left to right, the spectrum runs from “is this on-brand?” to “is this
grounded and accurate?” The claim of this piece is that a single toolset covers
the whole line.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;the-tool-is-fixed-the-criteria-move&quot;&gt;The tool is fixed; the criteria move&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Recall the four metric kinds from piece one. A &lt;strong&gt;pointwise&lt;/strong&gt; metric scores one
response against one question. A &lt;strong&gt;rubric&lt;/strong&gt; metric scores several named criteria
at once. A &lt;strong&gt;custom_schema&lt;/strong&gt; metric returns typed fields you define. A
&lt;strong&gt;pairwise&lt;/strong&gt; metric picks the stronger of two candidates.&lt;/p&gt;
&lt;p&gt;None of those kinds is a “brand” tool or a “technical” tool. A pointwise metric
does not know whether the number it produces measures brand voice or factual
grounding. You decide that when you write the prompt and the criteria. The
workflow is identical at both ends of the spectrum: you author a template, you
hand it a response, and you read back a verdict with the judge’s reasoning. The
brand reviewer and the platform engineer follow the same three steps. They differ
only in what they put in the template and what shape of answer they ask for.&lt;/p&gt;
&lt;p&gt;The two worked examples below prove it. The first sits at the brand end and uses
a shared template pack. The second sits at the technical end and returns a typed
verdict. Both are the same author-and-run loop.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;brand-end-import-a-pack-and-score-alignment&quot;&gt;Brand end: import a pack and score alignment&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;The Brand Lab user rarely writes brand criteria from scratch. Brand rules are
shared property, so they travel as a template pack: a versioned folder of metric
templates that anyone can import. The community pack repository ships a worked
example, the &lt;a href=&quot;https://github.com/ghchinoy/mizan-templates/tree/main/packs/google-brand&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;google-brand&lt;/code&gt; pack&lt;/a&gt;,
which contains a &lt;code dir=&quot;auto&quot;&gt;video-brand-alignment&lt;/code&gt; template.&lt;/p&gt;
&lt;p&gt;Import it into your local registry. With no argument, &lt;code dir=&quot;auto&quot;&gt;registry import&lt;/code&gt; pulls
from the configured default source, &lt;code dir=&quot;auto&quot;&gt;github.com/ghchinoy/mizan-templates&lt;/code&gt;:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;mizan&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;registry&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--namespace&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;google-brand&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;1 inserted, 0 updated, 0 skipped, 0 conflicted, 0 unchanged, 0 forked (source: https://github.com/ghchinoy/mizan-templates)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;inserted: google-brand/video-brand-alignment&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;The template is now a first-class metric in your registry, addressable by its
stable id:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;mizan&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;registry&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;google-brand/video-brand-alignment&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Under the hood it is a pointwise metric: it scores one asset on a 1-to-5 scale
against a supplied brand guideline. Its prompt asks the judge to weigh tone,
visual identity, and messaging consistency, and it declares two inputs, the
&lt;code dir=&quot;auto&quot;&gt;response&lt;/code&gt; (the video under evaluation) and a &lt;code dir=&quot;auto&quot;&gt;brand_guideline&lt;/code&gt; (the reference
text). Run it by supplying both inputs. The video is a media asset, so it is
passed with &lt;code dir=&quot;auto&quot;&gt;--gcs&lt;/code&gt; rather than &lt;code dir=&quot;auto&quot;&gt;--field&lt;/code&gt;; multimodal assets travel as &lt;code dir=&quot;auto&quot;&gt;gs://&lt;/code&gt;
URIs because the native Eval Service reads them from Cloud Storage rather than
inline:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;mizan&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;eval&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;run&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--metric&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;google-brand/video-brand-alignment&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--gcs&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;response=gs://ghchinoy-genai-sa-veo/camping_bear.mp4&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--field&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;brand_guideline=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Our brand voice is warm, concise, and never salesy. &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Always show the logo in the final 3 seconds. Primary color is #1A73E8; avoid competitor colors.&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;The result comes back as a pointwise score in the declared 1-to-5 range with a
free-text rationale that names what aligned and what did not:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Score:        2&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Explanation:  The ad&apos;s warm, concise, and non-salesy tone is perfect, but it completely fails on the visual identity rules by omitting the logo and not using the primary brand color.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Here a generic clip pulled from Cloud Storage scores a 2: the judge credits the
tone the guideline asks for and marks it down for the missing logo and the wrong
palette. That is the whole brand end: someone authored the criteria once, shared
them as a pack, and now any reviewer runs the same standard against their own
footage and gets a comparable answer. Nobody re-litigated what “on-brand” means
for this run.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;technical-end-a-typed-verdict-a-pipeline-can-gate-on&quot;&gt;Technical end: a typed verdict a pipeline can gate on&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;The asset manager and the genmedia configurator want the same author-and-run
loop, but their downstream needs a machine to read the result, not a person. When
the honest question is “does this response stay grounded and inside policy,” the
&lt;code dir=&quot;auto&quot;&gt;custom_schema&lt;/code&gt; kind returns a typed JSON verdict instead of prose.&lt;/p&gt;
&lt;p&gt;The repository ships an example schema,
&lt;a href=&quot;https://github.com/ghchinoy/mizan/blob/main/docs/examples/compliance-schema.json&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;docs/examples/compliance-schema.json&lt;/code&gt;&lt;/a&gt;,
that returns four fields: an &lt;code dir=&quot;auto&quot;&gt;overall_score&lt;/code&gt;, a boolean &lt;code dir=&quot;auto&quot;&gt;compliant&lt;/code&gt;, an array of
&lt;code dir=&quot;auto&quot;&gt;flagged_issues&lt;/code&gt;, and an &lt;code dir=&quot;auto&quot;&gt;explanation&lt;/code&gt;. Author a metric against it and run it:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;mizan&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;registry&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;create&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--id&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;demo/custom-compliance&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--name&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Compliance Check&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--kind&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;custom_schema&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--prompt&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Check if this response follows the policy: no medical advice. Response: {{response}}&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--response-schema-file&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;docs/examples/compliance-schema.json&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;mizan&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;eval&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;run&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--metric&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;demo/custom-compliance&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--field&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;response=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Drink plenty of water and rest.&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Score:                         (none)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Explanation:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;CustomOutput[compliant]:       true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;CustomOutput[explanation]:     General wellness suggestions, not specific medical advice; complies with the policy.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;CustomOutput[flagged_issues]:  []&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;CustomOutput[overall_score]:   9&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Read that output next to the brand run. The brand reviewer got a score and a
sentence for a human to weigh. Here the genmedia configurator gets a &lt;code dir=&quot;auto&quot;&gt;compliant&lt;/code&gt;
boolean their application can branch on, an &lt;code dir=&quot;auto&quot;&gt;overall_score&lt;/code&gt; they can threshold,
and a &lt;code dir=&quot;auto&quot;&gt;flagged_issues&lt;/code&gt; array they can log or surface, all as typed data returned
with &lt;code dir=&quot;auto&quot;&gt;--output json&lt;/code&gt;. Same command, &lt;code dir=&quot;auto&quot;&gt;mizan eval run&lt;/code&gt;; the difference is that the
criteria live in a schema the judge fills in rather than in a scale it reasons to.&lt;/p&gt;
&lt;p&gt;The grounding and accuracy question follows the identical shape. Swap the prompt
for one that asks whether every claim in the response is supported by a supplied
source, add a &lt;code dir=&quot;auto&quot;&gt;source&lt;/code&gt; field to feed the reference text, and the same
&lt;code dir=&quot;auto&quot;&gt;custom_schema&lt;/code&gt; template returns a typed verdict on factual grounding. You did
not change tools to move from a compliance concern to a grounding concern. You
changed the sentence in the prompt.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;where-you-sit-changes-what-you-write-not-what-you-run&quot;&gt;Where you sit changes what you write, not what you run&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Put the two examples side by side and the spectrum collapses into one workflow.
The Brand Lab user imported a pack of qualitative criteria and read a scored,
explained verdict. The genmedia configurator authored a schema of structured
criteria and read a typed, parseable verdict. The asset creator in the middle
does both on different days. The asset manager’s job is to curate these templates
into reusable sets and report each concern independently, which is the same loop
run over a group; Mizan ships a path-based eval-set runner (&lt;code dir=&quot;auto&quot;&gt;eval run --set&lt;/code&gt;) for
exactly that, and the next piece walks it end to end per role.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;https://ghchinoy.github.io/mizan/guides/llm-as-judge-scenarios/&quot;&gt;LLM-as-a-Judge scenarios guide&lt;/a&gt; is
the map from “here is the question I am asking” to “here is the command that
answers it,” across all four kinds and both ends of this spectrum; the
&lt;a href=&quot;https://ghchinoy.github.io/mizan/guides/llm-as-judge-scenarios/#scenario-5-structured--compliance-verdicts-custom_schema&quot;&gt;custom_schema scenario&lt;/a&gt;
covers the typed-verdict path in full, and the
&lt;a href=&quot;https://ghchinoy.github.io/mizan/guides/user-guide/&quot;&gt;user guide&lt;/a&gt; documents importing and inspecting packs.
Batch evaluation and the desktop app are not built yet, and the docs say so
rather than implying otherwise.&lt;/p&gt;
&lt;p&gt;The lesson to carry into the per-persona playbooks in piece three: pick your
place on the spectrum, and the only decision left is what to write down. The
machinery is already the same.&lt;/p&gt;
&lt;hr&gt;
&lt;div&gt;&lt;h3 id=&quot;sidebar-graded-by-mizan&quot;&gt;Sidebar: graded by Mizan&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Each hands-on piece in this series closes by grading itself with Mizan. The draft
you just read was scored against a &lt;code dir=&quot;auto&quot;&gt;rubric&lt;/code&gt; metric that encodes the editorial
standard for these posts. You can build the same rubric with shipped commands:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;mizan&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;registry&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;create&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--id&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;docs-quality/technical-explanation&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--kind&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;rubric&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--name&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Technical explanation quality&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--rubric-group&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;quality=Is the explanation direct, stating claims not announcing them?;&lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Is it dense with no cuttable filler?;Is it accurate and correctly scoped?;&lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Does it read as written by someone who did the thing?&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--model&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;gemini-2.5-flash&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;mizan&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;eval&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;run&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--metric&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;docs-quality/technical-explanation&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--field&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;response=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;&amp;#x3C;draft of this article&gt;&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--rubric-detail&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Be clear about what that score does and does not mean. The rubric grades surface
style and clarity. It does not verify that the substance is correct, that the two
worked examples run as written against your project, or that the spectrum
argument holds. A clean style score sits alongside the live-command checks and
human review that catch those things; it does not replace them. Read the
scorecard as a repeatable check that catches the obvious problems, not as a
measurement of whether the piece is right.&lt;/p&gt;
&lt;p&gt;(Any scorecard numbers shown in this series are manual review estimates unless
labeled as measured; the automated readability tooling was unavailable at the
time of writing.)&lt;/p&gt;
</content:encoded><category>evals</category><category>llm-as-a-judge</category><category>personae</category><category>brand-alignment</category></item><item><title>Why evals, and what is an LLM-as-a-judge, really?</title><link>https://ghchinoy.github.io/mizan/blog/01-why-evals/</link><guid isPermaLink="true">https://ghchinoy.github.io/mizan/blog/01-why-evals/</guid><description>You already judge generative output by eye. An eval turns that private judgment into something explicit, repeatable, and shareable.</description><pubDate>Tue, 15 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;div&gt;&lt;h2 id=&quot;the-judgment-you-already-make&quot;&gt;The judgment you already make&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;You shipped a generated image, a marketing line, or a model response, and you
asked yourself whether it was good enough. You answered by eye, once, and moved
on. The next person on your team answered differently. Neither of you wrote down
what “good enough” meant, so neither answer travels past the moment you made it.&lt;/p&gt;
&lt;p&gt;That private judgment is already an evaluation. You held criteria in your head,
you applied them to one artifact, and you reached a verdict. The parts missing
were a written-down standard, a way to run it again next week, and a way to hand
it to a colleague and get the same answer back.&lt;/p&gt;
&lt;p&gt;An eval supplies those missing parts. You state the criteria a response has to
meet, you hand a response and those criteria to a judge, and you get back a score
and an explanation you can store, rerun, and share. Mizan runs that judge on
Google’s Vertex AI Gen AI Evaluation Service, across text, images, audio, video,
and music.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;the-judge-is-a-model&quot;&gt;The judge is a model&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Automated scoring used to lean on string matching or reference answers. That
works when there is one correct output. Generative work rarely has one correct
output: a tagline can be strong in three different directions, and an image can
satisfy a brief without matching any reference pixel for pixel.&lt;/p&gt;
&lt;p&gt;An LLM-as-a-judge scores the way a careful reviewer would. You give a model the
artifact and a written standard, and the model returns a judgment against that
standard, along with its reasoning. The model doing the judging is the same class
of model that produced the work, pointed at a different task: assessment instead
of generation.&lt;/p&gt;
&lt;p&gt;Three properties make this worth adopting, and they are the same three you were
missing when you judged by eye. The judgment is explicit, because the standard
lives in a template you wrote rather than in your head. It is repeatable, because
running the same template over the same input gives you a comparable result each
time, which is what lets you track a draft improving across revisions. And it is
shareable: the template is a file, so you can commit it, hand it to a teammate,
or import one that someone else authored, and the standard travels with the
work instead of staying in one reviewer’s head.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;four-kinds-of-judgment&quot;&gt;Four kinds of judgment&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Mizan gives you four metric kinds, and they differ by the shape of the question
you are asking.&lt;/p&gt;
&lt;p&gt;A &lt;strong&gt;pointwise&lt;/strong&gt; metric answers a single question about a single response: how
concise is this, how well does it follow the prompt, on a scale you define.
Reach for it when you want one number and a reason.&lt;/p&gt;
&lt;p&gt;A &lt;strong&gt;rubric&lt;/strong&gt; metric checks several named criteria at once and reports against
each. A brand rubric might ask, in one run, whether the copy uses the approved
voice, avoids competitor names, and carries the required legal line.&lt;/p&gt;
&lt;p&gt;Two more cover the remaining shapes. A &lt;strong&gt;custom_schema&lt;/strong&gt; metric returns
structured fields you specify, so a compliance check comes back as typed data
you can act on rather than prose you have to parse. A &lt;strong&gt;pairwise&lt;/strong&gt; metric sets
two candidates side by side and picks the stronger one, for the times the honest
question is “which of these two.”&lt;/p&gt;
&lt;p&gt;You will meet all four across this series. The rest of this piece runs the first
one.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;run-one-eval-in-ten-minutes&quot;&gt;Run one eval in ten minutes&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;You need a Google Cloud project with the Vertex AI API enabled and Application
Default Credentials on your machine. The
&lt;a href=&quot;https://ghchinoy.github.io/mizan/guides/user-guide/#install&quot;&gt;user guide&lt;/a&gt;
covers install and configuration in full; the short version follows.&lt;/p&gt;
&lt;p&gt;Install the CLI (the install is cgo-free, so no C toolchain is required):&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;go&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;github.com/ghchinoy/mizan/cmd/mizan@v0.1.0&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Point Mizan at your project:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;mizan&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;config&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;set&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;project-id&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;#x3C;your-project-id&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;mizan&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;config&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;show&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Create a pointwise metric that scores conciseness, then run it against a sample
response:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;mizan&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;registry&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;create&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--id&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;demo/conciseness&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--name&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Conciseness&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;--description&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Scores how concise a response is&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;--kind&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;pointwise&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;--prompt&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Rate how concise this response is from 0 (verbose) to 1 (concise). Response: {{response}}&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;--model&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;gemini-2.5-flash&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;mizan&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;eval&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;run&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--metric&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;demo/conciseness&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--field&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;response=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;The cat sat on the mat.&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;The run returns a score and the judge’s reasoning:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Score:        1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Explanation:  The response &apos;The cat sat on the mat.&apos; is a very short, direct, and grammatically complete sentence that conveys its meaning with no superfluous words, making it maximally concise.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;That output holds the whole idea. Your standard (“how concise, 0 to 1”) now
lives in a template named &lt;code dir=&quot;auto&quot;&gt;demo/conciseness&lt;/code&gt;. Anyone with the template runs the
same check and gets a comparable score with a stated reason. Mizan persists each
run by default, so &lt;code dir=&quot;auto&quot;&gt;mizan results list&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;mizan results show &amp;#x3C;run-id&gt;&lt;/code&gt; let you
look back at what you scored and why. Add &lt;code dir=&quot;auto&quot;&gt;--no-store&lt;/code&gt; when you want a run to
leave no record.&lt;/p&gt;
&lt;p&gt;Swap the response for your own copy and rerun. Change the prompt to score a
dimension you care about (tone, factual grounding, adherence to a brief) and you
have authored a second metric. The mechanics hold steady as the criteria change.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;read-next&quot;&gt;Read next&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Everything above runs against shipped commands today. The README’s
&lt;a href=&quot;https://github.com/ghchinoy/mizan/blob/main/README.md#works-today&quot;&gt;Works today&lt;/a&gt;
section is the honest inventory of what the CLI does now, and the
&lt;a href=&quot;https://ghchinoy.github.io/mizan/guides/llm-as-judge-scenarios/&quot;&gt;LLM-as-a-Judge scenarios&lt;/a&gt;
guide maps each kind of question you might ask onto the command that answers it.
Batch evaluation and the desktop app are not built yet, and the docs say so
rather than implying otherwise.&lt;/p&gt;
&lt;p&gt;The next piece places all four Mizan personae on one spectrum, from “is this
on-brand?” at one end to “is this grounded and accurate?” at the other, and shows
that the same machinery answers both. For now, you have taken one judgment you
used to make by eye and turned it into a check you can rerun and hand to someone
else.&lt;/p&gt;
&lt;hr&gt;
&lt;div&gt;&lt;h3 id=&quot;sidebar-graded-by-mizan&quot;&gt;Sidebar: graded by Mizan&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Each hands-on piece in this series closes by grading itself with Mizan. The draft
you just read was scored against a &lt;code dir=&quot;auto&quot;&gt;rubric&lt;/code&gt; metric that encodes the editorial
standard for these posts. You can build the same rubric with shipped commands:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;mizan&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;registry&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;create&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--id&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;docs-quality/technical-explanation&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--kind&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;rubric&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--name&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Technical explanation quality&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--rubric-group&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;quality=Is the explanation direct, stating claims not announcing them?;&lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Is it dense with no cuttable filler?;Is it accurate and correctly scoped?;&lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Does it read as written by someone who did the thing?&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--model&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;gemini-2.5-flash&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;mizan&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;eval&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;run&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--metric&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;docs-quality/technical-explanation&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--field&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;response=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;&amp;#x3C;draft of this article&gt;&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--rubric-detail&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Be clear about what that score does and does not mean. The rubric grades surface
style and clarity. It does not verify that the substance is correct, that the
commands run as written, or that the argument holds. A clean style score sits
alongside the live-command checks and human review that catch those things; it
does not replace them. Read the scorecard as a repeatable check that catches the
obvious problems, not as a measurement of whether the piece is right.&lt;/p&gt;
&lt;p&gt;(Any scorecard numbers shown in this series are manual review estimates unless
labeled as measured; the automated readability tooling was unavailable at the
time of writing.)&lt;/p&gt;
</content:encoded><category>evals</category><category>llm-as-a-judge</category><category>getting-started</category></item></channel></rss>