@plannotator/pi-extension 0.15.3 → 0.15.4

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@plannotator/pi-extension",
3
- "version": "0.15.3",
3
+ "version": "0.15.4",
4
4
  "type": "module",
5
5
  "description": "Plannotator extension for Pi coding agent - interactive plan review with visual annotation",
6
6
  "author": "backnotprop",
@@ -16,7 +16,8 @@
16
16
  },
17
17
  "keywords": ["pi-package", "plannotator", "plan-review", "ai-agent", "coding-agent"],
18
18
  "pi": {
19
- "extensions": ["./"]
19
+ "extensions": ["./"],
20
+ "skills": ["./skills"]
20
21
  },
21
22
  "files": [
22
23
  "index.ts",
@@ -26,10 +27,11 @@
26
27
  "generated/",
27
28
  "README.md",
28
29
  "plannotator.html",
29
- "review-editor.html"
30
+ "review-editor.html",
31
+ "skills/"
30
32
  ],
31
33
  "scripts": {
32
- "build": "cp ../hook/dist/index.html plannotator.html && cp ../hook/dist/review.html review-editor.html && mkdir -p generated && for f in feedback-templates review-core storage draft project pr-provider pr-github pr-gitlab checklist integrations-common repo reference-common favicon resolve-file; do src=\"../../packages/shared/$f.ts\"; printf '// @generated — DO NOT EDIT. Source: packages/shared/%s.ts\\n' \"$f\" | cat - \"$src\" > \"generated/$f.ts\"; done && mkdir -p generated/ai/providers && for f in index types provider session-manager endpoints context base-session; do src=\"../../packages/ai/$f.ts\"; printf '// @generated — DO NOT EDIT. Source: packages/ai/%s.ts\\n' \"$f\" | cat - \"$src\" > \"generated/ai/$f.ts\"; done && for f in claude-agent-sdk codex-sdk opencode-sdk pi-sdk pi-sdk-node pi-events; do src=\"../../packages/ai/providers/$f.ts\"; printf '// @generated — DO NOT EDIT. Source: packages/ai/providers/%s.ts\\n' \"$f\" | cat - \"$src\" > \"generated/ai/providers/$f.ts\"; done",
34
+ "build": "cp ../hook/dist/index.html plannotator.html && cp ../hook/dist/review.html review-editor.html && rm -rf skills && cp -r ../skills skills && mkdir -p generated && for f in feedback-templates review-core storage draft project pr-provider pr-github pr-gitlab checklist integrations-common repo reference-common favicon resolve-file; do src=\"../../packages/shared/$f.ts\"; printf '// @generated — DO NOT EDIT. Source: packages/shared/%s.ts\\n' \"$f\" | cat - \"$src\" > \"generated/$f.ts\"; done && mkdir -p generated/ai/providers && for f in index types provider session-manager endpoints context base-session; do src=\"../../packages/ai/$f.ts\"; printf '// @generated — DO NOT EDIT. Source: packages/ai/%s.ts\\n' \"$f\" | cat - \"$src\" > \"generated/ai/$f.ts\"; done && for f in claude-agent-sdk codex-sdk opencode-sdk pi-sdk pi-sdk-node pi-events; do src=\"../../packages/ai/providers/$f.ts\"; printf '// @generated — DO NOT EDIT. Source: packages/ai/providers/%s.ts\\n' \"$f\" | cat - \"$src\" > \"generated/ai/providers/$f.ts\"; done",
33
35
  "prepublishOnly": "cd ../.. && bun run build:pi"
34
36
  },
35
37
  "peerDependencies": {
@@ -0,0 +1,402 @@
1
+ ---
2
+ name: plannotator-compound
3
+ description: >
4
+ Analyze a user's Plannotator plan archive to extract denial patterns, feedback
5
+ taxonomy, evolution over time, and actionable prompt improvements — then produce
6
+ a polished HTML dashboard report. Use this skill when the user says things like
7
+ "/compound-planning", "analyze my plans", "plan analysis", "what are my denial
8
+ patterns", "why do my plans get denied", "compound planning report", "plan
9
+ insights", or "analyze my planning data". This is a user-invoked skill only —
10
+ do not trigger automatically. The user must explicitly request it.
11
+ ---
12
+
13
+ # Compound Planning Analysis
14
+
15
+ You are conducting a comprehensive research analysis of a user's Plannotator plan
16
+ archive. The goal: extract patterns from their denied plans and annotations, reduce
17
+ them into actionable insights, and produce an elegant HTML dashboard report.
18
+
19
+ This is a multi-phase process. Each phase must complete fully before the next begins.
20
+ Research integrity is paramount — every file must be read, no skipping.
21
+
22
+ ## Phase 0: Locate the Plans Directory
23
+
24
+ Check for `~/.plannotator/plans/`. If it exists and contains `.md` files, proceed.
25
+
26
+ If not found, ask the user:
27
+ > "I couldn't find plans at ~/.plannotator/plans/. Where is your plans directory?"
28
+
29
+ Once you have the path, verify it contains files matching `*-denied.md` and/or
30
+ `*.annotations.md`. If neither exist, inform the user there's no denial/annotation
31
+ data to analyze and stop.
32
+
33
+ ## Phase 1: Inventory
34
+
35
+ Count and report the dataset:
36
+
37
+ ```
38
+ - *-approved.md files (count)
39
+ - *-denied.md files (count)
40
+ - *.annotations.md files (count)
41
+ - *.diff.md files (count)
42
+ - Date range (earliest to latest date found in filenames)
43
+ - Total days spanned
44
+ - Revision rate: denied / (approved + denied) — this is the "X% of plans
45
+ revised before coding" stat used in dashboard section 1
46
+ ```
47
+
48
+ Also run `wc -l` across all `*-approved.md` files to get average lines per
49
+ approved plan. This tells the user whether their plans are staying lightweight
50
+ or bloating over time. You do not need to read approved plan contents — just
51
+ their line counts. If possible, break this down by time period (e.g., monthly)
52
+ to show whether plan size changed.
53
+
54
+ Dates appear in filenames in YYYY-MM-DD format, sometimes as a prefix
55
+ (2026-01-07-name-approved.md) and sometimes embedded (name-2026-03-15-approved.md).
56
+ Extract dates from all filenames.
57
+
58
+ Tell the user what you found and that you're beginning the extraction.
59
+
60
+ ## Phase 2: Map — Parallel Extraction
61
+
62
+ This is the most time-intensive phase. You must read EVERY denied plan and EVERY
63
+ annotation file. Do not skip files. Do not summarize early.
64
+
65
+ **Important:** Do NOT read approved plan files. They are counted in the inventory
66
+ for context (total volume, approval rate) but are not analyzed for feedback
67
+ patterns. Only `*-denied.md` and `*.annotations.md` files contain the feedback
68
+ data this analysis needs.
69
+
70
+ ### Batching Strategy
71
+
72
+ The approach depends on dataset size:
73
+
74
+ **Small datasets (< 40 total files):** Read all files directly — no need for
75
+ parallel agents. Just read them sequentially and proceed to Phase 3.
76
+
77
+ **Medium datasets (40-120 files):** Split into 2-4 parallel agents by file type
78
+ and/or time period.
79
+
80
+ **Large datasets (120+ files):** Split into batches of ~40-60 files per agent.
81
+ Split by the natural time boundaries in the data (months, quarters, or whatever
82
+ groupings produce balanced batches). If one time period dominates (e.g., the most
83
+ recent month has 3x the files), split that period into two batches.
84
+
85
+ Launch all extraction agents in parallel using the Agent tool with
86
+ `run_in_background: true`.
87
+
88
+ ### Output Files
89
+
90
+ Each extraction agent must write its results to a clean output file rather than
91
+ relying on the agent task output (which contains interleaved JSONL framework
92
+ logs that are difficult to parse). Instruct each agent to write to:
93
+
94
+ ```
95
+ /tmp/compound-planning/extraction-{batch-name}.md
96
+ ```
97
+
98
+ Create the `/tmp/compound-planning/` directory before launching agents. The
99
+ reduce agent in Phase 3 will read these clean files directly.
100
+
101
+ ### Extraction Prompt for Denied Plans
102
+
103
+ Each agent for denied plans receives this instruction (adapt the time period,
104
+ file glob, and output path):
105
+
106
+ ```
107
+ You are extracting structured data from denied plan files for a pattern analysis.
108
+
109
+ Directory: [PLANS DIRECTORY]
110
+ Files to read: All *-denied.md files with dates in [TIME PERIOD]
111
+ Output: Write your complete results to [OUTPUT FILE PATH]
112
+
113
+ Read EVERY matching file. For EACH file, extract:
114
+ - The plan name/topic
115
+ - The denial reason or feedback given (look for reviewer comments, annotations,
116
+ revision requests — capture the actual words used)
117
+ - What was specifically asked to change
118
+ - The type of feedback (let the content determine the category — don't force-fit
119
+ into predefined types. Common types include things like: scope concerns,
120
+ approach disagreements, missing information, process requirements, quality
121
+ concerns, UX/design issues, naming disputes, clarification requests,
122
+ testing/procedural denials — but the user's actual patterns may differ)
123
+ - Any specific phrases or recurring language from the reviewer
124
+ - The date
125
+
126
+ Do NOT skip any files. One entry per file.
127
+
128
+ Format each entry as:
129
+ **[filename]**
130
+ - Date: ...
131
+ - Topic: ...
132
+ - Denial reason: ...
133
+ - Feedback type: ...
134
+ - Specific asks: ...
135
+ - Notable phrases: ...
136
+ ---
137
+
138
+ After processing all files, write the complete results to [OUTPUT FILE PATH].
139
+ State the total file count at the end of the file.
140
+ ```
141
+
142
+ ### Extraction Prompt for Annotation Files
143
+
144
+ Annotation files have a different structure — they contain inline comments,
145
+ highlights, and feedback left on specific sections of plans. Each agent for
146
+ annotations receives this instruction:
147
+
148
+ ```
149
+ You are extracting structured data from annotation files for a pattern analysis.
150
+
151
+ Directory: [PLANS DIRECTORY]
152
+ Files to read: All *.annotations.md files with dates in [TIME PERIOD]
153
+ Output: Write your complete results to [OUTPUT FILE PATH]
154
+
155
+ Read EVERY matching file. For EACH file, extract:
156
+ - The plan name/topic it annotates
157
+ - Every individual annotation/comment made (there may be multiple per file)
158
+ - For each annotation: the quoted text, what type of feedback it is (correction,
159
+ scope concern, design preference, structural request, question, praise,
160
+ process directive, etc.), and what section of the plan was annotated
161
+ - The overall tone of the feedback
162
+
163
+ Do NOT skip any files. One entry per file.
164
+
165
+ Format each entry as:
166
+ **[filename]**
167
+ - Plan topic: ...
168
+ - Annotations found: [count]
169
+ - Annotation 1: "[quote or paraphrase]" — Type: ... — Section: ...
170
+ - Annotation 2: "[quote or paraphrase]" — Type: ... — Section: ...
171
+ - (continue for all annotations in the file)
172
+ - Overall tone: ...
173
+ ---
174
+
175
+ After processing all files, write the complete results to [OUTPUT FILE PATH].
176
+ State the total file count at the end of the file.
177
+ ```
178
+
179
+ ### While Agents Run
180
+
181
+ Track completion. As each agent finishes, note the count of files it processed.
182
+ Verify the total matches the inventory from Phase 1. If any agent's count is
183
+ short, flag it and consider re-launching for the missing files.
184
+
185
+ If an agent times out (possible with large batches — a batch of 128 files can
186
+ take 8+ minutes), re-launch it for just the unprocessed files. Check the output
187
+ file to see how far it got before timing out.
188
+
189
+ ## Phase 3: Reduce — Pattern Analysis
190
+
191
+ Once ALL extraction agents have completed (or all files have been read for small
192
+ datasets), launch a single reduction agent.
193
+
194
+ The reduction agent reads the clean extraction files from `/tmp/compound-planning/`
195
+ (not the agent task output files, which contain noisy JSONL framework logs). It
196
+ processes all extraction files together and produces the comprehensive analysis.
197
+
198
+ Give the reduction agent this prompt (adapt the file paths):
199
+
200
+ ```
201
+ You are a data scientist conducting the reduction phase of a map-reduce analysis
202
+ across a user's plan denial and annotation archive.
203
+
204
+ Read ALL extraction files at /tmp/compound-planning/extraction-*.md
205
+
206
+ These files contain structured extractions from every denied plan and annotation
207
+ file. Your job: aggregate everything, find patterns, cluster into a taxonomy,
208
+ and produce a comprehensive analysis.
209
+
210
+ Be exhaustive. Use real counts. Quote real phrases from the data. This is
211
+ research — no hand-waving, no fabrication.
212
+
213
+ Produce the following sections:
214
+ [... sections listed below ...]
215
+ ```
216
+
217
+ The reduction agent's job is to let the data speak. Do not impose a predetermined
218
+ framework — discover what's actually there. The analysis must produce:
219
+
220
+ ### 1. Denial Reason Taxonomy
221
+ Categorize every denial into a finite set of types that emerge from the data. Count
222
+ occurrences. Show percentages. Include real example quotes for each type. Aim for
223
+ 8-15 categories — enough to be specific, few enough to be scannable. Let the user's
224
+ actual feedback determine what the categories are.
225
+
226
+ ### 2. Top Feedback Patterns (ranked by frequency)
227
+ The 5-10 most recurring patterns. For each: what the reviewer consistently asks for,
228
+ 3+ example quotes from different files, and whether the pattern changed over time.
229
+
230
+ ### 3. Recurring Phrases
231
+ Exact phrases the reviewer uses repeatedly, with counts and what they signal. These
232
+ are the reviewer's vocabulary — their shorthand for what they care about.
233
+
234
+ ### 4. What the Reviewer Values (implicit preferences)
235
+ Derived from patterns — what does this specific person care about most? Quality?
236
+ Speed? Narrative? Architecture? Process? Simplicity? Rank by evidence strength.
237
+ This section should feel like a personality profile of the reviewer's standards.
238
+
239
+ ### 5. What Agents Consistently Get Wrong
240
+ The flip side — what recurring mistakes trigger denials? What should agents stop
241
+ doing for this reviewer?
242
+
243
+ ### 6. Structural Requests
244
+ What plan structure does the reviewer consistently demand? Required sections,
245
+ ordering, format preferences, level of detail expected.
246
+
247
+ ### 7. Evolution Over Time
248
+ How feedback patterns changed across the time span. Group by whatever natural time
249
+ boundaries exist in the data (weeks for short spans, months for longer ones). Did
250
+ expectations mature? Did new patterns emerge? What shifted? If the dataset spans
251
+ less than a month, note that evolution analysis is limited but still look for any
252
+ progression from early to late files.
253
+
254
+ ### 8. Actionable Prompt Instructions
255
+ The most important output. Based on all patterns: specific numbered instructions
256
+ that could be embedded in a planning prompt to prevent the most common denial
257
+ reasons. Write these as actual directives an agent could follow. Be specific to
258
+ this user's patterns — generic advice like "write good plans" is worthless. Each
259
+ instruction should trace back to a real, frequent denial pattern.
260
+
261
+ After writing the instructions, calculate what percentage of denials they would
262
+ address (count how many denials fall into categories covered by the instructions
263
+ vs total denials). Report this percentage — it will be different for every user.
264
+
265
+ ## Phase 4: Generate the HTML Dashboard
266
+
267
+ Build a single, self-contained HTML file as the final deliverable. Save it to
268
+ the user's plans directory as `compound-planning-report.html`.
269
+
270
+ Read the template at `assets/report-template.html` for the **design language
271
+ only**. The template contains example data from a previous analysis — ignore all
272
+ data values, quotes, and percentages in the template. Use only its visual design:
273
+ colors, typography, spacing, component styles, and layout patterns.
274
+
275
+ ### Design Language (from template)
276
+
277
+ - **Palette:** Light mode, warm off-white (#FDFCFB), text in slate scale, amber
278
+ for highlights/accents, emerald for positive, rose for negative, indigo for
279
+ action elements
280
+ - **Typography:** Playfair Display (serif, for narrative headings), Inter (sans,
281
+ for body/data), JetBrains Mono (mono, for code/phrases) — Google Fonts CDN
282
+ - **Layout:** Single-column, max-width 1024px, generous vertical whitespace (128px
283
+ between major sections), editorial/narrative-first aesthetic
284
+ - **Tone:** Calm, reflective, authoritative. Like a personal retrospective journal,
285
+ not a monitoring dashboard.
286
+
287
+ ### Page Frame (header + footer)
288
+
289
+ Before the 7 sections, the page has:
290
+
291
+ - **Header:** Report title on the left (Playfair Display, ~36px), project name +
292
+ date range below it in light meta text. On the right: file counts in mono
293
+ (e.g., "202 denials · 168 annotations · 71 days"). Separated from content by
294
+ a bottom border. Generous bottom padding before section 1.
295
+
296
+ - **Footer:** After section 7. Top border, centered italic Playfair Display tagline
297
+ summarizing the corpus (e.g., "Analysis of X denied plans and Y annotation files
298
+ from the Plannotator archive.").
299
+
300
+ ### Dashboard Section Order (7 sections)
301
+
302
+ The report follows this exact section order. Each section builds on the previous
303
+ one — the flow moves from "what happened" through "why" to "what to do about it":
304
+
305
+ 1. **The story in the data** — An editorial narrative paragraph (Playfair Display
306
+ serif, ~26px) that tells the headline finding in prose. Not bullet points — a
307
+ real paragraph that reads like the opening of an article. Alongside it, a KPI
308
+ sidebar with 3 key metrics (the top denial percentage, the overall revision
309
+ rate, and the number of distinct denial categories found). Use an amber inline
310
+ highlight on the most striking number in the narrative.
311
+
312
+ 2. **Why plans get denied** — The taxonomy as a ranked list. Each row: rank number
313
+ (mono), category label, a thin 4px progress bar (top item in amber-500, rest
314
+ in slate-300), percentage (mono), and for the top entries, a real italic quote
315
+ from the data below the label. Show the top 10 categories or however many the
316
+ data supports (minimum 5).
317
+
318
+ 3. **How expectations evolved** — One card per natural time period. Each card has:
319
+ the period name in serif, a theme phrase in colored uppercase (different color
320
+ per period to show progression), a description paragraph, and a stat line at
321
+ the bottom (e.g., "X denials · Y narrative requests"). If the data spans less
322
+ than 3 distinct periods, use 2 cards or even a single card with internal
323
+ progression noted.
324
+
325
+ 4. **What works vs what doesn't** — Two side-by-side cards. Left: green-tinted
326
+ (emerald-50/50 bg, emerald-100 border) with traits of plans that succeed for
327
+ this reviewer. Right: red-tinted (rose-50/50 bg, rose-100 border) with what
328
+ agents keep getting wrong. Both derived from the reduction analysis. Bulleted
329
+ with small colored dots. 5-8 items per card.
330
+
331
+ 5. **The actionable output** — The diagnostic payoff. Opens with a Playfair
332
+ Display narrative sentence stating how many prompt instructions were derived
333
+ and what estimated percentage of denials they address (use the real calculated
334
+ percentage from Phase 3, not a generic number). Then the top 3 most impactful
335
+ improvements as numbered items, each with an amber number, bold title, and
336
+ one-line description. This section bridges the analysis and the full prompt
337
+ that follows.
338
+
339
+ 6. **Your most-used phrases** — Grid of chips (2-col mobile, 3-col desktop). Each
340
+ chip: monospace quoted phrase on the left, frequency count on the right. White
341
+ bg, slate-200 border, rounded-12px. Show 9-12 of the most recurring phrases
342
+ found. These should be the reviewer's actual words — their verbal fingerprint.
343
+
344
+ 7. **The corrective prompt** — Dark panel (slate-900 bg, white text, rounded-3xl,
345
+ shadow-xl). Opens with a Playfair intro sentence about the instructions. Then
346
+ a dark code block (slate-800/80 bg, amber-200 monospace text) containing the
347
+ full numbered prompt instructions from Phase 3. Include a copy-to-clipboard
348
+ button that works (JS included). Below the code block: a gradient glow card
349
+ (indigo-to-purple blurred halo behind a white card) with a closing message
350
+ that these instructions are personal — derived from the user's own feedback,
351
+ their own language, their own standards.
352
+
353
+ ### Adaptation Rules
354
+
355
+ - If the user has < 3 months of data, reduce the evolution section to fewer cards
356
+ - If the user has no annotation files (only denials), note this in the narrative
357
+ and skip annotation-specific insights
358
+ - If fewer than 5 denial categories emerge, combine the taxonomy and patterns
359
+ sections into one
360
+ - If the dataset is very small (< 20 files), the narrative should acknowledge the
361
+ limited sample size and frame findings as preliminary
362
+ - The number of prompt instructions will vary per user — could be 8 or 20. Don't
363
+ force exactly 17. Let the data determine the count.
364
+ - The top 3 actionable items in section 5 must be the 3 that cover the largest
365
+ share of denials, not the 3 that sound most impressive
366
+
367
+ ### Key Rules
368
+
369
+ 1. Every number must come from the real analysis — no fabricated data
370
+ 2. Every quote must be a real quote from a real file
371
+ 3. The taxonomy percentages must be calculated from real counts
372
+ 4. The prompt instructions must trace back to actual denial patterns
373
+ 5. The copy button on the prompt block must work (include the JS)
374
+
375
+ After generating, open the file in the user's browser.
376
+
377
+ ## Phase 5: Summary
378
+
379
+ Tell the user:
380
+ - How many total files were analyzed (denials + annotations)
381
+ - The top 3 denial patterns found
382
+ - The estimated percentage of denials the prompt instructions would address
383
+ - The single most impactful prompt improvement
384
+ - Where the report was saved
385
+
386
+ ## Important Notes
387
+
388
+ - **Research integrity:** Every file must be read. The value of this analysis comes
389
+ from completeness. Sampling or skipping undermines the findings.
390
+ - **Real data only:** Never fabricate quotes, percentages, or patterns. If the data
391
+ doesn't show a clear pattern, say so honestly rather than inventing one.
392
+ - **Let the data lead:** The taxonomy, patterns, and instructions should emerge from
393
+ what's actually in the files. Different users will have completely different
394
+ denial patterns. A user building mobile apps will have different feedback than
395
+ one building APIs. Don't assume what the patterns will be.
396
+ - **Agent parallelization:** For large datasets, maximize parallel agents to reduce
397
+ wall-clock time. The bottleneck is the largest batch — split it.
398
+ - **Structured extraction format:** Ask extraction agents to return structured text
399
+ with consistent delimiters so the reduce agent can parse reliably.
400
+ - **The report is the artifact:** The HTML dashboard is what the user keeps. It
401
+ should be beautiful, honest, and useful. Every section should feel like it was
402
+ written about them specifically, because it was.
@@ -0,0 +1,795 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>Compound Planning — What 370 Files Reveal</title>
7
+ <link rel="preconnect" href="https://fonts.googleapis.com">
8
+ <link href="https://fonts.googleapis.com/css2?family=Playfair+Display:ital,wght@0,400;0,500;1,400&family=Inter:wght@300;400;500;600&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
9
+ <style>
10
+ *, *::before, *::after { margin: 0; padding: 0; box-sizing: border-box; }
11
+
12
+ :root {
13
+ --bg: #FDFCFB;
14
+ --slate-900: #0f172a;
15
+ --slate-800: #1e293b;
16
+ --slate-700: #334155;
17
+ --slate-600: #475569;
18
+ --slate-500: #64748b;
19
+ --slate-400: #94a3b8;
20
+ --slate-300: #cbd5e1;
21
+ --slate-200: #e2e8f0;
22
+ --slate-100: #f1f5f9;
23
+ --slate-50: #f8fafc;
24
+ --amber-500: #f59e0b;
25
+ --amber-600: #d97706;
26
+ --amber-700: #b45309;
27
+ --amber-50: #fffbeb;
28
+ --emerald-500: #10b981;
29
+ --emerald-600: #059669;
30
+ --emerald-400: #34d399;
31
+ --emerald-900: #064e3b;
32
+ --emerald-800: #065f46;
33
+ --emerald-100: #d1fae5;
34
+ --emerald-50: #ecfdf5;
35
+ --rose-500: #f43f5e;
36
+ --rose-600: #e11d48;
37
+ --rose-400: #fb7185;
38
+ --rose-900: #881337;
39
+ --rose-800: #9f1239;
40
+ --rose-100: #ffe4e6;
41
+ --rose-50: #fff1f2;
42
+ --indigo-500: #6366f1;
43
+ --indigo-600: #4f46e5;
44
+ --purple-600: #9333ea;
45
+ }
46
+
47
+ body {
48
+ font-family: 'Inter', ui-sans-serif, system-ui, sans-serif;
49
+ background: var(--bg);
50
+ color: var(--slate-800);
51
+ -webkit-font-smoothing: antialiased;
52
+ }
53
+
54
+ .container {
55
+ max-width: 1024px;
56
+ margin: 0 auto;
57
+ padding: 48px 24px 64px;
58
+ }
59
+ @media (min-width: 768px) { .container { padding: 96px 24px 80px; } }
60
+
61
+ /* Typography */
62
+ .font-serif { font-family: 'Playfair Display', ui-serif, Georgia, serif; }
63
+ .font-mono { font-family: 'JetBrains Mono', ui-monospace, monospace; }
64
+
65
+ /* Header */
66
+ header {
67
+ border-bottom: 1px solid var(--slate-200);
68
+ padding-bottom: 40px;
69
+ margin-bottom: 96px;
70
+ display: flex;
71
+ justify-content: space-between;
72
+ align-items: flex-end;
73
+ flex-wrap: wrap;
74
+ gap: 16px;
75
+ }
76
+ header h1 {
77
+ font-family: 'Playfair Display', serif;
78
+ font-size: 36px;
79
+ font-weight: 400;
80
+ color: var(--slate-900);
81
+ line-height: 1.2;
82
+ }
83
+ header .meta {
84
+ font-size: 15px;
85
+ font-weight: 300;
86
+ color: var(--slate-500);
87
+ letter-spacing: 0.04em;
88
+ }
89
+
90
+ /* Sections */
91
+ .section { margin-bottom: 128px; }
92
+ .section-label {
93
+ font-size: 12px;
94
+ font-weight: 600;
95
+ text-transform: uppercase;
96
+ letter-spacing: 0.2em;
97
+ color: var(--slate-400);
98
+ margin-bottom: 24px;
99
+ }
100
+
101
+ /* Narrative + KPIs */
102
+ .summary {
103
+ display: grid;
104
+ grid-template-columns: 1fr;
105
+ gap: 48px;
106
+ align-items: start;
107
+ }
108
+ @media (min-width: 768px) {
109
+ .summary { grid-template-columns: 1fr 240px; }
110
+ }
111
+ .narrative {
112
+ font-family: 'Playfair Display', serif;
113
+ font-size: 26px;
114
+ line-height: 1.45;
115
+ color: var(--slate-900);
116
+ }
117
+ .narrative .highlight {
118
+ background: var(--amber-50);
119
+ color: var(--amber-700);
120
+ padding: 1px 6px;
121
+ border-radius: 3px;
122
+ }
123
+ .kpi-stack {
124
+ display: flex;
125
+ flex-direction: column;
126
+ gap: 32px;
127
+ }
128
+ @media (min-width: 768px) {
129
+ .kpi-stack { border-left: 1px solid var(--slate-200); padding-left: 32px; }
130
+ }
131
+ .kpi-item .kpi-value {
132
+ font-size: 36px;
133
+ font-weight: 300;
134
+ color: var(--slate-900);
135
+ letter-spacing: -0.02em;
136
+ }
137
+ .kpi-item .kpi-label {
138
+ font-size: 10px;
139
+ font-weight: 600;
140
+ text-transform: uppercase;
141
+ letter-spacing: 0.15em;
142
+ color: var(--slate-500);
143
+ margin-top: 2px;
144
+ }
145
+
146
+ /* Taxonomy bars */
147
+ .taxonomy-list { display: flex; flex-direction: column; gap: 20px; }
148
+ .tax-row { display: grid; grid-template-columns: 24px 1fr 52px; gap: 12px; align-items: center; }
149
+ .tax-rank {
150
+ font-family: 'JetBrains Mono', monospace;
151
+ font-size: 12px;
152
+ color: var(--slate-400);
153
+ text-align: right;
154
+ }
155
+ .tax-body { display: flex; flex-direction: column; gap: 6px; }
156
+ .tax-label { font-size: 14px; font-weight: 500; color: var(--slate-800); }
157
+ .tax-bar-track { height: 4px; background: var(--slate-100); border-radius: 100px; overflow: hidden; }
158
+ .tax-bar-fill { height: 100%; border-radius: 100px; transition: width 0.6s ease; }
159
+ .tax-bar-fill.top { background: var(--amber-500); }
160
+ .tax-bar-fill.rest { background: var(--slate-300); }
161
+ .tax-pct {
162
+ font-family: 'JetBrains Mono', monospace;
163
+ font-size: 12px;
164
+ color: var(--slate-500);
165
+ text-align: right;
166
+ }
167
+ .tax-quote {
168
+ font-size: 12px;
169
+ font-style: italic;
170
+ color: var(--slate-500);
171
+ margin-top: 2px;
172
+ }
173
+
174
+ /* Evolution timeline */
175
+ .evolution-grid {
176
+ display: grid;
177
+ grid-template-columns: 1fr;
178
+ gap: 24px;
179
+ }
180
+ @media (min-width: 768px) { .evolution-grid { grid-template-columns: repeat(3, 1fr); } }
181
+ .evo-card {
182
+ background: white;
183
+ border: 1px solid var(--slate-200);
184
+ border-radius: 16px;
185
+ padding: 28px;
186
+ }
187
+ .evo-card .evo-month {
188
+ font-family: 'Playfair Display', serif;
189
+ font-size: 20px;
190
+ color: var(--slate-900);
191
+ margin-bottom: 4px;
192
+ }
193
+ .evo-card .evo-theme {
194
+ font-size: 12px;
195
+ font-weight: 600;
196
+ text-transform: uppercase;
197
+ letter-spacing: 0.12em;
198
+ margin-bottom: 16px;
199
+ }
200
+ .evo-card .evo-desc {
201
+ font-size: 14px;
202
+ color: var(--slate-600);
203
+ line-height: 1.6;
204
+ }
205
+ .evo-card .evo-stat {
206
+ margin-top: 16px;
207
+ padding-top: 16px;
208
+ border-top: 1px solid var(--slate-100);
209
+ font-family: 'JetBrains Mono', monospace;
210
+ font-size: 12px;
211
+ color: var(--slate-500);
212
+ }
213
+ .evo-jan .evo-theme { color: var(--slate-600); }
214
+ .evo-feb .evo-theme { color: var(--amber-600); }
215
+ .evo-mar .evo-theme { color: var(--indigo-600); }
216
+
217
+ /* Quality comparison */
218
+ .quality-grid {
219
+ display: grid;
220
+ grid-template-columns: 1fr;
221
+ gap: 24px;
222
+ }
223
+ @media (min-width: 768px) { .quality-grid { grid-template-columns: 1fr 1fr; } }
224
+ .q-card {
225
+ border-radius: 24px;
226
+ padding: 36px;
227
+ }
228
+ .q-card.good {
229
+ background: color-mix(in srgb, var(--emerald-50) 50%, transparent);
230
+ border: 1px solid var(--emerald-100);
231
+ }
232
+ .q-card.bad {
233
+ background: color-mix(in srgb, var(--rose-50) 50%, transparent);
234
+ border: 1px solid var(--rose-100);
235
+ }
236
+ .q-card .q-icon { font-size: 20px; margin-bottom: 12px; }
237
+ .q-card .q-title {
238
+ font-family: 'Playfair Display', serif;
239
+ font-size: 22px;
240
+ margin-bottom: 20px;
241
+ }
242
+ .q-card.good .q-title { color: var(--emerald-900); }
243
+ .q-card.bad .q-title { color: var(--rose-900); }
244
+ .q-list { list-style: none; display: flex; flex-direction: column; gap: 14px; }
245
+ .q-list li {
246
+ display: flex;
247
+ align-items: flex-start;
248
+ gap: 10px;
249
+ font-size: 14px;
250
+ line-height: 1.6;
251
+ }
252
+ .q-card.good .q-list li { color: color-mix(in srgb, var(--emerald-800) 90%, transparent); }
253
+ .q-card.bad .q-list li { color: color-mix(in srgb, var(--rose-800) 90%, transparent); }
254
+ .q-dot {
255
+ width: 6px;
256
+ height: 6px;
257
+ border-radius: 50%;
258
+ flex-shrink: 0;
259
+ margin-top: 7px;
260
+ }
261
+ .q-card.good .q-dot { background: var(--emerald-400); }
262
+ .q-card.bad .q-dot { background: var(--rose-400); }
263
+
264
+ /* Phrases */
265
+ .phrases-grid {
266
+ display: grid;
267
+ grid-template-columns: repeat(2, 1fr);
268
+ gap: 12px;
269
+ }
270
+ @media (min-width: 768px) { .phrases-grid { grid-template-columns: repeat(3, 1fr); } }
271
+ .phrase-chip {
272
+ background: white;
273
+ border: 1px solid var(--slate-200);
274
+ border-radius: 12px;
275
+ padding: 14px 16px;
276
+ display: flex;
277
+ justify-content: space-between;
278
+ align-items: center;
279
+ gap: 8px;
280
+ }
281
+ .phrase-text {
282
+ font-family: 'JetBrains Mono', monospace;
283
+ font-size: 12px;
284
+ color: var(--slate-700);
285
+ white-space: nowrap;
286
+ overflow: hidden;
287
+ text-overflow: ellipsis;
288
+ }
289
+ .phrase-count {
290
+ font-family: 'JetBrains Mono', monospace;
291
+ font-size: 11px;
292
+ color: var(--slate-400);
293
+ flex-shrink: 0;
294
+ }
295
+
296
+ /* Dark action panel */
297
+ .action-panel {
298
+ background: var(--slate-900);
299
+ color: white;
300
+ border-radius: 24px;
301
+ padding: 40px;
302
+ box-shadow: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1);
303
+ }
304
+ @media (min-width: 768px) { .action-panel { padding: 56px; } }
305
+ .action-panel .section-label { color: var(--slate-500); }
306
+ .action-panel .ap-intro {
307
+ font-family: 'Playfair Display', serif;
308
+ font-size: 22px;
309
+ color: white;
310
+ line-height: 1.4;
311
+ margin-bottom: 32px;
312
+ max-width: 640px;
313
+ }
314
+ .prompt-block {
315
+ background: color-mix(in srgb, var(--slate-800) 80%, transparent);
316
+ border: 1px solid color-mix(in srgb, var(--slate-700) 50%, transparent);
317
+ border-radius: 16px;
318
+ overflow: hidden;
319
+ }
320
+ .prompt-header {
321
+ display: flex;
322
+ justify-content: space-between;
323
+ align-items: center;
324
+ padding: 12px 20px;
325
+ border-bottom: 1px solid color-mix(in srgb, var(--slate-700) 30%, transparent);
326
+ }
327
+ .prompt-header-label {
328
+ font-family: 'JetBrains Mono', monospace;
329
+ font-size: 12px;
330
+ color: var(--slate-400);
331
+ display: flex;
332
+ align-items: center;
333
+ gap: 8px;
334
+ }
335
+ .prompt-header-label svg { width: 14px; height: 14px; }
336
+ .copy-btn {
337
+ background: none;
338
+ border: none;
339
+ font-family: 'JetBrains Mono', monospace;
340
+ font-size: 12px;
341
+ color: var(--slate-400);
342
+ cursor: pointer;
343
+ display: flex;
344
+ align-items: center;
345
+ gap: 6px;
346
+ transition: color 0.2s;
347
+ }
348
+ .copy-btn:hover { color: white; }
349
+ .copy-btn.copied { color: var(--emerald-400); }
350
+ .prompt-body {
351
+ padding: 20px;
352
+ max-height: 480px;
353
+ overflow-y: auto;
354
+ }
355
+ .prompt-body pre {
356
+ font-family: 'JetBrains Mono', monospace;
357
+ font-size: 13px;
358
+ line-height: 1.7;
359
+ color: color-mix(in srgb, var(--amber-200) 90%, transparent);
360
+ white-space: pre-wrap;
361
+ word-break: break-word;
362
+ }
363
+ .prompt-body pre .comment {
364
+ color: var(--slate-500);
365
+ }
366
+
367
+ /* Glow card */
368
+ .glow-wrap {
369
+ position: relative;
370
+ margin-top: 48px;
371
+ }
372
+ .glow-bg {
373
+ position: absolute;
374
+ inset: -2px;
375
+ background: linear-gradient(135deg, var(--indigo-500), var(--purple-600));
376
+ border-radius: 26px;
377
+ opacity: 0.15;
378
+ filter: blur(16px);
379
+ transition: opacity 0.5s;
380
+ }
381
+ .glow-wrap:hover .glow-bg { opacity: 0.25; }
382
+ .glow-card {
383
+ position: relative;
384
+ background: white;
385
+ border: 1px solid var(--slate-200);
386
+ border-radius: 24px;
387
+ padding: 32px 36px;
388
+ display: flex;
389
+ justify-content: space-between;
390
+ align-items: center;
391
+ flex-wrap: wrap;
392
+ gap: 20px;
393
+ }
394
+ .glow-card .gc-text {
395
+ font-family: 'Playfair Display', serif;
396
+ font-size: 18px;
397
+ font-weight: 500;
398
+ color: var(--slate-900);
399
+ line-height: 1.5;
400
+ max-width: 640px;
401
+ }
402
+ .glow-card .gc-text em {
403
+ font-style: italic;
404
+ color: var(--indigo-600);
405
+ }
406
+
407
+ /* Footer */
408
+ footer {
409
+ border-top: 1px solid var(--slate-200);
410
+ padding-top: 48px;
411
+ margin-top: 0;
412
+ text-align: center;
413
+ }
414
+ footer p {
415
+ font-family: 'Playfair Display', serif;
416
+ font-style: italic;
417
+ font-size: 15px;
418
+ color: var(--slate-400);
419
+ }
420
+
421
+ /* Scrollbar in dark code block */
422
+ .prompt-body::-webkit-scrollbar { width: 6px; }
423
+ .prompt-body::-webkit-scrollbar-track { background: transparent; }
424
+ .prompt-body::-webkit-scrollbar-thumb { background: var(--slate-700); border-radius: 3px; }
425
+ </style>
426
+ </head>
427
+ <body>
428
+ <div class="container">
429
+
430
+ <header>
431
+ <div>
432
+ <h1>What 370 Files Reveal About<br>How You Plan</h1>
433
+ <div class="meta" style="margin-top: 8px;">backnotprop/plannotator &middot; Jan 7 &ndash; Mar 18, 2026</div>
434
+ </div>
435
+ <div class="meta" style="text-align: right;">
436
+ <span class="font-mono" style="font-size: 12px;">202 denials &middot; 168 annotations &middot; 71 days</span>
437
+ </div>
438
+ </header>
439
+
440
+ <!-- 1. Narrative + KPIs -->
441
+ <div class="section">
442
+ <div class="section-label">1. The story in the data</div>
443
+ <div class="summary">
444
+ <div class="narrative">
445
+ Across 71 days you denied or revised <span class="highlight">202 plans</span> before any code was written. The single most common reason&mdash;appearing in 1 out of 4 denials&mdash;was the same: the agent jumped to implementation without telling you <em>what</em> it was building, <em>why</em>, or <em>how</em>. Missing narrative. Missing context. Missing the story. Your expectations evolved from &ldquo;does it work?&rdquo; in January to &ldquo;tell me the story and be confident&rdquo; by March.
446
+ </div>
447
+ <div class="kpi-stack">
448
+ <div class="kpi-item">
449
+ <div class="kpi-value">25.7%</div>
450
+ <div class="kpi-label">Denials for missing narrative</div>
451
+ </div>
452
+ <div class="kpi-item">
453
+ <div class="kpi-value">50%</div>
454
+ <div class="kpi-label">Plans revised before coding</div>
455
+ </div>
456
+ <div class="kpi-item">
457
+ <div class="kpi-value">12</div>
458
+ <div class="kpi-label">Distinct denial categories</div>
459
+ </div>
460
+ </div>
461
+ </div>
462
+ </div>
463
+
464
+ <!-- 2. Denial Taxonomy -->
465
+ <div class="section">
466
+ <div class="section-label">2. Why plans get denied</div>
467
+ <div class="taxonomy-list">
468
+ <div class="tax-row">
469
+ <span class="tax-rank">1</span>
470
+ <div class="tax-body">
471
+ <span class="tax-label">Missing Narrative / Overview</span>
472
+ <div class="tax-bar-track"><div class="tax-bar-fill top" style="width: 100%"></div></div>
473
+ <span class="tax-quote">"This plan is denied without narrative detail and rationales."</span>
474
+ </div>
475
+ <span class="tax-pct">25.7%</span>
476
+ </div>
477
+ <div class="tax-row">
478
+ <span class="tax-rank">2</span>
479
+ <div class="tax-body">
480
+ <span class="tax-label">Clarification Needed</span>
481
+ <div class="tax-bar-track"><div class="tax-bar-fill rest" style="width: 65%"></div></div>
482
+ <span class="tax-quote">"What does this Mean???"</span>
483
+ </div>
484
+ <span class="tax-pct">16.8%</span>
485
+ </div>
486
+ <div class="tax-row">
487
+ <span class="tax-rank">3</span>
488
+ <div class="tax-body">
489
+ <span class="tax-label">Testing / Procedural</span>
490
+ <div class="tax-bar-track"><div class="tax-bar-fill rest" style="width: 54%"></div></div>
491
+ <span class="tax-quote">"I'm denying so you can create a diff."</span>
492
+ </div>
493
+ <span class="tax-pct">13.9%</span>
494
+ </div>
495
+ <div class="tax-row">
496
+ <span class="tax-rank">4</span>
497
+ <div class="tax-body">
498
+ <span class="tax-label">Wrong Approach / Over-Engineered</span>
499
+ <div class="tax-bar-track"><div class="tax-bar-fill rest" style="width: 37%"></div></div>
500
+ <span class="tax-quote">"Why are we doing difficult shit here? I want a hover experience."</span>
501
+ </div>
502
+ <span class="tax-pct">9.4%</span>
503
+ </div>
504
+ <div class="tax-row">
505
+ <span class="tax-rank">5</span>
506
+ <div class="tax-body">
507
+ <span class="tax-label">Process Requirement</span>
508
+ <div class="tax-bar-track"><div class="tax-bar-fill rest" style="width: 31%"></div></div>
509
+ <span class="tax-quote">"Make sure you feature branch."</span>
510
+ </div>
511
+ <span class="tax-pct">7.9%</span>
512
+ </div>
513
+ <div class="tax-row">
514
+ <span class="tax-rank">6</span>
515
+ <div class="tax-body">
516
+ <span class="tax-label">Confidence / Risk Check</span>
517
+ <div class="tax-bar-track"><div class="tax-bar-fill rest" style="width: 29%"></div></div>
518
+ <span class="tax-quote">"Take a step back, breathe, make sure we're not being irrational."</span>
519
+ </div>
520
+ <span class="tax-pct">7.4%</span>
521
+ </div>
522
+ <div class="tax-row">
523
+ <span class="tax-rank">7</span>
524
+ <div class="tax-body">
525
+ <span class="tax-label">Content Removal</span>
526
+ <div class="tax-bar-track"><div class="tax-bar-fill rest" style="width: 27%"></div></div>
527
+ <span class="tax-quote">"I don't want this in the plan."</span>
528
+ </div>
529
+ <span class="tax-pct">6.9%</span>
530
+ </div>
531
+ <div class="tax-row">
532
+ <span class="tax-rank">8</span>
533
+ <div class="tax-body">
534
+ <span class="tax-label">Implementation Bug Found</span>
535
+ <div class="tax-bar-track"><div class="tax-bar-fill rest" style="width: 23%"></div></div>
536
+ </div>
537
+ <span class="tax-pct">5.9%</span>
538
+ </div>
539
+ <div class="tax-row">
540
+ <span class="tax-rank">9</span>
541
+ <div class="tax-body">
542
+ <span class="tax-label">Design / UX Issue</span>
543
+ <div class="tax-bar-track"><div class="tax-bar-fill rest" style="width: 21%"></div></div>
544
+ </div>
545
+ <span class="tax-pct">5.4%</span>
546
+ </div>
547
+ <div class="tax-row">
548
+ <span class="tax-rank">10</span>
549
+ <div class="tax-body">
550
+ <span class="tax-label">Naming / Terminology</span>
551
+ <div class="tax-bar-track"><div class="tax-bar-fill rest" style="width: 16%"></div></div>
552
+ <span class="tax-quote">"Why do you keep calling it Simplified????"</span>
553
+ </div>
554
+ <span class="tax-pct">4.0%</span>
555
+ </div>
556
+ </div>
557
+ </div>
558
+
559
+ <!-- 3. Evolution -->
560
+ <div class="section">
561
+ <div class="section-label">3. How your expectations evolved</div>
562
+ <div class="evolution-grid">
563
+ <div class="evo-card evo-jan">
564
+ <div class="evo-month">January</div>
565
+ <div class="evo-theme">"Does it work?"</div>
566
+ <div class="evo-desc">Bug-hunting phase. You were hands-on testing View Logs, iterating on session scoping heuristics. 60% of denials were implementation bugs and verification failures. No mention of &ldquo;narrative&rdquo; or &ldquo;overview&rdquo; yet.</div>
567
+ <div class="evo-stat">26 denials &middot; 0 narrative requests</div>
568
+ </div>
569
+ <div class="evo-card evo-feb">
570
+ <div class="evo-month">February</div>
571
+ <div class="evo-theme">"Follow the process"</div>
572
+ <div class="evo-desc">Process gates emerged: feature branches, Linear tickets, pull main. 40% of denials were procedural (diff testing). UX polish intensified. The first narrative demands appeared: &ldquo;I want a narrative under each section.&rdquo;</div>
573
+ <div class="evo-stat">48 denials &middot; 6 narrative requests</div>
574
+ </div>
575
+ <div class="evo-card evo-mar">
576
+ <div class="evo-month">March</div>
577
+ <div class="evo-theme">"Tell me the story"</div>
578
+ <div class="evo-desc">Narrative became the #1 gate. You created a &ldquo;Missing overview&rdquo; label and applied it systematically. Confidence checks became standard. You began telling agents to &ldquo;take a step back, breathe, and analyze.&rdquo;</div>
579
+ <div class="evo-stat">128 denials &middot; 25+ narrative requests</div>
580
+ </div>
581
+ </div>
582
+ </div>
583
+
584
+ <!-- 4. Quality comparison -->
585
+ <div class="section">
586
+ <div class="section-label">4. What works vs. what doesn't</div>
587
+ <div class="quality-grid">
588
+ <div class="q-card good">
589
+ <div class="q-icon">&#10003;</div>
590
+ <div class="q-title">What approved plans do</div>
591
+ <ul class="q-list">
592
+ <li><span class="q-dot"></span>Lead with a narrative overview: what exists, what changes, why</li>
593
+ <li><span class="q-dot"></span>State confidence and identify risks proactively</li>
594
+ <li><span class="q-dot"></span>Reference existing codebase patterns before proposing new code</li>
595
+ <li><span class="q-dot"></span>Use explicit, transparent naming (not euphemisms)</li>
596
+ <li><span class="q-dot"></span>Break large work into phases with evaluation gates</li>
597
+ <li><span class="q-dot"></span>Include example output for user-facing changes</li>
598
+ <li><span class="q-dot"></span>Specify feature branch and ticket creation steps</li>
599
+ </ul>
600
+ </div>
601
+ <div class="q-card bad">
602
+ <div class="q-icon">&#10007;</div>
603
+ <div class="q-title">What agents keep getting wrong</div>
604
+ <ul class="q-list">
605
+ <li><span class="q-dot"></span>Jump to implementation steps without narrative context</li>
606
+ <li><span class="q-dot"></span>Over-engineer: Shift+Click when hover works, MCP tool when a README suffices</li>
607
+ <li><span class="q-dot"></span>Introduce new code for things the codebase already solves</li>
608
+ <li><span class="q-dot"></span>Propose work on top of failing lint/type checks</li>
609
+ <li><span class="q-dot"></span>Use vague or euphemistic naming (&ldquo;Accept&rdquo; instead of &ldquo;Git Add&rdquo;)</li>
610
+ <li><span class="q-dot"></span>Wait to be asked for confidence instead of stating it</li>
611
+ <li><span class="q-dot"></span>Rush to modify instead of reporting what they see</li>
612
+ </ul>
613
+ </div>
614
+ </div>
615
+ </div>
616
+
617
+ <!-- 5. The actionable output -->
618
+ <div class="section">
619
+ <div class="section-label">5. The actionable output</div>
620
+ <div class="narrative" style="margin-bottom: 32px;">
621
+ The analysis produced <span class="highlight">17 specific prompt instructions</span> that, if embedded in a planning prompt, would address ~70% of all denial reasons. The biggest three:
622
+ </div>
623
+ <div style="display: flex; flex-direction: column; gap: 20px;">
624
+ <div style="display: flex; gap: 16px; align-items: flex-start;">
625
+ <span class="font-mono" style="font-size: 24px; font-weight: 300; color: var(--amber-500); flex-shrink: 0; width: 32px; text-align: right;">1</span>
626
+ <div>
627
+ <div style="font-size: 17px; font-weight: 500; color: var(--slate-900); margin-bottom: 4px;">Every plan MUST start with a Solution Overview</div>
628
+ <div style="font-size: 14px; color: var(--slate-600); line-height: 1.5;">What exists, what changes, why, how. This alone addresses 1 in 4 denials.</div>
629
+ </div>
630
+ </div>
631
+ <div style="display: flex; gap: 16px; align-items: flex-start;">
632
+ <span class="font-mono" style="font-size: 24px; font-weight: 300; color: var(--amber-500); flex-shrink: 0; width: 32px; text-align: right;">2</span>
633
+ <div>
634
+ <div style="font-size: 17px; font-weight: 500; color: var(--slate-900); margin-bottom: 4px;">End every plan with a Confidence Assessment</div>
635
+ <div style="font-size: 14px; color: var(--slate-600); line-height: 1.5;">Don&rsquo;t wait to be asked. State your confidence, identify risks, flag uncertainties.</div>
636
+ </div>
637
+ </div>
638
+ <div style="display: flex; gap: 16px; align-items: flex-start;">
639
+ <span class="font-mono" style="font-size: 24px; font-weight: 300; color: var(--amber-500); flex-shrink: 0; width: 32px; text-align: right;">3</span>
640
+ <div>
641
+ <div style="font-size: 17px; font-weight: 500; color: var(--slate-900); margin-bottom: 4px;">Search for existing patterns before proposing new code</div>
642
+ <div style="font-size: 14px; color: var(--slate-600); line-height: 1.5;">Explicitly state what you found in the codebase. Prefer reuse over new implementation.</div>
643
+ </div>
644
+ </div>
645
+ </div>
646
+ </div>
647
+
648
+ <!-- 6. Recurring phrases -->
649
+ <div class="section">
650
+ <div class="section-label">6. Your most-used phrases</div>
651
+ <div class="phrases-grid">
652
+ <div class="phrase-chip"><span class="phrase-text">"narrative"</span><span class="phrase-count">50+</span></div>
653
+ <div class="phrase-chip"><span class="phrase-text">"I don't want this in the plan"</span><span class="phrase-count">10</span></div>
654
+ <div class="phrase-chip"><span class="phrase-text">"feature branch"</span><span class="phrase-count">8+</span></div>
655
+ <div class="phrase-chip"><span class="phrase-text">"confidence"</span><span class="phrase-count">8+</span></div>
656
+ <div class="phrase-chip"><span class="phrase-text">"Missing overview"</span><span class="phrase-count">14</span></div>
657
+ <div class="phrase-chip"><span class="phrase-text">"front-end design skill"</span><span class="phrase-count">16</span></div>
658
+ <div class="phrase-chip"><span class="phrase-text">"separation of concerns"</span><span class="phrase-count">6</span></div>
659
+ <div class="phrase-chip"><span class="phrase-text">"Take a step back, breathe"</span><span class="phrase-count">6</span></div>
660
+ <div class="phrase-chip"><span class="phrase-text">"how does this work"</span><span class="phrase-count">5+</span></div>
661
+ <div class="phrase-chip"><span class="phrase-text">"what the fuck"</span><span class="phrase-count">4</span></div>
662
+ <div class="phrase-chip"><span class="phrase-text">"create a ticket"</span><span class="phrase-count">4+</span></div>
663
+ <div class="phrase-chip"><span class="phrase-text">"reusable"</span><span class="phrase-count">19+</span></div>
664
+ </div>
665
+ </div>
666
+
667
+ <!-- 7. Corrective Prompt -->
668
+ <div class="section" style="margin-bottom: 64px;">
669
+ <div class="action-panel">
670
+ <div class="section-label">7. The corrective prompt</div>
671
+ <div class="ap-intro">
672
+ These 17 instructions were extracted directly from your denial patterns. Embedding them in a planning prompt would address approximately 70% of all denial reasons.
673
+ </div>
674
+ <div class="prompt-block">
675
+ <div class="prompt-header">
676
+ <span class="prompt-header-label">
677
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="4 17 10 11 4 5"></polyline><line x1="12" y1="19" x2="20" y2="19"></line></svg>
678
+ planning-instructions.md
679
+ </span>
680
+ <button class="copy-btn" onclick="copyPrompt(this)">
681
+ <svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"></rect><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"></path></svg>
682
+ Copy
683
+ </button>
684
+ </div>
685
+ <div class="prompt-body">
686
+ <pre id="prompt-content"><span class="comment"># Planning Instructions
687
+ # Derived from 370 files of denial & annotation analysis</span>
688
+
689
+ 1. STRUCTURE: Every plan MUST begin with a "Solution Overview"
690
+ containing 2-3 paragraphs of narrative prose explaining:
691
+ - What exists today (current state)
692
+ - What will change and why
693
+ - How it will be built (approach summary)
694
+ Do NOT skip this. Do NOT replace it with bullet points.
695
+
696
+ 2. NARRATIVE: Every major section must include a rationale
697
+ paragraph — not just what will be done, but WHY this
698
+ approach was chosen over alternatives.
699
+
700
+ 3. FEATURE BRANCH: Always specify implementation will occur
701
+ on a feature branch. State the branch name. Never plan
702
+ to work directly on main.
703
+
704
+ 4. EXISTING PATTERNS: Before proposing any new implementation,
705
+ search the codebase for existing patterns that solve the
706
+ same problem. Explicitly state what you found and whether
707
+ you will reuse it. Prefer reuse over new code.
708
+
709
+ 5. CONFIDENCE STATEMENT: End the plan with a "Confidence
710
+ Assessment" section. State your confidence level, identify
711
+ risks or edge cases, and note uncertainties. Do not wait
712
+ to be asked.
713
+
714
+ 6. PHASING: For plans with more than 3 steps, break them into
715
+ numbered phases. After each phase, note "Pause for
716
+ evaluation" so the reviewer can assess before proceeding.
717
+
718
+ 7. ISSUE TRACKING: If the project uses Linear or GitHub Issues,
719
+ include a step to create relevant tickets BEFORE
720
+ implementation. Backlog items should be separate tickets.
721
+
722
+ 8. SIMPLICITY: Choose the simplest approach that meets
723
+ requirements. Do not introduce modifier keys when hover
724
+ works. Do not build a framework when a README suffices.
725
+
726
+ 9. NAMING: Use explicit, transparent names for user-facing
727
+ features. Do not euphemize Git operations ("Git Add"
728
+ not "Accept"). Match existing product naming conventions.
729
+
730
+ 10. CODE QUALITY: State that implementation will follow clean
731
+ code principles: modular architecture, separation of
732
+ concerns, no circumventing lint or type checks.
733
+
734
+ 11. CLEAN FOUNDATION: If the codebase has failing lint or type
735
+ checks, address these BEFORE proposing new features. State
736
+ the current CI/CD state.
737
+
738
+ 12. PRIVACY: For features involving data storage or sharing,
739
+ explicitly state privacy guarantees. Require user
740
+ confirmation before storing data.
741
+
742
+ 13. EXAMPLES: When the plan involves user-facing output or UI,
743
+ include an example of what it will look like.
744
+
745
+ 14. FOCUSED SCOPE: Do not include sections that are obvious,
746
+ boilerplate, or previously asked to be removed. Keep the
747
+ plan focused rather than comprehensive.
748
+
749
+ 15. DESIGN SKILL: For any frontend/UI work, invoke the
750
+ front-end design skill to validate the approach. Note
751
+ this invocation explicitly in the plan.
752
+
753
+ 16. VERIFICATION STEP: For refactors or multi-file changes,
754
+ include a verification step with line-by-line comparison
755
+ of affected code paths.
756
+
757
+ 17. DELIBERATION: If the plan involves a dramatic shift, state
758
+ that you have re-evaluated the approach, traced through
759
+ affected files mentally, and are confident in the plan.
760
+ Do not rush.</pre>
761
+ </div>
762
+ </div>
763
+
764
+ <div class="glow-wrap">
765
+ <div class="glow-bg"></div>
766
+ <div class="glow-card">
767
+ <div class="gc-text">
768
+ These instructions are yours &mdash; derived from <em>your feedback, your language, your standards</em>. Copy them into your planning prompt and watch the deny rate drop.
769
+ </div>
770
+ </div>
771
+ </div>
772
+ </div>
773
+ </div>
774
+
775
+ <footer>
776
+ <p>Analysis of 202 denied plans and 168 annotation files from the Plannotator archive.</p>
777
+ </footer>
778
+
779
+ </div>
780
+
781
+ <script>
782
+ function copyPrompt(btn) {
783
+ const text = document.getElementById('prompt-content').textContent;
784
+ navigator.clipboard.writeText(text).then(() => {
785
+ btn.innerHTML = '<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M22 11.08V12a10 10 0 1 1-5.93-9.14"></path><polyline points="22 4 12 14.01 9 11.01"></polyline></svg> Copied';
786
+ btn.classList.add('copied');
787
+ setTimeout(() => {
788
+ btn.innerHTML = '<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"></rect><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"></path></svg> Copy';
789
+ btn.classList.remove('copied');
790
+ }, 2000);
791
+ });
792
+ }
793
+ </script>
794
+ </body>
795
+ </html>