HappyToHelp

Contract

What HappyToHelp is being built to do

Every clause of the product HappyToHelp is building toward, and how much of it the code does today. Judged from the code and tests, not from plans.

34 of 74 clauses done

  • 34 done
  • 29 partial
  • 11 missing

Judged at commit 82de9ed ·

How statuses are judged

Published clauses

20 done · 2 partial · 0 missing

of 22

Target and push further

14 done · 27 partial · 11 missing

of 52

Product target

Category
Customer service help desks and AI support agents
Replaces
Zendesk, Intercom (with Fin), Help Scout, Freshdesk (agent baseline: Decagon, Sierra, Pylon)
First buyer
A US SMB support lead, costs in USD, moving a Zendesk, Intercom, Help Scout or Freshdesk help desk

Progress by area

3 areas

Published · 1 area

Target and push further · 2 areas

All clauses

ClauseTitleStatusEvidence or gap
Retained product and operating guarantees 20 done · 2 partial · 0 missing
NATIVE-001publishedNative owner installationPartialscripts/installer/local.mjsscripts/installer/durable-objects.mjstests/journeys/installer-nightly.mjstests/helpers/installer/readme-restore.mjstests/helpers/installer/fresh-install.mjsGap: With Cloudflare credentials rer deploy --dry-run reads the target's Workers subdomain, settings and secret names (three GET requests, tests/helpers/installer/fresh-install.mjs), and without them it refuses, so "Deployment dry-run makes no provider requests" does not hold. Local install, setup, dev, reset, export/import and restore are exercised; remote provisioning is qualified separately.
IDENTITY-002publishedRetained native password identity (owner decision 2026-10-08)Donesrc/modules/identity/routes.tstests/journeys/identity.mjs
IDENTITY-001publishedScoped authorityDonesrc/modules/management/policy.tstests/journeys/identity.mjstests/journeys/runtime.mjs
FIRST-RUN-001publishedA useful first workspaceDonesrc/modules/management/provisioning/index.tstests/journeys/first-run.mjs
LOCAL-MAIL-001publishedRer dev mailDonesrc/modules/integrations/email.tstests/journeys/first-run.mjs
CONVERSATION-001publishedDurable transcriptDonesrc/modules/conversations/admission.tstests/journeys/runtime.mjstests/journeys/erasure.mjs
DELIVERY-001publishedLive delivery and recoveryDonesrc/modules/conversations/socket.tstests/journeys/widget.mjstests/journeys/first-run.mjs
UI-001publishedExisting editable experienceDonesrc/ui/dashboardsrc/modules/widgettests/journeys/inbox-browser.mjs
MOVE-IN-001publishedReviewed history importDonesrc/modules/move-in/plan.tstests/journeys/move-in-capacity.mjstests/journeys/move-in-browser.mjstests/move-in/native-corrections.mjs
OUTCOMES-001publishedResolution feedback and provenanceDonesrc/modules/outcomes/rating.tssrc/modules/outcomes/operator-feedback.tstests/reports/ratings.mjstests/reports/outcomes.mjs
REPORTS-001publishedWorkspace calendar reportsDonesrc/modules/reports/routes.tssrc/modules/reports/metrics.tstests/reports/figures.mjstests/journeys/reports.mjs
CONNECTIONS-001publishedWorkspace integrationsDonesrc/modules/api-integrationstests/connections/api.mjstests/connections/delivery.mjstests/connections/slack.mjs
ACTIVATION-001publishedObserved owner setupDonesrc/modules/management/activationtests/journeys/first-run.mjs
AI-001publishedConfigured model executionDonesrc/modules/ai-support/service.tstests/journeys/first-run.mjs
KNOWLEDGE-001publishedPublished knowledgeDonesrc/modules/knowledge/authoring.tssrc/modules/public-site/help-center.tsxtests/journeys/knowledge.mjstests/journeys/public.mjs
CONTEXT-001publishedAttributed customer contextDonesrc/modules/customer-contexttests/journeys/context.mjs
DELEGATION-001publishedExplicit local authorityDonesrc/modules/local-computer/results.tssrc/edition/delegation/routes.tstests/journeys/delegation.mjs
TRAINING-001publishedDurable evaluationDonesrc/modules/training-runs/runner.tssrc/edition/ai/training.tstests/journeys/ai.mjs
INTEGRATION-001publishedHonest external effectsPartialsrc/modules/integrations/inbound.tssrc/modules/integrations/github.tstests/journeys/email.mjstests/journeys/knowledge.mjsGap: Existing mail/GitHub adapters work at test boundaries; the newly required business connectors are missing.
PUBLIC-001publishedPublic product sourceDonesrc/ui/homepagetests/homepage-browser.mjstests/journeys/public.mjs
MIGRATION-001publishedPrior-data custodyDonesrc/modules/legacy-importtests/journeys/erasure.mjstests/journeys/move-in-admission.mjs
SOURCE-001publishedAuthor-owned capability graphDonescripts/edition-authoring/cli.mjs
Complete support operations 14 done · 26 partial · 8 missing
DESK-001targetThe shared support deskDonesrc/modules/management/dashboard.tssrc/modules/management/inbox-search.tssrc/modules/ticketstests/journeys/first-run.mjstests/journeys/inbox.mjstests/journeys/reports.mjstests/journeys/delegation-browser.mjs
WIDGET-001targetAvailability-aware messenger and proactive messagesPartialsrc/modules/management/availability.tssrc/modules/management/away-reply.tssrc/modules/widget/js/AwayNotice.jsxsrc/modules/widget/js/collection/Hesitation.jsxtests/journeys/widget-browser.mjstests/journeys/widget.mjsGap: Outside the schedule's hours or with new conversations off, the installed widget says the team is away, shows when it is back in the visitor's time, asks for an email before the first message and posts the workspace's away message once per conversation (never emailed, no AI reply, not counted in response times); an assistant answering the conversation keeps answering. Workflow rules still treat that away message as a teammate's reply, and an assistant-only resolution after it is recorded as unknown. Behavior-based hesitation detection exists. Live agent presence, configurable proactive messages with caps and quiet hours, and their reporting do not.
MAIL-001targetComplete support emailPartialsrc/modules/integrations/mailboxes/src/modules/integrations/email-threading.tstests/helpers/email/mailbox-provider.mjstests/helpers/email/complete-email.mjstests/helpers/email/transports.mjsdocs/email.mdGap: Forwarding, Gmail and Microsoft 365 OAuth connections, aliases, branded sender, signatures, CC/BCC, header/token threading and cursor/reconnect/backfill/disconnect controls are exercised at the provider edge (tests/journeys/email.mjs). The IMAP/SMTP mailbox (src/modules/integrations/mailboxes/socket.ts) has no journey or fake TLS edge, so its connection, sync and send are unverified. Live paid provider accounts and production cutover are not qualified.
MAIL-002targetReviewable suspended and spam mailDonesrc/modules/integrations/suspended.tssrc/modules/integrations/suspended-store.tssrc/modules/integrations/suspended-recovery.tstests/helpers/email/complete-email.mjsdocs/email.md
OUTBOUND-001targetAgent-created and proactive ticketsPartialsrc/modules/management/outbound-tickets.tssrc/modules/management/outbound-ticket-input.tssrc/modules/management/outbound-ticket-store.tstests/helpers/email/complete-email.mjstests/helpers/email/mailbox-provider.mjsdocs/email.mdGap: R6 individual email and call creation complete: requester/operator submitter attribution, mailbox and authorized sender, immutable CC/BCC, private call notes and durable send identity/outcomes. Provider-edge journeys inspect sent copies; R6's rer dev browser check of both creation paths has no repository journey and was not repeated for this review. Multi-requester proactive notices, remaining ticket configuration and consented SMS/WhatsApp templates remain outside this round.
CHANNELS-001targetMessaging and social supportMissingGap: No implementation located. No SMS/Meta support channel implementation located.
CHANNELS-002targetB2B shared-channel supportMissingGap: src/modules/api-integrations/dispatch.ts; tests/connections/slack.mjs; src/modules/escalations/actions.ts. Slack receives new-conversation notifications and outbound engineering handoff posts only, which this clause excludes; customer intake, bidirectional Slack Connect and Teams are absent.
VOICE-001targetTelephone service and unified voice agentMissingGap: No implementation located. No voice routing/agent or Aircall connector implementation located.
QUEUE-001targetAssignment rules and available teamsDonesrc/modules/workflows/routing.tssrc/modules/workflows/routing-candidates.tssrc/ui/native/pages/workflows/RoutingSettings.jsxtests/helpers/workflows/routing.mjs
TRIAGE-001targetIntelligent triageDonesrc/modules/triage/src/modules/workflows/routing-triage.tstests/helpers/ai/triage.mjstests/helpers/ai/triage-browser.mjsdocs/triage.md
QUEUE-002targetStructured and bulk queue workDonesrc/modules/ticketstests/journeys/inbox.mjstests/helpers/inbox/ticket-queue.mjstests/helpers/inbox/ticket-queue-capabilities.mjstests/helpers/inbox/tickets-browser.mjs
QUEUE-003targetCollaboration without conflicting repliesDonesrc/modules/collaborationsrc/modules/conversations/socket.tssrc/modules/ticketssrc/ui/dashboard/components/collaborationtests/journeys/inbox.mjstests/journeys/first-run.mjs
MACRO-001targetAction macros with placeholdersDonesrc/modules/macrossrc/ui/native/pages/macrossrc/ui/dashboard/components/macrostests/helpers/r4/macros.mjstests/journeys/inbox.mjs
QUEUE-004targetSnooze and scheduled follow-upDonesrc/modules/workflows/schedules.tssrc/modules/workflows/routes-schedules.tssrc/ui/dashboard/components/workflows/WorkflowPanel.jsxtests/helpers/workflows/schedules.mjs
STATUS-001targetTicket status lifecycleDonesrc/modules/ticketssrc/modules/workflows/followups.tssrc/modules/workflows/rule-time.tstests/helpers/inbox/ticket-lifecycle.mjstests/helpers/inbox/ticket-api-privacy.mjstests/helpers/workflows/rules.mjs
SLA-001targetBusiness-hour service commitmentsPartialsrc/modules/workflows/calendars-time.tssrc/modules/workflows/sla.tssrc/modules/workflows/sla-alerts.tstests/helpers/workflows/sla.mjsGap: R5 calendars, first/next/resolution clocks, queue due times, pauses and durable acknowledged alerts are implemented. Rule and SLA notices use R4’s proven-address delivery claims; Slack/Teams per-user notices belong to R11.
AUTOMATION-001targetExplainable durable support workflowsPartialsrc/modules/workflows/rule-admin.tssrc/modules/workflows/rule-engine.tssrc/modules/workflows/rule-preview.tstests/helpers/workflows/rules.mjsGap: R5 ordered/versioned event rules, sandbox, publishing, pause/cancel and durable loop-safe execution are implemented. Notify actions use R4’s proven-address delivery claims, with explicit terminal delivery outcomes. Signed-webhook actions are not part of the R5 build-row end state. "Operator replied" rules also run on the workspace's system away reply, which migrations/150_workflow_journal.sql journals as an operator reply.
AUTOMATION-002targetTime-based automationsPartialsrc/modules/workflows/rule-time.tssrc/modules/workflows/rule-engine.tssrc/jobs.tstests/journeys/inbox.mjstests/helpers/workflows/rules.mjsGap: Hourly durable time automations, the 48/96 business-hour templates, the seeded four-day close, restart-safe cursors, customer-reply reset, unsafe-repeat refusal and automation actors pass their journeys. The last-agent-update time (src/modules/workflows/time-rules.ts, src/modules/workflows/rule-model.ts) counts the workspace's system away reply, so agent-update automations act on tickets no teammate answered.
NOTIFY-001targetCustomer acknowledgments and teammate notificationsPartialsrc/modules/integrations/triggers.tssrc/modules/integrations/triggerssrc/modules/integrations/notification-teammates.tssrc/modules/integrations/operator-notifications.tstests/journeys/email.mjstests/journeys/inbox.mjsGap: R4 supplies editable requester/CC received and solved notices, inbox/email teammate notices, personal preferences, frozen delivery claims and the workflow notification interface. Push and per-user Slack/Teams remain R11.
CONVERSATION-002targetMerge and external forwardingDonesrc/modules/conversation-actionssrc/ui/dashboard/components/conversation-actionstests/helpers/r4/conversation-actions.mjstests/journeys/inbox.mjs
CONVERSATION-003targetProblem and incident linkingPartialsrc/modules/tickets/problem-routes.tssrc/modules/tickets/problem-execute.tstests/helpers/inbox/problems.mjsdocs/tickets.mdGap: R10a: problem marking, single and bulk incident links, per-requester placeholder previews, email/widget updates and solve, per-ticket failures, history/audit, erasure and safe restore. Triage suggestions, engineering issue links and later channel transports remain later rounds.
CUSTOMER-001targetCustomer and company support recordsPartialsrc/modules/customerssrc/modules/import-kit/csvsrc/ui/native/pages/Companies.jsxtests/helpers/company-records.mjstests/helpers/customer-csv.mjstests/journeys/inbox.mjsGap: Company records, typed attributes, domains, members, all account tickets, company inbox filtering, previewed reversible merge with provenance, and mapped CSV preview/apply/undo are implemented. Imports send nothing; new records participate in erasure, audit and portable storage. Full cross-channel identity governance and live connector context remain incomplete.
COMMERCE-001targetShopify order actionsMissingGap: No implementation located. No Shopify order/refund connector implementation located.
BILLING-001targetStripe billing and subscription resolutionMissingGap: No implementation located. No active Stripe billing/subscription action connector located; legacy financial imports confer no action authority.
CRM-001targetLive CRM and account contextMissingGap: No implementation located. No Orbit, HubSpot or Salesforce connector implementation located.
ESCALATION-001targetEngineering and team escalations that returnPartialsrc/modules/escalationstests/journeys/connections.mjstests/journeys/connections-browser.mjstests/helpers/escalations/dev-proof.mjsGap: Teams belongs to R11; live provider accounts remain unqualified.
API-001targetOwned API and managed connectorsPartialsrc/modules/api-integrationslocal-agent/lib/mcp.mjssrc/modules/move-in/plan.tstests/connections/api.mjstests/connections/delivery.mjsGap: Native API/webhooks, Help Scout export import and connector MCP transport exist; managed catalog, Zapier and continuous Help Scout synchronization do not.
MOVE-IN-002targetSwitch from every named incumbentPartialsrc/modules/move-in/plan.tssrc/modules/move-in/readers/normalise.tstests/journeys/move-in-capacity.mjstests/move-in/helpscout-security.mjstests/move-in/door-readers.mjstests/journeys/move-in-browser.mjsGap: Reviewed Zendesk, Help Scout, Freshdesk and Intercom history import exists (tests/journeys/move-in-admission.mjs); attachment bytes, one-click API connection, final delta cutover, channel repoint, companies and custom fields, activated ownership and configuration move-in are incomplete.
MOVE-IN-003targetReplies to pre-migration mail land in the imported ticketPartialsrc/modules/move-in/email-threading.tssrc/modules/integrations/email-threading.tssrc/modules/integrations/email-threading-keys.tstests/helpers/email/complete-email.mjsdocs/email.mdGap: R6 vendor scope complete: inert imported message/header, subject-token and reply-address keys for Zendesk, Freshdesk, Help Scout and Intercom. Public upload/review/apply and inbound journeys match all four vendors and hold wrong-customer replies. Header proposals preserve sender-authority gates; Closed remains final with a linked follow-up. Live cutover, broader legacy acceptance and unmatched-migration hints remain unqualified.
MOVE-IN-004targetBring configuration, not only historyPartialsrc/modules/move-in/plan.tstests/journeys/move-in-browser.mjsGap: Saved replies and tags move in today; macro actions, views, groups, schedules, SLA policies, forms, triggers and automations do not.
PORTAL-001targetAuthenticated customer self-serviceDonesrc/modules/portalsrc/modules/public-site/portal-pages.tssrc/modules/customerstests/helpers/customer-portal-journey.mjstests/helpers/company-portal.mjstests/journeys/knowledge.mjs
FORMS-001targetCustomer request forms with custom fieldsPartialsrc/modules/forms/settings.tssrc/modules/forms/definition.tssrc/modules/forms/validation.tssrc/modules/forms/challenge.tssrc/modules/forms/submit.tssrc/ui/native/pages/request-forms/RequestFormsSettings.jsxtests/helpers/request-forms-journey.mjstests/helpers/self-service-fixture.mjstests/journeys/knowledge.mjsGap: Published forms reuse typed ticket fields with required/conditional questions, translated labels, server validation, email-verified customer identity and fail-closed Turnstile checks for anonymous submissions. Verified customer sessions submit without Turnstile. Order/account lookup fields and explicit version-history management remain incomplete; live Turnstile and mail delivery are not established.
KNOWLEDGE-002targetGoverned private and multilingual knowledgePartialsrc/modules/knowledge/access.tssrc/modules/knowledge/experience.tssrc/modules/knowledge/experience-routes.tssrc/modules/knowledge/help-auth.tssrc/modules/knowledge/public-sources.tssrc/modules/public-site/help-center.tsxtests/journeys/knowledge.mjsGap: Public and signed-in/email-domain collections, reviewed translations, article history/restore and slug redirects are implemented. The assistant answers from public-audience articles only, so restricted knowledge never reaches an answer. Per-brand domain publishing and agent-proposed cited changes are absent.
KNOWLEDGE-003targetBranded help center, article feedback and knowledge in the ticketPartialsrc/modules/knowledge/feedback.tssrc/modules/knowledge/analytics-routes.tssrc/ui/native/pages/knowledge/KnowledgeExperience.jsxsrc/ui/dashboard/components/ArticlePicker.jsxsrc/modules/public-site/help-center.tsxsrc/modules/public-site/request-pages.tstests/journeys/knowledge.mjstests/journeys/public.mjsGap: Plain-text page templates (home, category, section, article, search and request form), article votes/comments, locale/brand activity analytics and recipient-scoped article insertion are implemented; no journey exercises the request-form template. Per-brand custom domains and ticket-after-reading attribution remain deferred.
BRANDS-001targetMulti-brand support operationsPartialsrc/modules/management/projects.tstests/journeys/inbox.mjsGap: Separate workspaces exist; unified multi-brand governance and routing are absent.
ACCESS-001targetEnterprise identity and custom permissionsPartialsrc/modules/access/src/platform/auth.tssrc/modules/integrations/inbound-authority.tssrc/edition/delegation/common.tssrc/modules/tickets/model.tstests/journeys/identity.mjstests/helpers/inbox/ticket-lifecycle.mjsGap: Native owner/admin/agent, the collaborator role (notes and follow only) and restricted custom roles exist, with refusals audited and owner recovery retained. Connected-application grants are held to the approving member's current role, so narrowing a role narrows its grants at once. Ticket fields carry read and write roles, including custom roles. SSO (SAML/OIDC), SCIM, and brand and team permissions are absent.
IDENTITY-003targetTwo-factor authentication for native accountsDonesrc/modules/identity/two-factor/src/platform/auth.tssrc/edition/delegation/consent.tstests/journeys/identity.mjstests/journeys/identity-browser.mjstests/journeys/delegation-browser.mjs
MOBILE-001targetSupport from a phonePartialsrc/ui/dashboardsrc/modules/widgettests/journeys/inbox-browser.mjstests/journeys/reports-browser.mjsGap: Responsive web journeys exist; native apps, mobile push and protected offline work are absent.
OUTCOMES-002targetCSAT across support channelsPartialsrc/modules/outcomes/survey-routes.tssrc/modules/outcomes/survey-delivery.tssrc/modules/outcomes/survey-store.tssrc/modules/reports/surveys.tssrc/modules/portal/requests.tssrc/modules/portal/preferences.tssrc/ui/native/pages/surveys/SurveyPanel.jsxtests/helpers/csat-journey.mjstests/helpers/customer-portal-journey.mjstests/helpers/self-service-fixture.mjstests/journeys/knowledge.mjstests/reports/ratings.mjsGap: Email surveys, expiring single-use signed links, opt-out, low-score results and cycle history coexist with widget ratings. The portal exposes the same eligible unused signed link and opt-out, without minting another invitation. Other messaging-channel surveys remain incomplete.
REPORTS-002targetWorkload, service and agent outcomesPartialsrc/modules/reports/team-routes.tssrc/modules/reports/schedule-dispatch.tssrc/modules/reports/timers.tstests/reports/team-journey.mjsdocs/reports.mdGap: R10a: complete current agent/team/channel/brand/tag workload and backlog, persisted R5 SLA compliance, reopen rate, adjustable ticket timers (a member's own Stop ends only their timer; removal or loss of ticket access ends theirs; a lead ends a teammate's only by naming it, recorded as the lead's in history and audit) and handle time by agent/form/visible intent, timezone/date/team/brand/import filters, complete CSV and permission-scoped daily/weekly mail. Existing response/outcome/CSAT reports retained. Account and procedure-version dimensions await their owning rounds.
AGENT-001targetA production support agent with clean handoffPartialsrc/modules/ai-support/service.tssrc/modules/knowledgesrc/edition/delegation/routes.tstests/journeys/first-run.mjstests/journeys/delegation.mjsGap: Configured AI and scoped local handoff exist; full multichannel, business-action and production-quality coverage is incomplete.
PROCEDURE-001targetNatural-language procedures and release simulationPartialsrc/modules/training-runs/runner.tssrc/edition/ai/training.tssrc/modules/management/resources.tstests/journeys/ai.mjsGap: Assistant instructions and durable evaluations exist; versioned procedures, their sandbox simulation and controlled rollout do not (the AUTOMATION-001 rule sandbox does not run procedures).
AGENT-002targetInspectable quality and resolution economicsPartialsrc/edition/ai/training-trace.tssrc/modules/local-computer/results.tssrc/modules/reports/routes.tstests/reports/figures.mjstests/journeys/first-run.mjsGap: Provider-round traces, training details and aggregate reports exist; full production tool/procedure exploration is incomplete.
FEEDBACK-001targetSource-linked feedback and release follow-upMissingGap: No implementation located. No Penny/Vector feedback and shipped-feature support follow-up implementation located.
ERASURE-001targetCustomer erasure with coherent historyDonesrc/modules/management/contact-erasure.tssrc/modules/management/contact-erasure/providers.tstests/journeys/erasure.mjstests/journeys/erasure-browser.mjs
AUDIT-001targetSecurity and accountable actionsDonesrc/modules/audit/migrations/180_account_security.sqltests/journeys/identity.mjstests/journeys/erasure.mjstests/journeys/identity-browser.mjs
PORTABILITY-001targetComplete customer-owned portable support dataPartialscripts/installer/local.mjsscripts/installer/durable-objects.mjsscripts/installer/portability-policy.mjsscripts/installer/migration-ledger.mjsscripts/export-d1.mjstests/journeys/installer-nightly.mjstests/journeys/restore.mjstests/helpers/platform-archive.mjstests/journeys/erasure.mjsGap: Local rer export and rer import carry D1, R2 and Durable Object storage with schema and digest and restore inertly into a clean installation. A Platform-applied installation (rer_migrations ledger) exports, its archive restores into Platform and native destinations, and incomplete, multiple or mismatched migration ledgers refuse before any write (tests/helpers/platform-archive.mjs; released in v0.4.12). A hosted installation cannot produce that archive: rer export --target remote refuses, and only the SQL and R2 backup procedure (scripts/export-d1.mjs) exists. Base-data equivalence remains held.
ASSURANCE-001targetQualified regulated support deploymentsMissingGap: No implementation located. No regulated-deployment agreement/control qualification flow or compliance acceptance located.
Push further: accountable agents 0 done · 1 partial · 3 missing
PUSH-001push furtherReproduce, repair and prove customer recoveryPartialsrc/modules/local-computer/results.tssrc/edition/delegation/routes.tstests/journeys/delegation.mjstests/helpers/delegation-journey/case.mjsGap: Approved local repair, independent readback and human Send exist with an edge fixture; sustained customer recovery verification/reopening is incomplete.
PUSH-002push furtherPromises survive every handoffMissingGap: No implementation located: obligation records with owner and due time, reminders and follow-up drafts are absent (durable messages and notes in src/modules/conversations/admission.ts are not obligations).
PUSH-003push furtherLearn from reopenings under human controlMissingGap: No implementation located: version-joined diagnosis of reopened cases, proposals and controlled rollout are absent (evaluation runs in src/modules/training-runs/runner.ts are generic).
PUSH-004push furtherTurn verified edge cases into reviewed knowledgeMissingGap: No implementation located: gap clustering from unanswered cases, sourced draft articles and recovery measurement are absent (article authoring in src/modules/knowledge/authoring.ts is manual).

How statuses are judged

Done
It ships in the default install, and a cited test or journey exercises it.
Partial
Some of it ships, it ships only behind an opt-in, or there is code with no requirement-level test.
Missing
There is no implementation.

Read CONTRACT.md on GitHub