training-faq-eval
Internal /ace:run step — Grade the training FAQ.
SKILL.mdskills/training-faq-eval/SKILL.md
GitHubTraining FAQ — Eval
Grades 6-qa-and-training/training-faq.md. The FAQ is the highest-traffic
training artifact: an FLW interrupted in the field needs to find the answer
to "where do I tap to retake the photo?" in seconds, and an LLO triaging
their first cohort needs the escalation matrix in front of them. An
independent grader catches comprehension/accuracy gaps that the producing
skill's self-eval routinely under-counts.
Fitness axis (out-of-chain anchor). "Does the FAQ list the catalogued
questions?" is a topic tally — a faithful build of a thin PDD passes it by
echoing the headings. The fitness dimension is answer_usefulness: does
each answer actually resolve the question for a worker mid-visit (vs the
question merely appearing with a hand-wave answer), and is it written for
the field rather than for a developer at a desk? It anchors on whether the
reader could act on the answer in the real world, not on whether the
question is present, and hard-gates an FAQ whose answers are present but
non-resolving. The comprehensiveness tally is demoted below it. See
skills/_eval-template.md § The out-of-chain fitness requirement.
See skills/_eval-template.md for shared verdict / severity / stock-block
contracts and skills/eval-calibration/SKILL.md for the calibration
methodology. Provisional rubric — calibration TBD until 3+ shipped FAQs
produce ground truth.
Inputs
Pipeline-only: grades a run's training FAQ, which exists only in a run.
| Source | Artifact | Used for |
|---|---|---|
| Phase 6 | 6-qa-and-training/training-faq.md |
artifact under judgment |
| Phase 1 | 1-design/idea-to-pdd.md |
anchors anticipated questions (Operational Caps, Evidence Model, Stage Gate triggers) and archetype |
| Phase 3 | 3-commcare/app-deploy_summary.md |
deliver-app field paths + form names; verifies "tap this button" prose matches reality |
| Phase 5 | 5-ocs/ocs-bot-config.md (if present) |
escalation routing — FAQ should match what the bot tells FLWs |
Products
6-qa-and-training/training-faq-eval_verdict.yaml— verdict YAML per_eval-template.md § Verdict YAML contract. Filename uses the producer stem.
Process
Read inputs from Drive. Read the artifact under judgment from its PUBLISHED file, never your local draft, and re-read it after any republish — see
skills/_eval-template.md § Grade the published revision (stock)(an empty published artifact is a BLOCKER, ace#2592). 1b. Run the published-render gate before grading anything:scripts/check-published-doc-render.ts <published Doc URL>— seeskills/_eval-template.md § Published-render gate (stock). A non-zero exit (raw markdown on the page, or a doc an anonymous reader cannot open) makes this eval's verdictfail, whatever the prose would score (ace#2213). Write the Doc URL you checked to the verdict as top-levelpublished_url, and the result aspublished_render—capture_pathkeeps naming the run-folder source, so the verdict records both what was composed and what a reader opened.Build an "anticipated-questions catalogue" from the PDD: Operational Caps (daily visit limits, payment per visit), Evidence Model Layer A rules (what photo counts, what GPS accuracy is needed), Stage Gate triggers (when does a visit get rejected), payment timing, support contact. This is the rubric's expectation set.
For each catalogue entry, check whether the FAQ surfaces an answer (or documents why it doesn't apply for this archetype). Distinguish "question appears" from "answer resolves the question" — read each answer and judge whether a worker mid-visit could actually act on it, not just whether the Q/A pair exists. Answer non-resolution is the
answer_usefulnesssignal.Apply the rubric and write the verdict YAML.
Surface concerns by severity per
_eval-template.md § Auto-surfaced severity rules.
LLM-as-Judge Rubric
Score each dimension 0–10. Weights sum to 1.0.
| Dimension | Weight | Anchored criteria |
|---|---|---|
| Answer usefulness (fitness — out-of-chain) | 0.30 | For each Q/A pair, does the answer actually resolve the question for a worker mid-visit — and is it written for the field, not for a developer at a desk? This is distinct from comprehensiveness: a question can appear with an answer that doesn't resolve it ("How do I retake the photo?" → "Use the photo retake feature."). Anchor on whether the reader could act on the answer in the real world. 10 = answers are imperative, concrete (name the actual UI control / the actual number / the actual next step), and each genuinely resolves its question. 6 = mixed — some answers resolve, others hand-wave or stay abstract; voice drifts toward spec-prose. 3 = answers are present but non-resolving (restate the question, point at a feature without saying how, or read like a spec doc). Hard-gate: if the load-bearing answers (payment, photo/GPS recovery, escalation) are present but non-resolving, score ≤ 3 → suite verdict fail. PDD silence on how something actually works is a finding here, not a free pass. |
| Comprehensiveness (conformance) | 0.20 | Does the FAQ surface answers to the top-N anticipated FLW/LLO questions catalogued from the PDD? 10 = covers ≥ 80% of catalogued questions, including all Layer A verification edges (photo retakes, GPS retry, consent gate). 6 = covers 50–80%; visible gaps in payment or escalation. 3 = covers < 50%; user would need to ask the bot for basic flow. Hard-deduct -3 if any of {payment-per-visit, daily-cap, support-contact} is missing entirely. Verify the consent-gate clause by scanning the body, never by impression — this row scored a consent-free FAQ as covering the consent gate on hh-poverty-targeting/20260824-1404; absence is a BLOCKER under the hard-deduct rules below, not a partial credit here. |
| Accuracy | 0.20 | Every concrete claim (button labels, field names, numeric caps, payment amounts, escalation contacts) matches the PDD + deploy summary. 10 = no factual drift detected. 6 = ≤ 2 minor drifts (e.g., outdated screenshot caption, off-by-one cap). 3 = ≥ 3 drifts or one load-bearing inaccuracy (wrong payment number, wrong support email). Hard-deduct -5 for any contradicted operational cap. |
| Scannability | 0.15 | Can an interrupted FLW find their answer in ≤ 15 seconds? 10 = question-first headings, indexed/grouped by task, short answers, bolded keywords. 6 = walls of prose under generic headings; user must read paragraphs. 3 = no headings or anchors; FAQ is unusable mid-task. |
| Anticipated-question depth | 0.15 | Beyond the catalogued surface, does the FAQ anticipate edge cases the PDD implies (e.g., "what if the market is closed today?" for a market-survey opp)? 10 = surfaces ≥ 3 archetype-specific edge cases with answers. 6 = 1–2 surfaced. 3 = none; FAQ is rote. |
Weights sum to 1.0: 0.30 + 0.20 + 0.20 + 0.15 + 0.15 = 1.00.
Hard-deduct rules:
- Consent absent while
consent-script-floorfires → BLOCKER; suite verdictfail. Grade this the way it was found, not by reading impressions: run a case-insensitive scan of the PUBLISHED body for the consent protocol and read the hits. The floor is at least two[FLW]entries — the script itself, and the refusal/withdrawal path (training-faq § step 4b, the producer-side obligation this mirrors). Fire the trigger straight from_app-component-library.md § consent-script-floor, whose clauses are evaluated INDEPENDENTLY and can fire on a PDD that never uses the word. An adjacent sentence that gestures at "what they were told at the start" without naming the script or the refusal path does not clear the floor. Live (measured_on: 2026-08-26; that run's FAQ and PDD are live, mutable Drive documents — re-read them before treating this as a regression gate):hh-poverty-targeting/20260824-1404shipped a consent-free FAQ —grep -in consentreturned zero hits across 11,822 characters — on a PDD mandating a six-element read-aloud script in § 7.5 and making refusal one of three non-payable outcomes, whilecomprehensivenessscored it as covering the consent gate (ace#1687). - Load-bearing answers present but non-resolving (
answer_usefulness≤ 3) → BLOCKER; suite verdictfail. A faithful echo of the catalogued questions with hand-wave answers does not earn a pass. - Screenshot reference exists in markdown but resolves to a dead Drive ID → BLOCKER (cap overall ≤ 5).
- FAQ contradicts a PDD operational cap (e.g., FAQ says "10 visits/day" when PDD says 8) → BLOCKER.
- Any single dimension ≤ 3 → suite verdict
fail.
Inflation guard. If training-faq self-eval graded itself top-tier
and this rubric's overall ≤ 8.0, cap overall at 8.0 and surface a
[WARN]. Default no-op until the producer ships a self-eval.
Calibration target (per _eval-template.md § Calibration target boilerplate):
- Detection rate ≥ 80% of catalogued FAQ issues from
eval-calibration/known-issues.md § Training FAQ(catalogue TBD). - Inter-run variance ≤ 0.5 across 3 same-model runs.
- Agreement with self-eval within ±1.5 points.
Provisional — flagged until first real run produces ground truth.
Archetypes
| Archetype | Rubric tweak |
|---|---|
atomic-visit |
Default. Anticipated-question catalogue centers on per-visit flow, photo/GPS retries, payment per visit. |
focus-group |
Catalogue shifts to attendance, per-session payment, facilitator vs participant Qs. Comprehensiveness dimension expects FGD-specific entries. |
multi-stage |
Catalogue expects per-stage FAQ blocks + Stage-Gate-trigger explanations ("what does it mean my visit is in stage_2_pending?"). |
MCP Tools Used
See skills/_eval-template.md § MCP Tools Used (stock).
Mode Behavior
See skills/_eval-template.md § Mode Behavior (stock).
Dry-Run Behavior
See skills/_eval-template.md § Dry-Run Behavior (stock).
Change Log
| Date | Change | Author |
|---|---|---|
| 2026-05-09 | Initial version. 5 dimensions: comprehensiveness (0.35), accuracy (0.25), scannability (0.20), field_realism (0.10), anticipated_question_depth (0.10). Provisional rubric — calibration TBD until first real run grades the artifact. | ACE team (qa-eval-registry initial buildout) |
| 2026-05-29 | Promoted the fitness axis above the comprehensiveness tally: renamed field_realism → answer_usefulness (0.10→0.30, out-of-chain, hard-gate) and folded in an "answer actually resolves the question" judgment distinct from "question appears". Demoted comprehensiveness 0.35→0.20 (it was a topic tally); accuracy 0.25→0.20, scannability 0.20→0.15, anticipated_question_depth 0.10→0.15. Sum = 1.00. Per docs/superpowers/specs/2026-05-29-eval-fitness-gap.md. |
ACE team (eval-fitness-gap) |
| 2026-08-26 | An absent consent protocol becomes a BLOCKER (ace#1687). comprehensiveness already listed "consent gate" among the Layer A verification edges, and it scored hh-poverty-targeting/20260824-1404 as covering it while the published FAQ contained the word zero times across 11,822 characters — on an atomic-visit PDD mandating a six-element read-aloud script in § 7.5 and making refusal one of three non-payable outcomes. A clause inside a 0.20-weighted dimension is not a gate: partial credit absorbed a total absence. Added a hard-deduct BLOCKER firing on _app-component-library.md § consent-script-floor — the same trigger the producer, the build, and pdd-to-deliver-app-eval share — requiring the script AND the refusal/withdrawal path, graded by scanning the published body rather than by impression. Weights unchanged. Mirrors the producer-side obligation added as training-faq § step 4b the same day, so build-emit and eval-grade cannot drift. Enforced: test/skills/training-faq-consent-coverage.test.ts. |
ACE team |