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.
Files changed (98) hide show
  1. package/CONTINUATION_PROMPT.md +42 -0
  2. package/INITIAL_PROMPT.md +214 -0
  3. package/LICENSE +201 -0
  4. package/README.md +198 -0
  5. package/TRACKING_SCHEMA.md +162 -0
  6. package/TRY_FORGETRAIL.md +78 -0
  7. package/WORKFLOW.md +921 -0
  8. package/content/AGENT_INTEGRATION_claude.md +38 -0
  9. package/content/AGENT_INTEGRATION_cursor.md +53 -0
  10. package/content/AGENT_INTEGRATION_generic.md +50 -0
  11. package/content/AGENT_INTEGRATION_grok.md +82 -0
  12. package/content/DEV_AUTOMATION_SCRIPTS.md +103 -0
  13. package/content/FORGETRAIL_LITE.md +1202 -0
  14. package/content/FORGETRAIL_LITE_UPDATES.md +13 -0
  15. package/content/FORGETRAIL_PROGRESS.md +26 -0
  16. package/content/GENESIS_SPEC_PROMPT.md +70 -0
  17. package/content/GENESIS_STUB.md +18 -0
  18. package/content/GREENFIELD_INTAKE.md +76 -0
  19. package/content/KICKOFF_WITHOUT_MCP.md +16 -0
  20. package/content/LITE_WORKFLOW_TRACKING.json +42 -0
  21. package/content/NEW_PROJECT_BOOTSTRAP.md +180 -0
  22. package/content/ONE_CLICK_DEV_SETUP.md +142 -0
  23. package/content/PLAN_MODE_PATTERNS.md +43 -0
  24. package/content/POCKETBASE_SCHEMA_SCRIPT.md +52 -0
  25. package/content/POST_BOOTSTRAP_USER_MESSAGE.md +51 -0
  26. package/content/SCAFFOLD_INSTALL.json +110 -0
  27. package/content/SESSION_RESUME_MCP.md +35 -0
  28. package/content/SYSTEM_HEALTH_CHECKS.md +131 -0
  29. package/content/USER_REPLY_FORMAT.md +41 -0
  30. package/content/cursor-rules/forgetrail-lessons-gate.mdc +30 -0
  31. package/content/cursor-rules/forgetrail-lessons-mcp.mdc +24 -0
  32. package/content/cursor-rules/forgetrail-no-trailer.mdc +49 -0
  33. package/content/cursor-rules/forgetrail-phase-status.mdc +61 -0
  34. package/content/cursor-rules/forgetrail-updates-log.mdc +30 -0
  35. package/content/cursor-rules/spec-completion.mdc +33 -0
  36. package/content/cursor-rules/specs-and-todo.mdc +26 -0
  37. package/content/cursor-rules/url-host-matching.mdc +31 -0
  38. package/content/cursor-rules/us-english.mdc +9 -0
  39. package/content/cursor-rules/user-facing-content.mdc +31 -0
  40. package/content/examples/GENESIS_SAMPLE_mars-habitat-roster.md +154 -0
  41. package/content/forgetrail-workspace-README.md +43 -0
  42. package/content/scripts/forgetrail-dev-launcher.mjs +208 -0
  43. package/content/scripts/forgetrail-env.mjs +51 -0
  44. package/content/scripts/setup-ollama.mjs +207 -0
  45. package/content/scripts/setup-pocketbase.mjs +133 -0
  46. package/content/scripts/test-ollama.mjs +71 -0
  47. package/content/scripts/test-pocketbase.mjs +110 -0
  48. package/content/skills/forgetrail/SKILL.md +92 -0
  49. package/docs/AUTOMATED_TESTING.md +269 -0
  50. package/docs/BLACK_HAT_REPORT.md +143 -0
  51. package/docs/BRAND_AND_PRODUCT.md +381 -0
  52. package/docs/BUGS.md +62 -0
  53. package/docs/BUSINESS_PLAN.md +256 -0
  54. package/docs/CODE_QUALITY.md +170 -0
  55. package/docs/CONTEXT_PROMPT.md +357 -0
  56. package/docs/DEPLOYMENT.md +181 -0
  57. package/docs/DESIGN_SYSTEM.md +414 -0
  58. package/docs/DEV_ESTIMATE.md +127 -0
  59. package/docs/FORGETRAIL_RENAME.md +193 -0
  60. package/docs/IDEAS.md +19 -0
  61. package/docs/MARKETING_GROWTH.md +301 -0
  62. package/docs/NAMING_EXPLORATION.md +406 -0
  63. package/docs/NPM.md +98 -0
  64. package/docs/PHASE_1_BRIEF.md +161 -0
  65. package/docs/README.md +75 -0
  66. package/docs/SPEC_FEATURE_TEMPLATE.md +155 -0
  67. package/docs/SPEC_UI_CHROME_NAV_TEMPLATE.md +48 -0
  68. package/docs/TECHNICAL_REFERENCE.md +836 -0
  69. package/docs/TEST_PLAN.md +467 -0
  70. package/docs/TODO.md +125 -0
  71. package/package.json +68 -0
  72. package/prompts/black-hat-audit.md +235 -0
  73. package/prompts/brand-copy-edit-pass.md +55 -0
  74. package/prompts/cialdini-marketing-audit.md +141 -0
  75. package/prompts/competitor-deep-dive.md +201 -0
  76. package/prompts/docs-alignment-audit.md +108 -0
  77. package/prompts/engineering-skill-library.md +75 -0
  78. package/prompts/landing-page-rewrite.md +63 -0
  79. package/prompts/microcopy-centralization.md +128 -0
  80. package/prompts/panel-usability-audit.md +197 -0
  81. package/prompts/personal-beta-outreach.md +195 -0
  82. package/prompts/pre-launch-audit.md +148 -0
  83. package/prompts/product-feedback-to-spec.md +76 -0
  84. package/prompts/propagate-to-forgetrail.md +315 -0
  85. package/prompts/user-facing-content-sync-audit.md +200 -0
  86. package/prompts/ux-cohesion-audit.md +165 -0
  87. package/scripts/ensure-lease.mjs +23 -0
  88. package/scripts/forgetrail-cli.mjs +85 -0
  89. package/scripts/install-forgetrail-lite.mjs +11 -0
  90. package/scripts/install-forgetrail.mjs +11 -0
  91. package/scripts/install-lib.mjs +115 -0
  92. package/scripts/install.mjs +163 -0
  93. package/scripts/link-global.mjs +100 -0
  94. package/scripts/mcp-lib.mjs +177 -0
  95. package/scripts/mcp-status.mjs +155 -0
  96. package/scripts/publish-gate.mjs +110 -0
  97. package/scripts/rename-to-forgetrail.mjs +273 -0
  98. package/workflow_tracking.json +124 -0
@@ -0,0 +1,406 @@
1
+ # [App Name]: Naming Exploration
2
+
3
+ **Status:** [Active exploration / Name selected / Parked]
4
+ **Current name:** [Current name, if renaming]
5
+ **Scope:** This document explores naming only. Implementation of a name change (codebase, domains, branding assets, redirects) belongs in a separate spec once a name is chosen.
6
+ **Related:** [BRAND_AND_PRODUCT.md](BRAND_AND_PRODUCT.md), origin story (if applicable), design system, competitive landscape
7
+
8
+ _Instructions: This is a structured methodology for naming or renaming a product. It works for greenfield naming and for renaming an existing product. Complete each section in order — later sections depend on earlier ones. The process is: understand the identity (§1-2), extract themes from your own language (§3), expand your vocabulary (§4), generate candidates (§5), stress-test against real copy (§6), verify availability (§7), score (§8), and act (§9)._
9
+
10
+ _Run this after your brand voice, positioning, and target audience are defined (BRAND_AND_PRODUCT.md should exist or be in progress). A name chosen before brand clarity tends to drift from the product it represents._
11
+
12
+ ---
13
+
14
+ ## 1. Why name / rename
15
+
16
+ _What is driving this exercise? Be specific about the problem with the current name (if renaming) or the constraints on a new name (if greenfield)._
17
+
18
+ ### The naming problem
19
+
20
+ [Describe what is not working. For a rename: what does the current name signal that is wrong, ambiguous, or limiting? For greenfield: what must the name accomplish that a placeholder cannot?]
21
+
22
+ > 📝 **Example (rename):**
23
+ > "Prime Contender" reads as sports/boxing/MMA before it reads as career. For someone encountering the name cold, the extra cognitive step costs clicks. The product is a job search preparation platform — the name should make that legible within two seconds.
24
+
25
+ > 📝 **Example (greenfield):**
26
+ > We need a name for an AI-powered contract review tool targeting in-house legal teams at mid-market companies. The name must signal "legal" without sounding like a law firm, and "technology" without sounding like a developer tool.
27
+
28
+ ### Names already considered and rejected
29
+
30
+ | Name | Reason rejected |
31
+ |------|-----------------|
32
+ | [Name] | [Specific reason: .com taken, namespace crowded, wrong connotation, etc.] |
33
+
34
+ ---
35
+
36
+ ## 2. What the name must do
37
+
38
+ _Derive these criteria from your BRAND_AND_PRODUCT.md, not from abstract naming theory. Every criterion should trace to a real product decision or audience insight._
39
+
40
+ ### Non-negotiable criteria
41
+
42
+ | Job | Why | Source |
43
+ |-----|-----|--------|
44
+ | **[Criterion 1: Category signal]** | [Why a cold reader must understand the category instantly] | [Which doc or user feedback this comes from] |
45
+ | **[Criterion 2: Audience signal]** | [Why the name must convey who the product is for] | [Source] |
46
+ | **[Criterion 3: Positioning signal]** | [Why the name must imply the product's approach — e.g. preparation vs automation, simplicity vs power] | [Source] |
47
+ | **[Criterion 4: Speakability]** | [Why word-of-mouth matters for this product's acquisition model] | [Source] |
48
+ | **[Criterion 5: Domain availability]** | [Why .com (or specific TLD) matters for this audience and price point] | [Source] |
49
+ | **[Criterion 6: Competitive clearance]** | [Which existing tools or brands the name must not conflict with] | [Source] |
50
+
51
+ > 📝 **Guidance:** 4-7 criteria is the sweet spot. Fewer than 4 and you have not constrained the problem; more than 7 and every candidate fails on something. Weight them in §8.
52
+
53
+ ### Nice-to-haves
54
+
55
+ - [Echoes something from the current name or brand history]
56
+ - [Works as a verb / action]
57
+ - [Fits the existing visual identity without a full redesign]
58
+ - [The legal entity name does not need to match]
59
+
60
+ ---
61
+
62
+ ## 3. Naming themes
63
+
64
+ _This is the most important section. Themes are not random brainstorming — they are extracted from your own product's language. Read your BRAND_AND_PRODUCT.md, origin story, marketing copy, and in-app copy. Highlight words and phrases that appear repeatedly or carry emotional weight. Each theme becomes a direction to explore._
65
+
66
+ _Aim for 4-8 themes. Each should have:_
67
+ - _Source phrases (actual quotes from your docs)_
68
+ - _A one-line explanation of why this direction works_
69
+ - _3-6 energy/tone keywords_
70
+
71
+ ### Theme [Letter]: [Theme name] ([short description])
72
+
73
+ **Source phrases:** "[exact quote from docs]," "[another quote]," "[another]."
74
+
75
+ [1-3 sentences explaining why this word/concept resonates for your product. What does it signal to the target audience? What connotation does it carry?]
76
+
77
+ **Energy:** [3-6 tone keywords]. [e.g. Deliberate. Forward-moving. Owned.]
78
+
79
+ > 📝 **Guidance on finding themes:**
80
+ >
81
+ > - **Grep your brand doc** for words that appear 3+ times. Frequency = resonance.
82
+ > - **Read your origin story** (if you have one). The emotional climax often contains naming energy.
83
+ > - **Read your "We say / We don't say" pairs.** The "We say" column is a goldmine.
84
+ > - **Read your differentiator statements.** "We are X, not Y" — the X words are candidate themes.
85
+ > - **Check your feature names.** If a feature is already branded (e.g. "Resume Forge," "Intel Dossier"), the brand word may extend to the product name.
86
+ > - **Consider audience-as-theme.** Instead of describing what the product does, name who it is for (e.g. "Exec," "Founder," "Counsel"). The audience self-selects.
87
+ > - **Consider the transformation.** "From [before state] to [after state]" — both states are themes.
88
+ >
89
+ > **Anti-pattern:** Generating themes from a thesaurus or abstract brainstorming without anchoring in your own copy. Names that sound good in isolation but do not connect to the brand voice will feel foreign in context.
90
+
91
+ ### Theme A: [Name]
92
+
93
+ **Source phrases:** [...]
94
+
95
+ [...]
96
+
97
+ **Energy:** [...]
98
+
99
+ ### Theme B: [Name]
100
+
101
+ **Source phrases:** [...]
102
+
103
+ [...]
104
+
105
+ **Energy:** [...]
106
+
107
+ _[Continue for each theme — typically 4-8]_
108
+
109
+ ---
110
+
111
+ ## 4. Vocabulary expansion (brainstorm then bucket)
112
+
113
+ _Before combining themes into two-word names, build a rich vocabulary. This step prevents tunnel vision — going directly from theme to name tends to produce a narrow set of obvious combinations. A broader word pool surfaces unexpected pairings._
114
+
115
+ ### Step 1: Generate a domain vocabulary
116
+
117
+ Ask for a large, unstructured list of words related to your product's **domain** — not your themes, not your brand, just the space you operate in.
118
+
119
+ > 📝 **Example prompt:** "Generate 150-200 single words associated with [your domain — e.g. executive job search, career transitions, senior professional hiring]. Include nouns, verbs, adjectives, and metaphors. Cover the full emotional and practical range: the process, the people, the stakes, the tools, the outcomes, the feelings, the environment."
120
+
121
+ The goal is volume and diversity. Do not filter yet. You want words you would not have thought of — alongside the obvious ones.
122
+
123
+ > 📝 **Guidance on scoping:** The initial ask can be broad (all of "executive career search") or narrow (just "the emotional experience of job searching," or "words associated with preparation and readiness"). Narrower prompts produce more focused vocabularies; broader prompts surface more unexpected connections. Consider running 2-3 narrower prompts rather than one broad one if the domain is large:
124
+ > - Domain-specific actions and artifacts (e.g. for career: resume, tailor, submit, pipeline, shortlist)
125
+ > - Emotional landscape (e.g. for career: confidence, doubt, momentum, weight, clarity)
126
+ > - Metaphorical frames (e.g. for career: forge, runway, bridge, edge, armor, signal)
127
+
128
+ ### Step 2: Bucket words against themes
129
+
130
+ Take the vocabulary list and score each word against the themes defined in §3. For each word, ask: **which theme(s) does this word's energy strongly fit?**
131
+
132
+ A word may land in:
133
+ - **One theme** — it is tightly associated (e.g. "forge" → Theme C only)
134
+ - **Multiple themes** — its energy spans several directions (e.g. "primed" → readiness + preparation + edge)
135
+ - **No theme** — discard it or note it as a potential new theme signal
136
+
137
+ > 📝 **Example prompt:** "Here are my naming themes with their energy keywords: [paste themes from §3]. Here is a vocabulary of [N] words: [paste list]. For each word, assign it to every theme where the association is strong (not forced). Output as a table: Word | Themes | Notes. Skip words that don't strongly fit any theme."
138
+
139
+ ### Step 3: Review the bucketed results
140
+
141
+ For each theme, you now have a richer pool of associated words beyond the obvious theme word itself. Review for:
142
+
143
+ - **Surprising additions** — words you would not have considered for a theme but that fit its energy. These are the most valuable.
144
+ - **High-overlap words** — words that land in 3+ themes. These are strong name candidates because they carry multiple signals simultaneously.
145
+ - **Theme gaps** — themes with very few words may be too narrow, or the vocabulary prompt missed their domain. Consider a targeted follow-up vocabulary generation.
146
+ - **New theme signals** — clusters of discarded words that share an energy not captured by existing themes. Consider adding a new theme.
147
+
148
+ ### Step 4: Feed into name generation
149
+
150
+ Use the bucketed vocabulary (not just the theme keywords) as the input for the combination methods below. This is what makes the difference — instead of combining "Pursuit" + "Primed" (two theme keywords), you are combining any word from Theme A's bucket with any word from Theme D's bucket.
151
+
152
+ ---
153
+
154
+ ## 5. Name candidates
155
+
156
+ _Generate candidates by combining words from the theme-bucketed vocabulary (§4). A two-word name typically pairs words from different themes. Test single words, two-word combinations, and occasional three-word phrases._
157
+
158
+ ### Generation method
159
+
160
+ For each theme bucket, generate candidates by:
161
+
162
+ 1. **Theme keyword alone** — Can the core theme word stand alone? (Usually only if domain is available.)
163
+ 2. **Bucket word + bucket word** — Combine words from **different** theme buckets. This is the primary method and the reason §4 exists — it produces combinations the theme-keyword-only approach would miss.
164
+ 3. **Theme keyword + bucket word** — Pair a theme's keyword with a non-obvious word from another theme's bucket.
165
+ 4. **Reversed pairs** — Try both word orders; they read differently ("Pursuit Forge" vs "Forge Pursuit").
166
+ 5. **Audience word + bucket word** — [Audience word] + [word from any bucket] (e.g. Exec + Primed, Counsel + Edge).
167
+ 6. **High-overlap words as anchors** — Words that scored into 3+ themes carry multiple signals; try them as the anchor word paired with more specific words.
168
+ 7. **Coined portmanteaus** — Combine syllable fragments from different words to create a new word that carries both signals (like Microsoft = micro + software, or Pinterest = pin + interest). This dramatically expands the domain-available namespace since coined words are rarely registered.
169
+
170
+ #### Portmanteau generation method
171
+
172
+ Take the favorite words from Steps 1-6 — the ones that keep appearing in strong candidates — and decompose them into syllable fragments. Then combine fragments from different words to create new coinages.
173
+
174
+ **Fragment extraction:** For each favorite word, list its syllable parts:
175
+
176
+ > 📝 **Example:** pursuit → "pur" / "suit"; forge → "forge" / "for"; prime → "prim" / "prime"; edge → "edge" / "edg"; helm → "helm"; foundry → "found" / "foun"; velocity → "vel" / "velo" / "veloci"
177
+
178
+ **Combination patterns:**
179
+
180
+ - **Compress two words at their boundary** — drop overlapping or redundant syllables to fuse two words into one (e.g. pursuit + forge → "pursforge," prime + edge → "primedge"). The result should read as one word, not a forced concatenation.
181
+ - **First-half + second-half** — take the opening syllables of one word and the closing syllables of another (e.g. velocity + forge → "velociforge," prime + helm → "primhelm").
182
+ - **Root word + archetype suffix** — pair a root with a suffix that carries meaning: "-wright" (craftsman — playwright, shipwright), "-works" (factory/output), "-point" (destination), "-craft" (skill/discipline), "-vault" (secure container), "-anvil" (where shaping happens). These suffixes create real-word associations without being common in the product-naming space.
183
+ - **Latin/Greek hybrid** — if a word has a classical root, use the Latin or Greek form for a premium feel (e.g. momentum → "momenta" [Latin plural], velocity → "velox" [Latin adjective], apex → "apexis"). Classical forms read as premium and educated — appropriate for executive-audience products.
184
+
185
+ **Evaluation criteria for coined words:**
186
+
187
+ - **Pronounceable on first read** — if someone hesitates or splits it wrong, it fails the word-of-mouth test
188
+ - **Spellable after hearing it once** — the phone test: can you spell it to a customer service agent without clarification?
189
+ - **Carries both source signals** — both root words should be recoverable from the coinage, even subconsciously
190
+ - **Doesn't trigger wrong associations** — "veloci-" triggers "velociraptor" for many; "prim-" could read as "prim and proper"; test for unintended readings
191
+ - **Domain available** — coined words have much higher .com availability than real-word combinations, which is a key advantage of this approach
192
+
193
+ > 📝 **Guidance:** Coined words trade recognition for distinctiveness. A two-word name like "Pursuit Forge" is instantly parsed; a coined word like "Pursforge" requires a beat. The trade-off is worth it when: (1) all strong two-word .coms are taken, (2) you want a single-word brand that feels owned and distinctive, or (3) your product is premium enough that a slightly opaque name works (think: Accenture, Verizon, Spotify). For products where category clarity is the top criterion, stick to two-word real-word names.
194
+
195
+ ### Tier 1: Strongest candidates
196
+
197
+ _Names that score highest across §2 criteria and have likely-available domains. Include 5-12 names._
198
+
199
+ | Name | Themes | Domain status | Why it works | Risks / considerations |
200
+ |------|--------|---------------|--------------|------------------------|
201
+ | **[Name]** | [Theme letters] | `[domain]` [status] | [2-3 sentences on why this name serves the criteria] | [Honest assessment of weaknesses] |
202
+
203
+ > 📝 **Guidance:** "Why it works" should reference specific criteria from §2, not just "sounds good." "Risks" should be real — connotation problems, spelling ambiguity, confusable neighbors, length.
204
+
205
+ ### Tier 2: Strong but with caveats
206
+
207
+ _Names that work well on some criteria but have a known weakness. Include 8-15 names. These are the bench — they may become Tier 1 if a top candidate falls through on trademark or testing._
208
+
209
+ | Name | Themes | Domain status | Notes |
210
+ |------|--------|---------------|-------|
211
+ | **[Name]** | [Letters] | `[domain]` [status] | [One-line on strength + caveat] |
212
+
213
+ ### Tier 3: Single-word explorations
214
+
215
+ _Premium single-word names are almost always taken as .com. Note them for creative direction and potential prefix/suffix treatment (get[word].com, [word]app.com, [word]hq.com, etc.)._
216
+
217
+ | Concept | Notes |
218
+ |---------|-------|
219
+ | [Word] | [Domain status; why it captures the brand] |
220
+
221
+ ### Competitive clearance check
222
+
223
+ _Search for each Tier 1 candidate + your product category to verify no active competitor uses the name._
224
+
225
+ | Name checked | Conflicts found | Verdict |
226
+ |--------------|-----------------|---------|
227
+ | [Name] | [None / Company X at domain Y — different category / Direct conflict] | [Clear / Caution / Blocked] |
228
+
229
+ ### Names explicitly ruled out
230
+
231
+ | Name | Reason |
232
+ |------|--------|
233
+ | [Name] | [Specific reason] |
234
+
235
+ ---
236
+
237
+ ## 6. Brand copy stress tests
238
+
239
+ _The best way to evaluate a name is to drop it into your actual brand copy. For each Tier 1 candidate, rewrite 4-6 key brand artifacts. If the name feels forced or breaks the sentence rhythm, it is probably wrong._
240
+
241
+ _Test these surfaces for each finalist:_
242
+
243
+ ### [Candidate name]
244
+
245
+ - **Tagline:** [Adapt your existing tagline or write a new one that fits]
246
+ - **Origin story closing:** [Rewrite the last 1-2 sentences of the origin story with this name]
247
+ - **Positioning statement:** "[Name] is the [category] for [audience]."
248
+ - **Virality / referral copy:** "Managed my [thing] with [Name]" / "Prepped with @[Handle]"
249
+ - **Verb form:** Can you verb it? "[Name]'d my application" — natural or forced?
250
+ - **Coach/partner referral:** "You should check out [Name] — it's a [one-line description]."
251
+
252
+ > 📝 **Guidance:** The referral test is the most important. Say it out loud as if texting a friend: "Check out [Name] — it [does thing] for [audience]." If you hesitate, stumble on pronunciation, or feel the need to explain the name before explaining the product, the name is adding friction.
253
+
254
+ _[Repeat for each Tier 1 candidate]_
255
+
256
+ ---
257
+
258
+ ## 7. Domain and handle availability
259
+
260
+ ### Method
261
+
262
+ _Describe the method used and its limitations._
263
+
264
+ > 📝 **Standard method:** DNS `nslookup` against a public resolver (e.g. Cloudflare 1.1.1.1). NXDOMAIN (non-existent domain) strongly suggests the domain is unregistered, but is not a guarantee — some domains are registered and parked without DNS records. Always confirm at a registrar (Namecheap, Cloudflare Registrar, Google Domains, etc.) before committing.
265
+ >
266
+ > To check: `nslookup -timeout=3 [domain] 2>&1` — look for "Non-existent domain" or "NXDOMAIN."
267
+ >
268
+ > For batch checking:
269
+ > ```bash
270
+ > for domain in candidate1.com candidate2.com candidate3.com; do
271
+ > echo -n "$domain: "
272
+ > nslookup -timeout=2 $domain 2>&1 | grep -c "NXDOMAIN\|server can't find\|Non-existent"
273
+ > done
274
+ > ```
275
+ > Output `1` = NXDOMAIN (likely available). Output `0` = resolves (taken or parked).
276
+
277
+ ### TLD strategy
278
+
279
+ [Which TLDs are acceptable for your audience and price point? .com is standard for premium B2B SaaS. Consider whether .io, .co, .app, etc. are acceptable or whether they undermine credibility for your specific buyer.]
280
+
281
+ ### Confirmed likely-available domains
282
+
283
+ ```
284
+ [domain1.com] [domain2.com] [domain3.com]
285
+ [...]
286
+ ```
287
+
288
+ ### Confirmed taken / resolving domains
289
+
290
+ ```
291
+ [domain1.com] [domain2.com] [domain3.com]
292
+ [...]
293
+ ```
294
+
295
+ ### Social handle availability
296
+
297
+ _Check for each Tier 1 finalist. Note the platform and availability._
298
+
299
+ | Name | X / Twitter | LinkedIn | Instagram | Facebook |
300
+ |------|-------------|----------|-----------|----------|
301
+ | [Name] | [Available / Taken / Close variant] | [...] | [...] | [...] |
302
+
303
+ ---
304
+
305
+ ## 8. Evaluation framework
306
+
307
+ _Score each Tier 1 candidate 1-5 on each criterion. Weights should reflect §2 priorities._
308
+
309
+ | Criterion | Weight | Notes |
310
+ |-----------|--------|-------|
311
+ | **[Criterion from §2]** | [%] | [Scoring guidance: what does a 5 vs a 1 look like?] |
312
+ | **[Criterion]** | [%] | [...] |
313
+ | **[Criterion]** | [%] | [...] |
314
+ | **[Criterion]** | [%] | [...] |
315
+ | **[Criterion]** | [%] | [...] |
316
+ | **[Criterion]** | [%] | [...] |
317
+ | **[Criterion]** | [%] | [...] |
318
+
319
+ > 📝 **Guidance:** Weights should sum to 100%. Category clarity and audience signal typically deserve the highest weights (20-25% each). Brand story continuity is usually lowest (5%) because the story adapts to any good name. Adjust based on what matters most for your acquisition model.
320
+
321
+ ### Scorecard
322
+
323
+ | Name | [C1] | [C2] | [C3] | [C4] | [C5] | [C6] | [C7] | **Weighted** |
324
+ |------|------|------|------|------|------|------|------|-------------|
325
+ | [Name 1] | | | | | | | | |
326
+ | [Name 2] | | | | | | | | |
327
+ | [Name 3] | | | | | | | | |
328
+
329
+ _Fill this in collaboratively — founder/team scores, not AI scores. The framework creates structured conversation, not an algorithm._
330
+
331
+ ---
332
+
333
+ ## 9. Decision process and next steps
334
+
335
+ ### Before selecting
336
+
337
+ 1. **Register top 3-5 domains immediately.** Domains are $10-15/yr. Do not wait for consensus — register anything you might want. This is insurance, not commitment.
338
+ 2. **Say them out loud.** In a referral text: "Check out [Name] — it's [one-line description] for [audience]." Record which one you hesitate on.
339
+ 3. **Test with 3-5 people in the target audience.** Show the name + one-line description, zero context. Ask: "What do you think this product does?" and "Who do you think this is for?"
340
+ 4. **Check trademark (USPTO TESS or equivalent).** Search each finalist for live marks in relevant classes (typically Class 42 for SaaS, Class 35 for employment/business services, Class 9 for software). International: check WIPO if targeting non-US markets.
341
+ 5. **Check social handles.** @[Name] on LinkedIn, X/Twitter, Instagram, Facebook. Minor variations (underscores, "get" prefix) are acceptable but not ideal.
342
+
343
+ ### After selecting
344
+
345
+ 1. **Write an implementation spec** (separate document) covering:
346
+ - Codebase rename (package.json, imports, env vars, internal references)
347
+ - Domain registration and DNS migration
348
+ - SSL certificates for new domain
349
+ - Redirect strategy (301 from old domain; preserve SEO equity)
350
+ - Asset regeneration (logos, favicons, OG images, email templates)
351
+ - In-app copy sweep (grep for old name in all user-facing strings)
352
+ - Marketing surface update (landing, About, Help, social profiles, app store listings)
353
+ - Legal (entity name alignment if needed; terms of service; privacy policy)
354
+ - Notification to existing users (email, in-app banner)
355
+ - Timeline and phasing (can be done in one sprint or staged)
356
+
357
+ 2. **Update BRAND_AND_PRODUCT.md** with the new name, adapted tagline, and updated origin story closing.
358
+
359
+ 3. **Update CONTEXT_PROMPT.md** so AI assistants use the new name.
360
+
361
+ ---
362
+
363
+ ## 10. What does not change
364
+
365
+ _Regardless of the name, these elements of the brand remain constant. Listing them explicitly prevents scope creep during the rename._
366
+
367
+ - **Brand voice** — [tone keywords from BRAND_AND_PRODUCT.md]
368
+ - **Visual identity** — [colors, design sensibility from DESIGN_SYSTEM.md]
369
+ - **Category** — [product category from BRAND_AND_PRODUCT.md]
370
+ - **Core tagline structure** — [the pattern, even if the words adapt]
371
+ - **Origin story** — [the narrative is the narrative; only the closing line changes]
372
+ - **Legal entity** — [entity name does not need to match product name, if applicable]
373
+
374
+ ---
375
+
376
+ ## Appendix: Naming anti-patterns
377
+
378
+ > 🔧 **Guidance:** Common failure modes in product naming, observed across projects.
379
+
380
+ ### Naming before brand clarity
381
+
382
+ Choosing a name before BRAND_AND_PRODUCT.md exists means the name is not anchored to anything. It will drift as the product evolves, and you will end up here again in 6-12 months. Define voice, audience, positioning, and differentiators first.
383
+
384
+ ### Thesaurus naming
385
+
386
+ Generating candidates from a thesaurus or random word lists without grounding them in the product's own language. The result sounds clever in isolation but feels foreign in the product's actual copy. Always extract themes from your own docs first (§3). The §4 vocabulary expansion process channels the brainstorming energy productively — you still generate a broad word list, but you bucket it against your themes rather than combining words at random.
387
+
388
+ ### Falling in love with unavailable names
389
+
390
+ Spending emotional energy on a name before checking domain + trademark + social handle availability. Check availability early and often. A great name you cannot own is not a great name.
391
+
392
+ ### Optimizing for cleverness over clarity
393
+
394
+ A name that requires explanation adds friction at every touchpoint: ads, referrals, cold outreach, search results. For most B2B products, **clear beats clever**. "What does this product do?" should be answerable from the name alone, or at minimum, the name should not actively mislead.
395
+
396
+ ### Ignoring how the name sounds in speech
397
+
398
+ Many names are evaluated visually (on a slide, in a doc) but experienced aurally (in a meeting, on a call, in a podcast). Say every candidate out loud. Spell it to an imaginary customer service agent over the phone. If it requires clarification ("that's one word, no hyphen, C-A-L-I-B-E-R"), factor that cost in.
399
+
400
+ ### Two-word names where both words say the same thing
401
+
402
+ "SmartGenius," "QuickFast," "PrepReady" — redundant pairs waste a word. The strongest two-word names combine two **different** signals: audience + state, action + quality, category + differentiator.
403
+
404
+ ### Naming by committee without a framework
405
+
406
+ Without explicit criteria and weights (§8), naming discussions become aesthetic arguments with no resolution mechanism. The framework does not make the decision — the founder/team does — but it ensures the conversation is structured around what matters.
package/docs/NPM.md ADDED
@@ -0,0 +1,98 @@
1
+ # Publishing ForgeTrail to npm
2
+
3
+ You run `pnpm publish`. The gate does not log in or publish.
4
+
5
+ Two public unscoped packages:
6
+
7
+ | Package | Version | From | What it is |
8
+ | --- | --- | --- | --- |
9
+ | [`forgetrail`](https://www.npmjs.com/package/forgetrail) | 0.3.0 | repo root | CLI + Lite + templates. `npx forgetrail install --lite` |
10
+ | [`forgetrail-mcp`](https://www.npmjs.com/package/forgetrail-mcp) | 0.2.2 | `mcp-server/` | MCP bin. `npx -y forgetrail-mcp` |
11
+
12
+ These are **installer and MCP channels**, not a library. App repos should not add `forgetrail` to `dependencies`.
13
+
14
+ `pnpm run pack:check` already passed on this tree (2026-08-20). Root dry-run packed `forgetrail@0.3.0` (98 files, no `site/` or `specs/`).
15
+
16
+ ---
17
+
18
+ ## Once (this machine)
19
+
20
+ ```bash
21
+ pnpm login
22
+ pnpm whoami
23
+ ```
24
+
25
+ Use an npm account that can publish **unscoped** public packages.
26
+
27
+ ---
28
+
29
+ ## First publish (paste in order)
30
+
31
+ From the repo root, on `main`, **clean working tree** (pnpm refuses `publish` if git is dirty). Push first if you want the published tarball to match GitHub.
32
+
33
+ ```bash
34
+ # 1. Gate (rebuilds mcp-server/dist)
35
+ pnpm run pack:check
36
+
37
+ # 2. CLI + methodology
38
+ pnpm publish --dry-run --access public
39
+ pnpm publish --access public
40
+
41
+ # 3. MCP server (prepublishOnly runs tsc)
42
+ pnpm --dir mcp-server publish --dry-run --access public
43
+ pnpm --dir mcp-server publish --access public
44
+ ```
45
+
46
+ `prepublishOnly` on the root re-runs the pack check. It refuses `private: true` and a tarball that includes `site/` or `specs/`.
47
+
48
+ ---
49
+
50
+ ## After publish (verify)
51
+
52
+ ```bash
53
+ # fresh npx, not your clone
54
+ npx --yes forgetrail@0.3.0 --help
55
+ npx --yes forgetrail@0.3.0 install --lite --dry-run
56
+
57
+ # MCP starts; needs content via FORGETRAIL_ROOT or a sibling forgetrail install
58
+ npx --yes forgetrail-mcp@0.2.2
59
+ ```
60
+
61
+ Optional Cursor MCP (content from a `forgetrail` install, or set the path):
62
+
63
+ ```json
64
+ {
65
+ "mcpServers": {
66
+ "forgetrail": {
67
+ "command": "npx",
68
+ "args": ["-y", "forgetrail-mcp"],
69
+ "env": {
70
+ "FORGETRAIL_ROOT": "/path/to/node_modules/forgetrail"
71
+ }
72
+ }
73
+ }
74
+ }
75
+ ```
76
+
77
+ If `forgetrail` is installed in the same tree, `forgetrail-mcp` finds `WORKFLOW.md` without `FORGETRAIL_ROOT`.
78
+
79
+ Registry pages to confirm:
80
+
81
+ - https://www.npmjs.com/package/forgetrail
82
+ - https://www.npmjs.com/package/forgetrail-mcp
83
+
84
+ ---
85
+
86
+ ## Later releases
87
+
88
+ 1. Bump `version` in `package.json` and/or `mcp-server/package.json` (independent versions are OK).
89
+ 2. Repeat the three publish blocks above.
90
+ 3. GitHub `main` stays canonical. npm versions are snapshots.
91
+
92
+ ---
93
+
94
+ ## Do not publish
95
+
96
+ - `site/` (FilePress marketing app)
97
+ - `specs/` (methodology-repo meta-specs)
98
+ - `.cursor/`
@@ -0,0 +1,161 @@
1
+ # [App Name] — Phase 1 architecture brief
2
+
3
+ _Structured capture of planning and architecture **before** code scaffolding. Goal: Phase 2 (or a new agent/session) can start from this file + `.forgetrail/workflow_tracking.json` without re-reading the whole Phase 1 chat._
4
+
5
+ **Status:** `[draft | locked]`
6
+ **Last updated:** `[ISO date]`
7
+ **Phase 1 exit:** Do not mark Phase 1 complete in `.forgetrail/workflow_tracking.json` until this brief is **locked** and major commitments are in `decisions[]`.
8
+
9
+ ---
10
+
11
+ ## 1. Problem and outcome
12
+
13
+ **What we are building (2–4 sentences):**
14
+
15
+
16
+ **Project archetype:** `[product | internal-tool | one-shot]` _(WORKFLOW.md §1d — non-`product` archetypes prune later-phase exit criteria in the tracking file; log the pruning in `decisions[]`)_
17
+
18
+ **What “done” looks like for v1 (measurable where possible):**
19
+
20
+
21
+ ---
22
+
23
+ ## 2. Users and hero flow
24
+
25
+ **Primary user(s):**
26
+
27
+
28
+ **The single most important workflow (hero flow) end-to-end:**
29
+
30
+
31
+ **Secondary workflows (if any) for v1:**
32
+
33
+
34
+ ---
35
+
36
+ ## 3. Constraints
37
+
38
+ _Hard requirements the stack and design must respect._
39
+
40
+ - **Technical:** (e.g. must run on X, offline, no PII region, etc.)
41
+ - **Business / timeline:**
42
+ - **Explicit non-goals for v1:** (link to section 9 for detail)
43
+
44
+ ---
45
+
46
+ ## 4. Stack and tooling
47
+
48
+ _Confirmed choices only after user sign-off. Mirror the same choices into `CONTEXT_PROMPT.md` → Tech Stack in Phase 2._
49
+
50
+ | Area | Choice | Status (proposed / confirmed) | Notes / WHY |
51
+ | --------------- | -------- | ----------------------------- | ----------- |
52
+ | Framework | | | |
53
+ | Language | | | |
54
+ | DB / backend | | | |
55
+ | Auth / storage | | | |
56
+ | Styling | | | |
57
+ | Deploy / CI | | | |
58
+ | Package manager | | | |
59
+
60
+ ---
61
+
62
+ ## 5. Data model (sketch)
63
+
64
+ _Entities and relationships — not full schemas. Enough for Phase 2 scaffolding._
65
+
66
+ **Core entities:**
67
+
68
+
69
+ **Relationships:**
70
+
71
+
72
+ **Existing data / migration:** _(none | describe import path)_
73
+
74
+
75
+ ---
76
+
77
+ ## 6. Integrations and external systems
78
+
79
+ _APIs, webhooks, LLM, payments, email, analytics, etc._
80
+
81
+ | Integration | Purpose | Auth / secrets | Risk notes |
82
+ | ------------- | ------- | -------------- | ---------- |
83
+ | LLM (if any) | Content generation | Cloud: `OPENAI_API_KEY`, `ANTHROPIC_API_KEY`, … **or** local: `OLLAMA_BASE_URL`, `OLLAMA_MODEL` (no cloud key) | Rate limits; field size limits; validate JSON at boundary |
84
+
85
+ ---
86
+
87
+ ## 6a. Content-generation pattern (only if LLM-produced content)
88
+
89
+ _Skip if content is hand-authored or from a non-LLM API._
90
+
91
+ | Field | Value |
92
+ | ----- | ----- |
93
+ | **Pattern** | _runtime API \| build-time seed \| BYO-LLM paste_ |
94
+ | **Provider / model** | _e.g. `openai/gpt-4o-mini`, `anthropic/claude-sonnet`, `ollama/ibm/granite4.1:8b`, `ollama/gemma3:4b`, BYO only_ |
95
+ | **Env vars** | _cloud keys and/or `OLLAMA_BASE_URL`, `OLLAMA_MODEL`_ |
96
+ | **Ollama launchers** (local runtime) | _setup-ollama.bat, test-ollama.bat after Phase 2 scaffold_ |
97
+ | **Validator / paths** | _e.g. Zod at `src/lib/...`, `data/seed.json`, prompt in `prompts/seed.md`_ |
98
+
99
+ > 💡 **Lesson learned:** **Local Ollama** fits the same three patterns as cloud — runtime routes call `/api/generate`; build-time seed calls Ollama once; BYO-LLM can mean the user runs a prompt in the Ollama desktop app and pastes JSON. Prefer **Granite 4.1** or **Gemma 3** for general product features; avoid reasoning-only models unless v1 explicitly needs chain-of-thought. See **ForgeTrail Lite** §7.1 and §4.8.
100
+
101
+ ---
102
+
103
+ ## 7. Hardest problems and risks
104
+
105
+ _What could blow schedule or architecture — honest list._
106
+
107
+ 1.
108
+ 2.
109
+ 3.
110
+
111
+ ---
112
+
113
+ ## 8. Architectural decisions (numbered)
114
+
115
+ _Each decision should include **WHY** and what was rejected. **Also** add each major commitment to `.forgetrail/workflow_tracking.json` → `decisions[]` (id, timestamp, phase, decision, rationale, alternatives_considered)._
116
+
117
+ **D1.**
118
+
119
+
120
+ **D2.**
121
+
122
+
123
+ **D3.**
124
+
125
+
126
+ _(Add D4+ as needed.)_
127
+
128
+ ---
129
+
130
+ ## 9. Open questions (before or during Phase 2)
131
+
132
+ _Items that are not yet decided. Resolve or explicitly defer._
133
+
134
+ | # | Question | Owner / resolve by |
135
+ | - | -------- | ------------------ |
136
+ | | | |
137
+
138
+ ---
139
+
140
+ ## 10. Explicitly out of scope (v1)
141
+
142
+ _Bullet list — prevents scope creep during scaffold._
143
+
144
+
145
+ ---
146
+
147
+ ## 11. First feature batch (post-scaffold)
148
+
149
+ _Ordered list of what to build after the spine runs — aligns with initial `TODO.md`._
150
+
151
+
152
+ ---
153
+
154
+ ## 12. Handoff checklist (before leaving Phase 1)
155
+
156
+ - [ ] User has confirmed stack, folder shape, data sketch, hero flow, and v1 boundaries
157
+ - [ ] This brief is **locked** (no `[draft]` ambiguity) or remaining items are only in §9 Open questions
158
+ - [ ] `.forgetrail/workflow_tracking.json` updated: `decisions[]` for each major D#; `phases["1-architecture"]` notes summarize sign-off
159
+ - [ ] Phase 2 opener will read **this file** + `.forgetrail/workflow_tracking.json` first
160
+
161
+ > 💡 **Lesson learned:** Treat the brief and `decisions[]` as a pair: JSON is great for machine-structured history; the brief is great for the next human or agent to read in one pass. Duplicated rationale is OK — drift between them is not. After Phase 2 starts, **merge** this content into `CONTEXT_PROMPT.md` per the mapping in that template’s “Handoff from Phase 1” section.