skills/concierge-testing/SKILL.md
Validate gap hypotheses by manually simulating features for individual users and measuring commitment, not satisfaction.
npx skillsauth add 0xhoneyjar/construct-observer concierge-testingInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Validate a gap hypothesis before any code is written. Manually simulate the proposed feature for ONE user whose canvas shows the strongest evidence, then measure commitment — not satisfaction, not compliments, commitment.
This skill sits between /analyze-gap and /file-gap in the pipeline. It is the validation step that separates Level 4 (Obstacle) from Level 5 (Validated Obstacle).
Commitment is the only metric that matters. "That's cool" is a kill signal. "How do I keep this?" is a build signal. The difference between a feature worth building and a feature that wastes Zerker's time is whether users change their behavior when given the thing.
/concierge-test {hypothesis-id}
/concierge-test {hypothesis-id} --canvas {username}
/experiment {hypothesis-id}
/experiment {hypothesis-id} --canvas {username}
Examples:
/concierge-test H3 # Test hypothesis H3, auto-select best user
/concierge-test H3 --canvas xabbu # Test H3 specifically with xabbu
/experiment H5 --canvas el-capitan # Alias: test H5 with el-capitan
Arguments:
{hypothesis-id}: Hypothesis ID from canvas Level 3 Hypotheses (required)--canvas {username}: Override user selection (optional — auto-selects strongest evidence)If hypothesis has fewer than 3 sources, WARN:
Hypothesis {id} has only {N} source(s). Concierge tests are most
reliable at Pattern level (3+ sources). Proceed anyway? Results
will carry lower confidence.
If --canvas provided, use that user. Otherwise, select the best candidate:
Selection Criteria (in priority order):
power_user or reactivating preferred over churningLoad selected canvas:
grimoires/observer/canvas/{username}-canvas.md
Extract:
Create a manual simulation of the proposed feature. The simulation must be:
Simulation Types:
| Hypothesis Type | Simulation Approach | |-----------------|---------------------| | Recognition / status | Manually assign a title or badge via DM: "We noticed you did X; we've flagged your wallet as [title]." | | Information gap | Send them the data they were missing: "Here's what your profile looks like behind the scenes: [data]" | | Workflow friction | Walk them through the manual workaround: "Try doing X → Y → Z. Does that get you what you need?" | | Social / comparison | Share relevant context: "You're one of {N} wallets that [behavior]. Here's how that compares: [data]" |
Draft the DM message. Use the user's own words as anchors:
hey {username} — you mentioned "{exact quote from canvas}". we
[describe simulation]. does that help with what you're doing?
Before sending, record the simulation in provenance:
echo -n "{simulation_message}" | scripts/provenance/gate.sh \
--source-type concierge_test \
--confidence exact \
--canvas-target "{username}" \
--raw-source-ref "concierge-{hypothesis_id}-{username}-{date}" \
--ingested-by concierge-test
This step requires human action. The agent prepares the message; the operator sends it.
Output the prepared message:
--- CONCIERGE TEST: {hypothesis_id} ---
Target: @{username}
Hypothesis: {hypothesis text}
Simulation: {what we're manually doing}
Message to send:
─────────────────────────────────────
{prepared DM message}
─────────────────────────────────────
After sending, run:
/concierge-test {hypothesis_id} --record {commitment_level}
Commitment levels:
strong — asked how to keep it, changed behavior
social — bragged to others, shared it
kill — "that's cool, thanks" (polite dismissal)
silence — no response after 72 hours
When the operator reports back with --record {level}:
| Response | Classification | Signal | Action | |----------|---------------|--------|--------| | Asked how to keep it | Strong | Build signal | Create Problem-Constraint Doc → Zerker handoff | | Changed behavior after receiving it | Strong | Build signal | Create Problem-Constraint Doc → Zerker handoff | | Bragged to others / shared it | Social | Build with sharing | Create Problem-Constraint Doc with social context → Zerker handoff | | "That's cool, thanks" | Kill | Don't build | Close hypothesis. Note in canvas. Save as Atomic Learning. | | Asked clarifying questions, then engaged | Strong | Build signal | Create Problem-Constraint Doc → Zerker handoff | | Polite but no follow-up action | Kill | Don't build | Close hypothesis. Note in canvas. | | No response after 72 hours | Silence | Need isn't strong enough | Close hypothesis unless user is known to be inactive. |
Update the user's canvas with concierge test result:
## Concierge Tests
### Test: {hypothesis_id} — {date}
| Field | Value |
|-------|-------|
| **Hypothesis** | {hypothesis text} |
| **Simulation** | {what we manually did} |
| **Commitment Level** | {strong / social / kill / silence} |
| **User Response** | "{exact response quote}" |
| **Provenance** | `[prov:{hash}]` |
**Interpretation**: {what this tells us about the hypothesis}
Update hypothesis confidence:
If Strong or Social signal:
grimoires/observer/templates/problem-constraint-doc.md
grimoires/observer/problem-constraints/{hypothesis_id}-{date}.md
/file-gapIf Kill or Silence signal:
falsified or inconclusivegrimoires/observer/learnings/:
## Learning: {hypothesis_id} — {date}
**Hypothesis**: {text}
**Test**: {simulation description}
**Result**: {kill/silence}
**Lesson**: {what we learned — why the need wasn't strong enough}
**Reuse**: {when this learning applies to future hypotheses}
Concierge Test Complete
Hypothesis: {id} — {text}
Target User: @{username}
Simulation: {description}
Commitment: {strong / social / kill / silence}
Result:
{If strong/social:}
✓ Problem-Constraint Doc created: grimoires/observer/problem-constraints/{id}-{date}.md
✓ Ready for Zerker handoff: /file-gap {id}
{If kill/silence:}
✗ Hypothesis {falsified/inconclusive}
✓ Learning recorded: grimoires/observer/learnings/{id}-{date}.md
✗ No issue filed — need not validated
Next Steps:
{If validated:} /file-gap {id} — file as GitHub issue for implementation
{If falsified:} Review canvas for alternative hypotheses
{If inconclusive:} Consider re-testing with different user or different simulation
| Error | Resolution |
|-------|------------|
| Hypothesis ID not found | List available hypotheses from canvases |
| No canvas with hypothesis | Suggest running /observe or /analyze-gap first |
| Canvas has no wallet / score context | Proceed without score weighting, note limitation |
| User unreachable | Suggest alternative user or defer test |
| Provenance gate error | Log error, proceed with test (degrade gracefully) |
| Operator doesn't report back | After 7 days, auto-classify as silence |
After concierge test:
/analyze-gap — Upstream: identifies gaps to test/file-gap — Downstream: files validated obstacles as issues/observe — Signal capture that populates canvases/follow-up — Prior messages inform simulation designgrimoires/observer/ARCHETYPE.md — The Listener archetype governing this skillgrimoires/observer/templates/problem-constraint-doc.md — Output templatedata-ai
Cognition orchestrator — analyze canvases, distill fears via /distill subagent, run gap analysis, optional cross-user synthesis.
development
Golden path /speak — generate RLM-isolated follow-ups with chronicle temporal context injection.
testing
# /snapshot — MiDi Experience Record (MER) Capture Capture a point-in-time MER for a wallet. Produces a 4-layer snapshot: data state, visual screenshot, user perception, and decision context. ## Usage ``` /snapshot <wallet-or-alias> /snapshot xabbu --trigger feedback /snapshot xabbu --data-only /snapshot --cohort /snapshot --cohort --diff MER-2026-001 ``` ## Arguments | Argument | Description | Required | |----------|-------------|----------| | `wallet-or-alias` | Wallet address or alias fr
development
Golden path /shape — consolidate journey patterns across canvases and file gap issues.