Files
magnus919_agent-skills/lifecycle-evals/README.md
T
Magnus HedemarkGitHubfactory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
9d6bddad61 test: add lifecycle evaluation corpus for new product and production skills (#232)
* test(evals): scope claims to harness model fixtures and revision

Append the neckbeard claims-scoping sentence to one representative
expected_output per per-skill manifest so every corpus member states
VAL-EVL-032 scope (harness, model, fixtures, revision under test).

Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>

* test(product-lifecycle): upgrade integrated launch trajectory

Add an explicit launch-decision assertion to the new-product lifecycle
case so the integrated product-launch scenario terminates in a launch
decision recorded as a lifecycle evidence-ledger entry (VAL-CRP-010),
and scope its expected_output claims per VAL-EVL-032.

Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>

* test(production-excellence): add integrated migration reconciliation failure case

Add integrated-migration-reconciliation-failure: the production-excellence
gate model returns No-go on a reconciliation mismatch, records the failure
evidence, produces a rollback/roll-forward decision with an accountable
owner, and does not proceed to launch (VAL-CRP-012).

Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>

* test(agent-production-operations): add privacy boundary escalation case

Add integrated-privacy-boundary-escalation (VAL-CRP-015): the runtime
control plan halts a cross-boundary EU PII trace export before any data
processing, names the privacy boundary, and escalates to jurisdiction-
specific legal review and a human operator. Also add a tool-authority-
health handoff assertion to the read-only contract case (VAL-CRP-016).

Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>

* test(lifecycle-evals): add lifecycle evaluation corpus

Add the #204 corpus home: run tooling (run-corpus.sh, fake adapter only),
programmatic coverage validator (validate-corpus-coverage.py), machine-
readable coverage index + human-readable coverage matrix, regression-
detection and fixture/source notes, the bounded discovery brief, and a
one-snapshot committed set of fake-adapter per-trial run artifacts with
harness/model/date scoping fields.

Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>

---------

Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
2026-08-02 20:13:36 -04:00

143 lines
8.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Lifecycle Evaluation Corpus
A focused output-quality evaluation corpus for the milestone-4 product-to-production
skills: the 14 new top-level skills (implementation-planning, product-analytics-and-measurement,
product-roadmapping-and-portfolio, product-experimentation, product-adoption,
conditional-customer-success, product-operations-and-governance, product-lifecycle-learning,
production-readiness, migration-engineering, resilience-and-recovery,
capacity-and-cost-engineering, incident-learning, privacy-engineering) and the 3 bundle
umbrellas (product-lifecycle, production-excellence, agent-production-operations).
This directory is **not** a canonical skill: it deliberately has no `SKILL.md`, so the
repository validators (which discover skills by `SKILL.md`) do not treat it as one. It is a
corpus layer over the 17 per-skill eval manifests, plus run tooling, documentation, and
committed reproducible run artifacts.
## Why this exists
The 17 milestone-4 skills each ship `evals/evals.json` with at least five output-quality
cases. This corpus layers the cross-skill requirements of issue #204 on top of those
manifests:
- every corpus case is an output-quality case with observable assertions in the canonical
`assertions` field (never trigger-only, never the `expectations` alias);
- the corpus as a whole covers five behavioral categories — **ambiguity**, **conflicting
evidence**, **unsafe authority**, **failure**, and **justified stop/retire** — each with
at least one case;
- the three bundle manifests carry six **integrated trajectory** scenarios — product launch,
failed experiment, migration with reconciliation failure, blocked production-readiness
review, agent tool failure, and privacy-boundary escalation — each exercising real
handoffs (evidence-ledger entries, production-evidence-packet fields, routing records,
escalation records, trace-to-eval feedback records), not isolated wrapper output;
- results are reproducible with the fake adapter, scoped, and honestly reported.
The machine-checkable map of which case covers which category/scenario is
[`references/coverage-index.json`](references/coverage-index.json), validated by
[`scripts/validate-corpus-coverage.py`](scripts/validate-corpus-coverage.py); the
human-readable version is [`references/coverage-matrix.md`](references/coverage-matrix.md).
## How to run the corpus
Prerequisite: the repository `.venv` (requirements-dev.txt installed). No credentials, API
keys, or network access are required — the corpus runs with the **fake adapter only**.
Run all 17 manifests end-to-end:
```sh
bash lifecycle-evals/scripts/run-corpus.sh
```
This loops every manifest through `eval_runner --adapter fake`, writes per-trial manifests
under `${CORPUS_OUT_DIR:-/tmp/lifecycle-evals-runs}/<skill>/manifests/`, and exits 0 only
when every trial completed with zero failures.
Run a single manifest:
```sh
.venv/bin/python -m eval_runner <skill>/evals/evals.json --adapter fake --output-dir /tmp/eval-smoke-<skill>
```
Validate the coverage index and category/scenario coverage:
```sh
.venv/bin/python lifecycle-evals/scripts/validate-corpus-coverage.py
```
After changing case content or tags, refresh the committed index with
`--write-index` (see [`references/regression-detection.md`](references/regression-detection.md)).
## Artifact layout
| Path | What it is |
|---|---|
| `README.md` | This file: run instructions, scoping, status semantics, claims policy |
| `references/coverage-matrix.md` | Human-readable matrix: every corpus case ID tagged with behavioral categories and integrated scenarios |
| `references/coverage-index.json` | Machine-readable coverage index (generated by `scripts/validate-corpus-coverage.py`) |
| `references/regression-detection.md` | Concrete regression-comparison procedure, case-ID stability rule, ratchet command, interpretation guidance |
| `references/sources.md` | Fixture/source notes and provenance (corpus cases are self-contained; inputs inline in prompts) |
| `references/discovery-brief.md` | Bounded discovery brief: surveyed surfaces, ownership boundaries, decisions |
| `scripts/run-corpus.sh` | Fake-adapter loop over all 17 manifests, aggregate exit 0 |
| `scripts/validate-corpus-coverage.py` | Programmatic coverage validator (categories, scenarios, ID resolution, index currency) |
| `run-artifacts/manifests/` | One committed snapshot of fake-adapter run output (per-trial manifests), refreshed at merge time |
The 17 eval manifests themselves live in their owning skills:
`<skill>/evals/evals.json` for the 14 top-level skills and `bundles/<bundle>/evals/evals.json`
for the 3 bundle umbrellas.
## Per-case status semantics
Each `eval_runner` trial produces a per-trial manifest (see
`run-artifacts/manifests/*.json`) whose `status` field is one of:
| Status | Meaning |
|---|---|
| `completed` | The trial executed to completion under the adapter and was serialized. With the fake adapter this means the pipeline ran the case end-to-end with no runner error. |
| `error` / `timeout` / `stopped` | The trial did not complete normally (execution error, timeout, or early stop) and counts as a failure for the run. |
The runner reports `done: N trial(s), 0 failure(s)` and exits 0 when every trial is
`completed`. A 0-failure run proves **pipeline reproducibility and case executability**:
every case loads, runs through the harness, and serializes a scoped result. It is not a
measure of model capability (see the claims policy below). The per-trial manifests also
record `prompt_hash` and `fixture_hashes` so the exact case content under test is pinned.
## Task-class scoping statement
All results produced by this corpus are scoped to:
- **Harness:** the `fake` adapter v0.1.0 via `eval_runner` (`.venv/bin/python -m eval_runner`).
- **Model:** none / `unspecified` for fake runs (`model.provider` and `model.model_id` are
recorded per trial as `unspecified` unless `--model` is passed).
- **Task class:** output-quality + integrated-trajectory evaluation of the milestone-4
product-to-production skills (the 14 product/production skills and 3 bundle umbrellas),
covering the five behavioral categories and six integrated scenarios listed above.
- **Date:** the `started_at` / `finished_at` timestamps recorded per trial.
No result is presented without this scope; per-trial manifests carry it mechanically.
## Trigger-only prohibition
Trigger-only checks — "does the skill load when I mention X", "is frontmatter valid",
"did the trigger match" — are **not** accepted as substitutes for output-quality
evaluation anywhere in this corpus. Every case has at least one assertion verifiable from
the produced output, artifact, decision outcome, or record content (a rejection, an
escalation, a stop/retire decision, a routed artifact, a recorded evidence entry). Cases
whose correct behavior is a negative outcome (reject / escalate / stop / retire / pause /
block / decline) assert exactly that negative outcome.
## Claims policy (non-claim statement)
This corpus is a **small, fixed output-quality corpus** (14 skills × ≥5 cases + 3 bundles
of integrated cases). **Fake-adapter runs prove pipeline reproducibility and case
executability only.** They produce **no pass-rate, accuracy, or capability claims about any
model** — no "10x", no "best", no universal performance claims. Any future **real-adapter**
run (a model-backed harness) must be separately scoped, labeled (adapter + model + model
version + date + task class), and reported under its own claims policy; results from such
runs must never be conflated with the fake-adapter corpus results committed here.
## Reference files
- [`references/coverage-matrix.md`](references/coverage-matrix.md) — which case covers which category/scenario.
- [`references/regression-detection.md`](references/regression-detection.md) — how to detect and interpret regressions across revisions.
- [`references/sources.md`](references/sources.md) — fixture/source notes and provenance.
- [`references/discovery-brief.md`](references/discovery-brief.md) — the bounded discovery brief for this corpus.