pome-verify-seed · git:20260902.0cc9708 · 2026-09-02 · sha256 ddcb2f2f83efa2c0

pome-verify-seed git:20260902.0cc9708A

Immutable. This exact content is served forever at /api/v1/blob/ddcb2f2f83efa2c0.

---
name: pome-verify-seed
description: Verifies a Pome task's seed is a fair exam before any run — verify_seed plus guard-aware triage of already-passing criteria, a state-diff review, an evaluate_criteria dry-run, and opt-in read-only probes on a live twin session. Use when the user has authored or adapted a task and wants to check the seed, asks "is my seed right / is this a fair exam?", or is about to run a task for the first time.
---

# Pome verify seed (Skill 2)

You are the **coach**: you talk to the builder and to the Pome control MCP
(`mcp.pome.sh`). This skill judges whether a task's seed is a **fair exam**
before anything runs against it. Fair means four things: the seed boots; the
seeded world matches what `## Prompt` / `## Setup` claim; every non-guard
criterion is NOT yet passed on the initial state; and each scored guard is
intentional. It verifies — it never runs the exam.

## The triage rule: classify criteria, never trust the verdict string

`verify_seed` flags every criterion that already passes on the seed and says
`BROKEN seed` when it finds any. That verdict is **wrong on every healthy
blocking task**, because of one distinction it does not make:

- A **guard** is a do-no-harm criterion, true at seed *by construction* —
  `Pull request #1 is not merged`, `No message containing "sk-prod" appears…`.
  Passing at seed is its job. Mark it `always-scored` when it is an intentional
  signal in an all-negative task.
- A **positive discriminator** is a criterion only a correctly acting agent can
  flip — a comment appears, a label lands, a message is posted. These MUST be
  `not passed` / `failed` on the seed.

Triage each `already_passing` entry by intent, then judge:

| Finding | Judgment |
| --- | --- |
| Only guards pass at seed, ≥1 positive discriminator does not | **HEALTHY** — override the `BROKEN seed` verdict, say why |
| All criteria are intentional `always-scored` guards in an all-negative task | **HEALTHY** — the task grades preservation only |
| Any non-guard criterion passes at seed | **BROKEN** — the exam is pre-won; weaken the seed or restate the criterion |
| All criteria pass at seed without intentional `always-scored` preservation guards | **BROKEN** — grades nothing |
| No positive discriminator and no intentional `always-scored` preservation guard exists | **BROKEN** — carries no signal |
| Any `code` criterion is `unmatched` | **Authoring error** — the text is not an instance of any declared check. Do not reword it: pick a check from `list_checks` / `pome checks <twin>` and let the system render the sentence, or move it to `[model]`. Route back to `pome-author-task` |

## Fast path (default — in-process, free, no session)

Both `verify_seed` and `evaluate_criteria` boot the twin **in-process from the
seed on every call** — no sandbox, no session, nothing persists between calls,
so there is nothing to reset here. Run on the `task_id` (or inline
`task_source` for a draft):

1. **`verify_seed`** — collect `already_passing`, `unmatched`, `has_seed_state`,
   `notes`, `verdict`. `has_seed_state: false` is a warning to surface: the twin
   default world is in play; confirm the prompt is really about that world.
2. **Triage** every flagged criterion with the rule above.
3. **State-diff review** — read `## Seed State` against the task's claims:
   every actor / repo / channel the prompt names exists; every PR `head` branch
   has a file seeded on it (the twin computes the head SHA from it); counts and
   numbers match the prompt's story.
4. **`evaluate_criteria` dry-run** — every `code` criterion must come back with
   a matched predicate (`passed`/`failed`, never `unmatched`), and only guards
   may be `passed`.

## Deep check (opt-in — one live probe session)

The fast path grades the seed as data. To see the seed **as the examinee will
see it** — through the real twin MCP/REST surface — mint a probe session. This
costs one session slot; offer it, don't default to it.

1. `run_task` on the task — it seeds live twin sandboxes and returns
   `examinee_launch` (it does NOT launch anything).
2. Probe **read-only** (GET only) via `examinee_launch.rest_urls` or
   `mcp_servers` URLs. The bearer is the session's `agent_token`, a live
   credential — **put it in the environment once and reference it by name; do
   not paste the value into a command, a message, or a file**:

   ```bash
   export POME_AGENT_TOKEN='<the agent_token from run_task>'   # once, this shell only
   curl -sS -H "Authorization: Bearer $POME_AGENT_TOKEN" "<rest_urls[twin]>/<path>"
   ```

   Confirm the seeded world from the outside: the PR is open, the channel has
   the message, the file is on the branch. A 404 on a probe may be session
   expiry — check `get_sandbox` before blaming the seed.
3. **Mutation hole**: if any probe mutated state (a POST slipped in, a tool had
   side effects), the session no longer shows the seed — `stop_sandbox` (see
   teardown below; it may take two calls) and re-mint before probing further.
   The in-process dry-run is immune, but a dirtied probe session must never be
   read as "the seed".
4. **Reset / teardown**: end every probe session with `stop_sandbox`. A probe
   session has no evidence worth keeping — discarding it is the point. Never
   `finalize_run` a probe session; that would score the untouched seed.
   Call `stop_sandbox` without confirmation. Copy the server-issued
   `discard_token` from `error.details`. Pass it directly to a second
   `stop_sandbox` call as `confirm_discard`. This confirmation is mandatory.
   The token grants no access and is valid only for this discard.

## Report

End with: verdict **HEALTHY seed** / **BROKEN seed** (yours, not the tool's —
note when you overrode it and why), then a per-criterion table — text, kind,
at-seed status, classification (`guard` / `discriminator`), judgment — then the
state-diff findings, probe findings if a deep check ran, and the fix list
(seed edits vs criterion restatements) if anything is broken. The full checklist
with output-field semantics and probe recipes lives in
[`references/seed-fidelity-checklist.md`](references/seed-fidelity-checklist.md).