forgetrail 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CONTINUATION_PROMPT.md +42 -0
- package/INITIAL_PROMPT.md +214 -0
- package/LICENSE +201 -0
- package/README.md +198 -0
- package/TRACKING_SCHEMA.md +162 -0
- package/TRY_FORGETRAIL.md +78 -0
- package/WORKFLOW.md +921 -0
- package/content/AGENT_INTEGRATION_claude.md +38 -0
- package/content/AGENT_INTEGRATION_cursor.md +53 -0
- package/content/AGENT_INTEGRATION_generic.md +50 -0
- package/content/AGENT_INTEGRATION_grok.md +82 -0
- package/content/DEV_AUTOMATION_SCRIPTS.md +103 -0
- package/content/FORGETRAIL_LITE.md +1202 -0
- package/content/FORGETRAIL_LITE_UPDATES.md +13 -0
- package/content/FORGETRAIL_PROGRESS.md +26 -0
- package/content/GENESIS_SPEC_PROMPT.md +70 -0
- package/content/GENESIS_STUB.md +18 -0
- package/content/GREENFIELD_INTAKE.md +76 -0
- package/content/KICKOFF_WITHOUT_MCP.md +16 -0
- package/content/LITE_WORKFLOW_TRACKING.json +42 -0
- package/content/NEW_PROJECT_BOOTSTRAP.md +180 -0
- package/content/ONE_CLICK_DEV_SETUP.md +142 -0
- package/content/PLAN_MODE_PATTERNS.md +43 -0
- package/content/POCKETBASE_SCHEMA_SCRIPT.md +52 -0
- package/content/POST_BOOTSTRAP_USER_MESSAGE.md +51 -0
- package/content/SCAFFOLD_INSTALL.json +110 -0
- package/content/SESSION_RESUME_MCP.md +35 -0
- package/content/SYSTEM_HEALTH_CHECKS.md +131 -0
- package/content/USER_REPLY_FORMAT.md +41 -0
- package/content/cursor-rules/forgetrail-lessons-gate.mdc +30 -0
- package/content/cursor-rules/forgetrail-lessons-mcp.mdc +24 -0
- package/content/cursor-rules/forgetrail-no-trailer.mdc +49 -0
- package/content/cursor-rules/forgetrail-phase-status.mdc +61 -0
- package/content/cursor-rules/forgetrail-updates-log.mdc +30 -0
- package/content/cursor-rules/spec-completion.mdc +33 -0
- package/content/cursor-rules/specs-and-todo.mdc +26 -0
- package/content/cursor-rules/url-host-matching.mdc +31 -0
- package/content/cursor-rules/us-english.mdc +9 -0
- package/content/cursor-rules/user-facing-content.mdc +31 -0
- package/content/examples/GENESIS_SAMPLE_mars-habitat-roster.md +154 -0
- package/content/forgetrail-workspace-README.md +43 -0
- package/content/scripts/forgetrail-dev-launcher.mjs +208 -0
- package/content/scripts/forgetrail-env.mjs +51 -0
- package/content/scripts/setup-ollama.mjs +207 -0
- package/content/scripts/setup-pocketbase.mjs +133 -0
- package/content/scripts/test-ollama.mjs +71 -0
- package/content/scripts/test-pocketbase.mjs +110 -0
- package/content/skills/forgetrail/SKILL.md +92 -0
- package/docs/AUTOMATED_TESTING.md +269 -0
- package/docs/BLACK_HAT_REPORT.md +143 -0
- package/docs/BRAND_AND_PRODUCT.md +381 -0
- package/docs/BUGS.md +62 -0
- package/docs/BUSINESS_PLAN.md +256 -0
- package/docs/CODE_QUALITY.md +170 -0
- package/docs/CONTEXT_PROMPT.md +357 -0
- package/docs/DEPLOYMENT.md +181 -0
- package/docs/DESIGN_SYSTEM.md +414 -0
- package/docs/DEV_ESTIMATE.md +127 -0
- package/docs/FORGETRAIL_RENAME.md +193 -0
- package/docs/IDEAS.md +19 -0
- package/docs/MARKETING_GROWTH.md +301 -0
- package/docs/NAMING_EXPLORATION.md +406 -0
- package/docs/NPM.md +98 -0
- package/docs/PHASE_1_BRIEF.md +161 -0
- package/docs/README.md +75 -0
- package/docs/SPEC_FEATURE_TEMPLATE.md +155 -0
- package/docs/SPEC_UI_CHROME_NAV_TEMPLATE.md +48 -0
- package/docs/TECHNICAL_REFERENCE.md +836 -0
- package/docs/TEST_PLAN.md +467 -0
- package/docs/TODO.md +125 -0
- package/package.json +68 -0
- package/prompts/black-hat-audit.md +235 -0
- package/prompts/brand-copy-edit-pass.md +55 -0
- package/prompts/cialdini-marketing-audit.md +141 -0
- package/prompts/competitor-deep-dive.md +201 -0
- package/prompts/docs-alignment-audit.md +108 -0
- package/prompts/engineering-skill-library.md +75 -0
- package/prompts/landing-page-rewrite.md +63 -0
- package/prompts/microcopy-centralization.md +128 -0
- package/prompts/panel-usability-audit.md +197 -0
- package/prompts/personal-beta-outreach.md +195 -0
- package/prompts/pre-launch-audit.md +148 -0
- package/prompts/product-feedback-to-spec.md +76 -0
- package/prompts/propagate-to-forgetrail.md +315 -0
- package/prompts/user-facing-content-sync-audit.md +200 -0
- package/prompts/ux-cohesion-audit.md +165 -0
- package/scripts/ensure-lease.mjs +23 -0
- package/scripts/forgetrail-cli.mjs +85 -0
- package/scripts/install-forgetrail-lite.mjs +11 -0
- package/scripts/install-forgetrail.mjs +11 -0
- package/scripts/install-lib.mjs +115 -0
- package/scripts/install.mjs +163 -0
- package/scripts/link-global.mjs +100 -0
- package/scripts/mcp-lib.mjs +177 -0
- package/scripts/mcp-status.mjs +155 -0
- package/scripts/publish-gate.mjs +110 -0
- package/scripts/rename-to-forgetrail.mjs +273 -0
- package/workflow_tracking.json +124 -0
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
# Personal Beta Outreach Playbook
|
|
2
|
+
|
|
3
|
+
Generate a structured outreach plan for inviting personal contacts to try your product during beta. Produces audience buckets, classification rules, per-bucket message templates, promo/offer policy, and a writing quality checklist to avoid AI-written and mass-email tells.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Context
|
|
8
|
+
|
|
9
|
+
**Your app** is in beta (or approaching launch). You have a personal network spanning close friends, professional contacts, casual connections, and people who know people. You need to invite them to try the product and give feedback -- but a single generic message wastes the warmth of close relationships and feels presumptuous for distant ones.
|
|
10
|
+
|
|
11
|
+
This prompt produces an **operational playbook** -- not product code.
|
|
12
|
+
|
|
13
|
+
**Prerequisites:**
|
|
14
|
+
|
|
15
|
+
- `docs/BRAND_AND_PRODUCT.md` exists (voice, positioning, audience)
|
|
16
|
+
- `docs/BUSINESS_PLAN.md` exists (pricing, trial length, promo code capabilities)
|
|
17
|
+
- `docs/MARKETING_LAUNCH.md` exists (launch channel strategy, messaging framework)
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## Instructions
|
|
22
|
+
|
|
23
|
+
Read the project's brand doc, business plan, and marketing launch doc to understand: the product's one-sentence value prop, the target audience, the trial/pricing model, the promo code system capabilities, and the brand voice.
|
|
24
|
+
|
|
25
|
+
Then produce a playbook covering all sections below. **Generalize** the audience buckets and message architecture; **customize** the templates with [BRACKETED] product-specific details.
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## 1. Audience Buckets
|
|
30
|
+
|
|
31
|
+
Define **6 mutually exclusive primary buckets** (A--F). Buckets mix **relationship warmth** with one **context-first** category:
|
|
32
|
+
|
|
33
|
+
| ID | Bucket | Who belongs here | Relationship signal |
|
|
34
|
+
|----|--------|------------------|---------------------|
|
|
35
|
+
| **A** | Inner circle | Close friends/family; high trust, low formality | You'd ask a blunt favor without a pitch |
|
|
36
|
+
| **B** | Strong professional | People you know well through work, not necessarily socially | Real conversations and mutual help |
|
|
37
|
+
| **C** | Warm acquaintance | Met more than once or had a real exchange | They'd recognize your name without checking |
|
|
38
|
+
| **D** | Light / casual | Thin relationship; mostly weak ties | Little or no 1:1 history |
|
|
39
|
+
| **E** | Alumni / former org | Shared employer, program, school, or cohort is a **genuine** hook you'd **lead with** or **center** | You'd anchor the message on that shared context -- warmth may range from strong to thin |
|
|
40
|
+
| **F** | Connector | May introduce others even if they don't use the product themselves | Primary value is intros, not personal trial |
|
|
41
|
+
|
|
42
|
+
### Tie-breaker rule
|
|
43
|
+
|
|
44
|
+
If stuck between two buckets, choose the **cooler** one (shorter copy, softer CTA, more conservative offer). Classify on **how the message would land today**, not the person's title or fame.
|
|
45
|
+
|
|
46
|
+
### E vs B/C (when shared context matters)
|
|
47
|
+
|
|
48
|
+
Use **E** when the message would **start or hinge** on alumni/org/cohort. Use **B** or **C** when you'd lead with the **person** and mention org second. Use **A** for true inner circle (org is color only). Use **F** when intros are the main ask.
|
|
49
|
+
|
|
50
|
+
### Edge cases
|
|
51
|
+
|
|
52
|
+
Include classification shortcuts for:
|
|
53
|
+
|
|
54
|
+
- **Weak professional** (title overlap, little real relationship) -- default **D**; promote to **C** only with a specific remembered moment; **E** if shared org/cohort is still the honest anchor for the outreach.
|
|
55
|
+
- **Dormant strong professional** ("used to be B, years since contact") -- classify by **current** warmth, not historical closeness. Often **E** if a **named** org/era is the reconnect hook; **C** if warmth is primary; **D** if the old bond is generic in memory. The opener can honor history while keeping structure honest.
|
|
56
|
+
- **Senior / time-poor** -- bucket unchanged; set a flag; shorter copy, one clear ask.
|
|
57
|
+
- **Former manager / direct report** -- use real warmth + recency, not org-chart position. Avoid A-level casual unless you're actually friends.
|
|
58
|
+
- **Might share code widely** -- bucket unchanged; tighten promo caps/expiry.
|
|
59
|
+
- **Between C and D** -- if you'd feel silly citing a shared memory, you're D. If you have one true sentence, you're C.
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
## 2. Classification Workflow
|
|
64
|
+
|
|
65
|
+
Per contact, record:
|
|
66
|
+
|
|
67
|
+
1. Name and **channel** (email, text, LinkedIn DM, etc.)
|
|
68
|
+
2. **Primary bucket** (A--F)
|
|
69
|
+
3. **Last meaningful touch** (this month / this year / years ago)
|
|
70
|
+
4. **Optional flags:** time-poor, privacy-sensitive, might share widely
|
|
71
|
+
|
|
72
|
+
**Tracking columns:** `Name | Channel | Bucket | Last touch | Promo code | Date sent | Reply | Signed up | Notes`
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
## 3. Message Architecture
|
|
77
|
+
|
|
78
|
+
### Shared spine (all buckets)
|
|
79
|
+
|
|
80
|
+
Every message follows a five-part skeleton. Weight shifts by bucket -- A is shortest; C is often longest; **E** flexes with how warm the tie is.
|
|
81
|
+
|
|
82
|
+
1. Short **personal opener** (one line) -- why them or recent context
|
|
83
|
+
2. **One sentence** on what [APP_NAME] helps with (outcome-oriented, not feature-list)
|
|
84
|
+
3. **Beta ask:** you'd value their **feedback**
|
|
85
|
+
4. **Optional:** extended trial via **promo code**
|
|
86
|
+
5. **Easy out** -- no pressure; invite questions
|
|
87
|
+
|
|
88
|
+
### Tone by bucket
|
|
89
|
+
|
|
90
|
+
| Bucket | Length | Tone | CTA strength |
|
|
91
|
+
|--------|--------|------|----------------|
|
|
92
|
+
| A | Shortest | Warm, direct; humor OK | Strong ("try it," "be brutal") |
|
|
93
|
+
| B | Short--medium | Professional-warm | Strong on feedback; moderate on trial |
|
|
94
|
+
| C | Medium | Polite; specific memory if real | Moderate |
|
|
95
|
+
| D | Short | Respectful; low assumption of time | Soft ("if it's relevant") |
|
|
96
|
+
| E | Short--medium (flex) | Lead with shared org/cohort; tone matches actual warmth | Moderate; cooler **E** can match **D**-soft |
|
|
97
|
+
| F | Short | Gratitude; focus on intros | Very soft on personal trial |
|
|
98
|
+
|
|
99
|
+
### Product in one sentence (vary per bucket)
|
|
100
|
+
|
|
101
|
+
Write **4 variants** of a one-sentence product description. Use different ones across messages so recipients who compare notes don't see the same rehearsed pitch:
|
|
102
|
+
|
|
103
|
+
- **Full value stack** -- what the product produces from a single input
|
|
104
|
+
- **Short / text-friendly** -- casual, compressed
|
|
105
|
+
- **Latent user angle** -- for people who haven't started yet ("makes starting take five minutes, not a weekend")
|
|
106
|
+
- **Positioning angle** -- what it is and what it's not
|
|
107
|
+
|
|
108
|
+
### Promo code snippets
|
|
109
|
+
|
|
110
|
+
Write 3 formality levels: casual (A/B), standard (C/D/E -- match warmth for **E**), connector (F).
|
|
111
|
+
|
|
112
|
+
---
|
|
113
|
+
|
|
114
|
+
## 4. Writing Quality Checks (AI-Tell Avoidance)
|
|
115
|
+
|
|
116
|
+
> π‘ **Lesson learned:** Personal outreach messages drafted by AI or assembled from templates carry consistent tells that recipients -- especially senior professionals -- recognize instantly. The following checklist was developed by writing templates, then auditing them for patterns that read as "generated" rather than "written by a person."
|
|
117
|
+
|
|
118
|
+
**Before sending, scan every message for:**
|
|
119
|
+
|
|
120
|
+
- **Sincerity adverbs** ("genuinely," "truly," "honestly") -- cut them. Real sincerity comes from the ask, not the adverb.
|
|
121
|
+
- **"I wanted to reach out"** -- filler. The recipient already knows you're contacting them.
|
|
122
|
+
- **Repeated flattery formula** -- if "people whose judgment I trust" appears across multiple messages, it's a visible template. Vary or cut.
|
|
123
|
+
- **Identical value-stack list** -- don't paste the same comma-separated product summary into every message. Use the variant one-liners (section 3) to diversify.
|
|
124
|
+
- **Three-part feedback request** ("what resonates, what feels off, anything you'd want to see") -- pick one or two. Three-item lists are an AI fingerprint.
|
|
125
|
+
- **Brand-doc phrasing in personal messages** -- if a sentence could appear on a pitch deck, rewrite it to sound like something you'd say out loud.
|
|
126
|
+
- **"I hope this finds you well"** -- the most parodied email opener in professional communication.
|
|
127
|
+
- **Structural parallelism across buckets** -- if all messages follow the same paragraph order with the same transitions, the architecture shows. Move pieces around per contact.
|
|
128
|
+
|
|
129
|
+
**Anti-pattern:** Using AI to draft all five bucket templates, then sending them unchanged with only the name swapped. The structural similarity is the tell, even when no single phrase is wrong.
|
|
130
|
+
|
|
131
|
+
**Pattern:** Use the templates as raw material. Per contact, rearrange the skeleton, pick a different product one-liner, and write the opener from a real memory. The goal is that two recipients who compare messages see family resemblance, not identical twins.
|
|
132
|
+
|
|
133
|
+
---
|
|
134
|
+
|
|
135
|
+
## 5. Template Messages
|
|
136
|
+
|
|
137
|
+
Write one template per bucket (A, B, C, D, E, F) with:
|
|
138
|
+
|
|
139
|
+
- Recommended **channel** and **tone** note
|
|
140
|
+
- **Subject line** (for email buckets)
|
|
141
|
+
- Message body using `[BRACKETED]` placeholders (for **E**, include `[SHARED_ORG_OR_ERA]` and an opener that centers shared context)
|
|
142
|
+
- Brief **"why it works"** annotation
|
|
143
|
+
|
|
144
|
+
Also produce:
|
|
145
|
+
|
|
146
|
+
- A **shorter text/WhatsApp variant** for A
|
|
147
|
+
- A **forwardable blurb** (stripped of personal framing, suitable for a stranger)
|
|
148
|
+
|
|
149
|
+
### Template guidance by bucket
|
|
150
|
+
|
|
151
|
+
| Bucket | Key characteristics |
|
|
152
|
+
|--------|-------------------|
|
|
153
|
+
| **A** | No formality, strong feedback ask ("be brutal"), acknowledge they may not be the target user |
|
|
154
|
+
| **B** | Name a time investment ("20 minutes"), specify what feedback you want, include a forward option as secondary CTA |
|
|
155
|
+
| **C** | More product context (less shared background to lean on), clear easy-out, forward/intro as natural secondary ask |
|
|
156
|
+
| **D** | Shortest, low assumption, forward is the real CTA, promo code optional |
|
|
157
|
+
| **E** | Opener anchors shared employer/program/cohort; body flexes between B- and C-like; include warmer vs cooler **E** notes |
|
|
158
|
+
| **F** | "About your network, not you personally," offer a walkthrough, make forwarding frictionless |
|
|
159
|
+
|
|
160
|
+
---
|
|
161
|
+
|
|
162
|
+
## 6. Offer Tiers (Promo Mapping)
|
|
163
|
+
|
|
164
|
+
Map **one promo code per bucket** (or per bucket x month) so redemptions are trackable. For each bucket, decide:
|
|
165
|
+
|
|
166
|
+
- **Trial extension** (extra days beyond standard)
|
|
167
|
+
- **Discount** (if any) and duration
|
|
168
|
+
- **Redemption cap** and **expiry** -- tighten for buckets where codes might spread (C, D, E)
|
|
169
|
+
|
|
170
|
+
General principle: **most generous for A** (highest trust), **most conservative for D** (weakest tie). **E** usually tracks **B**/**C** economics depending on warmth. F gets standard or nothing -- the reward is the relationship.
|
|
171
|
+
|
|
172
|
+
---
|
|
173
|
+
|
|
174
|
+
## 7. Guardrails
|
|
175
|
+
|
|
176
|
+
- **1:1 feel** -- especially for D, avoid blast tone
|
|
177
|
+
- **Beta honesty** -- rough edges OK to mention for A/B; keep D more polished
|
|
178
|
+
- **Founder alignment** -- if multiple people send, use the same bucket definitions and code map
|
|
179
|
+
- **No internal jargon** -- outreach copy should not reference spec filenames, internal feature names, or engineering terminology
|
|
180
|
+
|
|
181
|
+
---
|
|
182
|
+
|
|
183
|
+
## 8. Channel Notes
|
|
184
|
+
|
|
185
|
+
| Channel | Guidance |
|
|
186
|
+
|---------|----------|
|
|
187
|
+
| **Text / WhatsApp** | Under ~150 words. No subject line, no sign-off. Link on its own line for clean preview. |
|
|
188
|
+
| **Email** | Subject line personal, not marketing ("Something we built" > "Introducing [APP_NAME]"). Plain text preferred. |
|
|
189
|
+
| **LinkedIn DM** | ~300-char preview truncation. Hook in first two sentences. If not connected, send connection request first. |
|
|
190
|
+
|
|
191
|
+
---
|
|
192
|
+
|
|
193
|
+
## Output
|
|
194
|
+
|
|
195
|
+
Produce a single markdown document containing all sections above, customized to [APP_NAME] with specific product details filled in. The document should be usable as an operational playbook -- something the founders can open alongside their contact list and start sending from.
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
# Pre-Launch Audit
|
|
2
|
+
|
|
3
|
+
Run this audit against the codebase before any major launch or deploy milestone. The goal is to catch gaps that would embarrass the product, break for real users, cause data loss, or undermine trust. This is NOT about new features β it's about polish, robustness, and reliability of what exists.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## How to Use
|
|
8
|
+
|
|
9
|
+
Give this prompt to an AI coding assistant with full codebase access and ask it to perform the audit, reporting findings as **BLOCKER / HIGH / MEDIUM / LOW** with specific file paths, line numbers, and one-line fix suggestions.
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
Perform a pre-launch audit of this codebase using the checklist in [path to this file].
|
|
13
|
+
Report findings as BLOCKER / HIGH / MEDIUM / LOW with specific file paths, line numbers,
|
|
14
|
+
and one-line fix suggestions. For each finding, include the checklist item number it relates to.
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## Audit Checklist
|
|
20
|
+
|
|
21
|
+
### 1. Error Handling & Boundaries
|
|
22
|
+
|
|
23
|
+
- [ ] Does a custom error page exist with branded 404 and 500 pages?
|
|
24
|
+
- [ ] Does the server error handler export structured logging (not just console.error)?
|
|
25
|
+
- [ ] Do API routes return meaningful error messages, or do some silently swallow failures?
|
|
26
|
+
- [ ] Are there fire-and-forget async calls missing error handling?
|
|
27
|
+
- [ ] What happens if the database is down when a user saves? Is work lost after an expensive operation (LLM call, file generation) succeeds?
|
|
28
|
+
|
|
29
|
+
> π‘ **Lesson learned:** The most painful production bugs are silent data loss
|
|
30
|
+
> after expensive operations. If an LLM call costs $0.05 and succeeds, but the DB save
|
|
31
|
+
> fails silently, the user loses work AND you lose money. Always save-or-retry after
|
|
32
|
+
> expensive operations.
|
|
33
|
+
|
|
34
|
+
### 2. Security & Infrastructure
|
|
35
|
+
|
|
36
|
+
- [ ] Is the app's origin/host set correctly for production (reverse proxy awareness)?
|
|
37
|
+
- [ ] Is the real client IP being forwarded correctly for rate limiting (not just 127.0.0.1)?
|
|
38
|
+
- [ ] Is the database admin UI restricted to authorized IPs in production?
|
|
39
|
+
- [ ] Are source maps disabled in production builds?
|
|
40
|
+
- [ ] Does CSRF origin checking work correctly behind the reverse proxy?
|
|
41
|
+
- [ ] Are there any hardcoded secrets, tokens, or API keys in the codebase (not in `.env`)?
|
|
42
|
+
- [ ] Are security headers present (CSP, HSTS, X-Frame-Options, etc.)?
|
|
43
|
+
- [ ] Are rate limits configured? Are auth endpoints and expensive routes (LLM) stricter?
|
|
44
|
+
|
|
45
|
+
### 3. Legal & Compliance
|
|
46
|
+
|
|
47
|
+
- [ ] Do privacy policy and terms of service pages exist and render full content?
|
|
48
|
+
- [ ] Is there a cookie consent banner if analytics set cookies?
|
|
49
|
+
- [ ] Does analytics respect opt-out?
|
|
50
|
+
- [ ] Are AI processing disclosures present in the privacy policy (if using LLMs on user data)?
|
|
51
|
+
|
|
52
|
+
### 4. SEO & Social Sharing
|
|
53
|
+
|
|
54
|
+
- [ ] Does the landing page have `<title>`, `<meta description>`, `og:title`, `og:description`, `og:image`, and `twitter:card` tags?
|
|
55
|
+
- [ ] Does `static/` contain `favicon.ico`, `favicon.svg`, `apple-touch-icon.png`, and `site.webmanifest`?
|
|
56
|
+
- [ ] Does `robots.txt` exist and allow indexing of public pages?
|
|
57
|
+
- [ ] Does `robots.txt` include a `Sitemap:` directive pointing at `sitemap.xml`?
|
|
58
|
+
- [ ] Does a `static/sitemap.xml` exist listing all public routes (landing, privacy, terms)?
|
|
59
|
+
- [ ] Is there a `<link rel="canonical" href="...">` on the landing page?
|
|
60
|
+
- [ ] Is there JSON-LD structured data (`SoftwareApplication`, `FAQPage`, or similar) in the landing page's `<head>`?
|
|
61
|
+
- [ ] Are `<title>`, meta description, Open Graph, Twitter, and JSON-LD `description` driven from the **same content module** (or shared constants) as the visible hero and key sections β not a second copy of the pitch only in `<head>`?
|
|
62
|
+
- [ ] Does **audience / ICP language** match between meta tags, schema, and on-page copy (same specificity β e.g. band + seniority β not a generic phrase in one place and a precise phrase in another)?
|
|
63
|
+
- [ ] After landing copy changes, are in-app story surfaces (About panel, Help introduction, etc.) still aligned on hero framing, section titles, timing claims, and customer-facing feature names?
|
|
64
|
+
- [ ] If you added or renamed a **primary nav hub** (new top-level section, major tab family), do landing, About, Help, and FAQ **groupings** still describe the product map users see when logged in?
|
|
65
|
+
- [ ] If users download **bundled exports** (ZIP, Word, PDF) that include marketing links or βlearn moreβ CTAs, does every URL resolve on the **public** site (no dead routes like `/pricing` if you havenβt shipped that page)?
|
|
66
|
+
|
|
67
|
+
- [ ] If the app offers **CSV (or spreadsheet) export** and a symmetric **import**, do header columns and row cell order match so round-trip or re-import does not silently map fields into the wrong columns?
|
|
68
|
+
> π‘ **Lesson learned:** Canonical URL, sitemap, and JSON-LD structured data are all low-effort, moderate-SEO-upside items that are easy to forget. A `SoftwareApplication` schema with pricing aggregate offer gives Google richer context for search results. Add all three during the landing page build, not as a follow-up.
|
|
69
|
+
|
|
70
|
+
### 5. Billing & Payments (if applicable)
|
|
71
|
+
|
|
72
|
+
- [ ] Does the payment webhook handle all critical events (checkout completed, subscription updated, subscription deleted, payment failed)?
|
|
73
|
+
- [ ] What happens when a trial expires? Is the user gracefully downgraded or stuck?
|
|
74
|
+
- [ ] Has the full payment flow been tested end-to-end in test mode (signup β trial β upgrade β hit limits β downgrade β cancel)?
|
|
75
|
+
- [ ] Is the webhook signing secret set in `.env`?
|
|
76
|
+
- [ ] After **cold load**, **resume from sleep**, and **fast navigation** during onboarding, do trial/plan banners and upgrade modals match **server** state (no spurious "trial ended" or expired UI while the account is still in trial)?
|
|
77
|
+
|
|
78
|
+
> π‘ **Lesson learned:** Payment edge cases are embarrassment machines.
|
|
79
|
+
> Test the full lifecycle, not just the happy path. What happens when a subscription
|
|
80
|
+
> update webhook arrives before the checkout completion webhook? What happens when
|
|
81
|
+
> a user's card is declined on renewal?
|
|
82
|
+
|
|
83
|
+
### 6. Data Integrity & Resilience
|
|
84
|
+
|
|
85
|
+
- [ ] Has a database backup restore been tested? Can you spin up against a pulled snapshot?
|
|
86
|
+
- [ ] Are there retry mechanisms for critical saves (especially after expensive LLM calls)?
|
|
87
|
+
- [ ] What happens with concurrent usage across multiple tabs? Do refetch patterns cause conflicts?
|
|
88
|
+
- [ ] Are database query workarounds documented for known driver/ORM issues?
|
|
89
|
+
|
|
90
|
+
> π‘ **Lesson learned:** PocketBase's default 5K text field limit silently
|
|
91
|
+
> truncated LLM output with no error. Check ALL fields that receive LLM output against
|
|
92
|
+
> your database's field size limits. One systematic audit prevented 5 production bugs.
|
|
93
|
+
|
|
94
|
+
### 7. Authentication & Sessions
|
|
95
|
+
|
|
96
|
+
- [ ] Are auth cookies set with `httpOnly`, `secure`, and `sameSite`?
|
|
97
|
+
- [ ] Does logout clear all cookies (auth, delegation, impersonation)?
|
|
98
|
+
- [ ] What happens if access is revoked mid-session (e.g., delegation removed)?
|
|
99
|
+
- [ ] Does the forgot-password flow work? Is email sending configured?
|
|
100
|
+
- [ ] Is there session invalidation on password change?
|
|
101
|
+
- [ ] If the app sends **app-owned** transactional email (welcome, billing, security notices) via a provider API, are production credentials set and is the **sending domain** authenticated (SPF/DKIM/DMARC per provider)?
|
|
102
|
+
|
|
103
|
+
### 8. Client UX & Mobile
|
|
104
|
+
|
|
105
|
+
- [ ] Does the app load with proper skeletons/spinners, or does it flash empty states?
|
|
106
|
+
- [ ] What happens if the initial data load fails? Is there a retry/refresh indication?
|
|
107
|
+
- [ ] Does the layout work on mobile (especially complex layouts like Kanban boards, multi-column panels)?
|
|
108
|
+
- [ ] Are all modals/panels keyboard-accessible with Escape to close?
|
|
109
|
+
- [ ] Are file upload size limits communicated to users before they pick a file?
|
|
110
|
+
|
|
111
|
+
### 8a. Accessibility (Landing Page)
|
|
112
|
+
|
|
113
|
+
- [ ] Is there a skip-to-content link as the first focusable element?
|
|
114
|
+
- [ ] Is there a `<main>` landmark wrapping the primary content?
|
|
115
|
+
- [ ] Do all `<section>` elements have `aria-labelledby` or `aria-label`?
|
|
116
|
+
- [ ] Does the primary `<nav>` have `aria-label="Main"`?
|
|
117
|
+
- [ ] Do all password inputs have show/hide toggles with `aria-pressed` and `aria-controls`?
|
|
118
|
+
- [ ] Are tooltips used only where they add information not already visible? (See DESIGN_SYSTEM.md > Tooltip Usage Guidelines)
|
|
119
|
+
|
|
120
|
+
### 9. Caching
|
|
121
|
+
|
|
122
|
+
- [ ] Do server-side caches avoid storing error results? (Check TTLs and error-bypass logic.)
|
|
123
|
+
- [ ] Does client-side caching avoid persisting failures?
|
|
124
|
+
- [ ] Are caches keyed per-user to prevent data leaking between accounts?
|
|
125
|
+
|
|
126
|
+
### 10. Deployment Pipeline
|
|
127
|
+
|
|
128
|
+
- [ ] Does the CI/CD pipeline build, transfer, install deps, and restart correctly?
|
|
129
|
+
- [ ] Are deployment secrets (SSH keys, host IPs, tokens) set as CI/CD secrets?
|
|
130
|
+
- [ ] Does the service file have correct environment and dependency settings?
|
|
131
|
+
- [ ] Does the setup script install all required system dependencies?
|
|
132
|
+
|
|
133
|
+
### 11. Content Quality
|
|
134
|
+
|
|
135
|
+
- [ ] Spot-check 2β3 LLM-generated outputs for tone, accuracy, and format after the latest model/prompt changes.
|
|
136
|
+
- [ ] Verify any template markers or placeholders are fully resolved in generated content.
|
|
137
|
+
- [ ] Check that generated content sections don't repeat each other unnecessarily.
|
|
138
|
+
|
|
139
|
+
---
|
|
140
|
+
|
|
141
|
+
## Severity Guide
|
|
142
|
+
|
|
143
|
+
| Severity | Meaning |
|
|
144
|
+
| ----------- | ------------------------------------------------------------------------------------------------- |
|
|
145
|
+
| **BLOCKER** | Launch cannot proceed. Data loss, security vulnerability, or complete feature failure. |
|
|
146
|
+
| **HIGH** | Should fix before launch. Embarrassing UX, broken flow, or unhandled error visible to users. |
|
|
147
|
+
| **MEDIUM** | Fix soon after launch. Degraded experience, missing polish, or edge case that affects some users. |
|
|
148
|
+
| **LOW** | Improvement opportunity. Better error messages, tighter validation, or minor UX refinements. |
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# Product Feedback to Spec
|
|
2
|
+
|
|
3
|
+
Turn raw user product feedback (notes, quotes, bullets, or a transcript) into a concise, implementation-ready spec. Use this when you have feedback from a user interview, support ticket, or internal review and need a structured document engineers and PM can act on.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## How to Use
|
|
8
|
+
|
|
9
|
+
1. Paste this entire file (or from **Instructions** downward) into an AI assistant.
|
|
10
|
+
2. Append the raw feedback under **Input**, or paste it after the prompt in the same message.
|
|
11
|
+
3. Save the resulting spec under `specs/` (e.g. `specs/product-feedback-YYYY-MM-DD_<short-name>.md`) if you want it tracked in-repo. For a full Phase-4 delivery skeleton (data/API/UI, milestones, implementation summary), expand into ForgeTrail **`docs/SPEC_FEATURE_TEMPLATE.md`** (MCP: `getTemplate({ name: "SPEC_FEATURE_TEMPLATE" })`) instead of stopping at this short form.
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## Instructions
|
|
16
|
+
|
|
17
|
+
You are a product-minded engineer. The user will provide raw product feedback below.
|
|
18
|
+
|
|
19
|
+
Your job is to produce a **concise implementation-ready spec**, not a summary essay.
|
|
20
|
+
|
|
21
|
+
### Output structure (use these headings)
|
|
22
|
+
|
|
23
|
+
1. **Source** β One line: who/when/context if given; otherwise `Unattributed`.
|
|
24
|
+
2. **Problem statement** β What is broken, missing, or confusing? One tight paragraph.
|
|
25
|
+
3. **User goal** β What the user is trying to accomplish in their own terms (1β3 sentences).
|
|
26
|
+
4. **Scope**
|
|
27
|
+
- **In scope** β Bullets: what we should change or add.
|
|
28
|
+
- **Out of scope** β Bullets: what we explicitly wonβt do in this iteration.
|
|
29
|
+
5. **Proposed behavior** β Step-by-step or bullet βwhen user does X, system does Y.β Be specific enough to implement.
|
|
30
|
+
6. **Acceptance criteria** β Numbered, testable checks (Given/When/Then or checkbox style).
|
|
31
|
+
7. **Edge cases & risks** β Short list (empty states, permissions, performance, abuse, copy/legal if relevant).
|
|
32
|
+
8. **Open questions** β Numbered questions for PM/design/engineering; mark **Blocking** where needed.
|
|
33
|
+
9. **Suggested priority** β P0 / P1 / P2 with one-line rationale.
|
|
34
|
+
|
|
35
|
+
### Rules
|
|
36
|
+
|
|
37
|
+
- Prefer **decisions** over vague options; if the feedback is ambiguous, state assumptions in **Open questions** and still propose a default.
|
|
38
|
+
- Separate **facts from the feedback** vs **your inference**; label inference when it matters.
|
|
39
|
+
- If the feedback touches multiple features, split into **Spec A / Spec B** or **Primary / Follow-up**.
|
|
40
|
+
- Keep the whole doc skimmable: short paragraphs, bullets, no filler.
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## Multi-Source Feedback Analysis (brainstorm then bucket)
|
|
45
|
+
|
|
46
|
+
_Use this when you have feedback from multiple users, interviews, or sources and need to identify patterns before writing individual specs. This is affinity mapping formalized as a repeatable process._
|
|
47
|
+
|
|
48
|
+
**Step 1: Generate the observation inventory.** From all feedback sources (interview transcripts, support tickets, NPS comments, user testing notes, app store reviews), extract every distinct observation β a quote, a behavior, a complaint, a request, a confusion, a delight. One observation per line. Do not filter or interpret yet. Aim for 50-200 observations depending on the volume of source material.
|
|
49
|
+
|
|
50
|
+
> π **Example prompt:** "Here are transcripts from [N] user interviews about [product/feature]. Extract every distinct observation β things users said, did, struggled with, requested, praised, or got confused by. One observation per line. Include the source (User 1, User 2, etc.) for traceability. Do not summarize or group yet."
|
|
51
|
+
|
|
52
|
+
**Step 2: Bucket against hypothesized themes.** Define 5-8 themes that represent your hypotheses about what users care about. These might be:
|
|
53
|
+
|
|
54
|
+
- User goals (what they are trying to accomplish)
|
|
55
|
+
- Pain points (what frustrates them)
|
|
56
|
+
- Feature requests (what they explicitly ask for)
|
|
57
|
+
- Mental model gaps (where their expectations diverge from the product's behavior)
|
|
58
|
+
- Delights (what they value and don't want to lose)
|
|
59
|
+
- Workflow context (what they do before and after using your product)
|
|
60
|
+
|
|
61
|
+
Score each observation against the themes. An observation may land in multiple themes.
|
|
62
|
+
|
|
63
|
+
**Step 3: Review for research signals.**
|
|
64
|
+
|
|
65
|
+
- **Observations that land in 3+ themes** β these represent core user needs that cut across concerns; they often point to the most impactful product changes
|
|
66
|
+
- **Themes with many observations** β these are validated concerns worth acting on
|
|
67
|
+
- **Themes with few observations** β either you didn't ask about them (probe in the next round) or they are not real user priorities (deprioritize)
|
|
68
|
+
- **Observations that don't fit any theme** β the most valuable output of this step. These are signals your hypotheses missed. Cluster the unfitted observations and ask: is there a theme here you didn't anticipate?
|
|
69
|
+
|
|
70
|
+
**Step 4: Feed into specs.** Each theme with sufficient signal becomes a spec (use the output structure above). Themes with weak signal become hypotheses for the next research round. Cross-theme observations inform architectural decisions (they suggest interconnected features, not isolated fixes).
|
|
71
|
+
|
|
72
|
+
---
|
|
73
|
+
|
|
74
|
+
## Input
|
|
75
|
+
|
|
76
|
+
[PASTE RAW FEEDBACK HERE]
|