conectese 0.1.14
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/README.md +265 -0
- package/_conectese/.conectese-version +1 -0
- package/_conectese/config/playwright.config.json +11 -0
- package/_conectese/core/architect.agent.yaml +110 -0
- package/_conectese/core/best-practices/_catalog.yaml +116 -0
- package/_conectese/core/best-practices/blog-post.md +132 -0
- package/_conectese/core/best-practices/blog-seo.md +127 -0
- package/_conectese/core/best-practices/copywriting.md +426 -0
- package/_conectese/core/best-practices/data-analysis.md +401 -0
- package/_conectese/core/best-practices/email-newsletter.md +118 -0
- package/_conectese/core/best-practices/email-sales.md +110 -0
- package/_conectese/core/best-practices/image-design.md +348 -0
- package/_conectese/core/best-practices/instagram-feed.md +235 -0
- package/_conectese/core/best-practices/instagram-reels.md +112 -0
- package/_conectese/core/best-practices/instagram-stories.md +107 -0
- package/_conectese/core/best-practices/linkedin-article.md +116 -0
- package/_conectese/core/best-practices/linkedin-post.md +121 -0
- package/_conectese/core/best-practices/researching.md +349 -0
- package/_conectese/core/best-practices/review.md +269 -0
- package/_conectese/core/best-practices/social-networks-publishing.md +294 -0
- package/_conectese/core/best-practices/strategist.md +344 -0
- package/_conectese/core/best-practices/technical-writing.md +365 -0
- package/_conectese/core/best-practices/twitter-post.md +105 -0
- package/_conectese/core/best-practices/twitter-thread.md +122 -0
- package/_conectese/core/best-practices/whatsapp-broadcast.md +107 -0
- package/_conectese/core/best-practices/youtube-script.md +122 -0
- package/_conectese/core/best-practices/youtube-shorts.md +112 -0
- package/_conectese/core/prompts/build.prompt.md +547 -0
- package/_conectese/core/prompts/design.prompt.md +469 -0
- package/_conectese/core/prompts/discovery.prompt.md +269 -0
- package/_conectese/core/prompts/sherlock-instagram.md +123 -0
- package/_conectese/core/prompts/sherlock-linkedin.md +73 -0
- package/_conectese/core/prompts/sherlock-shared.md +684 -0
- package/_conectese/core/prompts/sherlock-twitter.md +78 -0
- package/_conectese/core/prompts/sherlock-youtube.md +85 -0
- package/_conectese/core/runner.pipeline.md +535 -0
- package/_conectese/core/skills.engine.md +381 -0
- package/agents/data-extractor/AGENT.md +13 -0
- package/agents/direito-adaneiro/AGENT.md +18 -0
- package/agents/direito-administrativo/AGENT.md +18 -0
- package/agents/direito-aeroporta-rio/AGENT.md +18 -0
- package/agents/direito-agra-rio/AGENT.md +18 -0
- package/agents/direito-ambiental/AGENT.md +18 -0
- package/agents/direito-banca-rio/AGENT.md +18 -0
- package/agents/direito-civil/AGENT.md +18 -0
- package/agents/direito-constitcional/AGENT.md +18 -0
- package/agents/direito-da-crianc-a-e-do-adolescente-eca/AGENT.md +18 -0
- package/agents/direito-da-propriedade-intelectal/AGENT.md +18 -0
- package/agents/direito-de-ami-lia/AGENT.md +18 -0
- package/agents/direito-de-tra-nsito/AGENT.md +18 -0
- package/agents/direito-desportivo/AGENT.md +18 -0
- package/agents/direito-digital/AGENT.md +18 -0
- package/agents/direito-do-consmidor/AGENT.md +18 -0
- package/agents/direito-do-trabalho/AGENT.md +18 -0
- package/agents/direito-econo-mico/AGENT.md +18 -0
- package/agents/direito-eleitoral/AGENT.md +18 -0
- package/agents/direito-empresarial/AGENT.md +18 -0
- package/agents/direito-imobilia-rio/AGENT.md +18 -0
- package/agents/direito-inanceiro/AGENT.md +18 -0
- package/agents/direito-internacional/AGENT.md +18 -0
- package/agents/direito-mari-timo/AGENT.md +18 -0
- package/agents/direito-me-dico-e-da-sa-de/AGENT.md +18 -0
- package/agents/direito-militar/AGENT.md +18 -0
- package/agents/direito-ndia-rio/AGENT.md +18 -0
- package/agents/direito-notarial-e-registral/AGENT.md +18 -0
- package/agents/direito-penal/AGENT.md +18 -0
- package/agents/direito-previdencia-rio/AGENT.md +18 -0
- package/agents/direito-processal-civil/AGENT.md +18 -0
- package/agents/direito-processal-do-trabalho/AGENT.md +18 -0
- package/agents/direito-processal-militar/AGENT.md +18 -0
- package/agents/direito-processal-penal/AGENT.md +18 -0
- package/agents/direito-rbani-stico/AGENT.md +18 -0
- package/agents/direito-secrita-rio/AGENT.md +18 -0
- package/agents/direito-sindical/AGENT.md +18 -0
- package/agents/direito-societa-rio/AGENT.md +18 -0
- package/agents/direito-tribta-rio/AGENT.md +18 -0
- package/agents/direitos-hmanos/AGENT.md +18 -0
- package/agents/legal-analyst/AGENT.md +16 -0
- package/agents/legal-synthesizer/AGENT.md +13 -0
- package/agents/lgpd-anonymizer/AGENT.md +14 -0
- package/agents/lgpd-restorer/AGENT.md +14 -0
- package/agents/task-router/AGENT.md +13 -0
- package/bin/conectese.js +73 -0
- package/dashboard/index.html +12 -0
- package/dashboard/package-lock.json +1971 -0
- package/dashboard/package.json +28 -0
- package/dashboard/public/assets/avatars/Female1_1wave.png +0 -0
- package/dashboard/public/assets/avatars/Female1_2wave.png +0 -0
- package/dashboard/public/assets/avatars/Female1_blink.png +0 -0
- package/dashboard/public/assets/avatars/Female1_talk.png +0 -0
- package/dashboard/public/assets/avatars/Female2_1wave.png +0 -0
- package/dashboard/public/assets/avatars/Female2_2wave.png +0 -0
- package/dashboard/public/assets/avatars/Female2_blink.png +0 -0
- package/dashboard/public/assets/avatars/Female2_talk.png +0 -0
- package/dashboard/public/assets/avatars/Female3_blink.png +0 -0
- package/dashboard/public/assets/avatars/Female3_talk.png +0 -0
- package/dashboard/public/assets/avatars/Female3_wave.png +0 -0
- package/dashboard/public/assets/avatars/Female4_blink.png +0 -0
- package/dashboard/public/assets/avatars/Female4_talk.png +0 -0
- package/dashboard/public/assets/avatars/Female4_wave.png +0 -0
- package/dashboard/public/assets/avatars/Female5_blink.png +0 -0
- package/dashboard/public/assets/avatars/Female5_talk.png +0 -0
- package/dashboard/public/assets/avatars/Female5_wave.png +0 -0
- package/dashboard/public/assets/avatars/Female6_blink.png +0 -0
- package/dashboard/public/assets/avatars/Female6_talk.png +0 -0
- package/dashboard/public/assets/avatars/Female6_wave.png +0 -0
- package/dashboard/public/assets/avatars/Male1_1wave.png +0 -0
- package/dashboard/public/assets/avatars/Male1_2wave.png +0 -0
- package/dashboard/public/assets/avatars/Male1_blink.png +0 -0
- package/dashboard/public/assets/avatars/Male1_talk.png +0 -0
- package/dashboard/public/assets/avatars/Male2_1wave.png +0 -0
- package/dashboard/public/assets/avatars/Male2_2wave.png +0 -0
- package/dashboard/public/assets/avatars/Male2_blink.png +0 -0
- package/dashboard/public/assets/avatars/Male2_talk.png +0 -0
- package/dashboard/public/assets/avatars/Male3_blink.png +0 -0
- package/dashboard/public/assets/avatars/Male3_talk.png +0 -0
- package/dashboard/public/assets/avatars/Male3_wave.png +0 -0
- package/dashboard/public/assets/avatars/Male4_blink.png +0 -0
- package/dashboard/public/assets/avatars/Male4_talk.png +0 -0
- package/dashboard/public/assets/avatars/Male4_wave.png +0 -0
- package/dashboard/public/assets/desks/desktop_set_black_down.png +0 -0
- package/dashboard/public/assets/desks/desktop_set_black_down_coding-1.png +0 -0
- package/dashboard/public/assets/desks/desktop_set_black_down_coding.png +0 -0
- package/dashboard/public/assets/desks/desktop_set_black_up.png +0 -0
- package/dashboard/public/assets/desks/desktop_set_white_down.png +0 -0
- package/dashboard/public/assets/desks/desktop_set_white_down_coding-1.png +0 -0
- package/dashboard/public/assets/desks/desktop_set_white_down_coding.png +0 -0
- package/dashboard/public/assets/desks/desktop_set_white_up.png +0 -0
- package/dashboard/public/assets/furniture/armchair_tan.png +0 -0
- package/dashboard/public/assets/furniture/armchair_tan_down.png +0 -0
- package/dashboard/public/assets/furniture/backpack_blue.png +0 -0
- package/dashboard/public/assets/furniture/backpack_red.png +0 -0
- package/dashboard/public/assets/furniture/blinds.png +0 -0
- package/dashboard/public/assets/furniture/blinds_large_closed_white.png +0 -0
- package/dashboard/public/assets/furniture/bookshelf.png +0 -0
- package/dashboard/public/assets/furniture/bookshelf_purple_tall.png +0 -0
- package/dashboard/public/assets/furniture/bulletin_board.png +0 -0
- package/dashboard/public/assets/furniture/clock.png +0 -0
- package/dashboard/public/assets/furniture/coffee_mug.png +0 -0
- package/dashboard/public/assets/furniture/coffee_mug_blue.png +0 -0
- package/dashboard/public/assets/furniture/coffee_table.png +0 -0
- package/dashboard/public/assets/furniture/coffeepot_right.png +0 -0
- package/dashboard/public/assets/furniture/coffeetable_black_horizontal.png +0 -0
- package/dashboard/public/assets/furniture/couch.png +0 -0
- package/dashboard/public/assets/furniture/couch_tan_down.png +0 -0
- package/dashboard/public/assets/furniture/cushion_blue.png +0 -0
- package/dashboard/public/assets/furniture/cushion_tan.png +0 -0
- package/dashboard/public/assets/furniture/desk_wood.png +0 -0
- package/dashboard/public/assets/furniture/fancy_rug.png +0 -0
- package/dashboard/public/assets/furniture/fancy_rug_wide.png +0 -0
- package/dashboard/public/assets/furniture/flowers1.png +0 -0
- package/dashboard/public/assets/furniture/flowers2.png +0 -0
- package/dashboard/public/assets/furniture/lamp_tan.png +0 -0
- package/dashboard/public/assets/furniture/lantern.png +0 -0
- package/dashboard/public/assets/furniture/monstera.png +0 -0
- package/dashboard/public/assets/furniture/monstera_small.png +0 -0
- package/dashboard/public/assets/furniture/picture_frame.png +0 -0
- package/dashboard/public/assets/furniture/plant1.png +0 -0
- package/dashboard/public/assets/furniture/plant2.png +0 -0
- package/dashboard/public/assets/furniture/plant3.png +0 -0
- package/dashboard/public/assets/furniture/plant_poof.png +0 -0
- package/dashboard/public/assets/furniture/plant_spindly.png +0 -0
- package/dashboard/public/assets/furniture/poster_blue.png +0 -0
- package/dashboard/public/assets/furniture/rug.png +0 -0
- package/dashboard/public/assets/furniture/succulent_blue.png +0 -0
- package/dashboard/public/assets/furniture/succulent_green.png +0 -0
- package/dashboard/public/assets/furniture/treasurechest_closed_gold.png +0 -0
- package/dashboard/public/assets/furniture/water_cooler_better.png +0 -0
- package/dashboard/public/assets/furniture/whiteboard.png +0 -0
- package/dashboard/public/assets/furniture/whiteboard_stand_graph.png +0 -0
- package/dashboard/public/assets/furniture/window_blinds_open.png +0 -0
- package/dashboard/src/App.tsx +46 -0
- package/dashboard/src/components/SquadCard.tsx +47 -0
- package/dashboard/src/components/SquadSelector.tsx +61 -0
- package/dashboard/src/components/StatusBadge.tsx +32 -0
- package/dashboard/src/components/StatusBar.tsx +97 -0
- package/dashboard/src/hooks/useSquadSocket.ts +135 -0
- package/dashboard/src/lib/formatTime.ts +16 -0
- package/dashboard/src/lib/normalizeState.ts +25 -0
- package/dashboard/src/main.tsx +10 -0
- package/dashboard/src/office/AgentSprite.ts +241 -0
- package/dashboard/src/office/OfficeScene.ts +153 -0
- package/dashboard/src/office/PhaserGame.tsx +80 -0
- package/dashboard/src/office/RoomBuilder.ts +190 -0
- package/dashboard/src/office/assetKeys.ts +150 -0
- package/dashboard/src/office/palette.ts +32 -0
- package/dashboard/src/plugin/squadWatcher.ts +233 -0
- package/dashboard/src/store/useSquadStore.ts +56 -0
- package/dashboard/src/styles/globals.css +36 -0
- package/dashboard/src/types/state.ts +63 -0
- package/dashboard/src/vite-env.d.ts +1 -0
- package/dashboard/test-results/.last-run.json +4 -0
- package/dashboard/tsconfig.json +24 -0
- package/dashboard/tsconfig.tsbuildinfo +1 -0
- package/dashboard/vite.config.ts +13 -0
- package/package.json +53 -0
- package/skills/README.md +63 -0
- package/skills/apify/SKILL.md +55 -0
- package/skills/blotato/SKILL.md +63 -0
- package/skills/canva/SKILL.md +60 -0
- package/skills/conectese-agent-creator/SKILL.md +192 -0
- package/skills/conectese-skill-creator/SKILL.md +407 -0
- package/skills/conectese-skill-creator/agents/analyzer.md +274 -0
- package/skills/conectese-skill-creator/agents/comparator.md +202 -0
- package/skills/conectese-skill-creator/agents/grader.md +223 -0
- package/skills/conectese-skill-creator/assets/eval_review.html +146 -0
- package/skills/conectese-skill-creator/eval-viewer/generate_review.py +471 -0
- package/skills/conectese-skill-creator/eval-viewer/viewer.html +1325 -0
- package/skills/conectese-skill-creator/references/schemas.md +430 -0
- package/skills/conectese-skill-creator/references/skill-format.md +235 -0
- package/skills/conectese-skill-creator/scripts/__init__.py +0 -0
- package/skills/conectese-skill-creator/scripts/aggregate_benchmark.py +401 -0
- package/skills/conectese-skill-creator/scripts/quick_validate.py +103 -0
- package/skills/conectese-skill-creator/scripts/run_eval.py +310 -0
- package/skills/conectese-skill-creator/scripts/utils.py +47 -0
- package/skills/image-ai-generator/SKILL.md +124 -0
- package/skills/image-ai-generator/scripts/generate.py +175 -0
- package/skills/image-creator/SKILL.md +155 -0
- package/skills/image-fetcher/SKILL.md +91 -0
- package/skills/instagram-publisher/SKILL.md +119 -0
- package/skills/instagram-publisher/scripts/publish.js +165 -0
- package/skills/resend/SKILL.md +80 -0
- package/skills/template-designer/SKILL.md +201 -0
- package/skills/template-designer/base-templates/model-a.html +27 -0
- package/skills/template-designer/base-templates/model-b.html +31 -0
- package/skills/template-designer/base-templates/model-c.html +42 -0
- package/src/agents-cli.js +158 -0
- package/src/agents.js +134 -0
- package/src/i18n.js +48 -0
- package/src/init.js +341 -0
- package/src/locales/en.json +73 -0
- package/src/locales/es.json +72 -0
- package/src/locales/pt-BR.json +72 -0
- package/src/logger.js +38 -0
- package/src/prompt.js +46 -0
- package/src/readme/README.md +119 -0
- package/src/runs.js +90 -0
- package/src/skills-cli.js +157 -0
- package/src/skills.js +146 -0
- package/src/update.js +169 -0
- package/templates/_conectese/.conectese-version +1 -0
- package/templates/_conectese/_investigations/.gitkeep +0 -0
- package/templates/ide-templates/antigravity/.agent/rules/conectese.md +55 -0
- package/templates/ide-templates/antigravity/.agent/workflows/conectese.md +102 -0
- package/templates/ide-templates/claude-code/.claude/skills/conectese/SKILL.md +182 -0
- package/templates/ide-templates/claude-code/.mcp.json +8 -0
- package/templates/ide-templates/claude-code/CLAUDE.md +43 -0
- package/templates/ide-templates/codex/.agents/skills/conectese/SKILL.md +6 -0
- package/templates/ide-templates/codex/AGENTS.md +105 -0
- package/templates/ide-templates/cursor/.cursor/commands/conectese.md +9 -0
- package/templates/ide-templates/cursor/.cursor/mcp.json +8 -0
- package/templates/ide-templates/cursor/.cursor/rules/conectese.mdc +48 -0
- package/templates/ide-templates/cursor/.cursorignore +3 -0
- package/templates/ide-templates/opencode/.opencode/commands/conectese.md +9 -0
- package/templates/ide-templates/opencode/AGENTS.md +105 -0
- package/templates/ide-templates/vscode-copilot/.github/prompts/conectese.prompt.md +201 -0
- package/templates/ide-templates/vscode-copilot/.vscode/mcp.json +8 -0
- package/templates/ide-templates/vscode-copilot/.vscode/settings.json +3 -0
- package/templates/package.json +8 -0
- package/templates/squads/.gitkeep +0 -0
|
@@ -0,0 +1,365 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: technical-writing
|
|
3
|
+
name: "Technical & Long-Form Writing"
|
|
4
|
+
whenToUse: |
|
|
5
|
+
Creating agents that write articles, blog posts, documentation, tutorials,
|
|
6
|
+
white papers, case studies, or educational content.
|
|
7
|
+
NOT for: short-form persuasive copy, research, data analysis, strategic planning.
|
|
8
|
+
version: "1.0.0"
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Technical & Long-Form Writing — Best Practices
|
|
12
|
+
|
|
13
|
+
## Core Principles
|
|
14
|
+
|
|
15
|
+
1. **Clarity over cleverness.** Use simple, direct language. Choose concrete examples over abstract explanations. If a twelve-year-old cannot understand your sentence structure, rewrite it. Technical content does not require complicated prose.
|
|
16
|
+
|
|
17
|
+
2. **Structure first, always.** Never write without an outline. The outline is the skeleton that holds everything together. Define your sections, their order, and their purpose before drafting a single paragraph. Share the outline for approval before proceeding to the full draft.
|
|
18
|
+
|
|
19
|
+
3. **Evidence-based arguments.** Every claim needs support. Cite sources, reference data, quote experts, or provide concrete examples. Unsupported assertions undermine credibility. When exact data is unavailable, say so explicitly rather than fabricating statistics.
|
|
20
|
+
|
|
21
|
+
4. **Progressive disclosure.** Start simple, build complexity. Introduce concepts in layers so readers can follow regardless of their starting knowledge level. The first paragraph of each section should be accessible; depth increases as the section progresses.
|
|
22
|
+
|
|
23
|
+
5. **Accessibility without compromise.** Never use jargon without defining it on first use. Acronyms get spelled out the first time. Technical terms receive inline definitions or parenthetical explanations. Accessibility does not mean dumbing down; it means removing unnecessary barriers.
|
|
24
|
+
|
|
25
|
+
6. **Completeness within scope.** Cover the topic thoroughly within the defined boundaries. If a topic requires more depth than the current format allows, flag it and recommend a follow-up piece or a series. Never leave obvious questions unanswered.
|
|
26
|
+
|
|
27
|
+
7. **Audience-appropriate depth.** A tutorial for beginners requires different depth than a white paper for CTOs. Assess the audience before writing and calibrate vocabulary, example complexity, and assumed knowledge accordingly. When in doubt, err on the side of more explanation, not less.
|
|
28
|
+
|
|
29
|
+
8. **Scannable structure.** Use subheadings, bullet points, numbered lists, bold key terms, and short paragraphs. Readers scan before they read. Make scanning productive by ensuring subheadings communicate the key point of each section.
|
|
30
|
+
|
|
31
|
+
9. **Actionable takeaways.** Every piece should leave the reader with something they can do. A blog post should end with next steps. A tutorial should produce a working result. A white paper should inform a decision. Content without action is content without purpose.
|
|
32
|
+
|
|
33
|
+
## Writing Methodology
|
|
34
|
+
|
|
35
|
+
### Step 1: Load Context
|
|
36
|
+
|
|
37
|
+
Gather all inputs before writing anything. Required context includes:
|
|
38
|
+
- Topic definition and scope boundaries
|
|
39
|
+
- Target audience (role, expertise level, goals)
|
|
40
|
+
- Brand voice guidelines (if available)
|
|
41
|
+
- Research brief or source materials (from researcher agent)
|
|
42
|
+
- Content format (blog post, tutorial, documentation, white paper)
|
|
43
|
+
- Target word count or depth expectations
|
|
44
|
+
- Any existing content on the topic to avoid duplication
|
|
45
|
+
|
|
46
|
+
### Step 2: Create Outline
|
|
47
|
+
|
|
48
|
+
Build a detailed outline that maps the argument or teaching progression:
|
|
49
|
+
- Define the hook (why should the reader care right now?)
|
|
50
|
+
- Map sections to a logical flow (chronological, problem-solution, simple-to-complex)
|
|
51
|
+
- Assign approximate word counts per section
|
|
52
|
+
- Identify where evidence, examples, and visuals are needed
|
|
53
|
+
- Mark sections that may need additional research
|
|
54
|
+
- Present the outline for approval before proceeding
|
|
55
|
+
|
|
56
|
+
### Step 3: Draft Introduction
|
|
57
|
+
|
|
58
|
+
Write the introduction with three components:
|
|
59
|
+
- **Hook:** A concrete scenario, surprising statistic, or relatable problem that pulls the reader in
|
|
60
|
+
- **Promise:** A clear statement of what the reader will learn or gain
|
|
61
|
+
- **Roadmap:** A brief preview of the article structure so the reader knows what to expect
|
|
62
|
+
|
|
63
|
+
### Step 4: Write Body Sections
|
|
64
|
+
|
|
65
|
+
Draft one section at a time, following the approved outline:
|
|
66
|
+
- Open each section with a clear topic sentence
|
|
67
|
+
- Support claims with evidence (data, citations, examples)
|
|
68
|
+
- Include at least one concrete example per section
|
|
69
|
+
- Use transitional phrases between paragraphs and sections
|
|
70
|
+
- Add subheadings every 200-300 words
|
|
71
|
+
- Keep paragraphs under 4-5 sentences
|
|
72
|
+
|
|
73
|
+
### Step 5: Draft Conclusion
|
|
74
|
+
|
|
75
|
+
Write a conclusion that delivers on the introduction's promise:
|
|
76
|
+
- Summarize key points without repeating them verbatim
|
|
77
|
+
- Provide an actionable takeaway the reader can implement immediately
|
|
78
|
+
- If appropriate, point to next steps or related resources
|
|
79
|
+
- End on a forward-looking or motivating note, not a summary rehash
|
|
80
|
+
|
|
81
|
+
### Step 6: Self-Review
|
|
82
|
+
|
|
83
|
+
Review the complete draft against quality criteria:
|
|
84
|
+
- Read the full piece for flow and coherence
|
|
85
|
+
- Check that every section delivers on its outline promise
|
|
86
|
+
- Verify all claims have supporting evidence
|
|
87
|
+
- Confirm no jargon is used without definition
|
|
88
|
+
- Validate subheading frequency and readability
|
|
89
|
+
- Ensure the introduction's promise matches the conclusion's delivery
|
|
90
|
+
- Check reading level appropriateness for the target audience
|
|
91
|
+
|
|
92
|
+
### Step 7: Compile with Metadata
|
|
93
|
+
|
|
94
|
+
Prepare the final output with all required metadata:
|
|
95
|
+
- Title (compelling, specific, keyword-aware)
|
|
96
|
+
- Subtitle or deck (one-sentence summary)
|
|
97
|
+
- Meta description (for SEO, 150-160 characters)
|
|
98
|
+
- Suggested tags or categories
|
|
99
|
+
- Estimated reading time
|
|
100
|
+
- The complete article body
|
|
101
|
+
|
|
102
|
+
## Decision Criteria
|
|
103
|
+
|
|
104
|
+
- **When to add examples vs. move on:** Add an example whenever a concept is abstract, counterintuitive, or new to the target audience. Move on when the point is concrete and self-evident.
|
|
105
|
+
- **When depth is sufficient:** Depth is sufficient when a reader at the target expertise level can act on the information without needing to consult another source for the same concept.
|
|
106
|
+
- **When to recommend splitting into a series:** If the outline exceeds the target word count by more than 30%, or if two or more sections could stand alone as complete articles, recommend a series.
|
|
107
|
+
- **When to use lists vs. prose:** Use lists for sequential steps, parallel items, or scannable reference material. Use prose for narrative flow, argumentation, and context-setting.
|
|
108
|
+
- **When to recommend visuals:** Recommend a diagram, screenshot, or illustration whenever a concept involves spatial relationships, multi-step processes, or comparisons across three or more items.
|
|
109
|
+
|
|
110
|
+
## Quality Criteria
|
|
111
|
+
|
|
112
|
+
Before delivering any piece of content, verify the following:
|
|
113
|
+
|
|
114
|
+
- [ ] **Clear structure.** The piece has a defined introduction, body sections, and conclusion. The reader can predict the flow from the introduction.
|
|
115
|
+
- [ ] **Examples in every section.** Each body section contains at least one concrete example, code snippet, scenario, or case reference.
|
|
116
|
+
- [ ] **No undefined jargon.** Every technical term, acronym, or domain-specific phrase is defined on first use.
|
|
117
|
+
- [ ] **Appropriate subheading frequency.** No section runs longer than 300 words without a subheading or visual break.
|
|
118
|
+
- [ ] **Evidence-backed claims.** Quantitative claims reference a source. Qualitative claims are supported by examples or expert references.
|
|
119
|
+
- [ ] **Actionable takeaway present.** The piece ends with specific next steps, recommendations, or actions the reader can take.
|
|
120
|
+
- [ ] **Reading level matches audience.** A beginner tutorial reads at a lower complexity than a white paper for senior engineers. Vocabulary and assumed knowledge align with the target audience.
|
|
121
|
+
- [ ] **Word count matches format.** Blog posts: 800-2,000 words. Tutorials: 1,500-3,000 words. White papers: 3,000-6,000 words. Documentation pages: 500-1,500 words.
|
|
122
|
+
- [ ] **No em dashes.** The entire output has been checked for em dashes and none are present.
|
|
123
|
+
- [ ] **Introduction promise matches conclusion delivery.** Whatever the introduction says the reader will learn, the conclusion confirms they learned it.
|
|
124
|
+
- [ ] **Transitions between sections.** Each section connects logically to the next. The reader never wonders "why am I reading this now?"
|
|
125
|
+
- [ ] **Metadata complete.** Title, meta description, tags, and estimated reading time are all provided with the final draft.
|
|
126
|
+
|
|
127
|
+
## Output Examples
|
|
128
|
+
|
|
129
|
+
### Example 1: Blog Post Introduction + Outline + First Section
|
|
130
|
+
|
|
131
|
+
**Title:** How Connection Pooling Cuts Your Database Latency in Half
|
|
132
|
+
|
|
133
|
+
**Meta description:** Learn how connection pooling works, why it reduces database latency, and how to implement it in Node.js with practical code examples.
|
|
134
|
+
|
|
135
|
+
**Estimated reading time:** 8 minutes
|
|
136
|
+
|
|
137
|
+
---
|
|
138
|
+
|
|
139
|
+
**Introduction:**
|
|
140
|
+
|
|
141
|
+
Every time your application opens a new database connection, it pays a tax. The TCP handshake, authentication, SSL negotiation, and protocol setup add 20-50 milliseconds per connection. For a single request, that is negligible. For an application handling 1,000 requests per second, that is 20-50 seconds of cumulative overhead every second, just from connection setup.
|
|
142
|
+
|
|
143
|
+
Connection pooling eliminates this tax by maintaining a set of pre-established connections that your application reuses. Instead of opening and closing connections per request, your app borrows a connection from the pool, uses it, and returns it. The result: database latency drops by 40-60% in most production workloads.
|
|
144
|
+
|
|
145
|
+
This article covers three things. First, you will understand how connection pooling works under the hood. Second, you will see benchmark data comparing pooled and unpooled connections. Third, you will implement a production-ready connection pool in Node.js with proper error handling and monitoring.
|
|
146
|
+
|
|
147
|
+
---
|
|
148
|
+
|
|
149
|
+
**Outline:**
|
|
150
|
+
|
|
151
|
+
1. The cost of a database connection (what happens during setup, measured latency)
|
|
152
|
+
2. How connection pooling works (pool lifecycle, borrow/return model, idle management)
|
|
153
|
+
3. Benchmark results (pooled vs. unpooled across load levels)
|
|
154
|
+
4. Implementation in Node.js (code walkthrough with pg-pool)
|
|
155
|
+
5. Production considerations (pool sizing, error handling, monitoring)
|
|
156
|
+
6. Common pitfalls (connection leaks, pool exhaustion, stale connections)
|
|
157
|
+
7. Key takeaways and next steps
|
|
158
|
+
|
|
159
|
+
---
|
|
160
|
+
|
|
161
|
+
**Section 1: The Cost of a Database Connection**
|
|
162
|
+
|
|
163
|
+
When your application calls `db.connect()`, the following sequence executes before a single query can run:
|
|
164
|
+
|
|
165
|
+
1. **DNS resolution** resolves the database hostname to an IP address (1-10ms)
|
|
166
|
+
2. **TCP handshake** establishes the network connection with a three-way SYN/SYN-ACK/ACK exchange (1-5ms locally, 10-50ms cross-region)
|
|
167
|
+
3. **TLS negotiation** sets up encrypted communication if SSL is enabled (5-15ms)
|
|
168
|
+
4. **Authentication** sends credentials and receives confirmation (2-10ms)
|
|
169
|
+
5. **Protocol initialization** configures session parameters like character set and timezone (1-5ms)
|
|
170
|
+
|
|
171
|
+
Total setup cost per connection: **10-90ms** depending on network topology and security configuration.
|
|
172
|
+
|
|
173
|
+
For a simple SELECT query that takes 2ms to execute, the connection setup can represent 80-97% of the total request time. That ratio gets worse with geographic distance between your application server and database server.
|
|
174
|
+
|
|
175
|
+
To put this in context, consider an e-commerce application that runs 5 database queries per page load. If each query opens a new connection, the user pays 50-450ms in connection overhead alone, before any actual data retrieval. On a page that otherwise loads in 200ms, connection setup could triple the total response time.
|
|
176
|
+
|
|
177
|
+
This overhead is entirely avoidable. The connections themselves are reusable. Once established, a database connection can handle thousands of queries sequentially. The only reason to close and reopen connections is resource management, which is exactly what connection pooling automates.
|
|
178
|
+
|
|
179
|
+
### Example 2: Tutorial Section with Step-by-Step Instructions
|
|
180
|
+
|
|
181
|
+
**Section: Setting Up Automated Backups with Cron and Restic**
|
|
182
|
+
|
|
183
|
+
Before you begin, make sure you have the following prerequisites installed on your server:
|
|
184
|
+
|
|
185
|
+
- **Restic** (version 0.14 or later): the backup tool that handles deduplication and encryption
|
|
186
|
+
- **Cron**: the standard Unix job scheduler (pre-installed on most Linux distributions)
|
|
187
|
+
- **An S3-compatible storage bucket**: where your encrypted backups will be stored (AWS S3, MinIO, or Backblaze B2 all work)
|
|
188
|
+
|
|
189
|
+
If you do not have Restic installed, run the following command on Ubuntu/Debian:
|
|
190
|
+
|
|
191
|
+
```bash
|
|
192
|
+
sudo apt update && sudo apt install restic
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
Verify the installation by checking the version:
|
|
196
|
+
|
|
197
|
+
```bash
|
|
198
|
+
restic version
|
|
199
|
+
# Expected output: restic 0.16.2 (or later)
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
**Step 1: Initialize the backup repository.**
|
|
203
|
+
|
|
204
|
+
A Restic repository is the destination where your backup data lives. You initialize it once, and all future backups write to the same repository. Run this command, replacing the bucket name and path with your own:
|
|
205
|
+
|
|
206
|
+
```bash
|
|
207
|
+
export AWS_ACCESS_KEY_ID="your-access-key"
|
|
208
|
+
export AWS_SECRET_ACCESS_KEY="your-secret-key"
|
|
209
|
+
|
|
210
|
+
restic -r s3:s3.amazonaws.com/your-bucket-name/backups init
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
Restic will prompt you for a repository password. Choose a strong password and store it in a password manager. You will need this password for every backup and restore operation. Without it, your backups are permanently inaccessible (this is a security feature, not a limitation).
|
|
214
|
+
|
|
215
|
+
**Step 2: Create the backup script.**
|
|
216
|
+
|
|
217
|
+
Rather than typing the full Restic command every time, create a shell script that handles environment variables, paths, and error reporting. Save this file as `/opt/scripts/backup.sh`:
|
|
218
|
+
|
|
219
|
+
```bash
|
|
220
|
+
#!/bin/bash
|
|
221
|
+
set -euo pipefail
|
|
222
|
+
|
|
223
|
+
# Configuration
|
|
224
|
+
export AWS_ACCESS_KEY_ID="your-access-key"
|
|
225
|
+
export AWS_SECRET_ACCESS_KEY="your-secret-key"
|
|
226
|
+
export RESTIC_REPOSITORY="s3:s3.amazonaws.com/your-bucket-name/backups"
|
|
227
|
+
export RESTIC_PASSWORD_FILE="/etc/restic/password.txt"
|
|
228
|
+
|
|
229
|
+
# Directories to back up
|
|
230
|
+
BACKUP_PATHS="/var/www /etc/nginx /home"
|
|
231
|
+
|
|
232
|
+
# Directories to exclude
|
|
233
|
+
EXCLUDE_PATTERNS="--exclude='*.tmp' --exclude='node_modules' --exclude='.cache'"
|
|
234
|
+
|
|
235
|
+
# Run the backup
|
|
236
|
+
restic backup $BACKUP_PATHS $EXCLUDE_PATTERNS \
|
|
237
|
+
--tag "automated" \
|
|
238
|
+
--tag "$(hostname)" \
|
|
239
|
+
2>&1 | logger -t restic-backup
|
|
240
|
+
|
|
241
|
+
# Prune old snapshots: keep 7 daily, 4 weekly, 6 monthly
|
|
242
|
+
restic forget \
|
|
243
|
+
--keep-daily 7 \
|
|
244
|
+
--keep-weekly 4 \
|
|
245
|
+
--keep-monthly 6 \
|
|
246
|
+
--prune \
|
|
247
|
+
2>&1 | logger -t restic-prune
|
|
248
|
+
|
|
249
|
+
echo "Backup completed at $(date)" | logger -t restic-backup
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
Two things to note about this script. First, the `set -euo pipefail` line at the top ensures the script stops immediately if any command fails, rather than silently continuing with partial backups. Second, the output pipes to `logger`, which writes to your system's syslog. This means you can review backup logs with `journalctl -t restic-backup` without managing separate log files.
|
|
253
|
+
|
|
254
|
+
**Step 3: Set file permissions.**
|
|
255
|
+
|
|
256
|
+
Your backup script contains storage credentials, so restrict its permissions to root only:
|
|
257
|
+
|
|
258
|
+
```bash
|
|
259
|
+
sudo chmod 700 /opt/scripts/backup.sh
|
|
260
|
+
sudo chown root:root /opt/scripts/backup.sh
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
Store the repository password in a separate file with equally restrictive permissions:
|
|
264
|
+
|
|
265
|
+
```bash
|
|
266
|
+
echo "your-repository-password" | sudo tee /etc/restic/password.txt > /dev/null
|
|
267
|
+
sudo chmod 600 /etc/restic/password.txt
|
|
268
|
+
sudo chown root:root /etc/restic/password.txt
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
**Step 4: Schedule the backup with Cron.**
|
|
272
|
+
|
|
273
|
+
Open the root crontab and add a daily backup schedule:
|
|
274
|
+
|
|
275
|
+
```bash
|
|
276
|
+
sudo crontab -e
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
Add this line to run backups every day at 2:00 AM server time:
|
|
280
|
+
|
|
281
|
+
```cron
|
|
282
|
+
0 2 * * * /opt/scripts/backup.sh
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
The five fields represent minute (0), hour (2), day of month (any), month (any), and day of week (any). This schedule avoids peak usage hours while running frequently enough to limit data loss to a maximum of 24 hours.
|
|
286
|
+
|
|
287
|
+
**Step 5: Verify the setup.**
|
|
288
|
+
|
|
289
|
+
Run the backup script manually to confirm everything works before relying on the cron schedule:
|
|
290
|
+
|
|
291
|
+
```bash
|
|
292
|
+
sudo /opt/scripts/backup.sh
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
After the script completes, verify that snapshots appear in your repository:
|
|
296
|
+
|
|
297
|
+
```bash
|
|
298
|
+
restic -r s3:s3.amazonaws.com/your-bucket-name/backups snapshots
|
|
299
|
+
```
|
|
300
|
+
|
|
301
|
+
You should see one snapshot listed with the current timestamp and the tags "automated" and your hostname. If you see errors instead, check that your AWS credentials are correct and that the S3 bucket exists and is accessible from your server.
|
|
302
|
+
|
|
303
|
+
## Anti-Patterns
|
|
304
|
+
|
|
305
|
+
### Never Do
|
|
306
|
+
|
|
307
|
+
1. **Write without an outline.** Drafting without structure leads to meandering content, redundant sections, and missing coverage. Always outline first, get approval, then write.
|
|
308
|
+
|
|
309
|
+
2. **Use jargon without definition.** Every undefined technical term is a potential exit point for the reader. Define terms inline on first use, even if you think the audience "should know."
|
|
310
|
+
|
|
311
|
+
3. **Exceed scope without flagging.** If writing reveals that the topic needs more coverage than planned, stop and flag it. Recommend a follow-up piece or series rather than inflating the current piece beyond its intended scope.
|
|
312
|
+
|
|
313
|
+
4. **Write walls of text without subheadings.** More than 300 words without a visual break (subheading, list, code block, or image) signals that the content needs restructuring. Scan-friendliness is not optional.
|
|
314
|
+
|
|
315
|
+
5. **Make claims without evidence.** Statements like "most developers prefer" or "this approach is faster" require supporting data, a citation, or at minimum a concrete example. Unsupported claims erode trust.
|
|
316
|
+
|
|
317
|
+
6. **Use em dashes anywhere in the output.** Replace every em dash with a comma, period, colon, or parenthetical. This is a non-negotiable formatting rule.
|
|
318
|
+
|
|
319
|
+
7. **Start sections with definitions.** "Authentication is the process of..." is the weakest possible opening. Start with a problem, scenario, or consequence, then introduce the concept as the solution.
|
|
320
|
+
|
|
321
|
+
8. **Repeat the same point in different words.** If you have said it clearly once, move forward. Repetition for emphasis works in speeches, not in written content. Readers can re-read; they should not have to.
|
|
322
|
+
|
|
323
|
+
### Always Do
|
|
324
|
+
|
|
325
|
+
1. **Include at least one concrete example in every section.** Abstract explanations without examples leave readers uncertain about practical application. Examples bridge the gap between theory and practice.
|
|
326
|
+
|
|
327
|
+
2. **Define technical terms on first use.** Use inline definitions (parenthetical or appositive) to keep the reader moving without requiring them to look things up externally.
|
|
328
|
+
|
|
329
|
+
3. **Use subheadings every 200-300 words.** Subheadings serve two purposes: they help scanners find relevant sections, and they help readers track their progress through the piece.
|
|
330
|
+
|
|
331
|
+
4. **Provide actionable takeaways.** Every article, tutorial, or guide should end with something the reader can do next. If your content does not change behavior or inform a decision, reconsider its purpose.
|
|
332
|
+
|
|
333
|
+
5. **Front-load key information.** Put the most important point of each section in the first sentence. Readers who scan will still absorb the core message.
|
|
334
|
+
|
|
335
|
+
6. **Use parallel structure in lists.** Every item in a list should follow the same grammatical pattern. Mixing verb forms, sentence fragments, and complete sentences within a single list creates cognitive friction.
|
|
336
|
+
|
|
337
|
+
## Vocabulary Guidance
|
|
338
|
+
|
|
339
|
+
### Use
|
|
340
|
+
|
|
341
|
+
- **Concrete examples** to anchor abstract concepts: "For instance, if your API returns a 429 status code, that means..."
|
|
342
|
+
- **Scenario-based framing** to build relevance: "Consider this scenario: your team just shipped a feature and usage spikes overnight..."
|
|
343
|
+
- **Transitional phrases** to maintain flow between paragraphs and sections: "Building on this foundation...", "With that context in mind...", "This brings us to..."
|
|
344
|
+
- **Active voice** as the default for direct, clear communication: "The function validates the input" not "The input is validated by the function."
|
|
345
|
+
- **Specific numbers and data** over vague qualifiers: "Reduced load time by 40%" not "Significantly improved performance."
|
|
346
|
+
- **Reader-addressing language** to maintain engagement: "You will notice...", "At this point, you have...", "Your next step is..."
|
|
347
|
+
- **Short sentences for key points.** When stating something important, keep it brief. Let the sentence stand alone.
|
|
348
|
+
|
|
349
|
+
### Avoid
|
|
350
|
+
|
|
351
|
+
- **Jargon without definition.** If a term requires domain knowledge, define it inline on first use. No exceptions.
|
|
352
|
+
- **Em dashes.** Do not use em dashes in any output. They are the most recognizable marker of AI-generated text. Use commas, periods, parentheses, or colons instead.
|
|
353
|
+
- **Filler phrases.** Remove "It's important to note that...", "It goes without saying...", "Needless to say...", "At the end of the day...", "In today's world..." These add no information.
|
|
354
|
+
- **Passive voice without reason.** Use passive voice only when the actor is genuinely unknown or irrelevant. Otherwise, name the subject.
|
|
355
|
+
- **"In conclusion" or "To summarize."** The conclusion should feel like a natural landing, not an announcement. Show the ending through content, not labels.
|
|
356
|
+
- **Walls of text.** Never write more than 300 words without a subheading, list, or visual break. Dense paragraphs lose readers.
|
|
357
|
+
- **Rhetorical questions as filler.** Only use a question when you immediately answer it and the answer drives the narrative forward.
|
|
358
|
+
- **Exclamation marks.** Professional content earns enthusiasm through substance, not punctuation.
|
|
359
|
+
|
|
360
|
+
### Tone Rules
|
|
361
|
+
|
|
362
|
+
1. **Authoritative but approachable.** Write like a senior colleague explaining something to a motivated junior, not like a professor lecturing a class. Confidence without condescension.
|
|
363
|
+
2. **Educational without patronizing.** Assume the reader is intelligent but may lack specific domain knowledge. Explain concepts, not because the reader is incapable, but because the topic is genuinely complex.
|
|
364
|
+
3. **Evidence-driven, not opinion-driven.** State facts, cite sources, present data. When offering an opinion or recommendation, label it clearly: "Based on these results, we recommend..." or "In our experience..."
|
|
365
|
+
4. **Calm and measured.** Avoid hype, urgency, or sensationalism. Let the content's value speak for itself. "This approach reduces errors by 60%" is more persuasive than "This game-changing approach will revolutionize your workflow."
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: "Twitter/X Post"
|
|
3
|
+
platform: "twitter"
|
|
4
|
+
content_type: "post"
|
|
5
|
+
description: "Single tweets and quote tweets optimized for engagement, bookmarks, and algorithmic reach"
|
|
6
|
+
whenToUse: |
|
|
7
|
+
Creating agents that produce tweets, quote tweets, or single posts for X/Twitter.
|
|
8
|
+
constraints:
|
|
9
|
+
tweet_max_chars: 280
|
|
10
|
+
effective_chars: 260
|
|
11
|
+
hashtags_max: 3
|
|
12
|
+
recommended_hashtags: "2-3"
|
|
13
|
+
images_per_tweet: 4
|
|
14
|
+
version: "1.0.0"
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## Platform Rules
|
|
18
|
+
|
|
19
|
+
- Engagement is weighted: Replies > Bookmarks > Retweets > Likes. Design tweets that provoke replies and are worth bookmarking.
|
|
20
|
+
- Tweets with images or video get significantly more impressions than text-only tweets. Always consider whether a visual element strengthens the tweet.
|
|
21
|
+
- The algorithm penalizes tweets with external links in the body. Links reduce distribution. Post the link in a reply instead or use the "link in bio" approach.
|
|
22
|
+
- Early engagement in the first 15-30 minutes is critical. The algorithm tests your tweet with a small audience first, then expands based on engagement velocity.
|
|
23
|
+
- Dwell time matters. Tweets that make people stop scrolling and read get algorithmic boosts. Multi-line tweets with line breaks create natural dwell time.
|
|
24
|
+
- Tweets from accounts that actively reply to others get higher baseline reach. Engagement is a two-way signal.
|
|
25
|
+
- Best posting times: 8-10 AM EST or 12-1 PM EST on weekdays. Tuesday through Thursday for professional and B2B content. Saturday morning works for casual content.
|
|
26
|
+
- Frequency: 1-3 tweets per day is a sustainable, high-performing cadence.
|
|
27
|
+
|
|
28
|
+
## Content Structure
|
|
29
|
+
|
|
30
|
+
### Single Tweet Formats
|
|
31
|
+
|
|
32
|
+
- **Hot take**: Contrarian opinion that sparks debate. "Most people think X. The truth is Y."
|
|
33
|
+
- **Question**: Simple, relatable question that invites replies. "What is the one thing you wish you knew about [topic]?"
|
|
34
|
+
- **Listicle**: "5 things I learned about X:" followed by a numbered list, one item per line.
|
|
35
|
+
- **Quote + take**: Share a quote and add your unique perspective in 1-2 sentences.
|
|
36
|
+
- **Data point**: One surprising stat with your interpretation. "[Stat]. Here is what most people miss:"
|
|
37
|
+
- **Before/After**: Contrast two states or perspectives. "Before: [old way]. Now: [new insight]."
|
|
38
|
+
|
|
39
|
+
### Quote Tweet Structure
|
|
40
|
+
|
|
41
|
+
1. Highlight the key point from the original tweet.
|
|
42
|
+
2. Add your unique angle, experience, or data.
|
|
43
|
+
3. Keep under 200 characters to leave room for the quoted content's context.
|
|
44
|
+
|
|
45
|
+
### Tweet Anatomy
|
|
46
|
+
|
|
47
|
+
- **Opening words** — The first 5-8 words decide whether someone reads further. Front-load the value or tension.
|
|
48
|
+
- **Body** — One idea only. Develop it clearly in 1-3 sentences maximum.
|
|
49
|
+
- **Closer** — A question, bold statement, or implication that invites engagement.
|
|
50
|
+
|
|
51
|
+
## Writing Guidelines
|
|
52
|
+
|
|
53
|
+
- **One idea per tweet.** Clarity beats cleverness. If you need multiple points, write a thread instead.
|
|
54
|
+
- Front-load the value. The first few words of the tweet determine whether someone reads the rest. Start with the strongest word or phrase.
|
|
55
|
+
- Use line breaks strategically for readability. A tweet formatted as 2-3 short lines reads better than one dense paragraph.
|
|
56
|
+
- Leave approximately 20 characters of headroom for hashtags. Aim for ~260 effective characters of content.
|
|
57
|
+
- Use 2-3 hashtags maximum. Place them at the end of the tweet or weave them naturally into the text. More than 3 hashtags signals low-quality content.
|
|
58
|
+
- Focus on industry/topic-specific hashtags, not generic ones. #ContentStrategy beats #Success.
|
|
59
|
+
- When quote tweeting, add genuine insight. Not "This!" or "So true." Add your experience, a counter-point, or additional data.
|
|
60
|
+
- Write tweets that invite replies: questions, fill-in-the-blank prompts, "unpopular opinion" takes, and debate-starting claims.
|
|
61
|
+
- Reply to comments on your tweets within the first hour to boost algorithmic momentum.
|
|
62
|
+
|
|
63
|
+
## Output Format
|
|
64
|
+
|
|
65
|
+
```
|
|
66
|
+
=== TWEET ===
|
|
67
|
+
[Tweet text — max 280 characters. Front-load value. One clear idea. Use line breaks for readability.]
|
|
68
|
+
|
|
69
|
+
=== HASHTAGS ===
|
|
70
|
+
#hashtag1 #hashtag2
|
|
71
|
+
[2-3 hashtags, placed at the end of the tweet or noted separately]
|
|
72
|
+
|
|
73
|
+
=== IMAGE (optional) ===
|
|
74
|
+
[Image description — what the visual shows, composition, text overlay if any]
|
|
75
|
+
[Alt text for accessibility — max 1,000 characters]
|
|
76
|
+
|
|
77
|
+
=== QUOTE TWEET (if applicable) ===
|
|
78
|
+
[URL or reference to the original tweet being quoted]
|
|
79
|
+
[Your commentary — max 200 characters to leave room for context]
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
## Quality Criteria
|
|
83
|
+
|
|
84
|
+
- [ ] Tweet is 280 characters or fewer, with ~260 characters of content leaving room for hashtags
|
|
85
|
+
- [ ] First 5-8 words create enough interest to finish reading the tweet
|
|
86
|
+
- [ ] Tweet contains exactly one clear idea, not multiple crammed together
|
|
87
|
+
- [ ] Hashtags are 2-3 maximum and topic-specific, not generic
|
|
88
|
+
- [ ] No external links appear in the tweet body (links go in replies)
|
|
89
|
+
- [ ] Tweet is formatted with line breaks for readability where appropriate
|
|
90
|
+
- [ ] Content invites a reply, bookmark, or retweet through its framing
|
|
91
|
+
- [ ] Quote tweets (if used) add genuine insight, not just agreement
|
|
92
|
+
- [ ] Image alt text is included if an image is attached
|
|
93
|
+
- [ ] Tweet avoids filler words and gets to the point immediately
|
|
94
|
+
|
|
95
|
+
## Anti-Patterns
|
|
96
|
+
|
|
97
|
+
- **Links in tweet body** — Dramatically reduces reach due to algorithmic suppression. Post the link as a reply or use "link in bio."
|
|
98
|
+
- **Excessive emojis** — More than 2-3 emojis per tweet looks unprofessional and reduces credibility in professional niches.
|
|
99
|
+
- **Hashtag spam** — More than 3 hashtags per tweet signals low-quality content and reduces engagement rather than increasing it.
|
|
100
|
+
- **Reposting the same content verbatim** — The algorithm detects duplicate content and suppresses it. Rephrase or add new context when revisiting a topic.
|
|
101
|
+
- **Not engaging with replies** — Failing to respond to comments signals to the algorithm that your content does not generate real conversation, reducing future distribution.
|
|
102
|
+
- **Using URL shorteners** — Twitter/X already shortens links. Third-party shorteners look suspicious and may be flagged as spam.
|
|
103
|
+
- **Auto-cross-posting from other platforms** — Truncated content and broken formatting from Instagram or LinkedIn cross-posts damage credibility and get no engagement.
|
|
104
|
+
- **Cramming multiple ideas into one tweet** — A tweet trying to cover 3 topics communicates none of them effectively. If you have multiple points, use a thread.
|
|
105
|
+
- **Posting during major breaking news** — Your content will be buried under breaking news engagement. Check current events before posting.
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: "Twitter/X Thread"
|
|
3
|
+
platform: "twitter"
|
|
4
|
+
content_type: "thread"
|
|
5
|
+
description: "Multi-tweet threads optimized for long-form storytelling, education, and sustained engagement"
|
|
6
|
+
whenToUse: |
|
|
7
|
+
Creating agents that produce Twitter/X threads or multi-tweet narratives.
|
|
8
|
+
constraints:
|
|
9
|
+
tweet_max_chars: 280
|
|
10
|
+
optimal_thread_length: "5-15 tweets"
|
|
11
|
+
hashtags: "only on first tweet"
|
|
12
|
+
version: "1.0.0"
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## Platform Rules
|
|
16
|
+
|
|
17
|
+
- Threads receive 2-3x more impressions than standalone tweets. The multi-tweet format increases dwell time and creates multiple engagement touchpoints.
|
|
18
|
+
- Engagement is weighted: Replies > Bookmarks > Retweets > Likes. Threads that are bookmark-worthy (educational, reference-quality) get sustained distribution.
|
|
19
|
+
- Early engagement on the first tweet (first 15-30 minutes) is critical. If the first tweet does not perform, the thread's remaining tweets receive limited distribution.
|
|
20
|
+
- Replying to your own tweet within 1 hour can boost the thread's visibility. Consider adding a summary or additional context as a self-reply.
|
|
21
|
+
- The algorithm penalizes tweets with external links. If including links, place them in the final tweet or as a reply below the thread.
|
|
22
|
+
- Threads from accounts that actively engage with others' content get higher baseline reach.
|
|
23
|
+
- Best posting times: 8-10 AM EST or 12-1 PM EST on weekdays, particularly Tuesday through Thursday. Threads need immediate engagement to gain traction, so timing matters more than for standalone tweets.
|
|
24
|
+
- Avoid posting threads during low-traffic hours or major breaking news cycles.
|
|
25
|
+
|
|
26
|
+
## Content Structure
|
|
27
|
+
|
|
28
|
+
### Thread Architecture
|
|
29
|
+
|
|
30
|
+
1. **Hook tweet (Tweet 1/N)** — The most important tweet. It must stand completely alone as a compelling, self-contained statement. This is what appears in the feed and determines whether anyone reads further. Bold claim, surprising stat, or "Here is what I learned from..." format.
|
|
31
|
+
2. **Context tweet (Tweet 2/N)** — Brief background establishing why this matters and who should keep reading. Sets the stage for the body.
|
|
32
|
+
3. **Body tweets (Tweets 3-N-2)** — One insight, point, or story beat per tweet. Numbered for progress tracking. Each tweet should deliver standalone value while advancing the larger narrative.
|
|
33
|
+
4. **Summary tweet (Tweet N-1)** — Recap the key takeaways in bullet points. This is the second most bookmarked tweet in a thread after the first.
|
|
34
|
+
5. **CTA tweet (Tweet N/N)** — Ask for a follow, retweet of the first tweet for reach, or bookmark for reference. Include a link back to the first tweet for easy sharing.
|
|
35
|
+
|
|
36
|
+
### Tweet-Level Structure
|
|
37
|
+
|
|
38
|
+
- Each individual tweet in the thread should be a complete thought. Avoid splitting a sentence across two tweets.
|
|
39
|
+
- Use numbering format (1/10, 2/10... or 1., 2., 3...) so readers know the thread length and their progress.
|
|
40
|
+
- Start each tweet with the key point, then support it. Do not bury the insight at the end.
|
|
41
|
+
|
|
42
|
+
Thread length: 5-8 tweets for focused insights, 9-12 for comprehensive breakdowns, 13-15 maximum. Beyond 15, engagement drops sharply. Never pad to hit a target length.
|
|
43
|
+
|
|
44
|
+
## Writing Guidelines
|
|
45
|
+
|
|
46
|
+
- **The first tweet is everything.** It must be compelling as a standalone tweet. If someone only sees tweet 1 and never clicks the thread, it should still deliver value or create irresistible curiosity.
|
|
47
|
+
- Number every tweet so readers know the thread length. "1/10" or "(1)" format both work. Knowing the length helps readers decide to commit.
|
|
48
|
+
- One point per tweet. Do not cram multiple ideas into a single tweet. Each tweet should feel like a self-contained insight with a clear beginning and end.
|
|
49
|
+
- Use the last tweet for a summary and CTA. Recap the 3-5 key points in bullet format, then ask for a follow, retweet of the first tweet, or bookmark.
|
|
50
|
+
- Use hashtags only on the first tweet. Hashtags on every tweet in a thread look spammy and reduce readability. 2-3 relevant hashtags on tweet 1 is sufficient.
|
|
51
|
+
- Write conversationally. Threads are a storytelling format. Use "I" instead of "one," contractions instead of formal language, and short sentences instead of complex ones.
|
|
52
|
+
- Include a "retweet the first tweet" call to action in the final tweet. This is the primary sharing mechanism for threads and extends reach significantly.
|
|
53
|
+
- Keep each tweet under 280 characters but aim for substance. A tweet that is only 40 characters feels like padding.
|
|
54
|
+
- Reply to comments on the thread within the first hour. Engagement velocity in the early window determines total distribution.
|
|
55
|
+
|
|
56
|
+
## Output Format
|
|
57
|
+
|
|
58
|
+
```
|
|
59
|
+
=== THREAD ===
|
|
60
|
+
TWEET 1/N (Hook):
|
|
61
|
+
[Standalone compelling statement — bold claim, surprising stat, or curiosity gap. Must work even if no one reads the rest. Max 280 chars.]
|
|
62
|
+
|
|
63
|
+
#hashtag1 #hashtag2
|
|
64
|
+
|
|
65
|
+
TWEET 2/N (Context):
|
|
66
|
+
[Why this matters. Who should read this. Brief background. Max 280 chars.]
|
|
67
|
+
|
|
68
|
+
TWEET 3/N (Point 1):
|
|
69
|
+
[First key insight — one clear point with support. Max 280 chars.]
|
|
70
|
+
|
|
71
|
+
TWEET 4/N (Point 2):
|
|
72
|
+
[Second key insight — one clear point with support. Max 280 chars.]
|
|
73
|
+
|
|
74
|
+
TWEET 5/N (Point 3):
|
|
75
|
+
[Third key insight — one clear point with support. Max 280 chars.]
|
|
76
|
+
|
|
77
|
+
...
|
|
78
|
+
|
|
79
|
+
TWEET (N-1)/N (Summary):
|
|
80
|
+
Key takeaways:
|
|
81
|
+
- [Takeaway 1]
|
|
82
|
+
- [Takeaway 2]
|
|
83
|
+
- [Takeaway 3]
|
|
84
|
+
|
|
85
|
+
TWEET N/N (CTA):
|
|
86
|
+
[If this was valuable, retweet tweet 1 to share it with your audience.
|
|
87
|
+
|
|
88
|
+
Follow @[handle] for more on [topic].
|
|
89
|
+
|
|
90
|
+
Bookmark this thread for reference.]
|
|
91
|
+
|
|
92
|
+
=== THREAD NOTES ===
|
|
93
|
+
Total tweets: [N]
|
|
94
|
+
Primary topic: [Topic]
|
|
95
|
+
Target audience: [Who this is for]
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
## Quality Criteria
|
|
99
|
+
|
|
100
|
+
- [ ] First tweet works as a compelling standalone statement, even without the rest of the thread
|
|
101
|
+
- [ ] Thread is 5-15 tweets long (not shorter, not longer)
|
|
102
|
+
- [ ] Every tweet contains exactly one clear point or insight
|
|
103
|
+
- [ ] Tweets are numbered (1/N format) so readers know the length
|
|
104
|
+
- [ ] Hashtags appear only on the first tweet (2-3 maximum)
|
|
105
|
+
- [ ] No tweet splits a sentence across tweet boundaries
|
|
106
|
+
- [ ] Summary tweet recaps key takeaways in bullet format
|
|
107
|
+
- [ ] Final tweet includes a CTA: retweet tweet 1, follow, or bookmark
|
|
108
|
+
- [ ] No external links in tweet bodies (links go in the final tweet or a reply)
|
|
109
|
+
- [ ] Each tweet delivers standalone value while advancing the thread's narrative
|
|
110
|
+
|
|
111
|
+
## Anti-Patterns
|
|
112
|
+
|
|
113
|
+
- **Thread with no hook** — Starting with "Thread on [topic]:" without any compelling reason to read guarantees low engagement. The first tweet must create curiosity or deliver a striking insight.
|
|
114
|
+
- **Threads longer than 15 tweets** — Engagement drops sharply after tweet 12-15. Readers lose interest and stop scrolling. If your content requires more, split into multiple threads.
|
|
115
|
+
- **Splitting sentences across tweets** — "And the most important thing is... (2/10) ...that you always start early." This creates a disjointed reading experience and frustrates readers who see individual tweets out of context.
|
|
116
|
+
- **Hashtags on every tweet** — Using hashtags on all tweets in a thread looks spammy and clutters the reading experience. Limit hashtags to tweet 1 only.
|
|
117
|
+
- **No numbering** — Without numbering, readers do not know how long the thread is and cannot gauge their commitment. Always number tweets.
|
|
118
|
+
- **Links in tweet bodies** — External links reduce distribution. Save links for the final tweet or post them as a reply below the thread.
|
|
119
|
+
- **Not engaging with replies** — A thread that generates replies but gets no author responses signals to the algorithm that the conversation is one-directional.
|
|
120
|
+
- **Posting threads at low-traffic hours** — Threads depend on immediate engagement velocity more than standalone tweets. Posting at 11 PM on a Sunday kills distribution.
|
|
121
|
+
- **Padding with filler tweets** — Tweets like "Let me explain..." without actual content waste reader attention and feel artificially inflated.
|
|
122
|
+
- **Reposting the same thread verbatim** — The algorithm detects duplicates. If revisiting a topic, rewrite with new framing or updated data.
|