Agent skill
ops-inbox
Process pending Brikette customer emails and generate draft responses using MCP tools
Install this agent skill to your Project
npx add-skill https://github.com/majiayu000/claude-skill-registry/tree/main/skills/other/other/ops-inbox
SKILL.md
Process Emails
Process customer emails for Hostel Brikette, generating intelligent draft responses using the knowledge base and MCP tools.
When to Use
Run this skill when you want to process customer inquiry emails for Brikette:
- Morning email triage (recommended: 09:00 Italy time)
- Afternoon follow-up (recommended: 17:00 Italy time)
- Ad-hoc when notified of urgent inquiry
Prerequisites
- MCP server running locally with Gmail tools enabled
- Gmail API credentials configured for Pete's account
- Network access to Gmail API
- Fallback CLI available:
scripts/ops/create-brikette-drafts.py
Workflow
0. Mandatory MCP Preflight (Fail Fast)
Before any inbox processing, run:
health_check({ strict: false })
Then enforce these rules:
- If this call fails with tool-resolution/transport errors (for example
Tool not found, unknown tool, or MCP disconnect), stop immediately. - Do not continue to
gmail_organize_inboxor any other MCP call in that session. - Tell the user this is a stale/continued session with a dead MCP registry and require a fresh Claude Code session.
- Recovery command:
bashThen rerun
claude/ops-inbox. - If preflight returns
status: "unhealthy", stop and show the failing checks/remediation. - If preflight returns
status: "degraded", continue only with explicit user approval.
After health_check passes, run the reconcile step:
gmail_reconcile_in_progress({ dryRun: false, staleHours: 2 })
Handle the result as follows:
- If the call throws or returns an error: log a warning (
⚠️ Reconcile failed: <error message> — continuing) and proceed. This step is fail-open and must never block the inbox run. - If
counts.routedRequeued > 0: surface this line in the preflight output:(where N is the value of♻️ N stuck email(s) recovered and re-queued.counts.routedRequeued) - If all counts are zero: say nothing about reconcile — preflight output is silent.
If the user wants dry-run fallback (or MCP remains unavailable), queue drafts locally instead of writing Gmail drafts:
python3 scripts/ops/create-brikette-drafts.py \
--input <path-to-drafts.json> \
--dry-run \
--queue-file data/email-fallback-queue/<timestamp>-ops-inbox.jsonl
NOTE: Dry-run and Python-fallback sessions produce no signal events. This is expected — those sessions are excluded from calibration data and will not appear in
draft_signal_statscounts.
1. Run Inbox Organize Cycle
First, run an inbox organize pass for unread emails. This does a garbage/sort cycle:
- trashes known garbage patterns
- labels likely customer inquiries as
Brikette/Queue/Needs-Processing
Organizing unread inbox...
Call the tool:
gmail_organize_inbox({ limit: 500 })
Then briefly report the result:
- scanned threads
- trashed count
- needs-processing count
- promotional count
- spam count
- deferred count
- deferred sender email list (for user instruction on future routing rules)
2. Check Email Queue
Use the gmail_list_pending MCP tool to fetch pending emails:
gmail_list_pending({ limit: 20 })
If no pending emails, inform the user:
No pending emails in your queue. You're all caught up!
3. Display Queue Summary
Present emails in a summary table:
## Pending Emails (N total)
| # | From | Subject | Received | Type |
|---|------|---------|----------|------|
| 1 | maria@example.com | Availability June 15-18? | 2h ago | Inquiry |
| 2 | john@example.com | RE: Booking confirmation | 4h ago | Reply |
...
Actions:
- "Process all" - work through queue in order
- "Process #1" - handle specific email
- "Skip #3" - mark as spam/not-customer
- "Defer #5" - move to deferred manual-review label
- "Done" - finish session
Classify emails by type:
Needs Draft Response:
- Inquiry - New customer question (availability, pricing, etc.)
- Reply - Response to previous thread requiring answer
- FAQ - Question answerable from knowledge base
No Draft Needed:
- Informational - Customer providing info, no reply needed (arrival time, "thanks", confirmation)
- Promotional - Marketing/newsletters from OTAs, suppliers, services
- Not-Customer - Irrelevant, wrong recipient, or automated bounce
Special Handling:
- Complex - Multi-part, complaint, or unusual request (defer for careful handling)
- Spam - Suspicious, phishing, or unwanted
4. Process Individual Emails
When user selects an email to process:
-
Fetch full details using
gmail_get_email:typescriptgmail_get_email({ emailId: "...", includeThread: true }) -
Run Interpretation stage using
draft_interpret:typescriptdraft_interpret({ body: email.body.plain, subject: email.subject, threadContext: email.thread_context })Output:
EmailActionPlan(intents, scenario, agreement status, workflow triggers). -
Review the Action Plan:
- Confirm
scenario.category - Check detected language
- Inspect agreement detection status
- Note workflow triggers (prepayment, T&C, booking monitor)
- Check
escalation_required: iftrue, do NOT proceed todraft_generate. Instead, move the email toBrikette/Queue/Deferredviagmail_mark_processed({ emailId, action: "deferred" })and stop the pipeline for this email. Inform the user that the email requires human review before a draft can be generated. - If classification is ambiguous or context looks odd, default to
deferred(manual review)
- Confirm
-
Run Composition stage using
draft_generate:typescriptdraft_generate({ actionPlan, subject: email.subject, recipientName: email.from.name, prepaymentStep: "first" | "second" | "third" | "success", prepaymentProvider: "octorate" | "hostelworld" })Output: draft (plain + HTML), template_used, answered_questions, knowledge_sources.
-
Run Quality Gate using
draft_quality_check:typescriptdraft_quality_check({ actionPlan, draft })Capture the full result including
quality.question_coverage[].Gap-Patch Loop — run this before presenting to the user:
a. Inspect every entry in
quality.question_coverage[]:status: "covered"→ no action needed for that question.status: "missing"→ the question received zero keyword matches; a patch is required.status: "partial"→ the question was touched but under the required match threshold; a patch attempt is required.
b. For each
missingorpartialentry, look up the question text againstknowledge_summariesreturned bydraft_generate.- If a relevant snippet exists in
knowledge_summaries: rewrite the relevant paragraph to include a source-backed answer. Cite the snippet URI inline if helpful. NEVER invent an answer that has no source snippet. - If no relevant snippet exists for that question: insert the following
escalation sentence in place of an invented answer:
"For this specific question we want to give you the most accurate answer — Pete or Cristiana will follow up with you directly." Do not attempt to paraphrase, guess, or approximate the missing information.
c. Hard-rule categories — do NOT modify under any circumstance:
prepaymentcategory text (1st/2nd/3rd attempt, cancelled, successful templates)cancellationcategory text (non-refundable, no-show templates) These paragraphs are legally and operationally fixed. If amissing/partialentry belongs to a question about prepayment or cancellation policy, escalate using the sentence above rather than touching the template wording.
d. Partial-subset rule: When an email contains multiple questions and only some can be source-backed, patch what can be sourced and escalate the rest individually. Do not withhold the draft because one question lacks a snippet — produce the best partial draft and flag each unanswered question explicitly in the user-facing summary.
e. After applying all patches (or escalation insertions), re-render
bodyPlainandbodyHtml. -
LLM Refinement Stage — after gap-patching, Claude (not a tool call) assesses the draft holistically and optionally rewrites it to improve tone, flow, and coverage. Then call
draft_refineto submit and attest the result:typescriptdraft_refine({ actionPlan, draft_id: draftGenerateResult.draft_id, // links this refinement to the selection signal event rewrite_reason: "<reason>", // "none" | "style" | "language-adapt" | "light-edit" | "heavy-rewrite" | "missing-info" | "wrong-template" originalBodyPlain: patchedBodyPlain, // post-gap-patch plain text refinedBodyPlain: claudeRefinedBodyPlain, // Claude's rewrite (or same text if no improvement) })Refinement rules:
- Claude is the refinement actor — Claude rewrites the body;
draft_refineis the commit step only. Never invoke an external model from inside this skill. - If Claude judges the draft already strong, pass
refinedBodyPlain === originalBodyPlain—draft_refinewill returnrefinement_applied: false, refinement_source: 'none'. - If Claude rewrites:
refinement_applied: true, refinement_source: 'claude-cli'. - Hard rules — do NOT modify in refinement:
prepaymentcategory text (1st/2nd/3rd attempt, cancelled, successful templates)cancellationcategory text (non-refundable, no-show templates)- Never invent policy facts not present in
knowledge_summaries.
- If
quality.passed: falseafter refinement: inspectfailed_checks. If resolvable by a targeted patch, patch and calldraft_refineagain (max one retry). If still failing, escalate to the user withfailed_checkslisted and ask how to proceed. - Note:
refinement_source: 'codex'is reserved for future CLI-based LLMs; it is not an active path in this workflow.
- Claude is the refinement actor — Claude rewrites the body;
-
Mandatory delivery_status gate — always check before creating the Gmail draft.
draft_generatereturns adelivery_statusfield:"ready" | "needs_patch" | "blocked"."ready"— quality passed with no warnings: proceed togmail_create_draft."needs_patch"— quality passed but warnings exist (e.g. partial coverage): review warnings, apply any needed patches viadraft_refine, then proceed."blocked"— quality failed (quality.passed: false): inspectquality.failed_checks, patch and calldraft_refine(max one retry). If still"blocked", escalate to the user withfailed_checkslisted and ask how to proceed. Do not callgmail_create_draftwhiledelivery_status === "blocked". This is a hard gate, not advisory.partial_question_coveragewarnings after patching are acceptable to proceed if the escalation sentence has been inserted; note them in the session summary.
-
Present to user:
markdown## Email #1: Availability Inquiry **From:** Maria Santos <maria@example.com> **Subject:** Availability June 15-18? **Received:** 2 hours ago ### Content: > [Customer's email content] ### Classification: - **Scenario:** [from EmailActionPlan] - **Language:** [from EmailActionPlan] - **Agreement:** confirmed / likely / unclear / none - **Workflow triggers:** prepayment / terms_and_conditions / booking_monitor ### Relevant Knowledge: - [Knowledge sources used] ### Draft Response: --- [Generated draft] --- Actions: - "Create draft" - save to Gmail drafts - "Edit" - modify the response - "Regenerate" - try a different approach - "Skip" - don't respond - "Flag" - mark for manual handling
5. Handle User Actions
Create draft (for Inquiry/Reply/FAQ):
gmail_create_draft({
emailId: "original_email_id",
subject: "RE: Original Subject",
bodyPlain: "Plain text version",
bodyHtml: "HTML version with branding"
})
gmail_mark_processed({ emailId: "...", action: "drafted" })
Create draft (dry-run fallback queue):
Use this path when:
- MCP tools are unavailable in the current session, or
- user explicitly requests dry-run/no Gmail mutation.
Steps:
- Build JSON input payload with draft candidates (
emailId,to,subject,recipientName,bodyPlain). - Run:
bash
python3 scripts/ops/create-brikette-drafts.py \ --input <path-to-drafts.json> \ --dry-run \ --queue-file data/email-fallback-queue/<timestamp>-ops-inbox.jsonl - Report the queue file path and do not call
gmail_mark_processedin dry-run mode.
Edit request:
- User provides feedback: "Make it shorter", "More formal", etc.
- Regenerate draft incorporating feedback
- Show revised draft for approval
Acknowledge (for Informational emails - no draft needed):
gmail_mark_processed({ emailId: "...", action: "acknowledged" })
Use when customer provides info but no reply is needed:
- "We'll arrive at 3pm"
- "Thanks, see you tomorrow!"
- "Here's my passport info"
- Booking confirmations from customer
Promotional (for marketing/newsletters):
gmail_mark_processed({ emailId: "...", action: "promotional" })
Archives email and labels Brikette/Outcome/Promotional for batch review later.
Use for:
- OTA newsletters (Booking.com, Expedia marketing)
- Travel industry promotions
- Supplier marketing
- Service provider updates
When a promotional/spam false-positive appears in queue:
- Mark it
promotionalorspamimmediately. - Capture sender email/domain and subject pattern.
- Add the new exclusion pattern to
packages/mcp-server/src/tools/gmail.ts(NON_CUSTOMER_*constants) so future organize runs stop queueing it.
Skip (not relevant/not customer):
gmail_mark_processed({ emailId: "...", action: "skipped" })
Spam (suspicious/unwanted):
gmail_mark_processed({ emailId: "...", action: "spam" })
Defer (complex/needs more info):
gmail_mark_processed({ emailId: "...", action: "deferred" })
Moves it out of the active queue and labels it Brikette/Queue/Deferred for manual follow-up.
Agreement Detection (T&C workflow)
Agreement detection is high-stakes:
confirmedonly for explicit agreement phrases (EN/IT/ES).likelyorunclearrequires human confirmation before any payment workflow.- Always check
agreement.requires_human_confirmation.
If the email includes agreement and questions, treat as mixed response:
- Acknowledge agreement in the draft.
- Answer all questions.
- Keep the workflow state as awaiting confirmation if
likely/unclear.
Marking agreement_received — reservation code required:
When marking an email as agreement_received, you must extract the booking reservation code and pass it as reservationCode. This writes activity code 21 to Firebase for all occupants on that booking.
How to extract the reservation code:
- Check the email subject line — Octorate reservation numbers appear as
#XXXXXXor plain numbers in subject lines like "Booking confirmation #456789". - Check the email body and thread context — look for phrases like "reservation", "booking reference", "conferma prenotazione", "numero prenotazione", or a numeric/alphanumeric code near the hostel name.
- If the thread context includes a prior outgoing email from Brikette that mentions a booking reference, use that.
- If no reservation code can be found: log a warning, call
gmail_mark_processedwithoutreservationCode(labels will still be applied), and note in the session summary that the Firebase activity write was skipped.
// When agreement is confirmed and reservation code is found:
gmail_mark_processed({
emailId: "...",
action: "agreement_received",
reservationCode: "456789" // extracted from email thread
})
// When agreement is confirmed but no reservation code found:
gmail_mark_processed({
emailId: "...",
action: "agreement_received"
// No reservationCode — labels applied, Firebase write skipped
})
6. Processing Informational Emails
When an email is classified as Informational (customer providing info, no reply needed):
## Email #3: Customer Information
**From:** John Smith <john@example.com>
**Subject:** RE: Booking confirmation
**Received:** 1 hour ago
### Content:
> Thanks for confirming! Just to let you know, we'll be arriving
> around 3pm. See you then!
### Classification:
- **Type:** Informational (arrival time notification)
- **Action Needed:** Note arrival time
- **Draft Required:** No
### Extracted Information:
- **Arrival time:** 3pm (approximately)
- **Guest:** John Smith
### Suggested Action:
Note arrival time in booking system if applicable.
**Mark as acknowledged?** (y/n)
Common informational patterns:
- "We'll arrive at [time]" → Note arrival time
- "Thanks!" / "See you soon!" → No action needed
- "Here's my passport/ID" → Record in guest file
- "Dietary requirements: vegetarian" → Note for breakfast
- "We found it okay" → No action needed
6. Batch Processing
When user requests batch processing ("Process all FAQ emails"):
- Filter queue by type
- Generate drafts for all matching emails
- Show summary:
markdown
## Batch Processing: 4 FAQ Emails 1. "Check-in time question" -> Draft created 2. "Breakfast included?" -> Draft created 3. "Pet policy" -> Draft created 4. "Luggage storage" -> Draft created 4 drafts created. Review them in Gmail. Remaining in queue: 2 emails
7. Session Summary
When user says "Done" or queue is empty:
- Call
draft_signal_statsto retrieve event counts for this session. - Call
draft_template_reviewwithaction: "list"to get pending proposal count. - Call
gmail_audit_labelsto check the Brikette label namespace health.- If
orphaned.length > 0: include an Orphaned labels warning in the summary listing each orphaned label name. These are unrecognisedBrikette/*labels that should be reviewed or migrated. - If
orphaned.length === 0: omit the label health section entirely (silent pass). - If the call fails: omit the label health section — do not fail the session summary.
- If
- Output the summary block below.
## Session Complete
**Processed this session:**
- 3 drafts created
- 2 emails acknowledged (no reply needed)
- 1 promotional archived
- 1 email deferred
**Drafts ready for review:**
1. RE: Availability June 15-18? (maria@example.com)
2. RE: Check-in time question (guest@hotel.com)
3. RE: Breakfast options (traveler@email.com)
**Acknowledged (info noted):**
- Arrival time 3pm (john@example.com)
- Dietary: vegetarian (jane@example.com)
Remember to review and send drafts in Gmail!
**Deferred for manual review:** 1 email
**Signal health:**
- N selection events · N refinement events · N joined signals this session
- N template proposals pending review
- [one-line summary per pending proposal, e.g. "T05 check-in: wrong-template (2026-02-20)"]
> ⚠️ **Backlog warning:** >10 pending proposals — run `draft_template_review list` and review.
> _(Remove this line if ≤10 proposals pending.)_
> 💡 **Calibration prompt:** ≥20 joined signals since last calibration — consider running `draft_ranker_calibrate`.
> _(Remove this line if events_since_last_calibration < 20.)_
<!-- Include the following block only when gmail_audit_labels returns orphaned.length > 0: -->
> ⚠️ **Orphaned Gmail labels:** The following unrecognised `Brikette/*` labels exist in Gmail and should be reviewed or removed:
> - [list each orphaned label name on its own line]
Graceful fallback: If draft-signal-events.jsonl or template-proposals.jsonl are missing, show "0 events" / "0 proposals pending" — do not error. If gmail_audit_labels fails, omit the label health section.
NOTE: Dry-run and Python-fallback sessions produce no signal events. Show
"0 events"for those sessions.
Email Classification Guide
Use these patterns to correctly classify incoming emails:
Needs Draft Response
Inquiry - Customer asking a question:
- "Do you have availability for...?"
- "What are your rates for...?"
- "How do I get to...?"
- "Is breakfast included?"
- Questions about rooms, facilities, policies
Reply - Continuing a conversation that needs response:
- Follow-up questions in a thread
- Requests for clarification
- Additional questions after initial response
FAQ - Common questions with standard answers:
- Check-in/check-out times
- Parking availability
- Pet policy
- Age restrictions
- Cancellation policy
No Draft Needed
Informational - Customer providing info (acknowledge, no reply):
- "We'll arrive at [time]" → Note arrival
- "Thanks!" / "See you soon!" → No action
- "Here's my passport number" → Record
- "We're vegetarian" → Note dietary
- "Just to confirm, booking #123" → Verify
- "We found it okay, checking in now" → No action
- Positive feedback with no question
Promotional - Marketing (archive to Brikette/Outcome/Promotional):
- Booking.com partner newsletters
- Expedia promotions
- Travel industry news
- Supplier marketing
- "Special offer for partners"
- "New features available"
- Software/service provider updates
Not-Customer - Skip without reply:
- Wrong recipient
- Automated bounce/delivery failure
- Unsubscribe confirmations
- System notifications not relevant
Special Handling
Complex - Defer for careful handling:
- Complaints or negative feedback
- Refund requests
- Multiple unrelated questions
- Special requests (events, groups)
- Anything emotionally charged
- Legal or liability concerns
Spam - Mark as spam:
- Obvious phishing
- Unsolicited sales pitches
- Suspicious links
- "You've won" / lottery scams
Classification Decision Tree
Is it from a real person about Brikette?
├─ No → Is it promotional?
│ ├─ Yes → PROMOTIONAL
│ └─ No → Is it spam?
│ ├─ Yes → SPAM
│ └─ No → SKIP (not-customer)
└─ Yes → Does it contain a question or need a response?
├─ Yes → Is it a complaint or complex?
│ ├─ Yes → DEFER (complex)
│ └─ No → DRAFT (inquiry/faq/reply)
└─ No → Is it providing useful information?
├─ Yes → ACKNOWLEDGE (informational)
└─ No → ACKNOWLEDGE (no action needed)
Email Draft Guidelines
Tone
- Warm and professional
- Friendly but not overly casual
- Personal touch (use customer's name)
- Helpful and solution-oriented
Structure
- Greeting - "Dear [Name]" or "Hi [Name]"
- Thank them - For their interest/inquiry
- Answer their question(s) - Directly and specifically
- Provide additional helpful info - From knowledge base
- Call to action - Booking link when appropriate
- Closing - "Warm regards" / "Best wishes"
- Signature - Peter & Cristiana, Hostel Brikette
Common Scenarios
Availability inquiry:
- Cannot check real-time availability
- Direct to website booking system
- Mention room types that might suit their needs
- Emphasize direct booking benefits
Price question:
- Use menu pricing data accurately
- Clarify breakfast inclusion policy
- Mention direct booking discounts
Directions/Location:
- Provide standard directions
- Link to relevant guides
- Mention luggage storage
Policy questions:
- Use FAQ data accurately
- Be specific about times and rules
- Offer flexibility where possible
Complaints:
- Acknowledge their frustration
- Apologize appropriately
- Offer solution or escalation
- Flag for Pete's careful review
Error Handling
Gmail API Error
## Gmail API Error
Unable to fetch emails: [Error message]
Options:
1. "Retry" - try again
2. "Done" - end session and try later
Cannot Generate Good Response
## Draft Generation Issue
I'm having trouble with this email because:
- [Reason]
Options:
1. "Flag for manual" - you'll handle this directly
2. "Use template" - generic acknowledgment response
3. "Give context" - tell me more to help
Session Interruption
When user needs to stop:
- Summarize progress
- Note queue position
- Remind about pending drafts
Quality Checks
Before creating each draft, verify:
- Addresses customer's specific question(s)
- Information is accurate (from knowledge base)
- Tone is appropriate
- Call-to-action included (if appropriate)
- No placeholder text remains
- Signature included
References
- User guide:
docs/guides/brikette-email-workflow.md - Workflow design:
docs/plans/email-autodraft-workflow-design.md - Card:
docs/business-os/cards/BRIK-ENG-0020.user.md
MCP Resources Available
| URI | Content |
|---|---|
brikette://faq |
29 FAQ items |
brikette://rooms |
Room details and config |
brikette://pricing/menu |
Bar and breakfast prices |
brikette://policies |
Check-in, age restrictions, etc. |
brikette://draft-guide |
Draft quality framework |
brikette://voice-examples |
Voice/tone examples |
brikette://email-examples |
Classification examples |
MCP Signal & Improvement Tools
| Tool | Action/Params | Purpose |
|---|---|---|
draft_signal_stats |
(none) | Returns {selection_count, refinement_count, joined_count, events_since_last_calibration} — used in Session Summary |
draft_template_review |
action: "list" |
Lists pending template improvement proposals with one-line summaries |
draft_template_review |
action: "approve", proposal_id, expected_file_hash |
Approves a proposal and writes to email-templates.json (optimistic concurrency) |
draft_template_review |
action: "reject", proposal_id |
Rejects and archives a proposal |
draft_ranker_calibrate |
dry_run?: boolean |
Computes and persists ranker priors from ≥20 joined events; use when events_since_last_calibration ≥ 20 |
Email Templates
Pre-written templates are available in packages/mcp-server/data/email-templates.json for common response scenarios. Use these as a starting point and personalize for each customer.
Template Categories
| Category | Templates | Use For |
|---|---|---|
| check-in | Arriving before check-in, Arrival Time, Out of hours | Check-in timing questions |
| access | Inner/Outer Building Main Door | Door code and access questions |
| transportation | Transportation to Hostel | How to get here questions |
| payment | Change Credit Card Details | Payment method updates |
| prepayment | 1st/2nd/3rd Attempt, Cancelled, Successful | Payment processing status |
| cancellation | Non-Refundable Booking, No Show | Cancellation requests |
| policies | Alcohol, Age Restriction | Policy explanations |
| activities | Path of the Gods Hike | Activity recommendations |
| booking-issues | Why cancelled | Booking troubleshooting |
Prepayment Workflow
When handling prepayment chase emails, apply these mappings:
- Step 1: Use the 1st attempt template (Octorate vs Hostelworld variant based on booking source). Log activity code 2.
- Step 2: Use the 2nd attempt template. Log activity code 3.
- Step 3: Use the cancelled-after-3rd-attempt template. Log activity code 4.
- Success: Use the prepayment successful template. Log activity code 21.
When updating Gmail labels, use gmail_mark_processed with:
prepayment_chase_1, prepayment_chase_2, or prepayment_chase_3.
T&C Agreement Workflow
When an incoming email is a T&C agreement reply:
- Sending the T&C request (outgoing): Mark with
action: "awaiting_agreement". - Receiving agreement confirmation (incoming): Mark with
action: "agreement_received"and passreservationCode(see Agreement Detection section above). This triggers Firebase activity code 21 write for all occupants — required to prevent the booking from being auto-cancelled despite the guest having agreed.
Using Templates
When drafting a response:
- Match the scenario - Find a template matching the customer's question
- Load the template - Reference the category and subject
- Personalize - Replace placeholders, add guest name, adjust tone
- Add specifics - Include relevant details from their booking/question
- Validate - Ensure accuracy before creating draft
Templates provide consistent messaging for common scenarios while maintaining the professional, warm tone expected by guests.
Recommended Agent Skills
Expand your agent's capabilities with these related and highly-rated skills.
agent-ops-spec
Manage specification documents in .agent/specs/. Use when user provides requirements, acceptance criteria, or feature descriptions that need to be tracked and validated against implementation.
agent-ops-state
Maintain .agent state files. Use at session start, after meaningful steps, and before concluding: read/update constitution/memory/focus/issues/baseline consistently.
agent-ops-spec
Manage specification documents in .agent/specs/. Use when user provides requirements, acceptance criteria, or feature descriptions that need to be tracked and validated against implementation.
agent-ops-testing
Test strategy, execution, and coverage analysis. Use when designing tests, running test suites, or analyzing test results beyond baseline checks.
agent-ops-testing
Test strategy, execution, and coverage analysis. Use when designing tests, running test suites, or analyzing test results beyond baseline checks.
agent-ops-state
Maintain .agent state files. Use at session start, after meaningful steps, and before concluding: read/update constitution/memory/focus/issues/baseline consistently.
Didn't find tool you were looking for?