Plan an A/B test by script: sample size per variant, days to run, stopping rules. "how many visitors per variant"
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
Validate the brand profile is production-ready: fields, compliance, connectors. "is the brand setup correct"
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
설치 방법 보기설치하기 전에 에이전트에게 전달되는 지시 내용을 확인할 수 있습니다.
Script location. If your host does not set
${CLAUDE_PLUGIN_ROOT}, the scripts are in this plugin'sscripts/folder, next toskills/. Run them with Python 3.10 or newer:python, orpython3wherepythonis not found (macOS, many Linux systems).
This skill is the canonical "is this brand ready to ship work?" gate. It validates a brand profile is complete enough for production use AND that every credential/connector referenced by the profile is actually reachable — without ever printing credential values.
Use this skill:
/digital-marketing-pro:brand-setup (or /digital-marketing-pro:client-onboarding) to confirm the new profile is production-ready./digital-marketing-pro:import-guidelines) to confirm the merge succeeded./digital-marketing-pro:engagement, /digital-marketing-pro:campaign-plan, or /digital-marketing-pro:launch-campaign.For agencies running 50–200 client brands, brand profiles and credentials drift constantly: a junior changes a Slack channel, an API key rotates, a brand voice gets edited. The cost of running a 60-minute engagement on a broken profile is hours of rework. This skill catches those drift cases in under 60 seconds.
The skill is read-only — it inspects state, never modifies it. It also never prints credential values — connector checks emit pass / fail / error-class without echoing the secret.
| Dimension | What's checked | Severity |
|---|---|---|
| Required identity | brand_name, industry, and a market/jurisdiction list non-empty — accept target_markets (what brand-setup actually writes) or target_jurisdictions (legacy). Checking only the legacy name made every freshly created brand fail its own validator on a BLOCKER | BLOCKER |
| Voice profile | tone, formality and energy populated under brand_voice (what brand-setup writes, and what content-engine and brand-voice-scorer.py both read) or under voice (legacy). The generator is the source of truth here — two consumers already follow it, so this validator was the outlier | BLOCKER for content work |
| Audience profile | target_audience.primary_persona with role + reading_level | WARNING |
| Guardrails | guardrails.prohibited_terms + guardrails.prohibited_claims non-empty. brand-setup does not create this block, so report it as a WARNING with the exact command to add it for an unregulated brand, and reserve BLOCKER for regulated industries — where a missing guardrail is a real risk, not a setup gap | BLOCKER for regulated industries (pharma, BFSI, healthcare, legal); WARNING otherwise |
| Compliance jurisdictions | Each declared jurisdiction has a matching rules entry in skills/context-engine/compliance-rules.md | BLOCKER |
| Connector config present | Every connector named in tracking.backend, integrations.*, analytics.* has its env vars / .mcp.json entry present (local check; live reachability comes from the MCP/curl probe below) | BLOCKER per unconfigured connector |
| MCP server health | Every entry in .mcp.json (if present) responds to a tools/list ping | WARNING |
| Credential storage | ~/.claude-marketing/brands/{brand}/credentials.json (or env vars) present for every backend referenced | BLOCKER |
| Output paths writeable | ~/.claude-marketing/brands/{brand}/ is writeable; the user-visible publish dir ($DIGITAL_MARKETING_PRO_PUBLISH_DIR or ~/Documents/DigitalMarketingPro/) is writeable | BLOCKER |
| Model curator currency | scripts/resolve_model.py --registry-age returns < 90 days | WARNING |
A BLOCKER means "do not let the user run engagement / campaign-plan / launch-campaign until this is fixed." A WARNING is surfaced but does not gate.
If --brand <slug> was passed, use it. Otherwise read the active brand from ~/.claude-marketing/brands/_active-brand.json (set by /digital-marketing-pro:switch-brand). If neither is available, error: "--brand <slug> required, or run /digital-marketing-pro:switch-brand first." Do NOT validate "everything" — validation is per-brand by design.
BRAND_DIR="$HOME/.claude-marketing/brands/{brand}"
test -d "$BRAND_DIR" || { echo "Brand directory not found at $BRAND_DIR — run /digital-marketing-pro:brand-setup first."; exit 1; }
PROFILE="$BRAND_DIR/profile.json"
test -f "$PROFILE" || { echo "profile.json missing under $BRAND_DIR — run /digital-marketing-pro:brand-setup."; exit 1; }
Parse the profile JSON and capture: brand_name, industry, target_jurisdictions, voice.*, target_audience.*, guardrails.*, tracking.backend, integrations.*, analytics.*.
Walk the checklist in the Validation dimensions table above. For each field, record one of: OK / WARN: <reason> / BLOCK: <reason>. Do NOT short-circuit — collect every issue so the user sees the full picture in one pass.
For regulated industries (industry matches any of pharma, pharmaceuticals, bfsi, banking, insurance, healthcare, legal, medical-devices), upgrade guardrails issues from WARNING to BLOCKER.
For every entry in target_jurisdictions, confirm skills/context-engine/compliance-rules.md contains a matching section header (e.g. ### 1.11 India — DPDPA). If a jurisdiction is declared but not covered, BLOCK with: "Jurisdiction {X} declared in profile but no compliance rules for it — engagement will produce non-compliant deliverables."
For each backend referenced in tracking.backend, integrations.crm, integrations.email, integrations.cms, integrations.analytics, integrations.social, run the matching health probe via scripts/connector-status.py:
python "${CLAUDE_PLUGIN_ROOT}/scripts/connector-status.py" \
--action status \
--brand "{brand}" \
--connectors "{comma-separated list inferred from profile}" \
--probe-only --no-secrets
connector-status.py --probe-only runs a local readiness check: it verifies that the required environment variables / .mcp.json entry for each connector are present and non-empty. It does NOT open a live network connection or make a whoami call — so it reports a config-level class (CONFIGURED / MISSING_ENV / NOT_IN_MCP), not a live HTTP status. --no-secrets guarantees it never echoes, logs, or writes a credential value. For an actual liveness check, use the connector's MCP tools/list endpoint or the HTTP curl probe below.
For MCP servers in .mcp.json (if present at the brand or project level), run a tools/list ping against each via mcp__connector__* if the connector is loaded, or invoke a 5-second curl HEAD against the configured url for HTTP MCPs:
for url in $(jq -r '.mcpServers[] | select(.type=="http") | .url' .mcp.json); do
code=$(curl -sS -o /dev/null -w "%{http_code}" -m 5 "$url" || echo "000")
echo "$url -> HTTP $code"
done
HTTP 200, 204, 401 (auth required for GET — POST will work), and 405 (method not allowed for GET — POST will work) all count as "reachable". 404, 000 (DNS / timeout), 5xx count as BLOCK.
test -w "$HOME/.claude-marketing/brands/{brand}/" || echo "BLOCK: brand directory is not writeable"
# User-visible publish dir (dual-copy pattern)
if [ -n "$DIGITAL_MARKETING_PRO_PUBLISH_DIR" ]; then
test -w "$DIGITAL_MARKETING_PRO_PUBLISH_DIR" || echo "WARN: DIGITAL_MARKETING_PRO_PUBLISH_DIR ($DIGITAL_MARKETING_PRO_PUBLISH_DIR) is not writeable"
elif [ -d "$HOME/Documents" ]; then
test -w "$HOME/Documents" || echo "WARN: ~/Documents is not writeable — the user-visible publish copy will fail"
fi
python "${CLAUDE_PLUGIN_ROOT}/scripts/resolve_model.py" --registry-age
If the registry is more than 90 days old, WARN: "model_registry.json is {N} days old — frontier models change every ~6 weeks. Run scripts/refresh_models.py to check drift." (Do not block — the curator auto-falls-forward on deprecated ids, so an older registry is degraded, not broken.)
Print a structured report. ALWAYS show every check (don't only print failures — agencies need positive confirmation for the rest):
🔎 Brand profile validation — {brand_name}
Slug: {brand} · Industry: {industry} · Jurisdictions: {list}
✅ Required identity brand_name, industry, target_jurisdictions all set
✅ Voice profile tone={tone} · formality={formality} · energy={energy}
⚠️ Audience profile primary_persona.role set, reading_level MISSING
✅ Guardrails {N} prohibited_terms, {M} prohibited_claims (industry={industry})
✅ Compliance jurisdictions EU-GDPR ✓ · IN-DPDPA ✓ · US-CCPA ✓
🛑 Connector — Slack MISSING_ENV (SLACK_* env not set — add via /digital-marketing-pro:add-integration slack)
✅ Connector — HubSpot OK (workspace acme-corp, 1247 contacts)
✅ Connector — Stripe OK
✅ MCP — gmailmcp.googleapis.com HTTP 405 (alive)
✅ Output paths ~/.claude-marketing/brands/{brand}/ writeable; ~/Documents/DigitalMarketingPro/ writeable
⚠️ Model curator registry is 102 days old — consider scripts/refresh_models.py
Decision: 🛑 BLOCKED — Slack connector not configured. Fix before running:
• /digital-marketing-pro:engagement
• /digital-marketing-pro:campaign-plan
• /digital-marketing-pro:launch-campaign
Re-run /digital-marketing-pro:validate-profile after fixing.
Also emit a machine-readable JSON summary so it can be consumed by /digital-marketing-pro:check, /digital-marketing-pro:status, or downstream automation:
{
"brand": "{slug}",
"decision": "blocked | passed | passed_with_warnings",
"blockers": [{"check": "connector_slack", "reason": "..."}],
"warnings": [{"check": "audience_persona", "reason": "reading_level missing"}],
"passed": ["required_identity", "voice_profile", ...]
}
--no-secrets; if a probe accidentally returns a credential in its error string, redact before printing. The skill output goes to logs and clipboards — assume it leaks./digital-marketing-pro:agency-dashboard --health)./digital-marketing-pro:validate-profile [--brand <slug>] [--json] [--connectors <list>] [--quick]
--brand <slug> — brand to validate (else uses active brand)--json — emit only the JSON summary, no human report (useful for chaining)--connectors <list> — comma-separated subset to probe instead of every connector in the profile (useful when only Slack rotated)--quick — skip the connector reachability probes (run only the field-level checks)brand-setup — interactive brand creationimport-guidelines — bulk-load existing brand guidelines into the profilestatus — unified read-only snapshot of the active brandcheck — pre-publish content quality gateswitch-brand — set the active brandscripts/connector-status.py — the underlying connector health probescripts/resolve_model.py — model curator (used for currency check)아직 리뷰가 없습니다. 사용해 본 소감을 남겨 주세요.
로그인 없이 쓸 수 있습니다. 사용 후기, 질문, 작동하지 않은 환경 등을 편하게 남겨 주세요.
아직 댓글이 없습니다. 첫 댓글을 남겨 보세요.
Plan an A/B test by script: sample size per variant, days to run, stopping rules. "how many visitors per variant"
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
Write ad copy variants to each platform's specs, policy-checked and in brand voice. "write ad copy for Meta"
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
Add a custom MCP integration: scaffold the server, write .mcp.json, test it. "add a new MCP server"
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
Run a one-time AEO audit of six AI answer engines, scored per surface. "check our AI search visibility"
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
Plan AEO/GEO strategy to get cited by AI: content, entities, schema, 90-day plan. "how do we get cited by AI"
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
Build the agency dashboard across all client brands: health, pacing, risk. "how are all our clients doing"
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.