Skip to content
Back to skills

Discovery

ASecurity

15-minute JTBD + acceptance criterion exercise. Use before any spec session. Produces a discovery-brief.md that anchors the entire increment to a real user need and a measurable DORA outcome. Implements DORA AI Capability 6. Includes advanced methods for untested assumptions, persona deep-dives, and prior art search.

  • 2 stars
  • 0 votes
  • 0 copies
  • 0 views
  • Added September 27, 2026
ai-agentsrustgobashdockertestinggitdevopssecurityperformance

Works with

  • claude code
  • cursor
  • cli

Security analysis

A100/100

Pro scans all 4 files and shows the line behind each finding

Scanned October 7, 2026

npx -y skills add paruff/uFawkesAI --skill discovery --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Discovery?

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

Security grade badge for Discovery
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/paruff-discovery/badge)](https://www.skillsdirectory.com/skills/paruff-discovery)

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: discovery
description: "15-minute JTBD + acceptance criterion exercise. Use before any spec session. Produces a discovery-brief.md that anchors the entire increment to a real user need and a measurable DORA outcome. Implements DORA AI Capability 6. Includes advanced methods for untested assumptions, persona deep-dives, and prior art search."
license: MIT
compatibility: Claude Code, GitHub Copilot, OpenCode, Cursor, Codex, Gemini CLI
metadata:
  author: paruff
  suite: uFawkesAI
  form: rule
  cadence: per-increment
---

# Skill: discovery

> **Load trigger:** "load discovery skill" > **DORA:** AI Capability 6: User-centric focus
> **Token cost:** Low

## Purpose

15-minute JTBD + acceptance criterion exercise. Use before any spec session. Produces a discovery-brief.md that anchors the entire increment to a real user need and a measurable DORA outcome. Implements DORA AI Capability 6.

This skill combines:
- **Core discovery** — 15-min JTBD + acceptance criteria
- **Advanced methods** — for untested assumptions, persona deep-dives, prior art search
- **Discover** — pre-spec user research agent

## When to Use

- Before any spec session begins
- When the riskiest assumption is untested
- When user segments disagree
- When a major capability is designed from scratch

## Sub-skills (now integrated)

### 1. Core Discovery

# Skill: Discovery

> **Load trigger:** `"load discovery skill"` > **DORA:** AI Capability 6: User-centric focus
> **Token cost:** Low

## Purpose

A 15-minute structured exercise that surfaces the real user need behind a proposed
change, the riskiest assumption embedded in it, and one testable acceptance criterion.
Output is `discovery-brief.md` — mandatory input to the `spec` skill.

DORA AI Capabilities Model v2025.1: Teams adopting AI without user-centric focus see
harm to team performance. Speed is irrelevant if moving in the wrong direction.

## When to Run

| Situation                                                | Run discovery?                                  |
| -------------------------------------------------------- | ----------------------------------------------- |
| New feature proposed                                     | ✅ Always                                       |
| Infrastructure migration that affects developer workflow | ✅ Yes — the developer _is_ the user            |
| Bug fix                                                  | ⚠ Only if the fix changes user-visible behavior |
| Dependency update, doc fix, test addition                | ❌ Skip — no user behavior change               |
| New Dojo belt module                                     | ✅ Yes — the learner is the user                |

## Persona Reference Table

| Persona ID          | Role                                            | Primary job                                | Pain points                                                  |
| ------------------- | ----------------------------------------------- | ------------------------------------------ | ------------------------------------------------------------ |
| `platform-engineer` | You (paruff)                                    | Ship reliable IDP improvements in 2hrs/day | Context switching, migration blast radius, scope creep       |
| `product-engineer`  | Dev using fawkes golden paths                   | Get from idea to running service           | Unclear golden paths, config complexity, slow feedback loops |
| `dojo-learner`      | Developer learning DevOps/platform skills       | Learn by doing, not reading                | Labs that don't run, missing prerequisites, unclear outcomes |
| `team-lead`         | Engineering manager adopting fawkes             | Know if the platform investment pays off   | No DORA visibility, unclear ROI, onboarding friction         |
| `solo-entrepreneur` | Small-team founder using uFawkesPipe/uFawkesObs | Ship product, not manage infra             | Operational overhead, complex setup, limited time            |

## The 5-Step Exercise (15 minutes)

### Step 1 — Name the persona (2 min)

Pick one from the Persona Reference Table. If the change affects multiple personas,
pick the one with the _highest stakes_ in this increment.

Write: `Primary persona: [persona-id]`

### Step 2 — State the JTBD (3 min)

Complete this template precisely — do not paraphrase:

> _"When I [concrete situation triggering the need], I want to [desired action or outcome],
> so I can [deeper motivation or business goal]."_

Examples:

- ✅ "When I deploy a new uFawkesObs release, I want `docker compose up` to succeed
  without manual config steps, so I can verify DORA metrics are flowing within 5 minutes."
- ❌ "As a user, I want better observability." (Too vague — no situation, no motivation)
- ❌ "I want the CI pipeline to be faster." (No situation, no deeper goal)

### Step 3 — Surface the riskiest assumption (3 min)

What is the one assumption in this proposal that, if wrong, makes the whole increment
useless or harmful?

Prompts to find it:

- "We assume users will [X]. What if they don't?"
- "We assume this takes [Y hours]. What if it takes 10x longer?"
- "We assume [Z] is the bottleneck. What if the real bottleneck is somewhere else?"

Write: `Riskiest assumption: [one sentence, falsifiable]`

### Step 4 — Write the acceptance criterion (5 min)

One given/when/then statement. Must be:

- Testable by the `test-execution` skill (not just "user feels better")
- Specific enough that a binary pass/fail is possible
- Grounded in the JTBD from Step 2

Template:

> _"Given [starting state], when [user action or system trigger], then [observable outcome]."_

Examples:

- ✅ "Given uFawkesObs is cloned on a fresh machine, when `make up` is run, then
  Grafana is accessible at localhost:3000 and the DORA Deployment Frequency panel
  shows data within 60 seconds."
- ❌ "Given the system is running, when the user uses it, then it works." (Not testable)

### Step 5 — Map to DORA outcome (2 min)

| Field                         | Answer                                                          |
| ----------------------------- | --------------------------------------------------------------- |
| DORA AI Capability improved   | [which of the 7 capabilities]                                   |
| DORA Core Capability improved | [which core DevOps capability, if applicable]                   |
| Metric that should improve    | [deployment frequency / change lead time / failed deployment recovery time / change fail rate / deployment rework rate] |
| How measured                  | [uFawkesObs Prometheus query / uFawkesDORA dashboard / manual]  |
| Baseline (current value)      | [current metric value, or "unknown — establish baseline first"] |

## Prior Art Check

Before writing the spec, spend 2 minutes checking:

- Does this already exist in another uFawkes\* stack?
- Does a well-known open-source project already solve this? (Compose rather than build)
- Does the uFawkesAI skill suite already cover this?

If prior art exists: document it and propose composition over construction.

## discovery-brief.md Template

```markdown
---
date: YYYY-MM-DD
persona: platform-engineer
jtbd: "When I ..., I want to ..., so I can ..."
riskiest_assumption: "We assume ..."
acceptance_criterion: "Given ..., when ..., then ..."
dora_ai_capability: "6: User-centric focus"
dora_core_capability: "Core: Continuous delivery"
metric: "change_lead_time_hours"
measurement_source: "uFawkesObs"
baseline: "18.4 hours (2026-06-01)"
prior_art: null
status: ready-for-spec
---

# Discovery Brief: [FEATURE_OR_CHANGE_NAME]

## Job to Be Done

[JTBD statement]

## Riskiest Assumption

[One sentence]

## Acceptance Criterion

[Given/When/Then]

## DORA Outcome Target

- Capability: [capability]
- Metric: [metric name]
- Current baseline: [value]
- Target: [value]
- Measurement: [how/where]

## Prior Art

[None found | Link to existing solution]

## Notes

[Any context that will help the `spec` skill — constraints, dependencies, related issues]
```

## Output Format

```json
{
  "skill": "discovery",
  "status": "complete | blocked | skipped",
  "skip_reason": null,
  "brief_path": "discovery-brief.md",
  "persona": "platform-engineer",
  "jtbd_complete": true,
  "assumption_stated": true,
  "acceptance_criterion_testable": true,
  "dora_capability_mapped": true,
  "prior_art_found": false,
  "ready_for_spec": true,
  "time_spent_minutes": 14
}
```

## Sub-Skills

| Sub-skill                     | Purpose                                                                         |
| ----------------------------- | ------------------------------------------------------------------------------- |
| `discovery/persona-deep-dive` | Extended persona research when primary persona is unclear                       |
| `discovery/assumption-test`   | Design a lightweight experiment to test the riskiest assumption before building |
| `discovery/prior-art-search`  | Structured search across uFawkes\* repos and open source for existing solutions |

### 2. Advanced Discovery

# Skill: Discovery Advanced

> **Load trigger:** `"load discovery-advanced skill"` > **DORA:** AI Capability 6: User-centric focus
> **Token cost:** Medium
> **Prerequisite:** `discovery` skill must have run first. This skill extends it.

## Purpose

When the 15-minute `discovery` exercise surfaces an assumption too risky to build on
without testing, this skill provides the methods to validate it before writing a line
of code. Designed for a solo entrepreneur with 2hrs/day: every method here fits
inside one session.

## When to Use This Skill (not the base `discovery` skill)

| Situation                                                              | Method                                     |
| ---------------------------------------------------------------------- | ------------------------------------------ |
| Riskiest assumption involves user behavior you've never observed       | Assumption mapping + lightweight interview |
| Two personas have conflicting needs for the same feature               | Persona priority matrix                    |
| Major capability being designed (new belt module, new golden path)     | Jobs-to-be-done interview protocol         |
| Previous release didn't get adopted despite solving the stated problem | Assumption autopsy                         |
| Platform feedback NPS dropped significantly without clear cause        | Friction log analysis                      |

## Method 1: Assumption Mapping (20 min)

Surface all assumptions embedded in a proposed change, rank by risk.

```markdown
## Assumption Map — [FEATURE_NAME]

For each assumption, assess:

- Importance: How critical is this to the feature working? (High/Med/Low)
- Certainty: How confident are we this is true? (High/Med/Low)
- Risk = High importance + Low certainty

| #   | Assumption                                           | Importance | Certainty | Risk    | Validation method    |
| --- | ---------------------------------------------------- | ---------- | --------- | ------- | -------------------- |
| 1   | Users will read the Quick Start before filing issues | High       | Low       | 🔴 High | Check issue patterns |
| 2   | Docker Compose up works on Mac ARM                   | High       | Med       | 🟡 Med  | CI matrix test       |
| 3   | Users prefer CLI over UI for config                  | Med        | Low       | 🟡 Med  | Friction log review  |

Prioritize: validate 🔴 High-risk assumptions before writing any spec.
```

## Method 2: Lightweight JTBD Interview Protocol (45 min)

One interview, one session. Use for major capabilities.

**Recruit:** One person from the target persona group. Can be a Dojo learner, a
colleague, or someone who filed a GitHub issue. Async is fine (written Q&A).

**Interview guide (8 questions, 30 min async or 20 min sync):**

```markdown
Context questions (understand the situation):

1. Tell me about the last time you tried to [relevant task]. What were you doing
   right before that moment?
2. What made you decide to do it at that point rather than earlier or later?

Motivation questions (understand the deeper goal): 3. What were you hoping to accomplish? 4. What would "done" look like for you?

Struggle questions (surface the real friction): 5. What was the hardest part? 6. What did you try that didn't work?

Outcome questions (understand the value): 7. How did it turn out? What did you end up doing? 8. If this had worked perfectly, what would have been different for you afterward?
```

**Analysis (15 min):**

- Extract the JTBD from questions 3-4: "When [Q1 situation], I want to [Q3 motivation], so I can [Q8 outcome]."
- Extract the real friction from questions 5-6: update `riskiest_assumption` in discovery-brief.md
- Compare against the assumption map: which assumptions did this validate or invalidate?

## Method 3: Persona Priority Matrix (20 min)

When two personas want conflicting things from the same feature.

```markdown
## Persona Priority Matrix — [FEATURE_NAME]

| Capability              | platform-engineer | product-engineer | dojo-learner | team-lead  |
| ----------------------- | ----------------- | ---------------- | ------------ | ---------- |
| Zero-config quick start | Nice to have      | Must have        | Must have    | Don't care |
| Full configurability    | Must have         | Nice to have     | Don't care   | Don't care |
| Built-in DORA metrics   | Must have         | Nice to have     | Nice to have | Must have  |
| CLI-first interface     | Must have         | Nice to have     | Nice to have | Don't care |

Resolution rule: If primary persona says "Must have" and secondary says "Don't care" or
"Nice to have" — build for the primary persona. If both say "Must have" and they conflict:
build the primary persona's version first, design for extensibility so secondary can be
served in a future increment.

Primary persona for this increment: [persona-id from discovery-brief.md]
Decision: [what you're building and why]
```

## Method 4: Assumption Autopsy (30 min)

When a previous release didn't get adopted. Use the `learn` skill's discovery accuracy
record as the starting point.

```markdown
## Assumption Autopsy — [RELEASE_VERSION]

1. Original riskiest assumption: [from discovery-brief.md]
2. Was it validated before building? [Yes / No / Partially]
3. What actually happened after release: [from `learn` skill retrospective]
4. The assumption that was actually wrong: [identify the real failure]
5. What we should have done differently: [updated assumption + validation method]
6. Impact on next increment: [how this changes the discovery brief for the next version]
```

## Method 5: Friction Log Analysis (30 min)

When platform-feedback NPS dropped without a clear cause.

```bash
# Collect friction signals from multiple sources
echo "=== GitHub Issues (user-feedback label) ==="
gh issue list --repo paruff/fawkes --label "user-feedback" --state open \
  --json number,title,createdAt --jq '.[] | "\(.createdAt[:10]): \(.title)"'

echo "=== Discussion threads with most replies ==="
# Manual: review pinned platform-feedback Discussion thread

echo "=== README 'Getting Help' section issues ==="
# Manual: check if any issues mention specific doc sections

echo "=== CI failures that users might have hit ==="
gh run list --repo paruff/REPO_NAME --status failure --limit 20
```

Categorize findings into friction themes (same categories as `platform-feedback` skill).
Each theme with >2 data points becomes an `@planner` action item.

## Output: Updated Discovery Brief

All methods produce updates to `discovery-brief.md`. Add a section:

```markdown
## Advanced Discovery Findings

### Method used

[assumption-mapping | jtbd-interview | persona-matrix | assumption-autopsy | friction-log]

### Key finding

[One sentence: what you learned that wasn't in the original brief]

### Assumption updates

- Original riskiest assumption: [original]
- Revised riskiest assumption: [updated based on findings]
- Assumptions invalidated: [list]
- Assumptions confirmed: [list]

### Impact on spec

[How this changes what gets built — or whether it gets built at all]
```

## Output Format

```json
{
  "skill": "discovery-advanced",
  "method": "jtbd-interview",
  "time_spent_minutes": 45,
  "discovery_brief_updated": true,
  "assumptions_invalidated": 1,
  "assumptions_confirmed": 2,
  "spec_impact": "Narrowed scope to CLI-only for v0.2; UI deferred to v0.3",
  "build_decision": "proceed | descope | defer | cancel"
}
```

### 3. Discover Agent

# Skill: Discover

> **Load trigger:** `"load discover skill"`
**Invoke when:** A new feature, capability, or change is proposed — before `spec.md` begins. > **DORA:** AI Capability 6: User-centric focus > **Token cost:** Low

> Migrated from the former `discover` agent. It is a skill, not an execution
> boundary: same tools, same model, same memory — the stage name describes work,
> not a separate agent runtime.

> **Invoke when:** A new feature, capability, or change is proposed — before `spec.md` begins.
> **DORA:** AI Capability 6: User-centric focus
> **Token cost:** Low
> **Output:** `discovery-brief.md` → consumed by `spec` skill

## Purpose

Ensure every increment starts from a real user need, not an assumed one. Prevents the
"moving fast in the wrong direction" failure mode identified in DORA AI Capabilities
Model v2025.1. This agent is a thin trigger: the 15-minute JTBD exercise, persona
reference table, and discovery-brief.md template live in the `discovery` skill — this
file only defines when to run, what to check first, and what to hand off.

## Trigger Conditions

| Trigger              | Description                                                       |
| -------------------- | ------------------------------------------------------------------- |
| New feature proposed | Any item moving from Backlog → This Week on the project board     |
| Migration planned    | Before any infrastructure change that affects developer workflow  |
| User complaint filed | Issue labeled `ux` or `developer-experience`                      |
| Dojo module planned  | Before authoring a new belt module (maps to a user learning need) |

## Pre-conditions

- [ ] Load `discovery` skill: `"load discovery skill"`
- [ ] Load `dev-experience` skill: `"load dev-experience skill"`
- [ ] AI_STANCE.md exists and is current (load `ai-stance` skill to verify)
- [ ] context-report.json shows no placeholder or missing-file findings

## Responsibilities

Run the `discovery` skill's 5-step exercise (persona → JTBD → riskiest assumption →
acceptance criterion → DORA outcome mapping) and its Prior Art Check in full — see
that skill for the exact templates, persona reference table, and worked examples.

The one addition this agent makes beyond the skill's own contract: **tag the
acceptance criterion with a `test_type`** — `unit`, `integration`, or `live-system` —
based on whether confirming the job truly done requires observing a real running
instance of the system. As a rough guide (not a rule to apply mechanically): changes
to deployed infrastructure, pipelines, or anything a platform engineer would only
trust after seeing it actually run tend to need `live-system`; changes to internal
logic that don't touch a deployed surface are more often `unit`/`integration`. This
is a judgment call for this specific brief — state your reasoning in one sentence
alongside the tag, and carry both into `discovery-brief.md`'s frontmatter and the
Output Format below.

## Handoff

Produces `discovery-brief.md` (per the `discovery` skill's template, extended with
`test_type` / `test_type_reasoning`) and passes it to the `spec` agent as mandatory
input. The `spec` skill MUST NOT begin without a discovery brief.

## Output Format

```json
{
  "agent": "discover",
  "status": "complete | blocked",
  "brief_path": "discovery-brief.md",
  "persona": "string",
  "jtbd": "string",
  "riskiest_assumption": "string",
  "acceptance_criterion": "string",
  "test_type": "unit | integration | live-system",
  "test_type_reasoning": "string — one sentence on why this tag was chosen",
  "dora_capability": "string",
  "dora_metric": "string",
  "prior_art_found": true,
  "prior_art_reference": "string | null",
  "ready_for_spec": true
}
```

## Success Criteria

- [ ] All `discovery` skill success criteria met (persona, JTBD, assumption,
      testable acceptance criterion, DORA mapping, prior art check)
- [ ] Acceptance criterion tagged with a `test_type` and a one-sentence reasoning
- [ ] discovery-brief.md written and passed to `spec` skill

### 4. Sub-skills

### Assumption Test

# Sub-Skill: Discovery — Assumption Test

> **Load trigger:** `"load discovery/assumption-test skill"` > **DORA:** AI Capability 6: User-centric focus + AI Capability 5: Working in small batches
> **Token cost:** Low
> **When to use:** Riskiest assumption is high-stakes and currently unvalidated.

## Purpose

Design the smallest possible experiment to confirm or refute the riskiest assumption
before committing to building. DORA's "working in small batches" principle applies
here: validate assumptions in small batches before scaling to implementation.

A 2-hour assumption test that invalidates a bad assumption saves 10+ hours of
building something nobody needed.

## Assumption Type → Test Method

| Assumption type                                | Example                                                          | Recommended test                                          |
| ---------------------------------------------- | ---------------------------------------------------------------- | --------------------------------------------------------- |
| **Behavioral** — user will do X                | "Users will run `make up` rather than following manual steps"    | Observation or written walkthrough with one real user     |
| **Technical** — system can do Y                | "`docker compose up` works on ARM Mac without modification"      | CI matrix test on the relevant platform                   |
| **Adoption** — users will find/use feature     | "Dojo learners will discover the new lab before asking for help" | Check GitHub Discussion for help requests in similar area |
| **Performance** — system will do Y fast enough | "Grafana dashboard loads in <3 seconds with 30 days of data"     | Benchmark test with synthetic data                        |
| **Integration** — component A works with B     | "uFawkesPipe events reach uFawkesObs Prometheus within 30s"      | Integration smoke test                                    |
| **Preference** — users prefer X over Y         | "Users prefer CLI config over UI config"                         | Prior-art search + friction log analysis                  |

## Test Design Protocol

### Step 1 — State the assumption precisely

From the discovery brief:

> `riskiest_assumption: "We assume [specific claim]"`

Convert to falsifiable form: "If we [run test X], we expect [observable outcome Y].
If we observe [different outcome Z], the assumption is false."

### Step 2 — Choose the cheapest test

Order of preference (cheapest first):

1. **Check existing data** — GitHub issues, platform-feedback history, CI logs. Costs 15 min.
2. **Prior-art search** — Does someone else's project prove or disprove this? Costs 20 min.
3. **Automated check** — Write a script or CI job that tests the claim directly. Costs 30-60 min.
4. **Manual walkthrough** — Do the thing yourself in a clean environment. Costs 30-60 min.
5. **User interview** — Ask one person from the target persona. Costs 45 min async.

Never jump to option 5 if options 1-3 would answer the question.

### Step 3 — Define the pass/fail criteria before running

Write the criteria _before_ you run the test, not after. Confirmation bias is real.

```markdown
## Assumption Test Protocol

**Assumption:** [exact text from discovery-brief.md]
**Test method:** [chosen method from Step 2]
**Pass criterion:** [observable outcome that confirms the assumption]
**Fail criterion:** [observable outcome that refutes the assumption]
**Time budget:** [minutes — must be ≤120]
**Test environment:** [clean install / existing environment / CI / etc.]
```

### Step 4 — Run the test and record raw output

Don't interpret while running. Record exactly what happened, then interpret.

### Step 5 — Update the discovery brief

```markdown
## Assumption Test Result (from assumption-test sub-skill)

**Assumption tested:** [text]
**Test run:** YYYY-MM-DD
**Result:** Confirmed / Refuted / Inconclusive

**What we observed:** [factual description of what happened]

**Interpretation:**

- If confirmed: proceed with the spec as written
- If refuted: [what changes — scope, approach, or decision to not build]
- If inconclusive: [what additional evidence would resolve it, and whether it's worth getting]

**Impact on spec:** [one sentence]
```

## Example Tests for Common uFawkes Assumptions

**"Users will successfully run `docker compose up` without external help"**
→ Test: Fresh VM, no prior knowledge of the repo, follow only README Quick Start. Pass if service is up and healthy check passes in <10 min. Fail if any step requires googling.

**"Grafana dashboard shows data within 60 seconds of `make up`"**
→ Test: Time from `make up` to Grafana panel showing non-empty data. Pass if <60s. Fail if >60s or requires manual steps.

**"The Dojo lab prerequisites are sufficient for a new learner"**
→ Test: Check the 5 most recent GitHub issues or Discussions in the Dojo area for questions about prerequisites. Pass if 0 questions in the last 30 days. Fail if any prerequisite questions found.

**"Tekton pipelines behave equivalently to Jenkins pipelines for the existing test suite"**
→ Test: Run existing test suite through both Tekton and Jenkins. Pass if all tests pass in Tekton. Fail if any test fails that passes in Jenkins. (This is the j-curve-navigation pre-flight check applied here.)

## Output Format

```json
{
  "sub-skill": "discovery/assumption-test",
  "assumption": "string",
  "test_method": "existing-data | prior-art | automated | manual | user-interview",
  "time_spent_minutes": 25,
  "pass_criterion": "string",
  "fail_criterion": "string",
  "result": "confirmed | refuted | inconclusive",
  "observation": "string",
  "spec_impact": "proceed | descope | pivot | cancel",
  "discovery_brief_updated": true
}
```

### Persona Deep Dive

# Sub-Skill: Discovery — Persona Deep Dive

> **Load trigger:** `"load discovery/persona-deep-dive skill"` > **DORA:** AI Capability 6: User-centric focus
> **Token cost:** Low
> **When to use:** Persona is ambiguous, or two personas have equally strong claims.

## Purpose

Resolve persona ambiguity before writing a JTBD statement. An ambiguous persona
produces an ambiguous JTBD, which produces an untestable acceptance criterion, which
produces a feature nobody actually needed. Spend 10 minutes here to avoid that cascade.

## The Ambiguity Signals

Run this sub-skill when any of these are true:

- The proposed change description uses "users" generically without naming a role
- Two different personas would use the same feature in fundamentally different ways
- A previous release was under-adopted — the persona assumption may have been wrong
- The change spans multiple stack repos (different stacks have different primary personas)

## Persona Disambiguation Protocol

### Step 1 — List all personas who touch this change

From the discovery skill's Persona Reference Table, identify every persona who
would interact with this change — not just benefit from it. Include:

- Who triggers the change (initiates the action)
- Who is affected by the change (receives the outcome)
- Who configures or maintains the change (ongoing responsibility)

For most uFawkes\* changes, the triggering persona is the most important one.

### Step 2 — Apply the stakes test

For each candidate persona, answer:

| Question                                          | Answer    |
| ------------------------------------------------- | --------- |
| If this change doesn't ship, who is most blocked? | [persona] |
| If this change ships wrong, who is most harmed?   | [persona] |
| Who will file an issue if this breaks?            | [persona] |
| Who has the clearest definition of "done"?        | [persona] |

The persona who answers the most of these questions is the primary persona.

### Step 3 — Check GitHub issue history

```bash
# Find issues filed by users that relate to this area
gh issue list --repo paruff/REPO_NAME --state all --label "user-feedback" \
  --json number,title,body,labels \
  --jq '.[] | {number, title, body: .body[0:200]}'

# Look for patterns: are issues about platform complexity (platform-engineer persona)
# or about golden path gaps (product-engineer persona)?
```

### Step 4 — Check platform-feedback history

If a quarterly platform-feedback survey has been run, check the Q2 "hardest part"
responses for this area. The persona who reported friction is the primary persona.

### Step 5 — State the selection rationale

Write one paragraph:

- Primary persona selected: [name]
- Why: [the stakes-test answer that was clearest]
- Secondary persona: [name] — their needs will be addressed via [how, e.g., "configuration option in v0.2"]
- Conflicting needs: [if any — how the conflict is resolved]

Add this paragraph to `discovery-brief.md` under a "Persona Selection" section.

## Common Ambiguity Patterns and Resolutions

| Ambiguity                                              | Resolution                                                                                                                                                               |
| ------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| "Is this for platform-engineer or product-engineer?"   | Platform-engineer if it changes how the IDP works; product-engineer if it changes what a team can build with it                                                          |
| "Is this a Dojo learner change or platform change?"    | Dojo learner if the primary outcome is learning; platform change if the primary outcome is a running system                                                              |
| "Is this for current users or new users?"              | Current users if it fixes a pain point; new users if it enables adoption. Current users win if unsure — don't break what works to attract people who haven't arrived yet |
| "Is this for fawkes itself or for teams using fawkes?" | fawkes itself = platform-engineer persona; teams using fawkes = product-engineer or team-lead persona                                                                    |

## Output

Append to `discovery-brief.md`:

```markdown
## Persona Selection (from persona-deep-dive sub-skill)

**Candidates considered:** platform-engineer, product-engineer
**Primary persona selected:** platform-engineer
**Selection rationale:** The change modifies how the CI pipeline runs — a concern
the platform-engineer configures, not a concern the product-engineer experiences
directly. Product-engineers are secondary; they benefit from the change but don't
trigger it or define "done."
**Secondary persona:** product-engineer — their need (faster feedback) addressed
via the deployment frequency metric improvement this change enables.
**Conflicting needs:** None identified.
```

## Output Format

```json
{
  "sub-skill": "discovery/persona-deep-dive",
  "candidates_considered": ["platform-engineer", "product-engineer"],
  "primary_persona": "platform-engineer",
  "selection_confidence": "high | medium | low",
  "selection_rationale": "string",
  "secondary_persona": "product-engineer",
  "conflict_identified": false,
  "discovery_brief_updated": true
}
```

### Prior Art Search

# Sub-Skill: Discovery — Prior Art Search

> **Load trigger:** `"load discovery/prior-art-search skill"` > **DORA:** AI Capability 5: Working in small batches + AI Capability 3: AI-accessible internal data
> **Token cost:** Low
> **When to use:** End of every discovery session, before writing spec.

## Purpose

"Compose rather than build" is the highest-leverage YAGNI principle in a solo-contributor
portfolio. If the capability already exists — in another uFawkes\* repo, in the Dojo,
or in a well-maintained open-source project — the right move is to integrate it,
not rebuild it.

Spending 15 minutes here can eliminate an entire sprint of unnecessary work.

## Search Layers (run in order — stop when you find a match)

### Layer 1 — Internal: uFawkes\* repos (5 min)

```bash
# Search all local uFawkes* repos for relevant functionality
QUERY="SEARCH_TERM"  # replace with key terms from the JTBD

for repo in fawkes uFawkesObs uFawkesPipe uFawkesDevX uFawkesDORA uFawkesSec uFawkesAI; do
  REPO_PATH="../${repo}"
  [ -d "$REPO_PATH" ] || continue
  echo "=== ${repo} ==="
  # Search README for capability description
  grep -in "${QUERY}" "${REPO_PATH}/README.md" 2>/dev/null | head -3
  # Search any architecture docs
  grep -rin "${QUERY}" "${REPO_PATH}/ARCHITECTURE.md" "${REPO_PATH}/docs/" 2>/dev/null | head -3
  # Search skill files
  grep -rin "${QUERY}" "${REPO_PATH}/.agents/" 2>/dev/null | head -3
done

# Also check the current repo's own test suite and scripts
grep -rn "${QUERY}" tests/ scripts/ .agents/ 2>/dev/null | head -5
```

**Match criteria:** If any repo has a documented feature, skill, or script that
covers >70% of the JTBD, it's prior art. Document it and propose composition.

### Layer 2 — Internal: Dojo content (3 min)

```bash
# Check if this capability is already taught in the Dojo
grep -rin "${QUERY}" docs/dojo/ 2>/dev/null | head -5
# Check ufawkes.dev if accessible
# gh issue list --repo paruff/ufawkes.dev --search "${QUERY}" --state all | head -5
```

If the capability is already in the Dojo, the right move is usually to extend the
existing lab, not create a parallel implementation.

### Layer 3 — GitHub: uFawkes issues and PRs (3 min)

```bash
# Check if this was already proposed, attempted, or closed as won't-fix
for repo in fawkes uFawkesObs uFawkesPipe uFawkesDevX uFawkesAI; do
  gh issue list --repo "paruff/${repo}" --search "${QUERY}" --state all \
    --json number,title,state,labels \
    --jq ".[] | \"[${repo}] #\(.number) [\(.state)]: \(.title)\"" 2>/dev/null
done
```

A closed issue with `wont-fix` or `duplicate` is signal. Understand why before
proposing the same thing again.

### Layer 4 — Open source (4 min)

Search these sources in order. Stop at the first credible match.

```bash
# 1. CNCF landscape (for platform/infra capabilities)
echo "Check: https://landscape.cncf.io/ for [capability]"

# 2. GitHub search for active projects
gh search repos "${QUERY} stars:>100 pushed:>2025-01-01" --limit 5 \
  --json fullName,description,stargazersCount,updatedAt \
  --jq '.[] | "\(.fullName) ★\(.stargazersCount): \(.description)"'

# 3. Known reference implementations for common capabilities
KNOWN_PRIOR_ART=(
  "observability stack: grafana/grafana, prometheus/prometheus, grafana/loki, open-telemetry/opentelemetry-collector"
  "CI pipeline: woodpecker-ci/woodpecker, tektoncd/pipeline"
  "GitOps: fluxcd/flux2, argoproj/argo-cd"
  "CDE: coder/coder, coder/code-server, devcontainers/spec"
  "golden paths: backstage/backstage, roadie-gg/roadie-backstage-plugins"
  "DORA metrics: LinearB, Sleuth, Faros AI"
  "security policy: open-policy-agent/opa, kyverno/kyverno"
)
echo "Known prior art for related domains:"
for item in "${KNOWN_PRIOR_ART[@]}"; do echo "  - $item"; done
```

## Composition Decision Matrix

| Finding                                             | Decision                                                                         |
| --------------------------------------------------- | -------------------------------------------------------------------------------- |
| Exact match in uFawkes\* suite                      | **Compose:** use existing skill/feature; open issue to improve it if it has gaps |
| Partial match in uFawkes\* suite                    | **Extend:** build on existing, don't create parallel implementation              |
| Exact match in open source (maintained, MIT/Apache) | **Integrate:** wrap or reference it; document the dependency                     |
| Partial match in open source                        | **Extend or fork:** evaluate maintenance burden before deciding                  |
| No match anywhere                                   | **Build:** proceed to spec; document why existing solutions don't apply          |

## Output Section for Discovery Brief

```markdown
## Prior Art Search (from prior-art-search sub-skill)

**Search terms:** [terms used]
**Date:** YYYY-MM-DD

### Internal (uFawkes\* suite)

- [repo]: [what exists, why it doesn't fully cover the need]
- No match found / [match description]

### Dojo

- [existing module or no match]

### Open source

- [project name + URL]: [what it does, why it does/doesn't fit]
- No credible match found

### Decision

[Build from scratch | Compose with X | Extend X | Integrate X]

**Rationale:** [one sentence — why this is the right composition decision]

**Composition approach:** [if not build-from-scratch — how exactly to use the existing solution]
```

## Output Format

```json
{
  "sub-skill": "discovery/prior-art-search",
  "query_terms": ["string"],
  "internal_matches": [
    {
      "repo": "uFawkesObs",
      "component": "observability skill",
      "coverage": 0.7
    }
  ],
  "dojo_matches": [],
  "open_source_matches": [],
  "decision": "extend | compose | integrate | build",
  "selected_prior_art": "uFawkesObs/observability skill",
  "composition_approach": "string",
  "discovery_brief_updated": true
}
```

## Usage

```bash
# Standard 15-min discovery
load discovery skill

# When assumptions are untested
load discovery/assumption-test skill

# For deep persona work
load discovery/persona-deep-dive skill

# For competitive analysis
load discovery/prior-art-search skill
```

## Enforcement

- **Discovery brief** required before any spec.md
- **DORA vocabulary** validates Capability 6 references
- **AI stance audit** validates user-centric focus

Files in this skill

  • SKILL.md7.9 KB
  • assumption-test.md6.2 KB
  • persona-deep-dive.md5.9 KB
  • prior-art-search.md6.3 KB

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…