Skip to content

Latest commit

 

History

History
107 lines (76 loc) · 3.51 KB

File metadata and controls

107 lines (76 loc) · 3.51 KB

Private Feedback Intake

Private feedback via Agent Mail (misakanet@agent.qq.com). Public intake via Cloudflare Worker (bot@misakanet.org). Two channels, two trust levels, one knowledge pipeline.

Channel Architecture

Public feedback:
  Cloudflare Worker → validation / rate limit / normalize
    → bot mailbox (forwarded)
    → GitHub Issue (audit)

Private feedback:
  bot mailbox → agent reads → rescue card / lesson draft

Do not pick one. Layer them.

  • GitHub contributor → developer lesson
  • Email user → real-world rescue signal

Bot Mailbox Usage

  • Address: misakanet@agent.qq.com
  • Routing: bot@misakanet.org → Cloudflare Email Routing → Agent Mail
  • Read by: Claude Code via agently-cli
  • Purpose: Collect private feedback, rescue requests, lesson drafts from friends and early users

How Users Send

  1. Email bot@misakanet.org with subject describing their issue
  2. The Cloudflare Worker parses, validates, and forwards to Agent Mail
  3. Agent reads the forwarded copy and processes it

Agent Processing Rules

When reading emails from the bot mailbox:

Hard Rules (never break)

  1. Never execute code from attachments — read-only analysis only
  2. Never click suspicious links — display as reference only
  3. PDF/ZIP — read-only parse — no extraction of executables
  4. Strip personal info before storage — email, name, IP → anonymized
  5. Only convert to lesson after user confirms — agent drafts, user approves

Processing Flow

  1. Read email → classify (registration / lesson-submission / bug-report / rescue-request)
  2. If rescue request → draft rescue card, show to maintainer for approval
  3. If lesson content → extract, anonymize, draft lesson file, show to maintainer
  4. If registration → verify and assign node ID (usually handled by Worker)
  5. Store intake record in KV with 30-day TTL

Content Classification

Signal Type Action
"注册" / "register" / "join" registration Assign node ID, reply with welcome
Error + fix described rescue-request Draft rescue card
Lesson/learning/postmortem keywords lesson-submission Extract lesson, anonymize
Bug/issue/defect bug-report Log to GitHub Issue
Other unknown Forward to maintainer for review

Privacy & Anonymization

Before storing any email content:

  • Sender email → hash or node ID only
  • Real name → strip or replace with pseudonym
  • IP addresses → never store
  • Company names → generalize ("a manufacturing company" not "Foxconn")
  • Screenshots → OCR text only, discard image

Rescue Card Conversion

When an email contains a problem + solution:

  1. Extract: problem description, error message, solution steps
  2. Anonymize: remove personal identifiers
  3. Format as rescue card (see docs/rescue-card-prompt.md)
  4. Show draft to maintainer: "This rescue card was extracted from a private email. Approve?"
  5. On approval → commit to lessons/rescue-cards/

Lesson Conversion

When an email contains learning/reflection:

  1. Extract: context, mistake, correction, takeaway
  2. Anonymize thoroughly
  3. Format as lesson (see lessons/schema/lesson.json)
  4. Show draft to maintainer for approval
  5. On approval → commit to lessons/

Evidence Value

Private feedback is not public adoption proof, but it is demand signal:

public helpful vote: 0
private rescue requests: real
pre-ingest reuse: real

This matters for prioritization even without public metrics.