# Deliverable D — The "Good Brief" Definition
*Phase 0 | Brand Pipeline | 2026-03-24*

---

## Purpose

D has two jobs:

1. **Define the Brief document schema** — the structured artifact that feeds the pipeline at T1. This is what Gate 1's output lives in. A references it via `origin.brief_ref`.

2. **Define "good enough to proceed"** — the minimum completeness standard at T1. A brief that passes this gate can run Stage 1 (competitive research) and Stage 2 (positioning territory). A brief that doesn't pass gets sent back before any pipeline work begins.

---

## Process Ownership

**Brief creation:** Gerri creates the brief during client intake, using this schema as the intake form. Target: T1 approval within 48 hours of engagement start. Assaf reviews and approves at T1.

**Gate 1 write-back:** After Stage 1 research, Gerri presents gap analysis to Assaf. Assaf writes `gate_1_output.positioning_territory` — this field is Assaf-only. `approved_by` must be Assaf. No other role qualifies for Gate 1 approval.

**T1 enforcement:** Human checklist against the T1 gate criteria table (below). Gerri runs the check before submitting for T1 approval. To be automated in Sprint 2.

---

## The Brief Document Schema

```json
{
  "brief_id":   "string — snake_case slug e.g. phat_foods_2026_q1",
  "created_at": "ISO date",
  "status":     "draft | t1_approved | gate1_complete | closed",

  "client": {
    "name":     "string",
    "category": "string — from taste-board-vocabulary category_tags",
    "website":  "string (URL)",
    "stage":    "seed | growth | established",
    "context":  "string — 2-3 sentences. Who they are, where they are in their journey."
  },

  "product": {
    "what_it_is":       "string — one clear sentence. Not marketing language.",
    "who_buys_it":      "string — the actual buyer (may differ from end user)",
    "why_they_buy_it":  "string — the real reason, not the aspirational one",
    "what_makes_it_different": "string — the actual differentiator, not category claims"
  },

  "audience": {
    "primary_buyer":      "string — job title, role, or archetype of decision maker",
    "decision_context":   "string — what situation triggers this purchase?",
    "key_concerns":       ["string array — what they worry about, what they need to believe"],
    "what_they_respond_to": "string — visual/emotional register that works with this audience"
  },

  "competitive_context": {
    "known_players": [
      {
        "name":     "string",
        "url":      "string",
        "position": "string — one sentence on where they sit"
      }
    ],
    "market_gap":   "string — where the client could occupy space competitors don't. AI-derived in Stage 1, human-confirmed at T2.",
    "client_position_today": "string — where the client currently sits relative to competitors"
  },

  "commission": {
    "what_visual_work": "string — specific: 'visual direction for investor deck and website hero' not 'brand identity'",
    "formats_needed":   ["string array — e.g. 16:9 deck slides, 3:4 social, web hero"],
    "use_cases":        ["string array — where these visuals actually appear"]
  },

  "constraints": {
    "existing_assets":     "string — what brand assets already exist that must be respected",
    "hard_constraints":    ["string array — absolute limits (color, style, logo)"],
    "timeline":            "string",
    "budget_tier":         "exploratory | standard | premium"
  },

  "success": {
    "what_done_looks_like": "string — specific outcome, not 'looks great'. E.g. 'CEO approves visual direction in one round'",
    "how_we_measure_it":    "string — Test 1 + Test 3 thresholds from visual-style.json, plus any client-specific criteria"
  },

  "gate_1_output": {
    "positioning_territory": "string — NULL at T1. Filled at T2 by Assaf after Stage 1 research. The strategic bet: what position in the competitive landscape this visual direction will own.",
    "approved_at":           "ISO date — null until T2",
    "approved_by":           "string — null until T2"
  }
}
```

---

## Field Classification Table

Every field — required at T1, optional at T1, or filled at T2+.

| Field | T1 Status | Notes |
|---|---|---|
| `brief_id` | Required | Created on intake |
| `created_at` | Required | Auto-set |
| `status` | Required | Starts as `draft` |
| `client.name` | Required | |
| `client.category` | Required | Must use vocabulary enum |
| `client.website` | Required | |
| `client.stage` | Required | seed/growth/established |
| `client.context` | Required | 2-3 sentences minimum |
| `product.what_it_is` | Required | One sentence, no marketing language |
| `product.who_buys_it` | Required | Named buyer, not "businesses" |
| `product.why_they_buy_it` | Required | Specific reason, not generic |
| `product.what_makes_it_different` | Optional T1 | Fill if known. Can be refined after Stage 1. |
| `audience.primary_buyer` | Required | Named role or archetype |
| `audience.decision_context` | Optional T1 | Fill if known |
| `audience.key_concerns` | Required | Minimum 2 entries |
| `audience.what_they_respond_to` | Optional T1 | Fill if known. Can emerge from Stage 1. |
| `competitive_context.known_players` | Required | Minimum 3 with URLs |
| `competitive_context.market_gap` | T2+ | AI-derived in Stage 1, human-confirmed at T2 |
| `competitive_context.client_position_today` | Optional T1 | Fill if obvious |
| `commission.what_visual_work` | Required | Specific enough to be unambiguous |
| `commission.formats_needed` | Required | Minimum 1 format |
| `commission.use_cases` | Optional T1 | |
| `constraints.existing_assets` | Required | "None" is a valid answer |
| `constraints.hard_constraints` | Optional T1 | Fill if any exist |
| `constraints.timeline` | Required | Even "TBD" forces a conversation |
| `constraints.budget_tier` | Required | exploratory/standard/premium |
| `success.what_done_looks_like` | Required | Specific outcome, not "looks great" |
| `success.how_we_measure_it` | Optional T1 | Defaults to Test 1 + Test 3 if blank |
| `gate_1_output.positioning_territory` | T2+ | NULL at T1 — Assaf fills at T2 |
| `gate_1_output.approved_at` | T2+ | Auto-set when Assaf approves |
| `gate_1_output.approved_by` | T2+ | Must be Assaf |

---

## "Good Enough to Proceed" — T1 Gate

A brief passes T1 when all of the following are true:

| Field | Requirement |
|---|---|
| `client.*` | All fields filled |
| `product.what_it_is` | One clear sentence, no marketing language |
| `product.why_they_buy_it` | Specific, not generic ("tastes better" fails; "replicates dairy fat profile at scale" passes) |
| `audience.primary_buyer` | Named role or archetype, not "everyone" |
| `audience.key_concerns` | At least 2 specific concerns |
| `competitive_context.known_players` | Minimum 3 named competitors with URLs |
| `commission.what_visual_work` | Specific enough that a misunderstanding is impossible |
| `commission.formats_needed` | At least one format specified |
| `gate_1_output.positioning_territory` | NULL is correct at T1 — this field is filled at T2 |

**Automatic fails:**
- Any `product.*` field answered with marketing language instead of plain description
- `audience.primary_buyer: "everyone"` or equivalent
- `competitive_context.known_players` fewer than 3 entries
- `commission.what_visual_work` vague enough to cover multiple interpretations

---

## How D Feeds the Pipeline

```
T1: Brief submitted → T1 gate check → PASS/FAIL
        ↓ PASS
Stage 1: Competitive research runs against competitive_context.known_players
Stage 2: market_gap filled (AI) → Assaf approves positioning_territory (Gate 1) → gate_1_output filled
        ↓ Gate 1 approved
Stage 3: Reference sourcing against positioning_territory
        ↓
Stage 4: Direction generation
        ↓
T3: Assaf selects direction → direction_name, rejected_alternatives logged
        ↓
Stages 5-6: Generation testing → lock
        ↓
T5: Lock decision → A.meta.locked = true, A.meta.locked_on_image set
        ↓
T6: Schema sign-off → A.origin.brief_ref → this document
```

**What A references from D:**
- `A.origin.positioning_territory` ← `D.gate_1_output.positioning_territory`
- `A.origin.competitive_gap` ← `D.competitive_context.market_gap`
- `A.origin.brief_ref` ← `D.brief_id`

---

## Corrections Folded In From A, B, C

### A: seed_images vs analog_references (clarified)
These are distinct concepts and both fields are correct:
- `origin.analog_references`: brand-level research references from Stage 3 ("we looked at Aesop's visual world"). Broad direction signals.
- `origin.seed_images`: specific images passed as direct style inputs to the generation model in Stage 6. Specific generation inputs.

A brief containing Aesop as an analog reference doesn't mean every Aesop image is a seed image. The analog is used for research; seed images are the filtered subset used in generation. Keep both fields — document the distinction.

### A: rejected_alternatives — add score field
Each rejected direction entry should include:
```json
{
  "direction_name":  "string",
  "summary":         "string",
  "stars":           "integer 1-5 — relative score at time of selection",
  "reason_rejected": "string"
}
```
Stars captures the relative evaluation at Gate 2. Useful for future work — a 4-star rejected direction for Phat may be exactly right for the next food client.

### B: image_source + image_context (two-axis clarification)
The current `image_source` field conflates two axes:
- **How it was found:** human_curated vs ai_surfaced
- **Why it was collected:** competitive_research / direction_seed / generation_test / taste_board / client_supplied

These overlap. The same image can be human_curated AND competitive_research.

Resolution: `image_source` becomes the mechanism (how found), and `image_context` is added as a separate optional field (why collected):

```
image_source: "human_curated" | "ai_surfaced" | "client_supplied"
image_context: "competitive_research" | "direction_seed" | "generation_test" | "taste_board" | "lock_reference"
```

`direction_link` + `client_relevance` already cover most of `image_context` — this is refinement only, not a rebuild.

### B: competitive_reference/human_curated overlap
With the two-axis resolution above, this overlap dissolves. A human-found competitor image = `image_source: human_curated` + `image_context: competitive_research`. No precedence rule needed — the axes are separate.

### C: Stage 4 direction scoring
Direction star ratings were produced by evaluating against: product-direction fit, reference strength, positioning territory alignment, competitive distinctiveness. Not arbitrary. The scoring logic belongs in the pipeline spec (Sprint 1), not in C. C correctly notes the output; the methodology lives downstream.

### C: Stage 7 field mapping (explicit)
Stage 7 (lock → schema extraction) produces these A fields:
- `core.palette` ← hex-sampled from lock reference images
- `visual.lighting.quality/shadows/fill` ← described from lock image characteristics
- `visual.texture.character/grain` ← described from lock image texture analysis
- `visual.color_behavior.cast/temperature/saturation` ← derived from full-image color analysis
- `core.prompt_framework.master` ← synthesized from the generation prompts that produced R6/R7
- `core.what_this_isnt` + `visual.*.NOT` arrays ← consolidated from failed round failure analysis
- `extended.shot_library` ← derived from successful shot types in lock images

### C: Feedback loop closure
C's stated purpose — "findings feed back into schema design" — is now complete:

| C finding | Resulted in |
|---|---|
| Gate 1 output is homeless | A.origin section added; D Brief schema defined |
| AI-generated images have no schema home | B.image_source: ai_generated; B.client_relevance: generation_test/lock_reference |
| Stage 3 intake unspecified | B.direction_link; Stage 3 intake protocol documented in C |
| Lock evidence not linked | A.meta.locked_on_image; B.client_relevance: lock_reference |
| Rejected directions abandoned | A.origin.rejected_alternatives with stars field |

---

## Summary

D defines the Brief schema and the T1 gate. Brief passes T1 → pipeline runs. Brief fails T1 → sent back before any work starts.

Gate 1's output (the strategic bet) lives in `D.gate_1_output.positioning_territory`. A references it. It doesn't live in A itself — A captures the visual direction; D captures why that direction exists.

---

*Deliverable D — complete. Phase 0 all four deliverables ready for final Anton review.*
