# Symposium-2026 Design Loop — Verifier Rules

These 9 rules are enforced by `mcp__codex-cli__review` (GPT-5.5) on every surface
before wave completion. A surface may not advance past the verifier loop until all
applicable rules return PASS. Opus may not self-review as the verifier.

---

## 1. No feature overclaim

Do not claim a feature that is not shipped and verified in the Laravel repo. A claim
is anything that a prospect, advisor, or evaluator would reasonably interpret as a
live product capability — a CTA, a status label, a confirmed output, or a workflow
step stated without a caveat. The Laravel verifier (`php artisan verify`) and the
test suite are the authoritative record of what is shipped. If a feature is
partially shipped, the surface must reflect that honestly (for example, by showing
a "verification pending" badge or a scoped description of what is actually live).

- **FAIL:** A surface for `p5-proposal-generation` shows a "Generate in 30 seconds"
  call-out even though the proposal generation job has no verifier pass for that SLA.
- **PASS:** The same surface shows "Proposal draft queued" with a link to the builder,
  matching the verified `POST /proposals/{id}/generate` behavior recorded in
  the verifier output.

---

## 2. Brand token purity

All color and font values in the surface's HTML and CSS must come exclusively from
`_brand.css` custom properties (e.g. `var(--color-accent)`, `var(--font-family-primary)`).
No raw hex codes, RGB values, named CSS colors, or font-name strings may appear in
inline styles, `<style>` blocks, or linked stylesheets for this surface. The `_brand.css`
file is the single source of truth for both brand packs; any color or font applied
outside of it will diverge silently when the brand pack is updated.

- **FAIL:** A button in `p9-existing-client-lane/index.html` contains
  `style="background: #0077C8; font-family: Clario, sans-serif;"` instead of
  `style="background: var(--color-accent); font-family: var(--font-family-primary);"`.
- **PASS:** All styled elements reference only custom properties defined in `_brand.css`,
  and switching the `<body>` class between `brand-proposalforge` and `brand-tr-partner`
  produces visually correct results for both packs without any per-surface CSS edits.

---

## 3. No Blade/route interpolation

Static HTML surfaces must contain no Laravel template syntax whatsoever. This includes
`{{ }}` echo tags, `{!! !!}` raw echo tags, `@route()`, `@url()`, `route()`, `url()`,
and any other Laravel/Blade directives or PHP expressions. These surfaces are never
processed by the Laravel framework; they are pure static files. Any live URL reference
must be written as a hardcoded example path (e.g. `/proposals/42/review/demo-token`)
that clearly communicates intent without implying runtime resolution.

- **FAIL:** A link in `p10-acceptance-handoff/index.html` reads
  `href="{{ route('proposals.accepted', $proposal) }}"`.
- **PASS:** The same link reads `href="/proposals/42/accepted"` with a comment noting
  the intended route pattern.

---

## 4. tr_partner draft watermark

Every render of a surface under the `tr_partner` brand — whether viewed in a browser,
captured as a screenshot, or shared in a review — must display the internal draft
co-brand banner. The banner text is `[INTERNAL DRAFT — Not for external distribution]`
as defined in `brand-packs/tr_partner.yaml` under `co_brand.draft_banner_text`. The
banner must be visible (not hidden, not `display:none`) whenever the surface is loaded
with `?brand=tr_partner` or with `body.brand-tr-partner` active. This requirement
exists because `tr_partner` pack approval is pending; any render without the banner
could be mistaken for an approved co-branded asset.

- **FAIL:** A `tr_partner` screenshot of `p2-intake/index.html` shows the Thomson Reuters
  color scheme with no banner, making it indistinguishable from an approved asset.
- **PASS:** The same screenshot shows the Thomson Reuters color scheme with the yellow
  draft banner visible at the top of the page reading
  `[INTERNAL DRAFT — Not for external distribution]`.

---

## 5. CTA completeness

Every call-to-action (button, link, or interactive affordance that the user is expected
to click in the demo context) must have a corresponding entry in `notes.md` under the
"Intended Routes" section. The entry must name the CTA, the intended Laravel route, and
the expected resulting state or page. This rule ensures that each surface is honest about
where it points and that advisors can verify the CTA maps to a real route before the
surface is shown to any audience. CTAs with no corresponding route entry are considered
orphaned and will cause a FAIL.

- **FAIL:** `p5-proposal-generation/index.html` has an "Approve Proposal" button but
  `p5-proposal-generation/notes.md` has no entry under "Intended Routes" for that CTA.
- **PASS:** `notes.md` includes an entry: `Approve Proposal → POST /proposals/{id}/approve
  → redirects to /proposals/{id}/accepted`, and the button's `href` or `data-` attribute
  reflects that intent.

---

## 6. No ingestion overclaim

The `p3-ingestion` surface must not claim that PDF ingestion, OCR, audio transcription,
or email parsing are live capabilities unless the Laravel verifier explicitly confirms that
the corresponding pipeline is fully shipped. The evidence YAML classifies this surface as
`shipped: partial` with `claim_risk: high` and records an `overclaim_guard` directive:
text-only ingestion is live; everything else must carry a "verification pending" badge or
equivalent honest caveat. This rule applies only to the `p3-ingestion` surface; other
surfaces are governed by Rule 1.

- **FAIL:** `p3-ingestion/index.html` shows a drag-and-drop upload zone with the label
  "Upload PDF, audio, or email — AI extracts all key terms" with no caveat.
- **PASS:** The same surface shows text ingestion as available, and PDF/OCR/audio/email
  upload areas each carry a clearly visible "Live verification pending" badge.

---

## 7. No autonomous promotion claim

The `p8-new-client-lane` surface must not imply that clients are automatically promoted
through the onboarding pipeline without an explicit human approval gate. The evidence YAML
classifies this surface as `shipped: partial` with `claim_risk: high` and records an
`overclaim_guard` directive: no autonomous promotion; any automated step must show a
"verification pending" badge and the advisor approval gate must be visually present. This
rule applies only to the `p8-new-client-lane` surface; other automated flows are governed
by Rule 1.

- **FAIL:** `p8-new-client-lane/index.html` shows a progress bar that reads
  "Client automatically onboarded — no action required" with no advisor step visible.
- **PASS:** The same surface shows each automated step accompanied by a "Pending advisor
  review" indicator, and the CTA to advance the client to the next stage requires a
  visible advisor approval action.

---

## 8. Accessibility baseline

All surfaces must pass WCAG AA color contrast for text and interactive elements under
both the `proposalforge` and `tr_partner` brand packs. At minimum, normal-weight body
text must achieve a contrast ratio of at least 4.5:1 against its background, and large
text or UI components must achieve at least 3:1. All color values used in text, buttons,
badges, and icons must be sourced from `_brand.css` tokens that have been validated for
WCAG AA compliance at the time the pack was approved. Surfaces that introduce custom
inline colors outside of the token system cannot be verified for accessibility and will
fail this rule automatically under Rule 2 as well.

- **FAIL:** A status badge on `p6-pricing/index.html` uses `color: #aaa` on a `#f9f9f9`
  background, producing a contrast ratio of approximately 2.3:1 — below the 4.5:1 AA
  threshold for normal text.
- **PASS:** All text and interactive element colors on the surface resolve to `_brand.css`
  tokens, and the token values in both brand packs have been confirmed to meet WCAG AA
  contrast ratios at the time the pack was authored.

---

## 9. No priority 12/13 surface

No directory named `p12-*` or `p13-*` may exist anywhere under `docs/design/symposium-2026/`.
Priorities 12 and 13 are explicitly excluded from this design loop per the approved spec.
Their presence — even as empty scaffolded stubs — would create ambiguity about scope and
could draw advisor attention or questions toward features that are intentionally out of
bounds for the TR Symposium demo. This rule is checked by scanning the directory listing,
not by inspecting file content.

- **FAIL:** The directory `docs/design/symposium-2026/p12-advanced-reporting/` exists,
  even if it contains only a `.gitkeep` placeholder.
- **PASS:** Only directories `p1-` through `p11-` exist under `docs/design/symposium-2026/`;
  no `p12-*` or `p13-*` directory is present.
