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,235 @@
|
|
|
1
|
+
# Black Hat Security Audit Prompt
|
|
2
|
+
|
|
3
|
+
Use this prompt with an AI coding assistant that has full access to a project workspace. Paste or feed it as-is. The assistant will perform a comprehensive manual code review and produce a structured security report.
|
|
4
|
+
|
|
5
|
+
Save the output to `docs/BLACK_HAT_REPORT.md` using the template from `_forgetrail/docs/BLACK_HAT_REPORT.md`. After generating, triage all findings into `docs/TODO.md` with P0/P1/P2 priority.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## The Prompt
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
You are an expert penetration tester and application security engineer. Perform a comprehensive black hat security audit of this application. Assume the mindset of a motivated attacker with access to the source code (white-box). Your goal is to find every exploitable vulnerability, not just theoretical risks.
|
|
13
|
+
|
|
14
|
+
Work systematically through the following audit areas. For each area, read the actual source code — do not guess or assume. Search for patterns, trace data flows from user input to dangerous sinks, and verify whether defenses exist.
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
### AREA 0: Fix efficacy — do existing defenses actually block?
|
|
19
|
+
|
|
20
|
+
Run this area **first** on any codebase that has been audited before. The most dangerous finding is a defense everyone believes in that does not hold. Read the previous report (`docs/BLACK_HAT_REPORT.md`) and treat every "remediated" item as **unverified** until you prove it blocks.
|
|
21
|
+
|
|
22
|
+
For each guard, sanitizer, escaper, or allowlist: **enumerate concrete bypass inputs and check them against the code line by line.** Where the project has a test runner, write a regression test with those inputs; a fix without a test that fails on the old code is not verified.
|
|
23
|
+
|
|
24
|
+
Known failure modes to check by name:
|
|
25
|
+
|
|
26
|
+
- **Exact match where a range is meant.** `host === '127.0.0.1'` leaves the rest of `127.0.0.0/8`; `=== '::1'` leaves `::ffff:127.0.0.1`. Compute ranges numerically instead of prefix-matching strings.
|
|
27
|
+
- **Missing hostname normalization.** Trailing FQDN dot (`localhost.`, `metadata.google.internal.`), uppercase, IPv6 brackets, IPv4-mapped and NAT64-embedded IPv6 (`::ffff:7f00:1`, `64:ff9b::7f00:1`), decimal/hex/short IPv4 (`2130706433`, `0x7f000001`, `127.1`). Check what the platform's URL parser normalizes for you and what it leaves alone.
|
|
28
|
+
- **Dead branches inside the guard.** A regex or condition that can never match the real input format (wrong number of leading colons, wrong case, checked before normalization). Prove each branch fires with a test input.
|
|
29
|
+
- **Escape scheme mismatch.** Verify the escaping matches the **downstream parser**, not a familiar one from another system: SQL-style doubled quotes in a parser that uses backslash escapes will both fail to escape (trailing `\` eats the closing quote) and corrupt legitimate values. Compare against the vendor SDK's own escaping helper.
|
|
30
|
+
- **Chained `.replace()` sanitization.** Sequential replaces re-scan their own output: an entity decoder that expands `&` before named entities still double-decodes. Prefer a single pass over the whole string, and iterate to a fixed point when stripping nested constructs.
|
|
31
|
+
- **Guard exists but call sites skip it.** Grep for the raw sink (`fetch(`, `exec(`, `innerHTML`, raw filter interpolation) and diff that list against the guard's callers. Every unguarded call site is a finding, even when a helper is "the pattern."
|
|
32
|
+
- **Validated value not the one used.** Check the URL/path/ID validated is the exact value passed to the sink (no re-parse, re-concat, or original-string fallback in between).
|
|
33
|
+
- **Check-then-use gaps.** Redirect following, DNS re-resolution, and second reads after a check (TOCTOU). Note which are closed and which are only narrowed.
|
|
34
|
+
|
|
35
|
+
Report each broken defense as a normal finding at the severity of the **underlying vulnerability it was supposed to close**, not as a documentation nit.
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
### AREA 1: Authentication & Session Management
|
|
40
|
+
|
|
41
|
+
Read all auth-related routes (login, signup, logout, password reset, OAuth) and session/cookie handling code (middleware, hooks, interceptors).
|
|
42
|
+
|
|
43
|
+
Check for:
|
|
44
|
+
- Password policy: minimum length, complexity requirements, common password blocking
|
|
45
|
+
- Login brute force protection: per-endpoint rate limiting (not just global), account lockout, exponential backoff
|
|
46
|
+
- Session token security: httpOnly, secure, sameSite flags on all auth cookies
|
|
47
|
+
- Session fixation: are sessions regenerated after login?
|
|
48
|
+
- Session invalidation: are all sessions revoked on password change or logout?
|
|
49
|
+
- Logout completeness: are all cookies and tokens properly cleared? Are clearing cookies set with correct flags?
|
|
50
|
+
- OAuth state parameter: validated on callback? Cookies for state/verifier have proper flags?
|
|
51
|
+
- User enumeration: do login vs. signup errors reveal whether an account exists? Timing side-channels?
|
|
52
|
+
- Auth token refresh: is it happening too aggressively (DoS amplification)?
|
|
53
|
+
- Cookie lifetime: are session cookies excessively long-lived?
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
### AREA 2: Authorization & Access Control (IDOR)
|
|
58
|
+
|
|
59
|
+
Read EVERY API route/endpoint in the application. For each one, verify:
|
|
60
|
+
|
|
61
|
+
- Is authentication checked? (reject unauthenticated requests)
|
|
62
|
+
- Is ownership verified? (user can only access/modify their OWN records)
|
|
63
|
+
- For admin-only routes: is admin/role status checked?
|
|
64
|
+
- For delegation/impersonation systems: are delegates properly constrained? Can they access admin functions?
|
|
65
|
+
- For multi-tenant systems: can tenant A access tenant B's data?
|
|
66
|
+
|
|
67
|
+
Specifically look for the pattern where a route parameter (like an ID) is used to fetch/modify a record WITHOUT verifying the record belongs to the requesting user. This is IDOR — the most common and most dangerous access control flaw.
|
|
68
|
+
|
|
69
|
+
Check:
|
|
70
|
+
- Every GET endpoint: can users read other users' data by changing IDs?
|
|
71
|
+
- Every PATCH/PUT endpoint: can users modify other users' records?
|
|
72
|
+
- Every DELETE endpoint: can users delete other users' records?
|
|
73
|
+
- List/search endpoints: are results filtered by the current user?
|
|
74
|
+
- File download endpoints: is file ownership verified before serving?
|
|
75
|
+
- Nested resources (e.g., /users/:id/files/:fileId): is the parent resource's ownership checked?
|
|
76
|
+
|
|
77
|
+
---
|
|
78
|
+
|
|
79
|
+
### AREA 3: Injection Attacks
|
|
80
|
+
|
|
81
|
+
#### 3a. SQL / ORM / Database Query Injection
|
|
82
|
+
- Search for raw query construction using string concatenation or template literals WITHOUT parameterization
|
|
83
|
+
- Check if the ORM or query builder is used safely everywhere
|
|
84
|
+
- Look for any raw SQL, raw MongoDB queries, or raw filter strings built from user input
|
|
85
|
+
- If a custom sanitization function exists (like a tagged template for queries), verify it's used consistently — search for cases where it's NOT used
|
|
86
|
+
|
|
87
|
+
#### 3b. XSS (Cross-Site Scripting)
|
|
88
|
+
- Search for patterns where HTML is rendered without sanitization: dangerouslySetInnerHTML (React), {@html} (Svelte), v-html (Vue), [innerHTML] (Angular), raw HTML template insertion
|
|
89
|
+
- For each instance: trace the data source. Is it user input, LLM output, scraped content, or database content?
|
|
90
|
+
- Check if sanitization (DOMPurify, sanitize-html) is applied. Does it work on BOTH server-side rendering AND client-side?
|
|
91
|
+
- Look for SSR-specific XSS: content sanitized client-side but rendered raw during server-side rendering
|
|
92
|
+
|
|
93
|
+
#### 3c. Command Injection
|
|
94
|
+
- Search for child_process, exec, spawn, system(), popen, subprocess, eval(), Function(), new Function
|
|
95
|
+
- Check if any user input reaches these sinks
|
|
96
|
+
|
|
97
|
+
#### 3d. LLM Prompt Injection (if applicable)
|
|
98
|
+
- Check if user-supplied content is passed to LLM prompts
|
|
99
|
+
- Look for prompt injection guards (system prompts, XML boundary tags, content wrapping)
|
|
100
|
+
- Check if LLM output is rendered as HTML without sanitization (connects to XSS)
|
|
101
|
+
|
|
102
|
+
---
|
|
103
|
+
|
|
104
|
+
### AREA 4: SSRF (Server-Side Request Forgery)
|
|
105
|
+
|
|
106
|
+
Search for any server-side code that makes HTTP requests based on user-supplied URLs:
|
|
107
|
+
- URL scraping, link preview, webhook delivery, image proxying, file import from URL, RSS feed fetching
|
|
108
|
+
|
|
109
|
+
For each instance, check:
|
|
110
|
+
- Is the URL scheme restricted to http/https?
|
|
111
|
+
- Are internal/private IP ranges blocked? (127.0.0.1, 10.x, 172.16-31.x, 192.168.x, 169.254.169.254, ::1, localhost, *.local, *.internal)
|
|
112
|
+
- Does the code follow redirects? Can a redirect bounce to an internal host?
|
|
113
|
+
- Is DNS rebinding considered?
|
|
114
|
+
|
|
115
|
+
---
|
|
116
|
+
|
|
117
|
+
### AREA 5: CSRF (Cross-Site Request Forgery)
|
|
118
|
+
|
|
119
|
+
- How are state-changing requests protected? (CSRF tokens, Origin header checking, SameSite cookies)
|
|
120
|
+
- Are there edge cases where protection is skipped? (missing Origin header, specific routes exempted)
|
|
121
|
+
- Are webhook/callback endpoints properly exempted from CSRF but protected by signature verification instead?
|
|
122
|
+
|
|
123
|
+
---
|
|
124
|
+
|
|
125
|
+
### AREA 6: File Handling
|
|
126
|
+
|
|
127
|
+
#### Upload:
|
|
128
|
+
- File type validation (extension, MIME type, magic bytes)
|
|
129
|
+
- File size limits
|
|
130
|
+
- Path traversal prevention (can filenames contain ../ or absolute paths?)
|
|
131
|
+
- Where are files stored? (local filesystem = dangerous, object storage = safer)
|
|
132
|
+
- Are uploaded files served with proper Content-Type and Content-Disposition headers?
|
|
133
|
+
|
|
134
|
+
#### Download/Export:
|
|
135
|
+
- Zip slip: if ZIP files are created, are filenames sanitized to prevent path traversal?
|
|
136
|
+
- Are file downloads gated by ownership checks?
|
|
137
|
+
- Can exported data leak other users' information?
|
|
138
|
+
|
|
139
|
+
---
|
|
140
|
+
|
|
141
|
+
### AREA 7: Business Logic Vulnerabilities
|
|
142
|
+
|
|
143
|
+
- Race conditions: look for non-atomic read-then-write patterns (TOCTOU). Common in: counters, usage limits, inventory, promo/coupon redemption, seat limits
|
|
144
|
+
- Entitlement bypass: are paid features enforced server-side? Can a free user call paid API endpoints directly?
|
|
145
|
+
- Promo/discount abuse: can codes be reused? Are max-redemption limits atomic? Can signup be raced to bypass per-user limits?
|
|
146
|
+
- Payment/billing: are webhook signatures verified? Can subscription status be forged? Are success/cancel URLs controlled server-side?
|
|
147
|
+
- Limit enforcement: if there are usage quotas, are they checked AND decremented atomically?
|
|
148
|
+
|
|
149
|
+
---
|
|
150
|
+
|
|
151
|
+
### AREA 8: Data Exposure
|
|
152
|
+
|
|
153
|
+
- API responses: do they include sensitive fields that shouldn't be exposed? (password hashes, internal IDs, tokens, other users' data, full error stacks)
|
|
154
|
+
- Error handling: do error responses include stack traces, library names, file paths, or SQL queries?
|
|
155
|
+
- Logging: are secrets, tokens, or PII logged?
|
|
156
|
+
- Source maps: are they enabled in production builds?
|
|
157
|
+
- Environment variables: are any secrets exposed to the client via public env var prefixes (NEXT_PUBLIC_, VITE_, REACT_APP_)?
|
|
158
|
+
|
|
159
|
+
---
|
|
160
|
+
|
|
161
|
+
### AREA 9: Rate Limiting & DoS
|
|
162
|
+
|
|
163
|
+
- Is rate limiting implemented? Per-IP? Per-user? Per-endpoint?
|
|
164
|
+
- Are expensive operations (LLM calls, file processing, scraping) separately rate-limited?
|
|
165
|
+
- Is the rate limiter in-memory (won't scale across instances) or shared (Redis)?
|
|
166
|
+
- Can an attacker amplify requests? (e.g., one request triggers multiple downstream requests)
|
|
167
|
+
- Are there unbounded loops, unlimited pagination, or missing timeouts?
|
|
168
|
+
|
|
169
|
+
---
|
|
170
|
+
|
|
171
|
+
### AREA 10: Secrets & Configuration
|
|
172
|
+
|
|
173
|
+
- Search for hardcoded secrets, API keys, passwords in source code
|
|
174
|
+
- Check if .env files are committed to version control (git ls-files .env)
|
|
175
|
+
- Check .gitignore for proper exclusion of secret files
|
|
176
|
+
- Review environment variable usage: are secrets only accessed server-side?
|
|
177
|
+
- Check for default credentials in setup scripts or seed data
|
|
178
|
+
|
|
179
|
+
---
|
|
180
|
+
|
|
181
|
+
### AREA 11: Dependencies
|
|
182
|
+
|
|
183
|
+
- Check package.json / requirements.txt / go.mod for known vulnerable packages
|
|
184
|
+
- Note any unmaintained or deprecated dependencies
|
|
185
|
+
- Check for overly permissive version ranges that could pull in compromised packages
|
|
186
|
+
|
|
187
|
+
---
|
|
188
|
+
|
|
189
|
+
## OUTPUT FORMAT
|
|
190
|
+
|
|
191
|
+
Produce a structured markdown report with:
|
|
192
|
+
|
|
193
|
+
### 1. Executive Summary
|
|
194
|
+
- Total findings count by severity (CRITICAL / HIGH / MEDIUM / LOW / INFO)
|
|
195
|
+
- 2-3 sentence summary of the most impactful issues
|
|
196
|
+
- Overall security posture assessment
|
|
197
|
+
|
|
198
|
+
### 2. Findings (grouped by severity)
|
|
199
|
+
For each finding:
|
|
200
|
+
- **ID**: Severity-prefixed sequential ID (C1, C2, H1, H2, M1, etc.)
|
|
201
|
+
- **Title**: Concise description
|
|
202
|
+
- **File**: Path and line numbers
|
|
203
|
+
- **Impact**: What an attacker can achieve
|
|
204
|
+
- **Code snippet**: The vulnerable code
|
|
205
|
+
- **Attack scenario**: Step-by-step exploitation
|
|
206
|
+
- **Fix**: Specific, actionable remediation with code example
|
|
207
|
+
|
|
208
|
+
### 3. Positive Findings
|
|
209
|
+
Table of what's done well — give credit for good security practices. This helps the developer understand which patterns to replicate.
|
|
210
|
+
|
|
211
|
+
### 4. Remediation Priority
|
|
212
|
+
Group fixes into:
|
|
213
|
+
- **Immediate** (before launch / this week): anything directly exploitable
|
|
214
|
+
- **Short-term** (next sprint): defense-in-depth, hardening
|
|
215
|
+
- **Backlog**: nice-to-haves, future-proofing
|
|
216
|
+
|
|
217
|
+
---
|
|
218
|
+
|
|
219
|
+
## RULES
|
|
220
|
+
|
|
221
|
+
- Read actual source code for every finding. Do not hallucinate file paths or code that doesn't exist.
|
|
222
|
+
- Verify each finding. If a defense exists, note it. Don't report mitigated issues as vulnerabilities.
|
|
223
|
+
- A defense counts as effective only when you can name the inputs it rejects. Prefer a regression test (one that fails against the pre-fix code) over prose; cite it in the report.
|
|
224
|
+
- Never mark a prior finding remediated because a fix was committed. Re-read the current code and re-run the bypass inputs.
|
|
225
|
+
- Include severity justification based on exploitability and impact, not just theoretical risk.
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
---
|
|
229
|
+
|
|
230
|
+
## Usage Notes
|
|
231
|
+
|
|
232
|
+
- For large codebases, consider running 2-3 subagents in parallel, each covering a subset of audit areas. This produces better coverage than a single pass.
|
|
233
|
+
- After generating the report, use the `BLACK_HAT_REPORT.md` template to structure the output.
|
|
234
|
+
- Triage findings into TODO.md immediately: P0 (Critical + exploitable High), P1 (defense-in-depth High + critical-path Medium), P2 (remaining Medium + Low + Info).
|
|
235
|
+
- Re-run the audit after major feature additions or when preparing a new release.
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# Brand Copy Edit Pass
|
|
2
|
+
|
|
3
|
+
A reusable prompt for making an editorial pass on brand, product, or marketing copy. Designed for docs like `BRAND_AND_PRODUCT.md` but applicable to any long-form brand or product narrative.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## The Prompt
|
|
8
|
+
|
|
9
|
+
Review this file and make three sequential editing passes:
|
|
10
|
+
|
|
11
|
+
### Pass 1: Resolve Annotations
|
|
12
|
+
|
|
13
|
+
Look for any sections, phrases, or words marked with `[]` square brackets. Inside the brackets there may be comments in parentheses `()` explaining what needs to change. For each annotation:
|
|
14
|
+
|
|
15
|
+
- Read the surrounding context to understand intent and tone
|
|
16
|
+
- Propose and implement a replacement that addresses the comment
|
|
17
|
+
- Match the voice and sophistication level of the surrounding prose
|
|
18
|
+
- Remove the bracket markers entirely when done
|
|
19
|
+
|
|
20
|
+
If a comment asks for a new paragraph or expanded content, write it in the same voice as the rest of the document. Do not add filler — every new sentence should carry weight.
|
|
21
|
+
|
|
22
|
+
### Pass 2: Deduplicate
|
|
23
|
+
|
|
24
|
+
Make a pass to identify repetition. Preserve all specifics, details, nuance, and clever phraseology — the goal is trimming redundancy, not flattening the writing.
|
|
25
|
+
|
|
26
|
+
Look for:
|
|
27
|
+
|
|
28
|
+
- The same argument made at full length in two different sections
|
|
29
|
+
- Near-identical phrases reused within a few paragraphs of each other
|
|
30
|
+
- Itemized lists that echo each other across sections
|
|
31
|
+
- Closing lines that repeat the emotional beat of an earlier section
|
|
32
|
+
|
|
33
|
+
For each instance, decide which location is the strongest home for the idea and trim or vary the other. Do not delete good lines — relocate or rephrase them if their current position is redundant.
|
|
34
|
+
|
|
35
|
+
### Pass 3: Kill Filler Words
|
|
36
|
+
|
|
37
|
+
Search for soft, unnecessary words that weaken the prose without adding meaning. Common offenders:
|
|
38
|
+
|
|
39
|
+
- **"real"** (as in "the real work", "the real burden") — either drop or replace with something more specific
|
|
40
|
+
- **"really"**, **"very"**, **"just"**, **"quite"**, **"actually"** — drop unless doing deliberate rhetorical work
|
|
41
|
+
- **"helps"** — often too weak for what the product does; consider "equips", "enables", "delivers"
|
|
42
|
+
- **"things"**, **"stuff"** — replace with the specific noun
|
|
43
|
+
- **"in order to"** — replace with "to"
|
|
44
|
+
- **"a number of"** — replace with the actual number or "several"
|
|
45
|
+
|
|
46
|
+
For each filler word found: drop it if the sentence is stronger without it, or replace it with something that earns its place.
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
## Usage Notes
|
|
51
|
+
|
|
52
|
+
- Run all three passes in sequence, not in parallel — Pass 2 depends on Pass 1's output, and Pass 3 benefits from the tighter text after Pass 2.
|
|
53
|
+
- Show a summary table of changes after each pass so the author can review.
|
|
54
|
+
- When in doubt about whether to cut, keep. The author's voice and specificity take priority over brevity.
|
|
55
|
+
- This prompt works on any long-form brand doc, product narrative, or marketing page copy.
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
# Cialdini Influence Audit for Landing Page & Marketing
|
|
2
|
+
|
|
3
|
+
Audit your landing page, pricing section, and product touchpoints through the lens of Robert Cialdini's seven principles of influence (_Influence_ and _Pre-Suasion_). Produces a prioritized list of specific copy, UI, and structural changes that strengthen conversion without compromising brand authenticity.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## When to Run
|
|
8
|
+
|
|
9
|
+
- Before spending on paid acquisition channels
|
|
10
|
+
- After building your landing page but before launch
|
|
11
|
+
- When conversion rates plateau and you need a structured diagnostic
|
|
12
|
+
|
|
13
|
+
## Prerequisites
|
|
14
|
+
|
|
15
|
+
Read these documents fully before beginning the audit:
|
|
16
|
+
|
|
17
|
+
1. **BRAND_AND_PRODUCT.md** — voice, positioning, audience, what you're NOT
|
|
18
|
+
2. **BUSINESS_PLAN.md** — pricing, target segment, growth channels
|
|
19
|
+
3. **The landing page source code** — actual copy, layout, CTAs, pricing cards
|
|
20
|
+
4. **Any existing social proof** — testimonials, user counts, press mentions
|
|
21
|
+
|
|
22
|
+
## The Seven Principles — Audit Framework
|
|
23
|
+
|
|
24
|
+
For each principle, assess:
|
|
25
|
+
|
|
26
|
+
1. **Current state:** What's already in place (even partially)?
|
|
27
|
+
2. **Gap severity:** Critical / Medium / Low / N/A
|
|
28
|
+
3. **Prescriptions:** Specific, implementable changes with exact copy suggestions
|
|
29
|
+
4. **Implementation priority:** Effort vs. impact ranking
|
|
30
|
+
|
|
31
|
+
### 1. Social Proof
|
|
32
|
+
|
|
33
|
+
> "People follow the lead of similar others."
|
|
34
|
+
|
|
35
|
+
Check for: user counts, testimonials, logos, outcome data, case studies, activity indicators, success stories. Social proof is consistently the #1 conversion driver for SaaS landing pages.
|
|
36
|
+
|
|
37
|
+
Prescriptions to consider:
|
|
38
|
+
|
|
39
|
+
- **Aggregate proof counters** — "[N] [users] have [done X] this month." Even small numbers work if framed as curated.
|
|
40
|
+
- **Outcome-framed testimonials** — Quote focused on the _experience_, not the tool. Include title level, not name.
|
|
41
|
+
- **Peer specificity strip** — "Built for [Title A] · [Title B] · [Title C]." The titles are the proof that peers use this.
|
|
42
|
+
- **Activity ticker** — Real-time anonymized activity. Only show when real data exists — never fabricate.
|
|
43
|
+
|
|
44
|
+
### 2. Authority
|
|
45
|
+
|
|
46
|
+
> "People defer to credible experts."
|
|
47
|
+
|
|
48
|
+
Check for: domain expertise signals in copy, methodology framing, external validation (press, endorsements), builder credentials.
|
|
49
|
+
|
|
50
|
+
Prescriptions to consider:
|
|
51
|
+
|
|
52
|
+
- **Domain expertise in feature copy** — Name specific tools, platforms, or methods your audience recognizes. Generic descriptions like "analyzes your resume" are weaker than "shows how [specific platform] will parse your resume."
|
|
53
|
+
- **Methodology authority** — Frame your approach as borrowed from established practice: "The [methodology] is standard practice at [credible entities]."
|
|
54
|
+
- **Builder credibility** — If the founder has relevant credentials, a one-line note adds authority. Only if authentic.
|
|
55
|
+
|
|
56
|
+
### 3. Scarcity
|
|
57
|
+
|
|
58
|
+
> "People want more of what they can have less of."
|
|
59
|
+
|
|
60
|
+
Check for: trial expiration framing, loss language, natural urgency signals. For professional audiences, manufactured urgency (countdown timers, limited slots) backfires badly.
|
|
61
|
+
|
|
62
|
+
Prescriptions to consider:
|
|
63
|
+
|
|
64
|
+
- **Loss-framed trial CTA** — Name what stops working after trial, don't just say "upgrade." "After [N] days, [specific features] lock — but everything you built stays."
|
|
65
|
+
- **Bandwidth scarcity** (natural) — "Your [search/project/window] is finite. Every week without [your value prop] is a week of [concrete cost]."
|
|
66
|
+
- **Opportunity cost anchor** — Professional service comparisons placed ABOVE the pricing grid, not below. Cialdini's contrast principle requires the expensive reference point before your price.
|
|
67
|
+
|
|
68
|
+
**Do NOT do:** Fake countdown timers, limited-slot messaging, or "only X left" tactics for professional audiences.
|
|
69
|
+
|
|
70
|
+
### 4. Reciprocity
|
|
71
|
+
|
|
72
|
+
> "People feel obligated to return favors."
|
|
73
|
+
|
|
74
|
+
Check for: free value before asking for commitment, trial generosity, useful content without paywall.
|
|
75
|
+
|
|
76
|
+
Prescriptions to consider:
|
|
77
|
+
|
|
78
|
+
- **Generous trial scope** — Full access during trial (not feature-limited). Give the best experience before asking for money.
|
|
79
|
+
- **Free tools / content** — One genuinely useful feature or resource that works without signup.
|
|
80
|
+
|
|
81
|
+
### 5. Commitment & Consistency
|
|
82
|
+
|
|
83
|
+
> "People align with their prior commitments."
|
|
84
|
+
|
|
85
|
+
Check for: progressive engagement, micro-commitments before the purchase decision, sunk-cost visibility.
|
|
86
|
+
|
|
87
|
+
Prescriptions to consider:
|
|
88
|
+
|
|
89
|
+
- **Progress visibility** — Show users what they've built during trial. "You've created N [items], customized M [things], and researched K [entities]."
|
|
90
|
+
- **Friction-free trial start** — No credit card upfront. Each setup step is a micro-commitment that increases switching cost.
|
|
91
|
+
|
|
92
|
+
### 6. Liking
|
|
93
|
+
|
|
94
|
+
> "People prefer to say yes to those they like."
|
|
95
|
+
|
|
96
|
+
Check for: brand personality, visual warmth, origin story, relatability.
|
|
97
|
+
|
|
98
|
+
Prescriptions to consider:
|
|
99
|
+
|
|
100
|
+
- **Origin story** — If authentic, a brief "why I built this" narrative builds parasocial connection.
|
|
101
|
+
- **Visual warmth** — Warm color palettes, friendly (not clinical) UI feel. The design system itself is a liking signal.
|
|
102
|
+
|
|
103
|
+
### 7. Unity
|
|
104
|
+
|
|
105
|
+
> "People assent to those they see as 'one of us.'"
|
|
106
|
+
|
|
107
|
+
Check for: shared identity signals, in-group language, community belonging.
|
|
108
|
+
|
|
109
|
+
Prescriptions to consider:
|
|
110
|
+
|
|
111
|
+
- **Identity language** — "[You're not an applicant, you're a [identity term]]." Status-elevating self-concept.
|
|
112
|
+
- **Shared experience naming** — Reference specific frustrations your audience has. "You've been asked 'what's your current salary expectations?' three times this week."
|
|
113
|
+
|
|
114
|
+
## Output Format
|
|
115
|
+
|
|
116
|
+
For each principle, produce:
|
|
117
|
+
|
|
118
|
+
```markdown
|
|
119
|
+
### [Principle Name]
|
|
120
|
+
|
|
121
|
+
**Current state:** [What exists]
|
|
122
|
+
**Gap severity:** [Critical/Medium/Low]
|
|
123
|
+
**Prescriptions:**
|
|
124
|
+
| # | Tactic | Where | Copy / Detail | Priority |
|
|
125
|
+
| --- | --- | --- | --- | --- |
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
Then a summary section:
|
|
129
|
+
|
|
130
|
+
```markdown
|
|
131
|
+
## Implementation Priority
|
|
132
|
+
|
|
133
|
+
| Phase | Tactic IDs | Effort | Expected Impact |
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
## Constraints
|
|
137
|
+
|
|
138
|
+
- **Honest over manipulative.** Every persuasion tactic must be grounded in truth. Never fabricate social proof, manufacture urgency, or claim credentials that don't exist.
|
|
139
|
+
- **Audience-calibrated.** Professional audiences are skeptical. Tactics that work for consumer products (countdown timers, hype language) damage trust here.
|
|
140
|
+
- **Brand-consistent.** All copy suggestions must match the established brand voice. Read BRAND_AND_PRODUCT.md before writing any copy.
|
|
141
|
+
- **Actionable specificity.** Don't just say "add social proof." Say exactly what to add, where, and with what copy.
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
# Competitor Deep Dive
|
|
2
|
+
|
|
3
|
+
A reusable prompt for producing a structured competitive analysis document. Takes a competitor URL, researches their product thoroughly, compares it against your own positioning and features, and outputs a strategic comparison doc. Works for any product-to-product comparison where you have brand, business, and feature documentation.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## When to Run
|
|
8
|
+
|
|
9
|
+
- When you discover a direct or adjacent competitor
|
|
10
|
+
- Before major positioning or pricing decisions
|
|
11
|
+
- When prospects ask "how are you different from X?"
|
|
12
|
+
|
|
13
|
+
## Prerequisites
|
|
14
|
+
|
|
15
|
+
Provide:
|
|
16
|
+
|
|
17
|
+
1. **The competitor's URL** — the public website to research.
|
|
18
|
+
2. **BRAND_AND_PRODUCT.md** — your product's voice, positioning, audience, and emotional framing.
|
|
19
|
+
3. **BUSINESS_PLAN.md** — your product's pricing, growth strategy, and market positioning.
|
|
20
|
+
4. **The product feature source** — the component, doc, or spec that lists all current features with descriptions.
|
|
21
|
+
5. **USER_PITCH.md or equivalent** — the narrative framing used to describe your product to prospects.
|
|
22
|
+
|
|
23
|
+
Read all internal docs fully before beginning competitor research.
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## The Prompt
|
|
28
|
+
|
|
29
|
+
You are a product strategist and competitive intelligence analyst. You are about to produce a deep-dive competitor comparison document.
|
|
30
|
+
|
|
31
|
+
### Phase 1: Competitor Research
|
|
32
|
+
|
|
33
|
+
Fetch and analyze the competitor's public-facing pages. At minimum:
|
|
34
|
+
|
|
35
|
+
- **Homepage** — tagline, hero copy, value proposition, social proof claims, testimonial titles/industries
|
|
36
|
+
- **Pricing page** — all tiers, prices, billing cadence, feature gating, free tier details
|
|
37
|
+
- **Features page** (if separate) — full feature list with descriptions
|
|
38
|
+
- **How-it-works flow** — what the user does vs. what the product does
|
|
39
|
+
- **Footer links** — look for "For Business," "Partners," "Comparisons," "About Us" for additional positioning signals
|
|
40
|
+
|
|
41
|
+
Extract and organize:
|
|
42
|
+
|
|
43
|
+
| Data Point | What to Capture |
|
|
44
|
+
| -------------------------- | ------------------------------------------------------------------------------- |
|
|
45
|
+
| **Tagline / hero claim** | Exact text |
|
|
46
|
+
| **Core value proposition** | One-sentence summary of what they promise |
|
|
47
|
+
| **Target audience** | Inferred from testimonials, copy, pricing, and use cases |
|
|
48
|
+
| **Pricing** | All tiers with prices and key limits — normalize to monthly for comparison |
|
|
49
|
+
| **Feature list** | Every distinct feature with a one-line description |
|
|
50
|
+
| **Social proof** | User counts, press mentions, testimonial job titles |
|
|
51
|
+
| **Philosophy** | Implicit product philosophy (automation vs. strategy, volume vs. quality, etc.) |
|
|
52
|
+
| **What they DON'T do** | Gaps, missing categories, explicit disclaimers |
|
|
53
|
+
|
|
54
|
+
### Phase 2: Internal Product Catalog
|
|
55
|
+
|
|
56
|
+
From the internal docs, build the equivalent catalog for your own product:
|
|
57
|
+
|
|
58
|
+
- Target audience (titles, seniority, context)
|
|
59
|
+
- Pricing tiers with limits and key differences
|
|
60
|
+
- Complete feature list organized by category
|
|
61
|
+
- Product philosophy and explicit non-goals
|
|
62
|
+
- Current social proof assets (or lack thereof)
|
|
63
|
+
|
|
64
|
+
This side of the comparison should be **factual and current** — based on what's shipped, not what's planned.
|
|
65
|
+
|
|
66
|
+
### Phase 3: Positioning Comparison
|
|
67
|
+
|
|
68
|
+
Write a side-by-side positioning table that captures the strategic differences:
|
|
69
|
+
|
|
70
|
+
| Dimension | Questions to Answer |
|
|
71
|
+
| -------------------- | ---------------------------------------------------------------- |
|
|
72
|
+
| **Tagline** | What does each product lead with? |
|
|
73
|
+
| **Core promise** | What outcome does each product sell? |
|
|
74
|
+
| **Philosophy** | Volume vs. quality? Automation vs. control? Speed vs. depth? |
|
|
75
|
+
| **Automation model** | What does the product do autonomously vs. what does the user do? |
|
|
76
|
+
| **User's role** | Passive (set-and-forget) vs. active (judgment-centric)? |
|
|
77
|
+
| **Input required** | What does the user provide, and how often? |
|
|
78
|
+
| **Output delivered** | What does the user get back? |
|
|
79
|
+
|
|
80
|
+
### Phase 4: Feature Matrix
|
|
81
|
+
|
|
82
|
+
Build a detailed feature comparison organized by functional category. Adapt categories to the actual products being compared.
|
|
83
|
+
|
|
84
|
+
For each feature:
|
|
85
|
+
|
|
86
|
+
- ✅ = core feature, available on most/all plans
|
|
87
|
+
- ⚡ = available but gated (higher tier only)
|
|
88
|
+
- ❌ = not offered
|
|
89
|
+
- Add a brief note where implementations differ meaningfully
|
|
90
|
+
|
|
91
|
+
Don't inflate your product's capabilities or minimize the competitor's. Honest assessment builds trust with anyone reading this doc internally.
|
|
92
|
+
|
|
93
|
+
### Phase 4b: Feature/Positioning Vocabulary Expansion (brainstorm then bucket)
|
|
94
|
+
|
|
95
|
+
_Optional enrichment step. Run this after the feature matrix to discover comparison dimensions you missed._
|
|
96
|
+
|
|
97
|
+
**Step 1: Generate a capabilities vocabulary.** From both products, the broader market, and adjacent categories, generate a flat list of 80-120 capabilities, claims, and positioning concepts — not just features, but also claims about outcomes, philosophies, and audience signals. Include capabilities neither product has but that buyers might expect.
|
|
98
|
+
|
|
99
|
+
> Example: For a career tool comparison, this list would include not just "resume tailoring" and "ATS scoring" but also "employer branding signals," "salary benchmarking," "interview scheduling," "alumni network access," "executive presence coaching," "board placement" — capabilities that define the edges of the competitive space.
|
|
100
|
+
|
|
101
|
+
**Step 2: Bucket against your differentiator categories.** Score each capability against your product's core differentiator dimensions (from BRAND_AND_PRODUCT.md "What Makes It Different" and the Phase 3 positioning comparison). For each capability, ask: which differentiator dimension(s) does this serve?
|
|
102
|
+
|
|
103
|
+
**Step 3: Review for strategic signals.**
|
|
104
|
+
|
|
105
|
+
- **Capabilities that land in multiple differentiator dimensions** — these are high-leverage features worth building or emphasizing
|
|
106
|
+
- **Differentiator dimensions with very few capabilities** — either the dimension is thin (reconsider it) or there is genuine whitespace (opportunity)
|
|
107
|
+
- **Capabilities that don't fit any dimension** — potential new competitive axes or features to explicitly declare out of scope
|
|
108
|
+
- **Capabilities the competitor has that you bucketed into YOUR differentiator** — these threaten your positioning and deserve attention in the threat assessment
|
|
109
|
+
|
|
110
|
+
**Step 4: Feed into Phases 5-7.** The enriched capability map makes the strengths analysis (Phase 5) and strategic implications (Phase 7) more complete. Capabilities you discovered in this step that neither product offers become roadmap candidates or explicit non-goals.
|
|
111
|
+
|
|
112
|
+
### Phase 5: Competitive Strengths
|
|
113
|
+
|
|
114
|
+
Two sections:
|
|
115
|
+
|
|
116
|
+
#### Where the Competitor Wins
|
|
117
|
+
|
|
118
|
+
List 5–8 genuine advantages the competitor has. For each:
|
|
119
|
+
|
|
120
|
+
- State the advantage concretely
|
|
121
|
+
- Note why it matters to their target audience
|
|
122
|
+
- Assess whether it matters to YOUR target audience (it may not)
|
|
123
|
+
|
|
124
|
+
#### Where You Win
|
|
125
|
+
|
|
126
|
+
List 5–8 genuine advantages your product has. For each:
|
|
127
|
+
|
|
128
|
+
- State the advantage concretely
|
|
129
|
+
- Note why it matters to your target audience
|
|
130
|
+
- Assess whether the competitor could close this gap easily (incremental improvement vs. architectural rebuild)
|
|
131
|
+
|
|
132
|
+
### Phase 6: Threat Assessment
|
|
133
|
+
|
|
134
|
+
#### Direct Competition Risk
|
|
135
|
+
|
|
136
|
+
Rate as **High**, **Medium**, or **Low** with a one-paragraph justification. Consider:
|
|
137
|
+
|
|
138
|
+
- Audience overlap (do you fight for the same users?)
|
|
139
|
+
- Feature substitutability (could one replace the other?)
|
|
140
|
+
- Price comparison (does the cheaper one cannibalize the expensive one?)
|
|
141
|
+
- Switching costs (how easy is it to move between them?)
|
|
142
|
+
|
|
143
|
+
#### Indirect Risks
|
|
144
|
+
|
|
145
|
+
| Risk | Severity | Notes |
|
|
146
|
+
| ------------------------ | -------- | ------------------------------------------------------ |
|
|
147
|
+
| Category confusion | ? | Will prospects lump you together and compare on price? |
|
|
148
|
+
| Feature creep from below | ? | Could they incrementally add your differentiators? |
|
|
149
|
+
| SEO / discoverability | ? | Do they dominate your keyword space? |
|
|
150
|
+
| Social proof gap | ? | Do they have stronger credibility signals? |
|
|
151
|
+
| Upstream platform risk | ? | Do they control a distribution channel you depend on? |
|
|
152
|
+
|
|
153
|
+
#### Non-Threats
|
|
154
|
+
|
|
155
|
+
Explicitly list competitive scenarios that look scary on the surface but aren't real risks — and explain why. Prevents reactive decision-making.
|
|
156
|
+
|
|
157
|
+
### Phase 7: Strategic Implications
|
|
158
|
+
|
|
159
|
+
Organize recommendations into three buckets:
|
|
160
|
+
|
|
161
|
+
#### Messaging
|
|
162
|
+
|
|
163
|
+
- How to frame your product when prospects have seen the competitor
|
|
164
|
+
- Language to use (and avoid) to prevent category confusion
|
|
165
|
+
- Right comparison anchor for pricing (other tools? professional services? opportunity cost?)
|
|
166
|
+
|
|
167
|
+
#### Product
|
|
168
|
+
|
|
169
|
+
- Competitor features worth building — because they serve YOUR audience, not just because the competitor has them
|
|
170
|
+
- Competitor features to explicitly NOT build — because they conflict with your positioning
|
|
171
|
+
- Where to leapfrog instead of matching
|
|
172
|
+
|
|
173
|
+
#### Go-to-Market
|
|
174
|
+
|
|
175
|
+
- Search terms, content topics, and channels the competitive landscape suggests
|
|
176
|
+
- How testimonials and social proof need to differ from the competitor's
|
|
177
|
+
- Partnerships, integrations, or channels the competitor's model can't access
|
|
178
|
+
|
|
179
|
+
## Constraints
|
|
180
|
+
|
|
181
|
+
- **Accuracy over advocacy.** This is an internal strategic tool, not marketing copy. Be honest about where the competitor is stronger.
|
|
182
|
+
- **Evidence-based claims.** Every claim about the competitor should trace back to their public pages. Every claim about your product should trace back to shipped code or published docs. Don't compare your roadmap to their current product.
|
|
183
|
+
- **Audience awareness.** A feature critical for their audience may be irrelevant to yours. Always contextualize through the lens of who actually uses each product.
|
|
184
|
+
- **No manufactured urgency.** If the competitive threat is low, say so. The most useful output is an accurate landscape read, not an argument for panic.
|
|
185
|
+
|
|
186
|
+
## Output Format
|
|
187
|
+
|
|
188
|
+
Save as `docs/COMPETITOR_[NAME].md` with:
|
|
189
|
+
|
|
190
|
+
```
|
|
191
|
+
# Competitor Analysis: [Competitor] vs. [Your Product]
|
|
192
|
+
## Executive Summary (3–5 sentences)
|
|
193
|
+
## Positioning at a Glance (table)
|
|
194
|
+
## Target Audience (table)
|
|
195
|
+
## Pricing Comparison (tables with analysis)
|
|
196
|
+
## Feature Comparison Matrix (categorized tables)
|
|
197
|
+
## Competitive Strengths (two sections: theirs and yours)
|
|
198
|
+
## Threat Assessment (direct risk + indirect risks table + non-threats)
|
|
199
|
+
## Strategic Implications (messaging, product, go-to-market)
|
|
200
|
+
## Summary (2–3 sentence capstone)
|
|
201
|
+
```
|