PA_PVP - a PLUTONIUM-like Adversarial Peer Validation Protocol (Guide)
PA_PVP is a rule-ordered decision protocol optimized for movement under uncertainty. It is designed as an AI-native decision kernel with human supervision.
If you want the fastest copy/paste path, start with QUICKSTART.md. Read this guide when you want the operating model, the state transitions, and the reasoning behind the protocol mechanics. It assumes you care about how PA_PVP works, not just how to run the first batch.
Two layers (do not mix them)
PA_PVP has two ways to use it:
1) Kernel (protocol)
- File: PA_PVP_full_v9.8.0_canonical.txt
- Use this when you want a rule-ordered, stateful, batch-safe AI-to-AI protocol.
2) Quickstart (copy/paste template)
- File: QUICKSTART.md
- Use this when you want the simplest copy/paste workflow to run the kernel.
We call it the “kernel” because of its internal structure: this choice is intentional to reduce drift and noise: one rule-ordered SSOT core enforces invariants and produces the state transition, while everything else (Quickstart, REPORT, orchestration policy) stays a consumer layer that must not change SSOT semantics.
What the kernel returns (always)
Each run returns:
- a forced verdict:
DO NOW/DO LATER/DISCARD - one
[NEXT]action (executable ifACTIVE/PROBING; optional/planned-only whenSTANDBY) - up to five atomic executable steps
For human scanning, the output also includes a derived markdown table ([HUMAN_TABLE]) after the code block.
The [QUEUE] and [HUMAN_TABLE] lines include a gate: token (dominant gate) so you can see the primary blocker without opening item blocks.
[HUMAN_TABLE] is UI-only: models must not treat it as SSOT or as machine input; analysis must rely on the single code block only.
If [PANEL] marks the output invalid, the runtime fail-closes to a minimal diagnostic surface and that output must not be reused as machine state.
If it cannot produce an executable next action, the item is invalid (or must be discarded/parked).
Orchestrator policy (optional, external)
Keep the kernel guardrails hard and rule-ordered. If you have an orchestrator/runner that chooses what to execute next across items, use this simple rule:
- Among actions allowed by gates and Step 1 priority, choose the next action that maximizes information ROI relative to Cost of Delay (cheap-first when possible).
REPORT / REPORT LITE (human render, no-look, derived-only)
If you want a human-readable report without adding narrative drift to the SSOT loop, use a second pass:
Input format (consumer-layer command):
- First line:
REPORTorREPORT LITE - Next lines: paste ONE PA_PVP snapshot from a prior kernel run (the code block). Extra derived text after the code block is OK and will be ignored.
Note:
- The canonical kernel supports these commands as a non-SSOT routing mode, so you can invoke them without loading a separate prompt.
Hard rules:
- The report MUST be derived-only from the pasted snapshot.
- It MUST NOT change verdicts/gates/triggers/steps or introduce new facts.
- If a value is missing in the snapshot, the report MUST say
missing in snapshot(no invention). - The report output MUST NOT be used as SSOT input (
<<<PREV>>>); it is a rendering only. - If the snapshot is missing or malformed, output:
ERROR: missing or invalid snapshotand stop. - The report MUST NOT include any code blocks (to avoid being confused with a PA_PVP snapshot).
REPORT LITE (1 page, scan-first) MUST include:
- Batch overview: counts by state; list ids
DO NOW; list ids blocked (top 5 bygate:). - For each
DO NOW/PROBINGitem:id,gate,trigger,critical_driver,conf, and the[NEXT]token (if present). - A short “What to do next” list: execute
[NEXT]forACTIVE/PROBINGitems; forSTANDBY, list the next planned action (if[NEXT]present).
REPORT (FULL, derived-only) MUST include:
- Everything in
REPORT LITE, plus per-item details for all non-terminal items:state,verdict,gate,trigger,closure_tier,best_evidence_tier,falsification_debt- steps list (S1..S5) with statuses when present
[NEXT]semantics: executable forACTIVE/PROBING; planned-only ifSTANDBY
- Fixed metrics (only if derivable from snapshot):
timebox_utilization_pct = 100 * tb_total / tb_budget(prefercounters tb=.../...; else sumtimebox<=Nm)complexity_utilization_pct = 100 * cx_score / cx_budget(prefercounters cx=.../...; else use complexity tax formula)step_completion_pct = 100 * completed_steps / steps_count(fromstatus=COMPLETED*markers)probe_resolution_pct = 100 * resolved_probe_ids / probe_ids_total(from[PROBE_LOG]statuses)- If a metric cannot be derived, print
missing in snapshot.
Optional: HUMAN_TABLE_OPS (scan-friendly console)
In addition to the mandatory [HUMAN_TABLE], the runtime may output an optional second table:
[HUMAN_TABLE_OPS](outside the code block; derived-only)
It is derived from [QUEUE] + per-item [ITEM_PANEL]/[DERIVED] and is designed to answer quickly:
“Is anything ready right now?”
It is ignored by SNAPSHOT-AS-INPUT just like [HUMAN_TABLE].
Optional: RISK_DASHBOARD (batch hotspots)
The runtime may also emit an optional derived-only block after the code block:
[RISK_DASHBOARD](outside the code block; derived-only)
It aggregates cross-item risk without introducing new kernel fields:
- derived from
[QUEUE]+[ITEM_PANEL]short fields only (driver, confidence, debt, gates) - ignored by SNAPSHOT-AS-INPUT (rendering only)
This answers: “Which drivers are fragile across the batch right now?”
SSOTScale (noise control, output-only)
PA_PVP supports an output-only scaling flag (no SSOT semantics change):
- batch:
<<<B ... ssot_scale=MIN|DEBUG>>>(defaultMIN)
Behavior (rule-ordered):
MIN: prints only the operational console for non-<<<PREV>>>items (panel/queue +ITEM_PANEL/DERIVED/STEPS/NEXTand probe logs if present).DEBUG: prints the full item structure.- In
MIN, any item withcontested=YESordominant_gate != NONEMUST be emitted inDEBUG(auto-escalation).
When to use PA_PVP
Use it when:
- the decision has real operational impact
- trade-offs are non-trivial
- you want to prevent analysis loops and force contact with reality
Do not use it for:
- free-form brainstorming
- pure exploration with no actionable leverage
Operating modes (derived per item)
The kernel derives an execution mode per item:
OK: fast loop (execute now)SLOW_MODE: systemic decision (probe-first)NO_TOOL: bypass the deep loop (execute or discard directly)
Terminality is separate from the mode:
- an item can be
CLOSED(terminal) while itsdsstill readsOK/SLOW/NO_TOOLfor scanability.
DIY / LOW is still real (MIN_SURFACE)
To keep the protocol truly scalable from trivial choices to systemic decisions, PA_PVP enforces a minimal emission surface:
- If
profile=DIYorimpact=LOWand the item is not enteringPROBING, the output for that item must stay minimal:[ITEM_PANEL]+[DERIVED]+[STEPS]+[NEXT]- no probe harness / probe logs unless the item is actually
PROBING
This prevents “DIY masked as FULL” and keeps low-stakes runs short and executable.
How the kernel works (copy/paste)
The kernel is batch-first. You paste:
- one batch header (optional):
<<<B ...>>> - one or more items:
<<<I ...>>> ... <<<END>>>
Each item must contain exactly one mode:
<<<PLAN>>>(bullets or numbered steps)<<<ARTIFACT>>>(paste the artifact to audit/optimize)<<<TOOL>>>+<<<TARGET>>>(tool audits target; must not invert)
Ping-pong is supported:
- If you paste the full previous output, the protocol treats it as
SNAPSHOT_AS_INPUTand resumes delta-only.
Simulation-first execution and closure
By default the kernel runs without runtime access:
- Batch defaults:
exec_capability=NO_RUNTIMEandclose_policy=SIM_OK
This means the protocol is allowed to close decisions based on simulation, but it must label the closure tier:
ct:SIM(simulated close)ct:REAL(close backed by new real/historical/experiment evidence)
Irreversibility safeguard:
- If an item declares
reversibility=IRREVERSIBLE, it must not close asct:SIM. It requiresct:REALevidence (or it is parked withCLOSE_BLOCKED_REAL_ONLY).
Reopen mitigation (REAL-closed items):
- If an item was previously
CLOSEDwithct:REALand is reopened due to new evidence, Step 1 must be a mitigation/compensation step (rollback/containment/compensation) before continuing execution.
Anti-loop reopen cap (mechanical):
- The kernel tracks
reopen_total(derived, authoritative) and blocks reopening whenreopen_total>=1withtrigger=REOPEN_BLOCKED_BUDGET.
Dynamic priorities (policy, via <<<CHANGE>>>):
- When context changes (deadlines, constraints, scope), add a short
<<<CHANGE>>>declaration so impact/urgency updates are explicit and reviewable across iterations.
Runtime exceptions (RUNTIME_OK, closed vocabulary)
When you run with exec_capability=RUNTIME_OK, steps may fail due to runtime exceptions (not fail_if).
In that case the step output token (after ->) MUST be one of:
EXCEPTION_IOEXCEPTION_TIMEOUTEXCEPTION_AUTHEXCEPTION_INVARIANTEXCEPTION_DEPENDENCY
The kernel maps these by fixed rules to existing blockers (no new tags):
- IO / TIMEOUT / AUTH ->
BLOCKED_EXTERNAL(gateEXTERNAL_BLOCK) - DEPENDENCY ->
DEPENDENCY_BLOCK - INVARIANT ->
REDESIGN_TRIGGER
Batch debug line (TopGates)
The [USER_PANEL] includes a TopGates: line showing up to 5 highest-impact gate causes across the batch (derived from gate: tokens only).
Concurrency (optional, rule-ordered)
You can model resource contention across items with two optional fields:
- batch:
resource_pool=R1:1,R2:2 - item:
uses=R1:1,R2:1
If multiple DO NOW items exceed capacity, the kernel demotes lower-priority items to DO LATER by fixed priority rule with trigger=DEPENDENCY_BLOCK (no new tags).
Dependencies (batch, DAG-only)
depends_on encodes execution-order constraints across items.
Normal dependency block (expected):
- if an item depends on another item that is not
CLOSED/DISCARDED, it must wait or explicitly waive the dependency (debt applies).
Circular dependency (structural modeling error):
- the
depends_ongraph among items present in the same batch MUST be acyclic (DAG-only). - if a cycle is detected (including self-dependency), each item in the cycle is parked by fixed rule:
new_state=STANDBY,verdict=DO LATERtrigger=CIRCULAR_DEPENDENCY(dominant gate maps toREDESIGN_TRIGGER)- the earliest non-conflicting step must break the cycle (split/refactor ids, remove/replace an edge, waive one edge with debt, or discard a dominated item).
- even though the item is
STANDBY(no execution now), the cycle-breaking step(s) must still be recorded in[STEPS]as the planned actions for when it is later revived.
Step 1 priority (hard, fixed-order)
Multiple rules can require a specific “Step 1 MUST …” action in the same run (reopen mitigation, cycle redesign, probes, dependency blocks, conservation redesign). To prevent contradictions, the kernel uses a fixed priority order for what Step 1 must be:
1) Reopen mitigation (previously CLOSED with ct:REAL and reopened)
2) Circular dependency break (trigger=CIRCULAR_DEPENDENCY)
3) Reality probe / probe harness redesign (when entering PROBING)
4) Dependency/resource block (unresolved depends_on or resource overload demotion)
5) Timebox/complexity redesign (conservation)
Lower-priority requirements are not dropped: if they are still relevant, they must appear as the earliest non-conflicting later step.
Probe executability constraint (hard):
- If an item enters
PROBINGbut has unresolved dependencies, the probe/data-acquisition chosen as Step 1 must be dependency-independent:- it must not require the dependency’s output and must not require executing blocked dependent steps.
- If no such probe can exist, the item must not enter
PROBINGin that run; it is parked underDEPENDENCY_BLOCKand follows dependency resolution instead.
Waiver positioning (hard):
- If you waive a dependency, the waiver action is a dependency-resolution step (often Step 1 when no higher priority applies).
- The probe/acquisition step required by the waiver must be placed at the earliest non-conflicting position after the waiver.
Cheap-first probe note:
- “Cheap-First” is a design constraint for probe steps, not a scheduling override over Step 1 priority.
Conservation (TimeboxBudget) and Complexity Tax
To prevent “free” simulation plans, the kernel enforces:
- a derived per-item timebox budget (based on impact)
- a derived complexity tax (steps + dependencies + contested/missing ratings + hedge + resource usage)
If a plan exceeds these budgets under weak evidence (SIMULATED/DERIVED), it triggers REDESIGN_TRIGGER and must be simplified or split.
Debt and complexity:
- If
falsification_debt=OPEN(...), treat it as extra coordination/risk and count it in the complexity tax (soft disincentive) in addition to the hardDEBT_CEILINGguardrail.
Probe cycles and near-miss loops (optional, mechanical)
Inside [DERIVED] the kernel can expose counters:
derived_version: derivation ruleset id used to compute derived fields (audit compatibility)pc: probe cycles completed (distinct probe_id reaching VALIDATED/FALSIFIED/EXPIRED)nm: near-miss count (distinct probe_id markedPASS_NARROW)nmd: near-miss count in the Deterministic domain (same asnm, but only for Deterministic domain)
Repeated near-misses under weak evidence can trigger REDESIGN_TRIGGER (probe harness redesign) without introducing new tags.
In Deterministic domains, any nmd>=1 must be treated as a learning signal: confidence is capped to MED and the plan must include a mitigation step (second independent check or threshold redesign).
Counters are optional:
- Treat
counters:as derived scan-only. If it is omitted, derive the same quantities from[PROBE_LOG](log-first).
Anti-stagnation (policy, mechanical):
- If the same critical uncertainty remains unresolved across iterations under weak evidence (
SIMULATED/DERIVED) and counters indicate spent cycles (pc/nm/inc), treat it as a stall and force a redesign:- change proxy/metric/kill-switch/constraint_signature, OR split the item, OR park it.
- Avoid adding hard-coded “max attempts” counters to the kernel; prefer these observable stall signals + mandatory redesign.
AskUser: always NONE until you need it
Default behavior is simulation-first:
AskUserstaysNONEand the protocol advances using internal simulation/probes.
If you truly need external evidence, explicitly enable it:
- Batch:
<<<B ... ask_user=ALLOW>>> - Per item:
<<<I ... ask_user=ALLOW>>>
Even when enabled, it can ask at most one minimal evidence question, and it should ask only when it is mechanically justified:
- the item is externally locked (
dominant_gate=EXTERNAL_BLOCK, derived from a closed trigger set) - and either the run is real-only (
close_policy=REAL_ONLY/ irreversible) or the loop has already “spent” internal cycles (pc/nm/inccounters).
EXTERNAL_BLOCK escalation (policy, orchestrator-side):
- If an item remains locked on
EXTERNAL_BLOCKfor multiple iterations, the orchestrator should force a proxy redesign or an evidence acquisition step (and only then consider AskUser, if enabled).
Human workflow modes (supervision)
These are “how you run the loop”, not protocol states:
Single-host
One reviewer/agent. Best for speed and discipline.
Multi-host (peer validation)
Two independent reviewers run the same input.
- Convergence (same verdict + similar top steps) increases confidence.
- Divergence indicates unresolved risk or missing evidence -> run probes / acquire data.
Peer convergence (A/B, consumer-level)
In multi-host mode, you can compare two independent PA_PVP outputs by fixed rules without changing the kernel. This is a consumer/renderer layer that reads the two snapshots and produces a convergence decision.
Two parts:
- B (required): fixed compare rules
- A (optional): fixed-rule convergence report (a derived table printed outside the code block)
B) Fixed compare rules For each item id present in either output, extract:
verdict: from[QUEUE](fallback to[ITEM_PANEL]if missing)gate: from[QUEUE]gate:(dominant gate token)conf:critical_driver_confidencefrom[ITEM_PANEL]tokens: a set of step output tokens (see below)
Step output token extraction (language-agnostic):
- for each
S#:line in[STEPS], take the substring after->up to the next|(or end), trim whitespace - keep the first 3 step tokens + the
[NEXT]token (if present)
Fixed metrics (per item):
VA(verdict agreement):1if equal else0GA(gate agreement):1if equal else0SO(step overlap): Jaccard overlap oftokenssets (intersection_size / union_size,0..1)CD(confidence distance): mapVERY_LOW/LOW/MED/HIGHto0/1/2/3, thenabs(a-b)(missing ->3)
Fixed classification:
CONVERGEDifVA=1ANDGA=1ANDintersection_size>=1SOFT_DIVERGENCEifVA=1but notCONVERGEDHARD_DIVERGENCEifVA=0
Fixed next-action selection:
- if
CONVERGEDand[NEXT]tokens match -> execute that (only if the item is notSTANDBY) - else if
intersection_size>=1-> execute the shared token with the smallest rank-sum (rank is 1..3 for steps, 0 for[NEXT]; ties -> lexical) - else:
SOFT_DIVERGENCE: execute the smallesttimebox<=...step across both outputs (ties -> lexical token)HARD_DIVERGENCE: do not merge. acquire new evidence (probe or external data) and rerun
A) Optional convergence report If you want a scan-friendly UI, render a derived block after both code blocks:
- header:
[PEER_CONVERGENCE] - one fixed-row markdown table with:
id | VA | GA | SO | CD | class | next_action
This report is not SSOT and must be ignored by SNAPSHOT-AS-INPUT.
N-host consensus (optional, external):
- You can generalize the same fixed-rule compare to N independent outputs by computing per-item agreement metrics and selecting the next action via a fixed rule (e.g., majority verdict + shared token with lowest rank-sum).
- Keep this logic outside the kernel so the SSOT remains stable.
Snapshot integrity (optional, external)
If you need tamper-evidence (legal/audit), compute and store a hash/signature of the emitted code block outside the kernel.
Do not add signatures inside [PANEL]/[QUEUE] unless you also define a strict canonicalization rule.
Red-team (optional)
One reviewer’s explicit goal is to break the plan: find failure modes and abuse cases.
Rating rubric (LOW / MED / HIGH)
Treat labels as triage, not fake precision:
- Cost: time/money/complexity/dependencies to do it
- Benefit: value gained or risk removed if it works
- Risk: likelihood x impact of failure
Rule of thumb:
- if you cannot estimate -> default
MEDand declare what evidence would reduce uncertainty.
Common failure modes (anti-patterns)
- Output says “it depends” instead of forcing a verdict.
- Steps are vague (“improve”, “optimize”, “refactor”) without falsifiable action.
- Alternative is invented without showing it is clearly superior.
- Step ordering is arbitrary (not cost/benefit or information ROI).
Validation (do not regress the kernel)
Protocol changes should be tested with the Examples Pack:
- Examples: examples.md
- Glossary: glossary.md
Run the same examples before/after and verify invariants still hold.
GitHub Pages (optional)
This repo includes a mini-site in docs/ (see overview.md for the doc landing and index.html for GitHub Pages).
To publish: GitHub -> Settings -> Pages -> Source: Deploy from a branch -> Branch: main -> Folder: /docs.
Modeling guidance (policy):
- Mutual exclusion: model alternatives inside the same item (options) or use a coordinator item; avoid cross-item auto-discard fields in the kernel.
- Knowledge transfer: when an item is falsified, promote any validated probe outcomes into
<<<NEW_EVIDENCE>>>for related items (or create a “lessons learned” item) instead of inventing sunk-cost math in the kernel.
Consistency upgrades (optional fields)
For probes, you can add a canonical constraint_signature inside decision_context to make context_match more mechanical and less subjective across iterations.
In PROBING, probes are adversarial-by-construction: they must include an explicit kill_switch and canonical constraint_signature (otherwise they stay INCONCLUSIVE and must be redesigned).