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,381 @@
|
|
|
1
|
+
# [App Name]: Brand Story & Product
|
|
2
|
+
|
|
3
|
+
**[Tagline: one line that captures the essence]**
|
|
4
|
+
|
|
5
|
+
_For technical feature documentation, see [TECHNICAL_REFERENCE.md](TECHNICAL_REFERENCE.md). For business model and growth strategy, see [BUSINESS_PLAN.md](BUSINESS_PLAN.md)._
|
|
6
|
+
|
|
7
|
+
_Instructions: This document defines WHO your product is for, WHY it matters, and HOW it's different. It's the reference for all marketing copy, product decisions, and feature prioritization. Write it after your core features work (Phase 6: Strategic Review), then use it to pressure-test every feature against your brand promise._
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## The Problem
|
|
12
|
+
|
|
13
|
+
_What pain exists in the world that your product addresses? Be specific about who feels this pain and when._
|
|
14
|
+
|
|
15
|
+
### The Surface Problem
|
|
16
|
+
|
|
17
|
+
[What users would say if you asked them what's broken. The obvious complaint.]
|
|
18
|
+
|
|
19
|
+
### The Deeper Problem
|
|
20
|
+
|
|
21
|
+
[The emotional or structural reality underneath the surface problem. This is what your product actually solves.]
|
|
22
|
+
|
|
23
|
+
> π **Example:**
|
|
24
|
+
> Surface: "Applying to jobs takes too long and my materials are generic."
|
|
25
|
+
> Deeper: "Job search at the senior level is emotionally destabilizing. Every tool adds more systems to manage, increasing the burden instead of reducing it. The real failure point isn't finding jobsβit's converting preparation into compelling, role-specific materials."
|
|
26
|
+
|
|
27
|
+
### Why Existing Solutions Fail
|
|
28
|
+
|
|
29
|
+
[What's wrong with the current alternatives? Be specific about which alternatives and which failure modes.]
|
|
30
|
+
|
|
31
|
+
> π **Example:** "Full automation (auto-apply to hundreds of roles) is a dealbreaker at senior levels. Hiring managers detect spray-and-pray instantly. Generic templates lose the candidate's differentiated value."
|
|
32
|
+
|
|
33
|
+
## Who It's For
|
|
34
|
+
|
|
35
|
+
### Primary User
|
|
36
|
+
|
|
37
|
+
[Demographic, psychographic, and behavioral description. Not "everyone." Be narrow enough to be useful.]
|
|
38
|
+
|
|
39
|
+
> π **Example:** "Director/VP/C-level professionals in active job search. Technical enough to use a SaaS tool, senior enough that their resume needs strategic positioning, not just formatting."
|
|
40
|
+
|
|
41
|
+
### Who It's NOT For
|
|
42
|
+
|
|
43
|
+
[Equally important. Who should you turn away? What use cases does this product explicitly not serve?]
|
|
44
|
+
|
|
45
|
+
## The Product
|
|
46
|
+
|
|
47
|
+
### What It Is
|
|
48
|
+
|
|
49
|
+
[One paragraph. What does the product actually do?]
|
|
50
|
+
|
|
51
|
+
### What Makes It Different
|
|
52
|
+
|
|
53
|
+
_Use "We are X, not Y" framing to draw clear lines._
|
|
54
|
+
|
|
55
|
+
- We are [X], not [Y].
|
|
56
|
+
- We are [X], not [Y].
|
|
57
|
+
- We are [X], not [Y].
|
|
58
|
+
|
|
59
|
+
> π **Example:**
|
|
60
|
+
> - We are a command center, not a job board.
|
|
61
|
+
> - We are a preparation system, not an automation tool.
|
|
62
|
+
> - We are human-in-the-loop, not auto-submit.
|
|
63
|
+
|
|
64
|
+
### The Promise
|
|
65
|
+
|
|
66
|
+
[What can the user expect? Set appropriate expectations. What do you NOT promise?]
|
|
67
|
+
|
|
68
|
+
### Core Value Pillars
|
|
69
|
+
|
|
70
|
+
_These become the organizing structure for your TODO.md and feature prioritization. Each feature should map to a pillar._
|
|
71
|
+
|
|
72
|
+
1. **[Pillar Name]:** [What it means for the user. What features serve this pillar.]
|
|
73
|
+
2. **[Pillar Name]:** [What it means for the user.]
|
|
74
|
+
3. **[Pillar Name]:** [What it means for the user.]
|
|
75
|
+
4. **[Pillar Name]:** [What it means for the user.]
|
|
76
|
+
5. **[Pillar Name]:** [What it means for the user.]
|
|
77
|
+
|
|
78
|
+
> π **Example:**
|
|
79
|
+
> 1. Preparation Quality: Intersections, selling points, readiness scoring
|
|
80
|
+
> 2. Tailoring Precision: Resume/cover letter customization per role
|
|
81
|
+
> 3. Pursuit Management: Kanban pipeline, status tracking, deadlines
|
|
82
|
+
> 4. Network Execution: Contact management, outreach tracking, relationship mapping
|
|
83
|
+
> 5. Operational Intelligence: Analytics, activity feeds, progress visualization
|
|
84
|
+
|
|
85
|
+
## Brand Voice
|
|
86
|
+
|
|
87
|
+
### Tone
|
|
88
|
+
|
|
89
|
+
[3-6 adjectives that define how the product speaks.]
|
|
90
|
+
|
|
91
|
+
> π **Example:** "Sharp. Competent. Honest. Direct. Grounded. Prepared."
|
|
92
|
+
|
|
93
|
+
### We Say / We Don't Say
|
|
94
|
+
|
|
95
|
+
| We Say | We Don't Say |
|
|
96
|
+
| ---------------------------------- | ------------------------------ |
|
|
97
|
+
| [language that reflects the brand] | [language that contradicts it] |
|
|
98
|
+
|
|
99
|
+
> π **Example:**
|
|
100
|
+
> | "You're prepared" | "We got you the job" |
|
|
101
|
+
> | "Command center" | "Dashboard" |
|
|
102
|
+
> | "Contender" | "Applicant" |
|
|
103
|
+
|
|
104
|
+
### Voice Vocabulary Expansion (brainstorm then bucket)
|
|
105
|
+
|
|
106
|
+
_Optional but high-value. Run this after the "We Say / We Don't Say" table is established, to enrich the voice palette beyond hand-curated pairs._
|
|
107
|
+
|
|
108
|
+
**Step 1: Generate audience language.** Collect 100-150 words and phrases your target audience actually uses β from support tickets, LinkedIn posts in your space, competitor landing pages, industry jargon, community forums, job descriptions, and review sites. Cast wide: include formal and informal registers, technical and emotional language, aspirational and frustrated language.
|
|
109
|
+
|
|
110
|
+
> π **Example prompt:** "Generate 150 words and short phrases that [your target audience β e.g. C-suite executives in active job search] actually use when talking about [your product's domain β e.g. the job search process, career transitions, professional preparation]. Include formal language, casual language, emotional language, and industry jargon. Mix nouns, verbs, adjectives, and idiomatic phrases."
|
|
111
|
+
|
|
112
|
+
**Step 2: Bucket against tone keywords.** Score each word/phrase against your tone keywords (e.g. Sharp, Competent, Honest, Direct, Grounded, Prepared). For each, ask: does this word/phrase **reinforce** the tone, **contradict** it, or sit **neutral**?
|
|
113
|
+
|
|
114
|
+
- **Reinforces** β candidate for the "We Say" column or in-app copy
|
|
115
|
+
- **Contradicts** β candidate for the "We Don't Say" column (catches phrasing you might accidentally use)
|
|
116
|
+
- **Neutral** β discard or note for later
|
|
117
|
+
|
|
118
|
+
**Step 3: Review for surprises.** Look for:
|
|
119
|
+
|
|
120
|
+
- Phrases that reinforce your voice but you would never have written yourself β these are gold for authentic-sounding copy
|
|
121
|
+
- Phrases that *seem* on-brand but carry a subtle wrong connotation when you examine them closely β add to "We Don't Say"
|
|
122
|
+
- Emotional-register words that capture how your user *feels* during the process (not just what they do) β these belong in origin stories and empathy copy
|
|
123
|
+
- Jargon your audience uses that you could adopt or explicitly avoid
|
|
124
|
+
|
|
125
|
+
**Step 4: Feed into copy surfaces.** Update "We Say / We Don't Say" with the strongest additions. Use high-overlap words (reinforcing 3+ tone keywords) in signature lines and tagline candidates. Use emotional-register words in origin story and empathy sections of marketing copy.
|
|
126
|
+
|
|
127
|
+
### Signature Lines
|
|
128
|
+
|
|
129
|
+
_Recurring phrases that reinforce the brand. Use these in UI copy, marketing, and onboarding._
|
|
130
|
+
|
|
131
|
+
- [Line]: [Where/when to use it]
|
|
132
|
+
|
|
133
|
+
## Feature Scope Boundaries
|
|
134
|
+
|
|
135
|
+
### The Product Layer
|
|
136
|
+
|
|
137
|
+
[Where does your product sit in the user's workflow? What layer of the problem do you own?]
|
|
138
|
+
|
|
139
|
+
### Explicitly Out of Scope
|
|
140
|
+
|
|
141
|
+
[What does this product NOT do, even if users ask for it? Why?]
|
|
142
|
+
|
|
143
|
+
> π **Example:**
|
|
144
|
+
> "We stay in the preparation layer (before submission). We don't submit applications, send follow-ups, or negotiate offers. Crossing into post-submission creates liability and dilutes focus."
|
|
145
|
+
|
|
146
|
+
---
|
|
147
|
+
|
|
148
|
+
## Copy & Messaging Lessons
|
|
149
|
+
|
|
150
|
+
> π§ **Guidance:** These are hard-won lessons about what works and what doesn't in marketing and product copy. Patterns to follow when writing for any ForgeTrail-derived product.
|
|
151
|
+
|
|
152
|
+
### Microcopy duplication policy
|
|
153
|
+
|
|
154
|
+
> **One source per string class.** Feature titles β `[productLabels].ts` (or equivalent). Help tip bodies β tips module only β never duplicate prose in Svelte. Legal β markdown per page, not copy shards. FAQ may shorten feature summaries; elevator-pitch variants stay intentionally separate. See `prompts/microcopy-centralization.md` and `docs/TECHNICAL_REFERENCE.md` Β§ User-facing copy.
|
|
155
|
+
|
|
156
|
+
### Landing Page Callout Boxes
|
|
157
|
+
|
|
158
|
+
A callout box immediately following a pitch paragraph should NOT restate the pitch in different words. It should answer the natural next question the pitch raises.
|
|
159
|
+
|
|
160
|
+
Pattern: the pitch paragraph delivers the emotional "why" (instant momentum, break through the barrier); the callout box delivers the "how" (numbered steps β what to do first, what happens next, what you get).
|
|
161
|
+
|
|
162
|
+
Duplicate callout copy reads as filler and dilutes both elements. If the callout says the same thing as the paragraph above it, ask: what's the reader's next question? Answer that instead.
|
|
163
|
+
|
|
164
|
+
### Marketing Prerequisite Clarity
|
|
165
|
+
|
|
166
|
+
When your core feature requires a prerequisite step (e.g., "upload your resume" before "paste a URL"), surface that prerequisite in reference docs and pitch docs β but NOT necessarily in the hero marketing copy.
|
|
167
|
+
|
|
168
|
+
- **Hero copy**: selling the outcome. Omitting a setup detail here is appropriate scope, not misleading.
|
|
169
|
+
- **Reference docs, how-it-works sections, CTAs**: these are read by prospects who are closer to converting. Omitting the prerequisite here IS misleading because it leaves them unprepared.
|
|
170
|
+
|
|
171
|
+
Rule: Every "one-liner" hook that skips a required step needs a longer companion version in adjacent reference material that includes it.
|
|
172
|
+
|
|
173
|
+
### Error Messages as Brand Expression
|
|
174
|
+
|
|
175
|
+
User-facing error messages are copy, not code. Two rules:
|
|
176
|
+
|
|
177
|
+
1. **Never leak backend service names.** If your backend is PocketBase, Supabase, or anything else, the user should never see that name. "Network error. Is PocketBase running?" becomes "Something went wrong. Check your connection and try again." Internal names confuse users and expose implementation details.
|
|
178
|
+
|
|
179
|
+
2. **Match the error to the user's mental model.** A signup failure should say "Something went wrong" not "Request failed with status 500." Catch blocks in authentication flows are especially visible β they're the first impression for new users.
|
|
180
|
+
|
|
181
|
+
> π‘ **Lesson learned:** Grep for your backend service name (e.g., "PocketBase", "Supabase", "Firebase") in all user-facing strings. Every hit is a leak. Replace with plain-language alternatives that describe the outcome, not the cause.
|
|
182
|
+
|
|
183
|
+
### Security Claim Precision
|
|
184
|
+
|
|
185
|
+
Don't overstate security in marketing copy. Be specific about what protections actually exist:
|
|
186
|
+
|
|
187
|
+
- **Bad:** "Your data is encrypted and secure." (Implies encryption at rest, which may not be true.)
|
|
188
|
+
- **Good:** "All connections are encrypted in transit, and your data is stored on private infrastructure with access restricted to your account."
|
|
189
|
+
|
|
190
|
+
If your database doesn't encrypt documents at rest (e.g., default PocketBase, SQLite), don't imply it does. Users in regulated industries (finance, healthcare) will notice. State what IS true β TLS in transit, access controls, no third-party sharing β and leave out what isn't.
|
|
191
|
+
|
|
192
|
+
> π‘ **Lesson learned:** Have someone with security knowledge review FAQ security answers before launch. A single overclaim discovered by a technical user erodes trust far more than a modest but accurate claim builds it.
|
|
193
|
+
|
|
194
|
+
### Generated letters and long-form outbound copy (LLM)
|
|
195
|
+
|
|
196
|
+
When the product produces **cover letters**, **outreach**, or other **persuasive prose** for a specific opportunity, prompt and post-process for **human register** β especially for senior buyers: avoid **self-important** openings, **density packing** (keyword stuffing that reads as AI), and **redundant** motifs across opening, body, and closing. **Why:** Recruiters and hiring managers pattern-match βLLM voiceβ quickly; repetition across paragraphs reads as broken, not thorough.
|
|
197
|
+
|
|
198
|
+
> π‘ **Lesson learned:** **Email and attachment cover letters** usually do not need a **city/state line** or mailed-letter dateline block (`[City, State]` above the date, employer address block, etc.). Drop those placeholders from the **base template** and from LLM βdo not changeβ blocks β they survive tailoring as obvious non-personalized cruft. Start with name, contact line (email/phone/LinkedIn), date if needed, then salutation and body.
|
|
199
|
+
>
|
|
200
|
+
> π‘ **Lesson learned:** **Application / screening prompts** that ask for **specific past work** (especially βhow did AI improve your output?β) must use **grounded-or-ask** behavior: answer only from resume, uploads, and saved profile examples; if evidence is missing, return **short intake questions** for the user and persist answers on the profile β **never** fabricate employers, architectures, or toolchains that βsound right.β
|
|
201
|
+
>
|
|
202
|
+
> π‘ **Lesson learned:** Encode **deduplication and register** rules in **shared prompt fragments** or server-side passes so every surface that generates the same artifact class (tailoring tab, assistant, batch flows) stays aligned β not three different ad-hoc prompts that drift.
|
|
203
|
+
>
|
|
204
|
+
> π‘ **Lesson learned:** **Factual grounding and veracity checks prevent hallucinated credentials.** When generating tailored cover letters, outreach, or other persuasive copy representing the user, the model must be grounded in their full base document of record (passed directly in the prompt) rather than lossy summaries. Running a separate, cheap semantic veracity pass immediately after generation to flag ungrounded claims (technologies, metrics, or misplaced chapters) provides a robust, human-in-the-loop safety net before the user treats the output as final.
|
|
205
|
+
>
|
|
206
|
+
> π‘ **Lesson learned:** **Anti-self-importance and position-of-strength rules prevent grandiose and striving registers.** When generating outbound copy representing the user, explicitly instruct the LLM to write in a plain, confident, and professional tone. Ban grandiose framing of routine work, visionary self-positioning, analytical flattery, name-dropping by negation, performative specificity, and modifier stacking. Enforce a "position of strength" posture: ban mirroring the job description as proof of fit, delivering maxims/theses as quotable wisdom, branding ordinary habits as named methods, using striving/grind vocabulary, and using rhetorical scaffolding, self-narration, or clever self-authored aphorisms. Let the facts of what the user built carry the weight directly.
|
|
207
|
+
|
|
208
|
+
### Assertive product voice (no hedging *can*)
|
|
209
|
+
|
|
210
|
+
Marketing, help, onboarding, and feature descriptions should state **what the product does** in the present tense with direct verbs β not tentative capability language.
|
|
211
|
+
|
|
212
|
+
| We say | We don't say |
|
|
213
|
+
|--------|----------------|
|
|
214
|
+
| β[Feature] **strengthens** your resume before you apply.β | β[Feature] **can strengthen** your resumeβ¦β |
|
|
215
|
+
| βThe engine **suggests** roles that match your direction.β | βThe engine **can suggest** rolesβ¦β |
|
|
216
|
+
| βOverview **keeps** both the apply link and where you found it.β | βOverview **can keep** both linksβ¦β |
|
|
217
|
+
|
|
218
|
+
**Keep *can* for:** user options (βYou can change it laterβ), factual extraction limits (βwhen we can read it from the listingβ), and people (βsomeone who can intro youβ) β not for describing shipped product behavior.
|
|
219
|
+
|
|
220
|
+
> π‘ **Lesson learned:** Hedging **can** on capability lines reads as marketing filler and undercuts a premium positioning. After landing or how-it-works edits, grep `\bcan\b` in copy modules and fix product-capability instances in the same pass. LLM prompts that describe product behavior should use the same assertive voice so generated help/marketing does not reintroduce hedges.
|
|
221
|
+
|
|
222
|
+
### Name Competitors in Differentiator Copy
|
|
223
|
+
|
|
224
|
+
In FAQ or comparison sections, name the specific tools your buyer is already evaluating β don't hide behind vague "other tools" or "existing solutions."
|
|
225
|
+
|
|
226
|
+
- **Bad:** "How is this different from other tools?"
|
|
227
|
+
- **Good:** "How is this different from ChatGPT, Claude, or a resume builder?"
|
|
228
|
+
|
|
229
|
+
Naming competitors directly does three things: (1) it matches the exact query prospects type into search engines, (2) it signals confidence that you can withstand the comparison, and (3) it meets the buyer where they already are in their evaluation process. If you're afraid to name a competitor, that's a product problem, not a copy problem.
|
|
230
|
+
|
|
231
|
+
### Pricing Copy Clarity
|
|
232
|
+
|
|
233
|
+
Pricing feature lists often contain internal jargon that means nothing to a prospect who hasn't used the product yet. Audit each line item from the perspective of someone reading it for the first time.
|
|
234
|
+
|
|
235
|
+
- **Bad:** "30 prep generations/mo" β "prep generations" is internal terminology.
|
|
236
|
+
- **Good:** "30 interview & strategy prep runs/mo" β uses words the buyer already understands.
|
|
237
|
+
- **Bad:** "Resume Forge access" β the feature's brand name hasn't been introduced yet.
|
|
238
|
+
- **Good:** "AI-tailored resumes" β describes the outcome.
|
|
239
|
+
|
|
240
|
+
If a line item requires explanation, either rewrite it in plain language or add a tooltip (see DESIGN_SYSTEM.md > Tooltip Usage Guidelines).
|
|
241
|
+
|
|
242
|
+
### Action verbs over generic "Generate" (in-app copy)
|
|
243
|
+
|
|
244
|
+
This is **not** the same lesson as "remove internal jargon" (e.g. billing counters, backend names). **Generate** is precise for engineers but **vague for users**: it implies a black box and trains people to think every AI action is the same kind of magic.
|
|
245
|
+
|
|
246
|
+
**Pattern:** Prefer verbs that describe the **outcome** or the **user's next artifact**:
|
|
247
|
+
|
|
248
|
+
| Instead of (generic) | Prefer (when it fits) |
|
|
249
|
+
| -------------------- | ---------------------- |
|
|
250
|
+
| Generate / Generating | **Map** (intersections, overlaps), **Build** (selling points, dossier, export bundle), **Draft** (answers, thank-yous, outreach), **Create** (Word files, variant templates), **Refresh** / **Re-create** (re-run after edits), **Tailor** / **Re-Tailor** (full per-job document rebuild from base) |
|
|
251
|
+
|
|
252
|
+
**Acronyms:** Expand once per surface where it helps (**ATS** = applicant tracking systems; **STAR** = Situation, Task, Action, Result). Keep the acronym after the first expansion.
|
|
253
|
+
|
|
254
|
+
**Propagation:** When you settle terminology in a customer project, capture it in a **project-owned spec** (e.g. `specs/UI_UX_COPY_CONSISTENCY_SPEC.md`) and **lift generalizable rules back into ForgeTrail** here so the next product inherits the pattern. Grep periodically for `Generate` / `Generating` in user-visible `*.svelte` strings; API route names and analytics event keys can stay technical.
|
|
255
|
+
|
|
256
|
+
> π‘ **Lesson learned:** Jargon removal fixes *what* users read (opaque nouns). Verb choice fixes *how* they understand *what the software is doing* and reduces "everything is just generate" fatigue. Do both.
|
|
257
|
+
|
|
258
|
+
### Plain language for profile and priority labels
|
|
259
|
+
|
|
260
|
+
Structured intent editors (direction, emphasis areas, constraints) often ship with **implementation-flavored** labels. Users read those strings literally.
|
|
261
|
+
|
|
262
|
+
> π‘ **Lesson learned:** **Schema keys and editorial vocabulary can diverge.** If research shows confusion with an early label, ship the **clearer plain-language word** in UI, Help, tours, FAQ, and exports first; rename persistence when you are ready for migration. Reconcile **all** surfaces in one pass β otherwise onboarding describes a concept the primary editor no longer shows.
|
|
263
|
+
|
|
264
|
+
> π§ **Guidance:** After any rename of a user-visible concept, grep **tours**, **onboarding**, **empty states**, and **download titles** β not only the main form component.
|
|
265
|
+
|
|
266
|
+
### URL ingestion wording (customer-facing)
|
|
267
|
+
|
|
268
|
+
**Pattern:** In UI, Help, and lifecycle email, prefer **Import**, **Add from link**, or **Analyze posting** over **Scrape** when describing automated URL fetch. Many professional buyers read "scrape" as adversarial, technical, or low-trust.
|
|
269
|
+
|
|
270
|
+
**Why:** Same pipeline under the hood; the label should match how you want the relationship with third-party sites and the userβs self-image to feel.
|
|
271
|
+
|
|
272
|
+
### Duplicate and variant flows: plain language
|
|
273
|
+
|
|
274
|
+
**Pattern:** For flows where users **copy an entity to start a variant** (second application from a template, new draft from an old record), label the action **Carry forward**, **Start fromβ¦**, **Duplicate**, or **New β¦ from copy** β not developer idioms (**fork**, **branch**, **rebase**) unless your ICP is engineers.
|
|
275
|
+
|
|
276
|
+
**Why:** Same behavior under the hood; wording should signal intent (continue my work), not toolchain.
|
|
277
|
+
|
|
278
|
+
### Default to Signup, Not Sign-In
|
|
279
|
+
|
|
280
|
+
On landing pages, set the authentication form's default mode to **signup** (not sign-in). First-time visitors β the majority of landing page traffic β should see the path of least resistance to starting. Returning users know to click "Sign In." This is a simple state default change with measurable conversion impact.
|
|
281
|
+
|
|
282
|
+
### Elevate Audience Targeting
|
|
283
|
+
|
|
284
|
+
If your product targets a specific seniority band or persona, don't bury that in small muted text. Elevate it to a prominent visual element near the hero CTA β badge rows, styled pills, or a dedicated one-line callout. The right visitor should see "that's me" within 3 seconds of landing. Example: moving a seniority line from muted footer copy to a badge row above the CTA made targeting unmissable.
|
|
285
|
+
|
|
286
|
+
### Keep in-app marketing surfaces aligned with the public landing
|
|
287
|
+
|
|
288
|
+
If you ship a **public marketing route** (e.g. `/start`, marketing home) and an **in-app story surface** (About panel, Help introduction, settings blurb), treat the **landing page as canonical** for positioning: hero promise, supporting lines, section titles, taglines, and **customer-facing feature names** on cards or accordions.
|
|
289
|
+
|
|
290
|
+
**Why:** Users who converted read the landing first. When About or Help still says an old tagline, a different timing claim ("five minutes" vs "in minutes"), or internal naming ("Resume Score" vs the marketing label "ATS scoring & fixes"), it feels like a different product β worse than a small inconsistency in tone.
|
|
291
|
+
|
|
292
|
+
**Pattern:** When landing copy changes, audit paired in-app surfaces in one pass. Match differentiator headings and empathy blocks; keep "how it works" steps aligned (secondary paths like manual entry or recruiter paste can live in the same bullet as a clause). **Adapt** signup-only eyebrows and CTAs for logged-in users (e.g. drop "no credit card" where it no longer applies) without contradicting the core promise.
|
|
293
|
+
|
|
294
|
+
**Anti-pattern:** Letting the in-app About panel drift while marketing iterates, or maintaining three long prose blocks that all describe the product without a checklist of surfaces to sync.
|
|
295
|
+
|
|
296
|
+
> π‘ **Lesson learned:** Add "landing + About (or equivalent)" to your pre-launch or release checklist when you change marketing copy. One grep pass for the old hero sentence often catches stragglers in `*Panel.svelte` or Help JSON.
|
|
297
|
+
|
|
298
|
+
### New primary hubs and navigation pillars
|
|
299
|
+
|
|
300
|
+
When you ship a **new top-level area** (main-nav section, multi-tab hub, or βcommand centerβ family) that reframes how users work, treat it like a **positioning change**, not only a route.
|
|
301
|
+
|
|
302
|
+
**Why:** Logged-in users learn new names and tabs while prospects still read marketing that describes the old map. Word-of-mouth and support use language that the public site never reflects.
|
|
303
|
+
|
|
304
|
+
**Pattern:** In the same release train, update **landing feature grids, About, Help, and FAQ groupings** so the **category of value** the hub represents is discoverable without opening the app. Avoid internal codenames on customer-facing surfaces; align with the abstraction level you use elsewhere (see *Describe features at the right level of abstraction*).
|
|
305
|
+
|
|
306
|
+
### Single module for landing SEO and on-page marketing copy
|
|
307
|
+
|
|
308
|
+
**Pattern:** Drive `<title>`, `<meta name="description">`, Open Graph, Twitter Card fields, and JSON-LD `description` from the **same content module** (or the same string constants) you use for the hero, subheads, and feature grid β not a parallel set of strings maintained only in the routeβs `<svelte:head>`.
|
|
309
|
+
|
|
310
|
+
**Why:** Social previews and search snippets are part of the same promise as the visible page. When meta says one audience framing and the hero or schema says another, positioning drifts silently because engineers update the module but forget hardcoded tags.
|
|
311
|
+
|
|
312
|
+
**Anti-pattern:** Duplicating audience or value language only inside `<meta>` and structured data while the hero imports from elsewhere β two sources of truth that diverge on the next copy pass.
|
|
313
|
+
|
|
314
|
+
> π‘ **Lesson learned:** Keep **who the product is for** spelled the **same way** in hero intro, meta descriptions, and `SoftwareApplication` schema (e.g. explicit band + seniority), not a generic shorthand in one place and a precise ICP phrase in another.
|
|
315
|
+
|
|
316
|
+
### Audit for invisible features (the marketing gap)
|
|
317
|
+
|
|
318
|
+
A built-and-shipped feature that is absent from the landing page, About panel, and Help guide might as well not exist for prospects. This happens naturally: engineering ships a feature, copy lags behind, and the marketing surfaces silently drift from what the product actually does.
|
|
319
|
+
|
|
320
|
+
**Pattern:** After each release cycle, diff the set of user-facing capabilities against the set of features named on public marketing surfaces. Any capability with zero marketing presence is an "invisible feature" that needs a card, bullet, or mention. Prioritize features that address a buyer's top objections or map to competitor differentiators.
|
|
321
|
+
|
|
322
|
+
> π‘ **Lesson learned:** A personal branding tool (LinkedIn profile generation) and a full job-posting trust scan (six-category LLM analysis) were both fully implemented but completely absent from the landing page and About panel. Adding two feature cards and two About entries took minutes but made the product look materially more capable to prospects. Schedule a feature-vs-marketing parity check whenever you update landing copy.
|
|
323
|
+
|
|
324
|
+
### Describe features at the right level of abstraction
|
|
325
|
+
|
|
326
|
+
Marketing copy that enumerates every sub-feature ("generates a headline, an About section, and an application summary") becomes stale the moment you add a new output type. Describe the *category of value* the feature provides ("tailored LinkedIn profile content built from your actual resume") so the copy survives feature evolution without requiring a marketing update for every iteration.
|
|
327
|
+
|
|
328
|
+
**Anti-pattern:** Listing every specific deliverable in hero or card copy β forces a copy edit for every feature addition and trains users to expect only the listed outputs.
|
|
329
|
+
|
|
330
|
+
> π‘ **Lesson learned:** A branding feature card originally listed "headline, About section, and application summary." Rewriting to "tailored LinkedIn profile content" kept the promise accurate as new content types were added, without touching the landing page again.
|
|
331
|
+
|
|
332
|
+
### Personal outreach copy: avoid AI tells in founder-written messages
|
|
333
|
+
|
|
334
|
+
When drafting personal beta outreach (or any founder-to-contact message), AI-assisted drafts carry consistent tells that recipients -- especially senior professionals -- recognize instantly. The message doesn't need to be worse; it needs to not read as generated.
|
|
335
|
+
|
|
336
|
+
**Signals to audit before sending:**
|
|
337
|
+
|
|
338
|
+
- **Sincerity adverbs** ("genuinely," "truly") undermine sincerity. The ask itself signals you care; the adverb signals a template trying to sound like it cares.
|
|
339
|
+
- **Filler openings** ("I wanted to reach out," "I hope this finds you well") are meta-announcements. Start with substance.
|
|
340
|
+
- **Flattery formulas** ("people whose judgment I trust") repeated across multiple messages become visible templates when recipients compare notes.
|
|
341
|
+
- **Identical product descriptions** across all messages. Write 3--4 variant one-liners and rotate.
|
|
342
|
+
- **Three-item lists** for feedback asks ("what resonates, what feels off, anything you'd want to see") are an AI fingerprint. Pick one or two.
|
|
343
|
+
- **Pitch-deck language** in personal messages. If a sentence could appear on a slide, rewrite it to sound spoken.
|
|
344
|
+
- **Structural parallelism** across messages. If every recipient gets the same paragraph order, the architecture shows even when no single phrase is wrong.
|
|
345
|
+
|
|
346
|
+
> π‘ **Lesson learned:** The structural similarity across bucket templates is the hardest tell to catch because each message looks fine in isolation. The fix: rearrange the skeleton per contact -- sometimes lead with product, sometimes bury it after a personal opening -- and use different product one-liners. Two recipients comparing messages should see family resemblance, not identical twins.
|
|
347
|
+
|
|
348
|
+
### Don't echo competitor ad tropes (especially after a screenshot review)
|
|
349
|
+
|
|
350
|
+
If you study **paid social** or display creative in your category, use it for **positioning and roadmap** β not as a style guide. Competitor ads often lean on:
|
|
351
|
+
|
|
352
|
+
- **Unsourced statistics** ("70% of jobs neverβ¦") β same trust failure as overprecise security claims.
|
|
353
|
+
- **Guaranteed timelines or outcomes** β invites regulatory and reputation risk; senior buyers discount it anyway.
|
|
354
|
+
- **Volume-as-hero** ("100 applications/week") when your ICP optimizes for **fit and narrative**, not throughput.
|
|
355
|
+
|
|
356
|
+
**Pattern:** Maintain a short **"fluff to avoid"** list in your brand doc or competitive spec and check new landing, FAQ, and in-app copy against it. **Substance to keep** is usually calm: signal over noise, relationships and timing, verifiable mechanics (e.g. how ATS parsing works), runway awareness without panic UX.
|
|
357
|
+
|
|
358
|
+
**Bundled marketing exports:** If users download **Word/PDF appendices** built from the same narrative as About or landing (e.g. personal data ZIP), drive body copy from a **single shared module** and **verify every CTA URL** exists on your public site. Dead or aspirational routes in an archive undermine trust when someone opens it months later.
|
|
359
|
+
|
|
360
|
+
### FAQ as a Conversion and SEO Tool
|
|
361
|
+
|
|
362
|
+
A short FAQ section (5-7 items) placed just before the signup form serves dual purposes:
|
|
363
|
+
|
|
364
|
+
1. **Conversion:** It catches last-moment objections ("Is my data secure?", "Can I cancel?") right where the user is about to decide. Each answered question removes a reason to leave.
|
|
365
|
+
2. **SEO:** FAQ content matches long-tail search queries ("is [product] secure", "[product] vs [competitor]") and can be enhanced with FAQ structured data (JSON-LD) for rich search results.
|
|
366
|
+
|
|
367
|
+
Structure the FAQ as an accordion with a single open item at a time. Lead with the question your buyer is most anxious about. Include a differentiator question to restate your positioning in a conversational format.
|
|
368
|
+
|
|
369
|
+
### Visual Design as Brand Expression
|
|
370
|
+
|
|
371
|
+
> π‘ **Lesson learned:** Create a dedicated DESIGN_SYSTEM.md document (see template) as the single reference for visual decisions. Key patterns worth replicating:
|
|
372
|
+
>
|
|
373
|
+
> 1. Accent hierarchy: Define three intensity tiers β strong (CTAs, active states), medium (borders, icon containers), and subtle (hover shadows, gradient washes, active tab background at 4% opacity). The subtle tier is the most powerful because it registers subconsciously β users feel "this is polished" without being able to point to why.
|
|
374
|
+
>
|
|
375
|
+
> 2. Gradient polish: Layer subtle accent-tinted `radial-gradient()` over surface colors on modals and panels. Use the accent color at 3-5% opacity in light mode, 5-7% in dark. Modals get a top-left radial glow (where the eye enters); panels get a left-edge glow (from the panel border). Define as reusable CSS classes (`.modal-gradient`, `.panel-gradient`) with `[data-theme="dark"]` variants. This creates brand cohesion at such a subtle level that removing it makes everything feel flat, but no user could articulate what's different.
|
|
376
|
+
>
|
|
377
|
+
> 3. Shadow system: Card hover shadows and panel shadows should carry a barely perceptible accent tint (`rgba(accent, 0.04)` outer glow). Combined with accent gradients, this makes the brand color feel ambient in the interface.
|
|
378
|
+
>
|
|
379
|
+
> 4. Warm color foundations: Avoid the sterile blue-grey of typical SaaS. Use warm neutrals β parchment-toned light themes, deep navy (not pure black) dark themes. The difference is subtle but emotionally significant, especially for products targeting professionals.
|
|
380
|
+
>
|
|
381
|
+
> 5. Terminology care: User-facing labels for negative outcomes deserve attention. "Not Selected" instead of "Rejected." "On Hold" instead of "Paused." The word choice is brand expression.
|
package/docs/BUGS.md
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# [App Name] - Bug Tracker
|
|
2
|
+
|
|
3
|
+
_Raw bugs triaged and routed to TODO.md. This is the intake form, not the backlog._
|
|
4
|
+
|
|
5
|
+
_Instructions: Log bugs here as they're discovered. Each entry gets a severity, a one-line description, and a reproduction path. Once triaged (severity assessed, root cause identified), create a proper TODO entry and check it off here with a cross-reference. Don't let this list grow unbounded β triage weekly._
|
|
6
|
+
|
|
7
|
+
> π‘ **Lesson learned:** Bugs and ideas are different workflows. IDEAS.md is a parking lot for future possibilities β low urgency, evaluated in batches during strategic review. BUGS.md is an intake queue for things that are broken NOW β higher urgency, triaged as they arrive. Mixing them in one file causes bugs to get lost in a sea of ideas, or ideas to feel like emergencies.
|
|
8
|
+
>
|
|
9
|
+
> Triage workflow:
|
|
10
|
+
> 1. Log the bug here with severity and repro steps
|
|
11
|
+
> 2. Investigate root cause (or ask Claude to)
|
|
12
|
+
> 3. Create a TODO entry under the appropriate section (Foundation > Robustness, or the relevant value pillar)
|
|
13
|
+
> 4. Check it off here with a cross-reference to the TODO entry
|
|
14
|
+
> 5. Fix in priority order from TODO, not from this list
|
|
15
|
+
>
|
|
16
|
+
> Severity guide:
|
|
17
|
+
> - P0 (Critical): Data loss, security vulnerability, payment failure, app crash. Fix immediately.
|
|
18
|
+
> - P1 (High): Core workflow broken, major UX failure, affects most users. Fix this sprint.
|
|
19
|
+
> - P2 (Medium): Feature partially broken, workaround exists, affects some users. Schedule fix.
|
|
20
|
+
> - P3 (Low): Cosmetic, edge case, minor annoyance. Fix when convenient.
|
|
21
|
+
|
|
22
|
+
## Batch Error Triage (brainstorm then bucket)
|
|
23
|
+
|
|
24
|
+
_Use this when facing a large batch of errors β e.g. from an error tracking tool (PostHog, Sentry, Datadog), a QA pass, or a production incident. The standard one-at-a-time triage (above) works for steady-state; this process works when you need to make sense of 20+ errors at once._
|
|
25
|
+
|
|
26
|
+
**Step 1: Generate the error inventory.** Export or list every distinct error message, stack trace signature, or failure pattern from your error source. Include metadata: frequency (volume/occurrences), recency, affected users/sessions, and the component/file where the error originates. Do not filter or prioritize yet β capture everything.
|
|
27
|
+
|
|
28
|
+
**Step 2: Bucket against root-cause categories.** Define 4-8 root-cause categories based on your codebase and common failure modes. Score each error against the categories. Examples:
|
|
29
|
+
|
|
30
|
+
- **Reference errors** β undefined variables, missing imports, stale reactive state (e.g. Svelte `$effect` referencing unmounted state)
|
|
31
|
+
- **Null/undefined access** β null dereference, optional chaining gaps, data loaded before component expects it
|
|
32
|
+
- **Network failures** β fetch failures, timeouts, API errors, offline handling
|
|
33
|
+
- **Browser quirks** β ResizeObserver, intersection observer, vendor-specific bugs
|
|
34
|
+
- **Third-party library** β errors originating in dependency chunks, not your code
|
|
35
|
+
- **Data integrity** β unexpected data shapes, missing fields, schema mismatches
|
|
36
|
+
- **Timing/race conditions** β component mounts before data, concurrent writes, stale closures
|
|
37
|
+
|
|
38
|
+
**Step 3: Review for triage signals.**
|
|
39
|
+
|
|
40
|
+
- **Errors that land in multiple categories** β often the most complex bugs; prioritize investigation
|
|
41
|
+
- **Categories with high error volume but few distinct errors** β one root cause is producing many symptoms; fix the root cause, not the symptoms
|
|
42
|
+
- **Categories with many distinct errors but low volume each** β systemic code pattern issue (e.g. missing null guards across many components); address with a codebase-wide sweep, not one-off fixes
|
|
43
|
+
- **Errors that don't fit any category** β potential new failure mode worth adding to your monitoring
|
|
44
|
+
|
|
45
|
+
**Step 4: Feed into triage priorities.** Within each category, rank by (volume Γ recency Γ user impact). Categories with the highest aggregate score get triaged first. Create TODO entries by category, not by individual error β this prevents the backlog from exploding into dozens of single-error tickets when a pattern fix would resolve many at once.
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
## Active Bugs
|
|
50
|
+
|
|
51
|
+
_Untriaged or in-progress. Move to Triaged once routed to TODO._
|
|
52
|
+
|
|
53
|
+
| # | Severity | Description | Repro / Location | Reported |
|
|
54
|
+
| --- | -------- | --------------- | ------------------------------- | -------- |
|
|
55
|
+
| 1 | [P0-P3] | [What's broken] | [How to reproduce or file:line] | [Date] |
|
|
56
|
+
|
|
57
|
+
## Triaged
|
|
58
|
+
|
|
59
|
+
_Routed to TODO.md. Check off when the TODO entry is created._
|
|
60
|
+
|
|
61
|
+
- [x] **#N** [P1] [Description] β TODO > [Section] > [Item name]
|
|
62
|
+
- [ ] **#N** [P2] [Description] β _(needs triage)_
|