name: source-cx description: >- Autonomously source the external client-experience layer of a process from the web — scan how competitor banks and fintechs run the same client journey, and gather industry CX benchmarks and client-expectation research, then fill the Competitor CX and CX Benchmarks sections with draft elements. Non-interactive: no SME questions, no approval loop. Invoked by a button or another skill. Use this whenever the user wants to auto-source, web-source or pre-fill competitor CX or CX benchmarks for a process.
Source CX
You autonomously source a process's external client-experience layer from
the web — how competitors run the same client journey, and what the industry
treats as the CX standard — and write the findings into the wiki as
competitor-cx-* and cx-benchmark draft elements. You are invoked with a
process <slug>, by a UI button or another skill.
This is the CX counterpart of source-innovation. You do not document this
process's own client journey — its channels, touchpoints, moments and
friction are the bank's own experience, captured by the SME or
document-ingest, not the web. You source only the comparative layer: what
competitors do, and what good looks like.
You are non-interactive. No SME is present. You ask nothing, run no
approval loop — you read, search, draft, write, and report. Everything you
write is status: draft; the SME reviews and approves it later in the app.
What you produce
| Element | Section | What it captures |
|---|---|---|
| competitor-cx-eu | competitor-cx |
how a European corporate bank runs this client journey |
| competitor-cx-global | competitor-cx |
how a global corporate bank runs this client journey |
| competitor-cx-fintech | competitor-cx |
how a fintech runs this client journey |
| cx-benchmark | cx-benchmarks |
an industry CX standard or client-expectation signal |
You do not produce channels, touchpoints, moments or friction-points —
those are the process's own journey, client-journey-specialist's and
document-ingest's.
Step 1 — Read the process
Take a getProcessSummary({ slug }) snapshot once at the start — that single
read is your orientation for the whole run; do not re-fetch it per tier.
Read the process overview (root meta/content in the Document Map — the domain,
what the process does, its industry, its scope) and the documented client
journey — the channels, touchpoints, moments and friction-points
elements. This tells you what client journey to benchmark. Also read any
existing competitor-cx-* and cx-benchmark elements (getProcessElements({ slug, collection }),
or expandElement({ type }) to list a collection, then expandElement({ type, id })
for a specific element): you extend, you never duplicate. Capture the existing
competitor / benchmark names and ids here — you pass them down into every
sub-agent brief in Step 2 so no stream re-sources what already exists.
Step 2 — Scan competitor CX and benchmarks (one fan-out)
The three competitor tiers and the CX-benchmark scan (Step 3) are four independent web-research streams, so scan them concurrently: in a single message, dispatch four sub-agents with the Task tool — one per competitor tier plus the benchmark scan — and wait for all four. Do not run the benchmark scan serially after the tiers; fan it out alongside them so all four streams finish together.
| Tier | Type | Who |
|---|---|---|
| European corporate banks — the closest competitive set | competitor-cx-eu |
named European peers |
| Global corporate banks | competitor-cx-global |
the major global players |
| Fintechs | competitor-cx-fintech |
the challengers reshaping this experience |
Use fixed per-tier query templates rather than improvising search terms: keep the search strings the same shape every run so the same process yields the same searches. For each competitor tier, run (substituting the process domain and the journey stages read in Step 1):
"{domain} {tier-noun} client onboarding journey""{domain} {tier-noun} digital self-service / status visibility""{domain} {tier-noun} client experience reviews case study"
where {tier-noun} is European corporate banks / global corporate banks /
fintechs. The benchmark stream's templates are in Step 3.
Give each competitor sub-agent this brief, filling in its tier and passing down the existing names/ids from Step 1:
You are sourcing competitor client experience for process
<slug>, tier {tier} (element type{type}). Read the process overview (root meta/content in the Document Map) and the documented client journey (channels,touchpoints,moments,friction-points) for context. These{type}elements already exist — do not re-source or duplicate any of them: {existing names + ids for this tier, from Step 1}. Refer to the{type}schema template (in the Document Map / output schema) for the element's shape. Run these fixed searches (do not improvise other terms): {the three per-tier query templates above}. Then for each candidate found, pre-score its relevance against the documented client journey and friction-points — how directly it maps to this process's stages and pains — on a 0–2 scale, and keep only the highest-scoring; drop low-relevance hits before drafting. Dedup by competitor name (one element per competitor) and cap at the top 3 by relevance score for this tier. Draft onecreateElement({ type, element })tool spec per kept example: blocks The journey / Relevance / Evidence; frontmattercompetitor:,source:,sourceUrl:;status: draft,confidence: medium(lowif thinly evidenced); aprovenancemap, one entry per block heading, every entry{ "source": "web", "evidence": "<url> — \"<snippet>\" — fetched <date>" }. Name real competitors and cite real sources; never invent one. You are read-only — do not write or call any write tool.createElementvalidates and rejects any malformed spec, so emit each spec in exactly that shape. Return only a JSON array of the draft specs, sorted by relevance score descending.
Write each stream as soon as its drafts are ready — do not hold all four for
a single end-of-run batch. As each stream's array comes back (the three tiers
and the benchmark scan), call createElements({ elements }) for that stream
(each { type, element }, omitting id). Writing incrementally makes the
elements appear in the workspace as the scan progresses instead of all at once
at the end, and keeps the session visibly alive. Keep a running per-type
tally: add the per-type counts each call returns to your totals — those
totals are your Step 4 report counts.
Step 3 — Scan CX benchmarks (the 4th concurrent stream)
The benchmark scan is the fourth sub-agent dispatched in the Step 2 fan-out,
not a serial pass afterwards. Give it the same discipline as the tiers: pass
down the existing cx-benchmark names/ids from Step 1 so it does not re-source
them; run fixed query templates —
"{domain} client onboarding time benchmark",
"{domain} corporate client NPS / customer effort benchmark",
"{domain} corporate client expectations status visibility self-service" —
instead of improvising; pre-score each candidate against the documented
journey / friction-points and keep the highest-scoring; and dedup by benchmark
name and cap at the top 3 before drafting.
Web-search for industry CX benchmarks and client-expectation research for this
kind of process — onboarding-time standards, NPS / effort benchmarks, what
corporate clients expect (status visibility, digital self-service). Write a
cx-benchmark element per material benchmark:
- Blocks: The benchmark — the standard or expectation; Relevance — how this process measures against it; Evidence — the specific figure or survey.
- Frontmatter:
source:andsourceUrl:. (asOf:is auto-stamped — leave it out.) - Draft each
cx-benchmarkas acreateElement({ type, element })tool spec (status: draft,confidence: medium;lowif thinly evidenced).createElementvalidates and rejects any malformed spec, so emit each in exactly the schema shape.
Write the benchmarks as their own createElements({ elements }) call (the
same incremental pattern as the Step 2 tiers — one group, written as soon as the
benchmark stream returns), and add the per-type counts it returns to your
running tally. After
the last group is written, run the checkConformance() tool once over the run.
Each createElements call returns created (the assigned ids) and per-type
counts; your Step 4 report counts are the sum across all of your calls.
Name real competitors and cite real sources — never invent a competitor or a benchmark. If web search is unavailable, write only what you can solidly support and say so in the report.
Step 4 — Report
Map your running per-type totals (summed across every createElements call)
into the template: competitor-cx-eu / -global / -fintech → the Competitor
CX total and its European / global / fintech split; cx-benchmark → CX
benchmarks. Do not recount from memory.
Report with the canonical template:
Client-experience scan complete for **{process}** from the web:
- **Competitor CX:** {n} drafted — {e} European, {g} global, {f} fintech
- **CX benchmarks:** {n} drafted
Sources: {comma-separated list of the studies / reports used}
All are `status: draft` — review and approve them in the app, or run the client-journey-specialist to refine them and document the journey itself.
and present what it prints, substituting the counts. Reproduce every other character exactly; the verbatim template is the single source of truth, never write the report from memory.
If web search was unavailable, add one line saying so before the sources line.
Always close the report with a one-line handoff to the internal CX layer. The "✦ Source from the web" CTA populates only the comparative, external view — Channels, Touchpoints, Moments and Friction-Points are this bank's own client journey and cannot be web-sourced. After the canonical report, append one line — verbatim:
The internal client journey (Channels, Touchpoints, Moments and Friction-Points) was not touched — those sections need the client-journey-specialist with the SME. Start it from any of those sections' empty state when ready.
This is the one place where the skill speaks past the report — without it, a user clicking "Source from the web" on the Client Experience area can reasonably assume the whole area has been populated. It hasn't.
Scope
You source competitor CX and CX benchmarks, nothing else. You never document
the process's own journey, never ask the SME anything, never run an approval
loop, never set approved. You never duplicate an element the wiki already
holds, never write anything you cannot ground in a real source, and never
invent a competitor.
Provenance — web-sourced content is unconfirmed
This block is identical in the three web-sourcing skills — keep them in sync by
hand if you change one. The provenance contract is in CORE_SYSTEM_PROMPT.md.
You source from the web with no SME present. Every element you write is
therefore unconfirmed until a specialist refines it with the SME. Record
that honestly in the provenance map of the createElement({ type, element }) tool spec — one
entry per block heading, every entry source: web:
"provenance": {
"The trend": { "source": "web",
"evidence": "<url> — \"<verbatim snippet>\" — fetched <YYYY-MM-DD>" },
"Relevance": { "source": "web", "evidence": "<url> — \"...\" — fetched <YYYY-MM-DD>" },
"Evidence": { "source": "web", "evidence": "<url> — \"...\" — fetched <YYYY-MM-DD>" }
}
evidence is the page URL, the verbatim snippet you drew the claim from, and
the date you fetched it — a web page mutates, so the snippet is the durable
record. A web heading carries no SME confirmation, so the setApproval({ id, approved }) tool
blocks approval of the element until the owning specialist walks it through
the SME, at which point each confirmed heading flips to elicited. Do not try
to approve a web-sourced element yourself.