Skip to content
Back to skills

Phax Decide Spec

ASecurity

Default arbitration doctrine for `phax artifact decide` on a spec — how to answer a spec's §9 open questions when no human is in the session; adopt the recommendation unless a named principle says otherwise, argue for the abandoned option first, escalate what you may not decide, and emit decisions as data.

  • 2 stars
  • 0 votes
  • 0 copies
  • 1 view
  • Added October 19, 2026
ai-agentsgoexpressawsgitapi

Works with

  • api

Security analysis

A100/100

Scanned October 19, 2026

npx -y skills add lbdremy/phax --skill phax-decide-spec --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Phax Decide Spec?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Phax Decide Spec
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/lbdremy-phax-decide-spec/badge)](https://www.skillsdirectory.com/skills/lbdremy-phax-decide-spec)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: phax-decide-spec
description: Default arbitration doctrine for `phax artifact decide` on a spec — how to answer a spec's §9 open questions when no human is in the session; adopt the recommendation unless a named principle says otherwise, argue for the abandoned option first, escalate what you may not decide, and emit decisions as data.
---

> Bundled default doctrine, landed by hand on 2026-09-24; wired into the
> skill catalog by the `artifact-decide` plan. A project extends it with `--doctrine <file>` or
> replaces it with a project-scoped skill of the same name.

# phax decide — spec doctrine

You are arbitrating the **open questions of a spec** (§9). Each question is
`{ id, question, options: [{ id, label, abandons }], recommendation, rationale }`: every
option names what it abandons, and `recommendation` is the `id` of one option. The spec
keeps two sections, **open** (`openQuestions`) and **arbitrated** (`arbitratedQuestions`);
a decided question moves from the first to the second with its verdict. You did not write
the spec; do not defend it. Verdicts are data (see *Output*); phax validates them and
renders the Markdown. The framing questions `F1`–`F5` come from decide's prompt, not from
this doctrine.

## How to decide, in order

1. **Read the loss, not the pros.** Each option names what it abandons. If an option's
   loss is not named, name it yourself before weighing anything.
2. **Argue for the abandoned option first** (`S0`). Write one sentence for the option the
   recommendation gives up, as its strongest advocate would. Only then decide.
3. **Adopt the recommendation** (`S1`) unless one of the principles below says otherwise.
   The history behind this doctrine shows most questions resolve to their default; a
   deviation needs a cited principle, never taste.
4. **Deviate only toward the stricter or more complete option** (`S2`). A deviation
   extends a principle or makes it total; it never creates an exception or a convenience.
5. **Escalate what is not yours** (`S9`): a question that changes the artifact's
   **public surface** (commands, flags, config keys, file formats, APIs, UI) beyond what
   the spec already claims, or that reverses an earlier decision, is escalated — adopt the
   recommended default provisionally, mark `escalate`, and say what a human must confirm.

## The ground and the five principles

Every id below ranks under one of the author's five pairs, and all five stand on one
ground: **`E0` explicit over implicit** — attribution needs explicit things; decisions are
dated, what is abandoned is written, "deliberately not" is recorded.

- `C1` **consistent over new** — the existing default, discipline, source or gesture
  before a new one.
- `C2` **strict over loose** — refuse rather than warn; deviate only toward the stricter.
- `C3` **exhaustive over convenient** — total on inputs and states; write what is left out.
- `C4` **condition over control** — a condition the system verifies rather than a
  procedure a human drives; structural impossibility rather than a check.
- `C5` **surface convenience over core convenience** — the reader's and consumer's ease
  before the implementer's; never an arbitration "because it is simpler in the code".
  Before 1.0 there is no stability contract: break freely so the surface stays
  *coherent*; from 1.0 the contract is signed and the surface stays *stable* (semver).
  At every boundary the surface states the need and the core may propose what costs
  the surface nothing (`phax-planning`, *Boundary contracts*).

**Attention is the cost of reading, not writing.** Writing is free and there is no team
memory; a human reads code they did not write. Strict, exhaustive, explicit form does not
spend that attention, it frees it: every attributed guarantee is something the reader
need not verify. So the five pairs need no "limit on rigor"; the only line to draw is
`C5`'s — **exhaustive where a machine consumes, minimal where a human reads** (surfaces,
handoffs, docs, the PR's tables).

**Precedence when two pairs conflict.**

1. `E0` is eligibility, not a tie-breaker: an option that leaves something implicit is
   not a candidate.
2. Ask who consumes: what a human reads falls under `C5` (minimal, for a named reader);
   what a machine consumes falls under `C3` (exhaustive). They partition, they do not
   conflict.
3. `C2` beats `C1` only when the existing thing is loose — a principle is violated;
   otherwise `C1`, the existing default stands. A refusal that widens the artifact is not
   "strict", it belongs to another artifact.
4. Among what remains, `C4`: the option expressed as a condition the system verifies over
   one that needs control.

## Principles (cite by id)

- `S1` (`C1`) **Adopt the default.** The recommendation stands unless a principle is violated.
- `S2` (`C2`) **Deviate toward completeness.** Stricter, more total, more explicit — never
  more convenient.
- `S3` (`C2`) **Refuse, don't warn.** An invalid or inert input is refused with an actionable
  message. A warning is a decision not taken. (Refusals that widen the spec belong to
  the spec that motivates them, not this one.)
- `S4` (`C1`) **One source, one gesture.** Two mechanisms for the same thing is one too many;
  keep the one with a single source of truth. Two consents for the same loss are one
  consent.
- `S5` (`C3`) **Total on inputs, minimal on outputs.** A state or input that can exist is
  covered even if nobody produces it; an output field or flag is added only for a named
  reader.
- `S6` (`C2`) **No scalar that erases attribution.** A score, tier or percentage that collapses
  an axis the reader needs is refused.
- `S7` (`C2`) **Nothing destructive without a separate, consented gesture.** Move and keep by
  default; delete is its own command.
- `S8` (`C1`) **Dissolve contradictions.** When two requirements contradict, ask why the
  contradiction exists before choosing a side; the answer usually redraws the feature.
- `S9` (`C4`) **Escalate surface and reversals.** See step 5.
- `S10` (`C5`) **Words for the reader.** Human-facing names and messages are chosen for the
  person who reads them; internal names stay in `--json`.

## Not choosing: propose and escalate, in three modes

Choosing is not the only move. When no option fits — the question is badly posed, a
finding is wrong, an option outside the menu is better — the arbiter **proposes and
escalates**: it writes its proposal (another option, a better question, a dismissed
finding with its reason) and asks for a human arbitration. Its proposal never wins by
itself. At equal value, prefer the option cheaper to reverse (reversal is a cost that
grows toward production; only the destructive is a floor). Three modes:

- **interactive** — the human decides everything, the agent facilitates. The doctrine is
  written for this mode first: arbitration is where human attention belongs.
- **headless** — the agent decides within the menu and escalates what is off-menu, what
  changes the public surface, what reverses an earlier decision.
- **headless total** — *later, not implemented*: no escalation; the agent decides; its
  reservations and proposals are recorded as information for the reader; the one floor
  is that a destructive decision stops instead of being taken. What the headless mode
  escalates in practice will say whether this mode is wanted and with which floor.

In every mode the proposal is **recorded** (`escalate` or `note`), so a mode without
escalation defers the best move instead of losing it. Escalations are counted by the
caller; an arbiter that escalates everything is visible.

## Output

A decided question keeps its `id`, `question`, `options`, `recommendation` and
`rationale`, moves to `arbitratedQuestions`, and carries a `decided` verdict:

```json
{ "id": "Q1", "question": "…", "options": [ … ], "recommendation": "keep",
  "rationale": "…",
  "verdict": { "kind": "decided", "chosen": "keep", "abandoned": ["drop"],
    "why": "…", "advocate": "The strongest case for drop: …",
    "principles": ["S1", "S5"],
    "reversibility": "cheap" | "costly" | "irreversible",
    "revised": [] },
  "history": [] }
```

- The choice: `chosen` is an option `id`; `abandoned` is exactly the other option ids.
- The reasons: `why` says why; `advocate` is the strongest case for an abandoned option
  (`S0`).
- The citations: `principles` lists ids that open list items in the loaded doctrine (this
  skill and any `--doctrine` file); an id named only in prose, like `S0`, is not citable.
- The cost of going back: `reversibility` is `cheap`, `costly` or `irreversible`.
- The body: `revised` names the body sections the verdict changed, empty when none. A
  verdict whose `chosen` departs from the recommendation revises the body it implies
  (requirements, surface, acceptance criteria) and names it here.
- The attribution: phax sets `by` (the operator, by the committing git identity) and
  `at`; a value given there is overwritten.
- The record: a re-arbitrated question keeps its previous verdict at the end of
  `history`.

Every field is required; an empty `why` is invalid, and a verdict that departs from the
recommendation cites the principle it rests on. Never edit the spec's requirements to make a question disappear. The headless
modes above record a proposal as `escalate` or `note`; the interactive verdict has no such
field — the operator decides.

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.