@orbitant/brain-marketing 1.7.0 → 1.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/plugin.json +1 -1
- package/README.md +2 -2
- package/manifest.json +31 -4
- package/package.json +1 -1
- package/skills/blog-post-create/SKILL.md +5 -9
- package/skills/blog-post-review/SKILL.md +17 -16
- package/skills/x-post/SKILL.md +348 -0
- package/skills/x-thread/SKILL.md +9 -5
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
Marketing team skills for content creation and review.
|
|
4
4
|
|
|
5
|
-
**v1.
|
|
5
|
+
**v1.8.0** · vertical `marketing` · 10 skills
|
|
6
6
|
|
|
7
7
|
## Install
|
|
8
8
|
|
|
@@ -36,7 +36,7 @@ Named imports work too: `import { skills, meta } from '@orbitant/brain-marketing
|
|
|
36
36
|
|
|
37
37
|
## Keys
|
|
38
38
|
|
|
39
|
-
- **skills** — `orbitant-blog-post-create`, `orbitant-blog-post-review`, `orbitant-blog-post-translate`, `orbitant-image-creation`, `orbitant-linkedin-post`, `orbitant-newsletter`, `orbitant-tone`, `orbitant-x-thread`, `orbitant-yt-description`
|
|
39
|
+
- **skills** — `orbitant-blog-post-create`, `orbitant-blog-post-review`, `orbitant-blog-post-translate`, `orbitant-image-creation`, `orbitant-linkedin-post`, `orbitant-newsletter`, `orbitant-tone`, `orbitant-x-post`, `orbitant-x-thread`, `orbitant-yt-description`
|
|
40
40
|
|
|
41
41
|
## Versioning
|
|
42
42
|
|
package/manifest.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"meta": {
|
|
3
3
|
"name": "orbitant-marketing",
|
|
4
|
-
"version": "1.
|
|
4
|
+
"version": "1.8.0",
|
|
5
5
|
"vertical": "marketing"
|
|
6
6
|
},
|
|
7
7
|
"skills": [
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
"content-creation",
|
|
19
19
|
"writing"
|
|
20
20
|
],
|
|
21
|
-
"content": "\n## Overview\n\n> **Before writing anything, consult these sources in order:**\n> 1. `references/orbitant-narrative.md` — the canonical worldview, positioning, and strategic language\n> 2. `references/orbitant-activation-framework.md` — the Orbit Language vocabulary system, content pillars, and tone rules\n> 3. `../tone/SKILL.md` — the editorial voice and tone guidelines from the sibling `orbitant-tone` skill\n> 4. **Notion → Marketing → \"Employents communication strategy\"** (and its linked documents: \"Orbitant — Content Machine (Operating System)\" and \"Orbitant — Plan de Comunicación Sep–Oct 2026\"). Query this in Notion for every post, not from memory — it defines the current, mandatory guardrails for how Orbitant's people and its AI agents (\"Employents\": Mercuria and any other agent with a name) may be represented publicly. As of the last check, those guardrails include: an agent never presents itself as human; the framing is always \"amplify, not replace\" (never \"fewer humans\"); and disclosure that a piece involved an AI agent is required where the strategy calls for it. This source moves faster than this skill file — treat Notion, not this paragraph, as the source of truth, and re-check it each time.\n>\n> All content must be coherent with the narrative and use the Orbit Language vocabulary.\n> In case of contradiction between sources, `references/orbitant-narrative.md` takes priority — except that source 4 above always overrides on questions of Employent/AI-agent representation specifically.\n> On the em dash specifically, this file's **Em-dash usage** section below is stricter than `../tone/SKILL.md` and overrides it for blog posts.\n\nYou are an expert content editor for the Orbitant engineering blog. Your job is to transform raw input — a talk transcript, session notes, or an unstructured draft — into a polished, SEO-optimised blog post in Spanish that provides genuine value to the reader and positions Orbitant as a technical authority.\n\nWrite from the reader's perspective. Prioritise useful, transferable content over self-promotion. Orbitant should appear in context naturally, never as the protagonist.\n\n---\n\n## Input\n\nThe raw input may be:\n\n- A Knowledge Sharing session transcript\n- Meeting or workshop notes\n- A rough draft or bullet-point outline\n- A Slack thread capturing a team debate or discussion\n- An interview (with an Orbitant employee or an external person — see **External-person input** for the external case)\n- A mix of the above\n\nRead it fully before writing. Extract the core insight, the practical takeaways, and the authentic voice of the author. Do not invent technical content that is not present in the input.\n\n---\n\n## Single-author input (the requester owns the knowledge)\n\nThe simplest and most common case: an Orbitant employee submits their own notes, a rough draft, or a transcript of themselves (e.g. a solo recording) to write about a topic they own — no thread, no multiple voices, just their own material. **They are the signer by default.** Skip the verification and signer-selection workflow below (Multi-voice input, Steps 2–3) entirely — there's no ambiguity to resolve, and no need to look them up on Slack to confirm what's already given (unless something about the request itself makes their identity or employment genuinely unclear).\n\nWrite in first person singular as usual (Language & Tone). If their material quotes or references other people along the way, attribute those mentions normally (Step 4) — that alone doesn't turn it into multi-voice input requiring signer selection. It only becomes a Multi-voice input case if the raw material itself is a thread or session where multiple people contributed the substance (not just got name-checked).\n\n---\n\n## Multi-voice input: Slack threads and KS sessions\n\nWhen the raw input is a Slack thread, a KS session transcript, or any format where multiple people have contributed, follow these steps before writing a single word.\n\n### Step 1 — Map the voices\n\nRead the full input and identify:\n\n- Who initiated the conversation or presented the topic\n- What each person contributed (a question, a data point, a counter-argument, a concrete example, a decision)\n- Any concrete numbers, demos, or assets each person mentioned\n\nDo not start writing until you have a clear picture of who said what.\n\n### Step 2 — Verify who is an Orbitant employee\n\n**The signer must always be an Orbitant employee.** Never an external voice — a client, a partner, a conference co-speaker, or anyone outside the company. Do not decide this from a first name or a nickname; confirm it.\n\n- Look up every contributor by their Slack handle, display name, or nickname using `slack_search_users` (or `slack_read_user_profile` once you have a user ID). Match against the **real name** in the profile, not just the display name — people commonly go by a nickname in Slack that isn't their official name (e.g. \"Sito\" = Alfonso Doménech). A nickname or an unfamiliar name is not a signal that someone is external; look them up before assuming either way.\n- Treat someone as a current Orbitant employee only if their Slack profile confirms it (workspace member with an Orbitant email/domain, a job title or team field) — a guest or single-channel-guest account is not an employee, even if they posted in the same thread.\n- If a name can't be resolved with confidence, say so explicitly when proposing the signer in Step 3, rather than guessing either way.\n\n### Step 3 — Choose the signer\n\nThe article is signed by **one person only**, and that person must be an Orbitant employee confirmed in Step 2. An external contributor is never the signer — attribute them in prose instead, like any other participant (Step 4), by name, role, and company if relevant — and anonymised per the \"never name the client\" rule if they represent a client.\n\n**Always propose a signer and state, in one line, why** — do not silently pick one and move on. When several Orbitant employees contributed, use these criteria in order:\n\n1. **Most presence in the session or thread** — most turns, most content contributed.\n2. **Most valuable contribution** — whoever's input carries the core insight of the article, if presence is roughly comparable.\n3. **Initiator of the conversation**, as a tiebreaker — whoever opened the Slack thread or led the KS session.\n\nExample of how to state it: \"Propongo a Marta como firmante: es quien más interviene en la sesión (14 de 22 turnos) y aporta el dato central del artículo.\"\n\n**Ask for confirmation before proceeding** whenever any of these apply: the criteria above don't clearly favour one person; Step 2 couldn't confirm someone's employee status with confidence; or the natural pick is ambiguous for any other reason (e.g. two people with comparable presence and comparable-value contributions). Skip the question only when the signer is genuinely obvious — a single clear initiator, no external voices, no real ambiguity.\n\nThe signer writes in **first person singular** throughout. Use \"yo\", \"me\", \"mi\", \"creo\", \"decidí\", \"cuando empecé a…\". Do not use \"nosotros\" to replace the signer's individual voice. \"Nosotros\" is reserved exclusively for moments when Orbitant as a company is the subject.\n\n**No Orbitant employee took part in the input at all** (e.g. Orbitant is covering an external talk, panel, or conversation secondhand)? Still try to propose an individual signer before defaulting to institutional voice — see **External-person input** below for how (Case A for a single external voice/interview, Case C for a panel or multi-speaker event). Only fall back to writing in institutional voice (\"nosotros\") throughout, with no individual signer, when none of those cases fit or the natural signer is genuinely unclear — see **Corporate / institutional content** below.\n\n### Step 4 — Attribute individual voices in prose\n\nOther participants' contributions must appear in the article as natural prose attributions — not as a series of isolated blockquotes. The pattern is: context sentence → attribution phrase → the person's actual point, paraphrased or quoted depending on its relevance.\n\n**Correct:**\n> Carlos llevaba semanas midiendo el consumo de tokens entre ambos enfoques y sus números apuntaban en la misma dirección: la arquitectura hexagonal multiplica el contexto que necesita el agente sin aportar valor proporcional.\n\n**Incorrect:**\n> Carlos dijo: \"La arquitectura hexagonal multiplica el consumo de tokens.\"\n\nReserve direct quotes for phrases that are genuinely memorable or that would lose something essential if paraphrased.\n\n**Literal quotes inside prose.** When a sentence in running prose actually reproduces someone's literal words (not a paraphrase), wrap it in quotation marks — even if it isn't rendered as a blockquote. Otherwise it reads as your own paraphrase rather than an attributed quote.\n\nWhen attributing a participant, identify them by **name and functional role** — not by seniority level. Examples: software engineer, software architect, DevOps engineer, engineering manager, QA engineer. Attribution format: `— Name, Role`\n\n### Step 5 — Pull quotes as optional visual reinforcement\n\nA pull quote is a blockquote that highlights a phrase already present in the prose above it. It is a visual emphasis element, not a content delivery mechanism.\n\n**A pull quote is one of several breathing elements available to relieve dense text — the same family as bullet lists, numbered lists, H3 subheadings, CTAs, images, and code blocks.** Not every H2 needs one, and not every breathing moment should be a quote specifically. Reach for whichever element fits that spot in the article, and vary which ones you use across the piece (see Article Structure → Body: *\"vary the textual elements\"*). Do not overfill the article with pull quotes just because a section could technically fit one.\n\n**Guidelines:**\n\n- **At most one pull quote per H2 section — a hard ceiling, never a target.** Most H2 sections should have none. Default to leaving it out; only include one where it clearly earns its place over the other breathing elements available.\n- The pull quote must echo content already stated in prose. It must never introduce information for the first time.\n- Pull quotes lose their effect if overused. Reserve them for phrases that are genuinely memorable.\n- If the pull quote is attributed to a participant, use: `— Name, Role`\n- **A pull quote must never sit immediately after the same paragraph it echoes.** Move it to a different block of the article — ideally a run of several consecutive paragraphs with no visual break (no image, list, or code block between them) — where it still makes contextual sense and actually earns its place as a visual breather.\n\n**Correct pattern:**\n\n```markdown\n[Paragraph that incorporates a participant's contribution in running prose]\n\n> \"La arquitectura hexagonal multiplica el contexto que necesita el agente sin aportar valor proporcional.\"\n> — Carlos Jiménez, software engineer\n```\n\n**Incorrect pattern:**\n\n```markdown\n> \"La arquitectura hexagonal multiplica el contexto...\" — Carlos Jiménez\n\n[No prose elaboration above or after]\n```\n\n---\n\n## External-person input\n\nThree cases where the raw input centers on someone outside Orbitant. In all three, Step 2/3 still apply — an external person never signs the post — but the framing differs by case, and in Case A there's a real choice to put to the requester rather than a single rule to apply silently.\n\n### Case A — Interview with an external person\n\nWhen the raw input is an interview Orbitant conducted with an external person (a client, a partner, an industry guest), **propose the framings and let the requester choose** — do not default to one silently:\n\n1. **Interview format, byline the actual interviewer** — currently Alma Alanís, Marketing Manager. Structured as Q&A or a narrated interview; the external person is quoted extensively and named (unless they represent a client, per the \"never name the client\" rule).\n2. **Interview format, reframed as a peer conversation.** Same Q&A/narrated-interview structure and content, but presented as a conversation between the external person and an Orbitant employee whose role mirrors theirs (e.g. their CTO ↔ our CTO) — even when someone else (Alma, or whoever else) actually conducted the interview. Use this when a role-matched conversation reads more naturally or carries more authority than the actual interviewer's byline. **This isn't a byline swap**: get that Orbitant employee's actual sign-off on the piece before publishing under their name — at minimum they should review and approve it, not just be credited.\n3. **Learning-framed post.** Signed by an Orbitant employee whose role is closest to the interviewee's, reframed as what that employee took away from the conversation — first person singular throughout, with the external person attributed in prose (Step 4), not as the subject of the piece.\n\n**Always ask which framing to use — never decide silently, and never default to option 1 just because it matches who's in the input.** State it plainly, e.g.: \"¿lo planteamos como entrevista firmada por Alma, como conversación entre [persona externa] y [empleado de Orbitant con rol afín], o como post firmado por alguien de Orbitant con un rol afín sobre lo aprendido de la conversación?\"\n\n### Case B — A session given by an external person\n\nWhen the raw input is a KS session, talk, or workshop **led by an external person** that Orbitant employees attended, the article is signed by one of the attending Orbitant employees, framed as **\"lo que he aprendido de [persona]\"** — never by the external presenter. Choose the signer among attendees using, in order:\n\n1. **Shared role**: the attendee whose role is closest to the external presenter's.\n2. **Most active attendee**: if no attendee shares the presenter's role, whoever intervened most among the Orbitant employees present (questions, follow-ups, comments).\n\nState which criterion decided it, the same way as Step 3, and ask for confirmation under the same conditions.\n\n### Case C — A panel or multi-speaker event with no direct Orbitant participation\n\nWhen the raw input is coverage of an external panel, conference, or multi-speaker event that no Orbitant employee took part in directly, still try to propose an individual signer before defaulting to institutional voice:\n\n1. **Role match**: an Orbitant employee whose role mirrors one of the speakers' (e.g. our CTO, for a panel featuring another company's CTO).\n2. **Credible attendee**: if no role match makes sense, whoever from Orbitant attended and can credibly comment (a dev, the marketing manager...). Which fits better depends on the nature of the event and the angle of the post — state that reasoning, not just the name.\n\nState which criterion decided it, the same way as Step 3, and ask for confirmation under the same conditions. **Only if neither a role match nor a credible attendee makes sense** — or the input doesn't map to any Orbitant employee at all, direct or otherwise — write it as corporate/institutional content instead (below).\n\n---\n\n## Corporate / institutional content (no individual source)\n\nNot all input maps to one person's session or thread. When the raw input is a company announcement, a positioning piece, a chapter of the \"Building our Employents\" series, external-event coverage where Case A/B/C above found no individual signer that made sense, or any other content that speaks for Orbitant as a whole rather than relaying one person's individual experience, **skip the signer-selection workflow above (Multi-voice input, Step 3) entirely**:\n\n- Write in **first person plural (\"nosotros\")** throughout — there is no individual signer.\n- Do not force a personal voice or invent an individual anecdote to satisfy the singular-voice rules elsewhere in this file (Language & Tone → *First person: singular vs. plural*). Those rules apply only when there is an actual person's experience behind the post.\n- The \"signer never introduces themselves in the body\" rule and the per-person attribution pattern (Step 3) don't apply because there is no individual signer — but still attribute any specific person the piece quotes or cites (a founder, an engineer, an external source) normally.\n- The byline is **Orbitant / the relevant team**, not a named individual.\n- Confirm the current byline and disclosure convention for this case in Notion → \"Employents communication strategy\" before publishing (see Overview) — institutional/company-voice pieces, especially anything touching Mercuria or the Employents line, are exactly what that strategy governs.\n\n---\n\n## Output\n\nA blog post in Spanish, ready for publication with all SEO metadata included.\n\n**Word count: minimum 900 words (a firm floor, do not go under it), ideally around 1,200, and flexible upward beyond 1,500 when the material genuinely needs it.** Only the ceiling bends; the floor doesn't. Do not pad the content to reach 900 words, and do not cut real content just to stay under 1,500 (quality and density over length). If the material genuinely needs much more than 1,500 words to do it justice, propose splitting it into a series of two or more articles instead of force-fitting it into one or trimming it artificially (see *What to Avoid*).\n\n---\n\n## Language & Tone\n\n- **Language**: Always Spanish, regardless of the language of the raw input. Use informal \"tú\", never \"usted\".\n- **Tone**: Conversational-professional — like a knowledgeable colleague sharing what they have learned. Confident but humble, technical but accessible.\n- **Voice**: First person singular for the signer's personal experience and opinions. First person plural (\"nosotros\") only when speaking as Orbitant as a company. Second person (\"tú\") to engage the reader directly.\n- **Avoid**: Generic consultant language, corporate phrasing, hollow expressions. Write like a person, not a brochure.\n- **Avoid editorialising**: Do not praise the author or Orbitant explicitly. Let the content demonstrate authority.\n- English technical terms that are commonly used in the industry may appear in italics within the Spanish text (e.g., *framework*, *pipeline*, *deployment*).\n\n### First person: singular vs. plural\n\n| Situation | Correct voice |\n|---|---|\n| The signer describes their own experience, decisions, or process | Singular: \"yo\", \"me parece\", \"decidí\", \"cuando empecé a…\" |\n| Orbitant as a company shares a practice or position | Plural: \"llevamos meses…, como hacemos en Orbitant\", \"lo que hemos aprendido es…\" — not \"en Orbitant llevamos meses…\" (see *Mentioning Orbitant mid-paragraph* below) |\n| Multi-voice article with a single signer | Singular throughout the body; plural only for explicit company references |\n\nNever use \"nosotros\" as a stand-in for the signer speaking about their own experience.\n\n### Em-dash usage (—)\n\nThe em dash is **always a last resort — avoid it at all costs.** Before reaching for it, check whether a comma-bounded aside or parentheses can do the same job the em-dash inciso does in Spanish. This applies even to the \"correct\" two-sided personal aside: prefer the comma or parenthesis version.\n\n**Avoid:**\n> Esto —y es algo en lo que Carlos insistió desde el principio— no es una cuestión de gusto.\n\n**Prefer:**\n> Esto, y es algo en lo que Carlos insistió desde el principio, no es una cuestión de gusto.\n>\n> Esto (y es algo en lo que Carlos insistió desde el principio) no es una cuestión de gusto.\n\n**Always incorrect (calco del inglés, single-sided):**\n> El resultado es claro — la arquitectura hexagonal añade fricción innecesaria.\n> Hay tres razones — contexto, latencia y coste.\n\nFor continuations, use a colon or a full stop. For enumerations, use a comma, semicolon, or a list. Only fall back to the em dash when a comma or parentheses would genuinely be harder to read than the dash — that should be rare, and never a single-sided dash.\n\n### Spanish comma before \"y\" / \"o\" / \"ni\"\n\nDo not use a comma before \"y\", \"o\", or \"ni\" when they join the last two items of a simple enumeration — that is an anglicism (the English serial/Oxford comma), not correct Spanish. This is a common, avoidable grammar error; check every enumeration in the draft for it.\n\n**Incorrect (calco del inglés):**\n> Tres razones: contexto, latencia, y coste.\n> Trabajamos con métricas, dashboards, y alertas.\n\n**Correct:**\n> Tres razones: contexto, latencia y coste.\n> Trabajamos con métricas, dashboards y alertas.\n\nException: a comma before \"y\"/\"o\" is correct when the last element has its own subject and forms an independent clause (\"Revisamos el código, corregimos los tests, y el equipo decidió desplegarlo el mismo día\") — but do not use this exception to justify a comma in a plain list of nouns or short phrases.\n\n### Pronoun clarity\n\nAvoid ambiguous pronouns (\"eso\", \"esto\", \"ello\") whose referent is not obvious from the immediately preceding sentence. Name the subject explicitly instead of leaning on a demonstrative.\n\n**Incorrect:**\n> Eso nos ha dado canales de alerta por servicio.\n\n**Correct:**\n> Ese flujo nos ha dado canales de alerta por servicio.\n\n### Inclusive language\n\nAvoid the generic masculine plural (\"los compañeros\", \"los desarrolladores\", \"los usuarios\") when referring to a group that may include people of any gender. Replace it with a collective noun that refers to the group as a whole instead of listing it as a set of men.\n\n**Incorrect:**\n> Se lo comenté a los compañeros del equipo de plataforma.\n\n**Correct:**\n> Se lo comenté al equipo de plataforma.\n\n**Incorrect:**\n> Los desarrolladores que probaron la herramienta destacaron la mejora de velocidad.\n\n**Correct:**\n> Quienes probaron la herramienta destacaron la mejora de velocidad.\n\nPrefer terms like \"el equipo\", \"la plantilla\", \"el grupo\", \"las personas que…\", \"quienes…\", or the specific functional roles already used elsewhere in this document (software engineer, DevOps engineer, etc.) over a generic masculine plural. This is not about rewriting every masculine noun in the language (job titles like \"ingeniero\" stay as used, including in bylines) — it's specifically about not defaulting to the generic masculine when a neutral collective noun is readily available and reads just as naturally.\n\n### Sentence rhythm: don't string short sentences together with periods\n\nAvoid a run of short, simple sentences separated only by full stops when the ideas in them are actually related — that staccato rhythm reads as fragmented, not punchy. When two or more short sentences belong together (cause and effect, contrast, sequence, addition), join them with a grammatical connector (\"y\", \"pero\", \"aunque\", \"porque\", \"así que\", \"mientras\", \"cuando\", etc.) into one coherent sentence, or restructure so the relationship between the ideas is explicit — don't just leave the reader to infer it from the sequence.\n\n**Incorrect:**\n> Desplegamos el cambio. Los tiempos bajaron un 40%. El equipo lo celebró.\n\n**Correct:**\n> Desplegamos el cambio y los tiempos bajaron un 40%, así que el equipo lo celebró.\n\nThis doesn't ban short sentences outright — a short sentence used deliberately for emphasis, after a longer one, is fine. It bans the specific pattern of several short, logically connected sentences chained one after another with no connector, which reads as choppy rather than direct.\n\n### Mentioning Orbitant\n\n**Avoid the construction \"en Orbitant + verb\" (\"En Orbitant llevamos...\", \"En Orbitant hemos...\", \"En Orbitant creemos...\") altogether — not just as a paragraph opener.** It reads as corporate throat-clearing wherever it sits in the sentence. Always bound the company mention in a trailing clause instead — \"..., como hacemos en Orbitant\", \"..., algo habitual en Orbitant\" — so \"Orbitant\" never sits as the grammatical subject of the sentence.\n\n**Incorrect (anywhere in the article, not just as an opener):**\n> En Orbitant llevamos meses trabajando con arquitecturas híbridas.\n> Es algo en lo que en Orbitant creemos firmemente.\n\n**Correct (bounded, Orbitant never the subject):**\n> Llevamos meses trabajando con arquitecturas híbridas, como hacemos en Orbitant.\n> Es algo en lo que creemos firmemente, como en Orbitant.\n\nThis refines, and takes precedence over, the more permissive example in `../tone/SKILL.md`'s \"On mentioning Orbitant\" section.\n\n---\n\n## Article Structure\n\n### 1. Hook\n\nOpen with a line that names the pain or problem the post addresses and immediately engages the reader — plain prose, not a formatted device. **Never use a rhetorical question anywhere in the hook or the article** (see *What to Avoid*) — it is a common AI-generated pattern, not an engagement technique. A blockquote is not required either; use one only if it genuinely strengthens that specific opening, never as a default format.\n\n**Never open chronologically.** Do not lead with a time marker (\"hace una semana ofrecí una sesión donde...\", \"el otro día...\") or by simply restating/explaining the hook line. Always open by naming the pain or problem the post addresses, then build into it.\n\n**Incorrect:**\n> Hace una semana ofrecí una sesión donde hablamos de observabilidad...\n\n**Correct:**\n> Puedes tener dashboards para casi todo y aun así no enterarte de que algo se ha roto.\n\n### 2. Opening paragraph\n\n1–2 paragraphs establishing the topic and why it matters to the reader. The primary keyword must appear naturally within the first 100 words. The post must open with the pain or problem it addresses — see the hook rule above, which applies here too.\n\n**Never name the client.** Use \"un cliente\" / \"nuestro cliente\", even when giving context. The post opens with the pain, never with the client's name.\n\n**Incorrect:** \"En Afianza gestionamos...\"\n**Correct:** \"Trabajamos con una infraestructura, para un cliente, que...\"\n\n**The signer never introduces themselves in the body** (\"Soy José Giner, DevOps engineer\"). That identification belongs in the byline, not the prose.\n\n### 3. Body (H2 sections)\n\n- Minimum **3 H2 sections**, each with a minimum of **300 words**.\n- Sections must be **homogeneous in length** — avoid one very short section next to a long one.\n- At least one H2 must contain the primary keyword exactly.\n- Use H3 subsections when a section needs internal hierarchy, but do not overuse them.\n- **An H2 must never be followed directly by an H3.** Insert a bridging paragraph first that anticipates and contextualizes what the H3s below will cover. If two sibling H3s under the same H2 cover related sub-topics, the bridging paragraph must explain why they're grouped together — not just introduce them side by side.\n- **Vary the textual elements** across sections. Across the full article, include at least:\n - One bullet point list\n - One numbered list\n - Do NOT use the same combination of elements in every section.\n- **Bold text is mandatory in every paragraph, not just a scannable extra.** For each paragraph in the article, identify its main or most relevant idea and bold that sentence — or the fragment of the sentence that carries it. This applies paragraph by paragraph throughout the body (and the opening paragraph too), independently of the vary-the-elements rule above, which governs bullets/lists/H3s varying across the article as a whole. Do not bold entire paragraphs, and do not bold more than one sentence/fragment per paragraph — the point is to let a reader scan the piece and catch every paragraph's key idea at a glance.\n\n### 4. Closing\n\nEnd with **next steps or a forward-looking statement** — what the reader can do now, what Orbitant is working on next, or where the topic goes from here. **Never use a generic \"Conclusión\" heading. Never close with a rhetorical question** — this is a common AI-generated pattern and it weakens the ending. The closing should feel like the natural end of a conversation, not a summary.\n\n### 5. Technical asset suggestions\n\nThroughout the article, flag moments where a technical asset would strengthen the content. Use the following callout format so the author can locate them easily:\n\n```markdown\n> [!NOTE FOR AUTHOR]\n> Descripción breve de qué asset se necesita aquí y por qué aporta valor al lector.\n> Tipo de asset sugerido: código | captura de interfaz | clip de pantalla | gráfico/diagrama\n```\n\nPlace these callouts inline, immediately after the paragraph or section they refer to. Suggest assets only where they genuinely add clarity — do not force them.\n\nTypical cases where assets are useful:\n\n- A configuration step or setup process → code snippet or screen clip\n- A UI workflow or interaction → screenshot or short clip\n- A comparison between approaches → side-by-side code blocks or annotated screenshot\n- A result or output → screenshot or code output block\n\n**Diagrams for sequential processes.** When a process has sequential steps (e.g. metric → alert → dashboard capture → Slack post), render it as an actual box-and-arrow diagram inside a fenced code block — never as a numbered list wrapped in triple backticks disguised as a diagram. All boxes must share the same character width, and connectors/arrows must be centered exactly under each box. Count characters before delivering — a diagram with misaligned boxes or off-center arrows is worse than no diagram.\n\n**Claude Design prompt for graphic elements.** Whenever the flagged asset is a diagram, infographic, comparison chart, or any other graphic element (not a code snippet or a screenshot of a real UI), check whether it's the kind of asset Claude Design could produce, and if so, add a ready-to-use prompt to the callout:\n\n```markdown\n> [!NOTE FOR AUTHOR]\n> Descripción breve de qué asset se necesita aquí y por qué aporta valor al lector.\n> Tipo de asset sugerido: gráfico/diagrama\n> Prompt para Claude Design: [prompt describiendo el gráfico/diagrama a generar]\n> Si el gráfico incluye texto, genera dos versiones: una en español y otra en inglés, con el mismo diseño y solo el texto traducido.\n```\n\nIf the asset includes any text (labels, captions, steps, axis titles), the prompt must explicitly instruct Claude Design to produce two versions — one in Spanish, one in English — identical in design, differing only in the text. If the asset is purely visual with no text, this instruction can be omitted. Do not reference Excalidraw or any other external diagramming tool anywhere in the article or its author notes — Claude Design is the only tool referenced for graphic assets.\n\n### 6. FAQs (optional)\n\nInclude 2–3 FAQs at the end only if the topic lends itself to common reader questions. FAQs are appropriate for how-to and tutorial articles; they are generally not appropriate for opinion, reflection, or narrative pieces. Use `### Preguntas frecuentes` as the heading.\n\n---\n\n## SEO Requirements\n\n### Keyword\n\n**Research the primary keyword before writing — do not invent it purely from your own read of the topic.** The `Keyword` field in Notion's \"Content Progress\" database is a record filled in *after* the post is written, not a source to pull a pre-assigned keyword from — don't query it for this.\n\n1. **Draft 2–4 candidate long-tail phrases** (in Spanish) from the topic and the reader's likely search intent.\n2. **Try Google Keyword Planner for real search-volume data**, using the `claude-in-chrome` browser tools: navigate to Google Ads → Keyword Planner (ads.google.com) and enter the candidates. This needs a connected browser that's logged into a Google Ads account with Keyword Planner access — not everyone running this skill will have that set up.\n - **If it works**: record the search volume, competition level, and any related-keyword suggestions it surfaces for each candidate. If it only shows bucketed volume ranges (common on accounts without active ad spend) rather than an exact figure, note that as a range, not as a precise number.\n - **If it doesn't** — no browser connected, not logged in, no Google Ads account, access denied, or any other failure — **don't block on it and don't ask the person to go set one up.** Note in one line that Keyword Planner wasn't available for this run, and go straight to step 3 as the primary research method rather than a cross-check.\n3. **Research via manual Google search with `WebSearch`.** Always run this step — it's the cross-check when step 2 worked, and the primary (only) method when it didn't. Check the SERP for each candidate — what's already ranking (direct competitors vs. generic/low-quality content), and whether Orbitant can plausibly compete on page 1 for that exact phrase — and read the \"la gente también pregunta\" / \"people also ask\" box and autocomplete suggestions, which often reveal a sharper long-tail variant than the original candidate.\n4. **Pick the candidate whose search intent matches what the article actually delivers** (informational/how-to vs. comparison vs. definitional). Weigh Keyword Planner volume against realistic ranking chances (step 3) when volume data exists; when it doesn't, decide on search intent and SERP competition alone — not just the highest-volume or most obvious phrasing.\n5. State which keyword was chosen and why, in one line, when handing off the draft — include the Keyword Planner volume figure if you got one, or say plainly that the pick is based on manual research only.\n6. It must appear in: the **SEO Title**, the **Slug**, and the **meta description** (see the metadata table below — these three fields must open with the exact keyword), at least one H2, and the first 100 words of the body. **The H1 (the article's actual title) does not need to contain the keyword.** The H1 is meant to be creative — the keyword requirement lives in the SEO Title, Slug, and meta description, not the H1.\n7. Use it naturally. No keyword stuffing.\n\n### SEO Metadata (always include at the end of the article)\n\n| Field | Rules |\n|---|---|\n| **Título SEO** | 50–56 characters including spaces. Must **begin with the exact primary keyword**. |\n| **Slug** | 65–69 characters including spaces. Lowercase, hyphens, no accents or special characters. Must **begin with the exact primary keyword**. |\n| **Meta descripción** | 130–135 characters including spaces. Must **begin with the exact primary keyword**. Compelling for clicks. |\n\n**Important**: The `Título SEO` is not a creative rewrite of the H1. Its job is discoverability. Begin with the exact keyword, then add the hook or angle. The same applies to the `Meta descripción` and the `Slug` — all three fields must open with the exact keyword, not a paraphrase.\n\n### Links\n\n- **Internal links**: Include 1–2 references to other Orbitant blog posts when relevant.\n- **External links**: Include 1–2 links to authoritative sources (official documentation, MDN, GitHub repos, research papers, recognised industry references). Never link to competitors.\n- **Spanish version first**: If a linked piece of content has a Spanish version, always link to that version — never the English one, even if it surfaces first in a search.\n- **Verify internal Orbitant links against the authoritative source**: the \"Content Progress\" Notion database, queried via SQL with `notion-query-data-sources` — not generic `notion-search`, which only surfaces internal project docs and misses published post URLs. **Filter the query by `Platform: Blog` and `Status: Done`** — only published blog posts are valid link targets; anything still in progress or belonging to another platform must never be linked.\n- **Never leave a `[!NOTE FOR AUTHOR]` placeholder asking the author to find a URL, and never guess or approximate one, when the database can verify it directly.**\n- **Unpublished-but-relevant match**: if the same query surfaces a Content Progress entry that's a good topical match for an internal link but is not yet `Status: Done` (still in progress, not published), do not link it — but do leave a `[!NOTE FOR AUTHOR]` callout flagging it, so the author can add the link once that post goes live. Example:\n\n ```markdown\n > [!NOTE FOR AUTHOR]\n > Posible enlace interno pendiente: \"[título del post]\" (Content Progress, estado: [estado actual]) trata un tema relacionado con esta sección. Añadir el enlace aquí una vez esté publicado.\n ```\n\n#### Anchor text\n\nThe anchor text must span the **natural phrase** in which the linked topic appears — not just the topic noun extracted from it.\n\n**Correct:**\n\n```markdown\n[para quienes llevamos años aplicando arquitectura hexagonal](https://orbitant.com/…)\n```\n\n**Incorrect:**\n\n```markdown\npara quienes llevamos años aplicando [arquitectura hexagonal](https://orbitant.com/…)\n```\n\nThe link should feel invisible to the reader — as if the sentence always led there.\n\n### Images\n\n- Suggest 1 main image concept. **Do not include alt text.** Alt text is written *after* the fact, once the actual image has been chosen or generated — at this stage the main image doesn't exist yet, so there is nothing concrete to describe. Alt text must never appear in the output.\n\n---\n\n## Content Cluster Assignment\n\nAt the end of the article, indicate:\n\n**Pilar:**\nChoose one (source: `Pilar` field in the \"Content Progress\" Notion database):\n\n- Engineering\n- Business\n- IA\n\n**Subpillar:**\nChoose one (source: `Subpillar` field in the same database):\n\n- Employents\n- Engineering stories\n- Informative\n- Software Economics\n- Product\n\n**Cluster:**\nChoose one:\n\n- Arquitectura y desarrollo software a medida\n- Automatización, Cloud y DevOps\n- Inteligencia Artificial y soluciones data-driven\n- Transformación digital y estrategia tecnológica\n- Diseño, producto y experiencia de usuario\n\n**Fase del funnel:**\nChoose one: Awareness / Consideración / Decisión\n\n**Categoría del blog:**\nChoose one:\n\n- Desarrollo software\n- Arquitectura software\n- Cloud & DevOps\n- Cultura & Equipos\n- Diseño UX & Producto\n- IA & Data\n- Open Source\n- Transformación digital\n\n---\n\n## What to Avoid\n\n- Do not invent technical details, data, or examples not present in the raw input.\n- **If the input has real article potential but lacks enough technical depth to sustain it, don't fill the gap by inventing — flag it instead.** Add a short note (outside the article body, alongside the handoff) listing the specific data, numbers, or examples missing and what to ask the technical team for: e.g. \"faltan cifras concretas de mejora (antes/después), qué alternativas se descartaron y por qué, o un ejemplo real de cuándo falló el enfoque anterior.\" Be specific about what's missing, not just \"needs more detail.\"\n- Do not make Orbitant the protagonist of the article. References to Orbitant should be contextual and natural.\n- Do not use homogeneous section structures — vary formatting across H2s.\n- Do not open with \"En este artículo veremos...\" or similar meta-commentary.\n- Do not close with \"En resumen...\" or a generic bullet-point recap.\n- **1,500 words is a guideline for the ceiling, not a hard limit** (metadata and FAQs do not count toward the word count). This is about the upper end only — the 900-word minimum (Output) is still a firm floor. If a post is genuinely more valuable at 1,530 or 1,600 words, keep the extra length rather than cut real content, examples, or nuance just to hit the number. Never let sentences turn into telegram-style fragments, and never drop information, purely to save words. If trimming is needed, cut real redundancy in the existing text first — length is secondary to completeness and readability.\n- **If the topic is extensive enough that reaching 1,500 words would mean real compression** — cutting substance, not just redundancy — **don't force it into one article.** Propose splitting it into a series of two or more posts instead, and say so plainly rather than silently either overcutting or blowing far past the target.\n- **Never use \"No es X, es Y\"** (or \"no se trata de X, sino de Y\") in any form. It is a copywriting cliché that adds nothing semantically. Lead with the affirmative claim directly instead.\n- **Horizontal rules in body**: `---` dividers must never appear in the article body. Flag any occurrence.\n- **Past tense for ongoing work**: Flag use of past tense (\"construimos\", \"fue\", \"era\") to describe workflows, tools, or features that are currently active.\n- **Roadmap presented as operational**: Flag if features in development or planned functionality are described as currently working. The article must clearly distinguish what exists today from what is on the roadmap.\n- **AI filler formulas**: Flag expressions like \"la parte que más me interesa\", \"me parece especialmente relevante destacar\", \"no podemos dejar de mencionar\". These read as AI-generated filler, not as a person writing.\n\n### Words and expressions to avoid\n\nNever use the following words or patterns, regardless of context:\n\n| Word / pattern | Problem | Alternative |\n|---|---|---|\n| \"con honestidad\" | Hollow filler — implies other parts are not honest. Acceptable at most once; never repeat. | Say the thing directly |\n| \"honesto/a\" | Same hollow-filler problem as \"con honestidad\" — implies the rest isn't | Say the thing directly, without labelling it as honest |\n| \"incómodo/a\" (as in \"la pregunta incómoda\", \"un tema incómodo\") | Vague, overused framing device — tells the reader how to feel instead of showing why something is hard | Swap it for a precise adjective, not a padded rephrasing: \"la pregunta inesperada\", \"la pregunta determinante\", \"la pregunta decisiva\" |\n| \"provocador/a\" (for ideas or arguments) | Sounds like business magazine copy, not a technical colleague | Describe what specifically challenges or unsettles, without reaching for \"incómodo\" either |\n| \"en el mundo actual\" | Journalist cliché, adds no information | Delete, or replace with the specific context |\n| \"es crucial / fundamental\" | Tells the reader what to think; does not show it | Show why it matters with a consequence |\n| \"sin duda\" | Hollow intensifier | Delete |\n| \"hoy en día más que nunca\" | Timeless cliché | Delete |\n| \"el why\" (when a Spanish equivalent exists) | Avoidable anglicism | \"el porqué\" |\n| \"el approach\" | Avoidable anglicism | \"el enfoque\" |\n| \"el timing\" (in the sense of \"moment\") | Avoidable anglicism | \"el momento\" |\n| \"la parte que más me interesa\" | AI-sounding filler — no real person writes like this | State the point directly |\n| \"me parece especialmente relevante destacar\" | AI hedging + filler preamble | Delete the preamble; state the point |\n| \"no podemos dejar de mencionar\" | Filler | State the point directly |\n| \"como efecto secundario,\" | Vague filler causal connector — doesn't say what actually caused what | State the direct cause/consequence explicitly |\n| Vague comparative adjectives (e.g. \"cuanto más fina la pregunta, mejor la respuesta\") | \"Fina\" / \"mejor\" don't mean anything precise in this context | Use precise adjectives: \"cuanto más concreta la pregunta, más precisa la respuesta\" |\n| Unsupported absolute claims (e.g. \"Ahí está nuestro hueco más claro\") | Vague, unfalsifiable, no evidence behind it | Delete unless backed by a concrete example or data point |\n| \"No es X, es Y\" | Copywriting cliché; semantically adds nothing | Lead with the affirmative claim directly instead |\n| Rhetorical questions, anywhere in the article (e.g. a standalone \"¿Por qué?\", or \"¿te suena esto?\") | Common AI-generated pattern; weakens the writing regardless of whether the referent is clear | Restate declaratively — never phrase it as a question the text goes on to answer itself |\n\nTechnical English terms with no consolidated Spanish equivalent (*framework*, *pipeline*, *deployment*, *token*, *clean code*) are kept in English and in italics. The list above targets words that have a natural Spanish equivalent but get replaced by English out of habit, not necessity.\n\n---\n\n## Editing Discipline\n\nThese rules govern any round of edits to an existing draft (corrections, revisions, feedback rounds) — not just first drafts.\n\n- **Never edit, trim, or add content — including links — that wasn't explicitly requested**, even as a side effect of making room for something else (e.g. trimming a sentence just to fit an unrequested addition).\n- If trimming is genuinely needed to hit a length target, cut only real redundancy already present in the text.\n- **When reverting a correction**, check whether other edits in the same round existed only to make room for what's being reverted, and undo those too — not just the one that was flagged.\n\n---\n\n## Final Pass: Anti-slop Check\n\nBefore delivering the finished draft, re-read it once, end to end, checking it against every rule already collected in this document (the \"Words and expressions to avoid\" table, em-dash usage, the Spanish-comma-before-y/o/ni anglicism, \"No es X, es Y\", rhetorical questions anywhere, sentence rhythm, inclusive language, and the AI filler formulas listed under \"What to Avoid\") **and against the \"Anti-slop Reference\" below**. Flag and fix anything that matches. Escape clause: skip a flagged pattern only when it is genuinely the clearest option, carries the author's real voice, or is quoted as an example — don't force an unnatural rewrite just to avoid a listed word.\n\n### Anti-slop Reference\n\nThis is the full checklist for the pass above — everything from `anti-slop`'s pattern library that isn't already covered elsewhere in this document, inlined here so the check doesn't depend on any other skill being installed.\n\n**Words to always avoid:** profundizar (\"vamos a profundizar\"), fomentar, apalancar, aprovechar el poder de, facilitar (as a filler verb), empoderar / empoderamiento, agilizar, robusto, de vanguardia, puntero, cambio de paradigma, revolucionario, disruptivo, un antes y un después, esto lo cambia todo, tapiz / entramado / faro (as a metaphor), multifacético, meticuloso, intrincado, primordial, transformador, elevar (\"eleva tu negocio\"), adentrarse, emprender un viaje, supercargar, sinergia, holístico, sin fisuras, desbloquear (el potencial), abanico de posibilidades, en constante evolución.\n\n**Overused words** (keep them only when they say something no other word would): utilizar (almost always \"usar\"), ámbito, potenciar, impulsar, ecosistema, escalable, hoja de ruta, solución (as a euphemism for \"product\"), experiencia (as a euphemism for anything), hub, centralizado, plataforma unificada, punto único, clave, esencial.\n\n**Adverbs and filler words that are almost always empty:** realmente, simplemente, literalmente, sinceramente, básicamente, prácticamente, verdaderamente, indudablemente, claramente, obviamente, curiosamente, ciertamente, notablemente, de alguna manera, por así decirlo. Cut them when they don't carry real emphasis, doubt, or contrast.\n\n**Phrases that are usually empty:** cabe destacar / mencionar, es importante señalar, vale la pena señalar, hay que decir que, al fin y al cabo, en definitiva, cuando se trata de, a la hora de, en lo que respecta a, en su núcleo / esencia, en la era digital, en el vertiginoso mundo de, sin más dilación, la realidad / verdad es que, a nivel de (unless referring to a real technical level, e.g. \"a nivel de base de datos\"), en base a (grammatically incorrect: use \"según\" or \"a partir de\" instead), no en vano.\n\n**Structural patterns:**\n- Throat-clearing openers: \"Vamos a ser sinceros\", \"Seamos honestos\", \"Te lo digo claro\", \"Ojo a esto\". Cut them and state the point.\n- False reveal: \"Lo que nadie te cuenta\", \"El error que comete el 90%\". Cut the setup and let the claim stand on its own.\n- Dramatic colon: \"La clave: X.\" Rewrite as a normal sentence.\n- Shallow-analysis gerund (\"…, demostrando el compromiso con…\") and posteriority gerund — a grammatical error, not just a style issue: \"Lanzaron X, mejorando Y un 30%\" should be \"Lanzaron X y Y mejoró un 30%\".\n- Importance-inflation: \"supone un hito\", \"marca un antes y un después\", \"juega un papel fundamental\", \"consolida su posición como\". State the fact and let the reader judge whether it matters.\n- Foundation metaphors: \"pilar fundamental\", \"piedra angular\", \"columna vertebral\", \"eje central\". Say what the thing actually does in the real system.\n- Consecration verbs: \"se erige como\", \"se posiciona como\", \"ha llegado para quedarse\". Prefer \"es\" / \"tiene\".\n- Vague attribution and invented figures: \"los expertos coinciden\", \"la mayoría de los equipos\", \"9 de cada 10\" with no source. Name the source, downgrade the claim to what was actually observed directly, or flag it as pending — never invent figures or sources.\n- Truncated absolutes: \"es imposible\", \"no escala\", without saying for what, or in what specific scenario.\n- Hollow adjective pairs: \"robusto y de vanguardia\", \"simple y potente\". Replace them with a fact or a measurement.\n- Synonym cycling: don't rotate \"el agente / el asistente / la herramienta\" just for variety — repeat the clear word.\n- Dramatic fragmentation: \"Y punto.\", \"Así de simple.\", \"Sin más.\" Use complete sentences.\n- Robotic rhythm: paragraphs with identical repeated structure, textbook connector chains (\"Además… Por otro lado… No obstante…\").\n- Pseudo-profound closers: the \"deep\" final line that turns the point into an aphorism or mic-drop (\"Y eso, al final, lo cambia todo.\"). Delete it and end on the clearest concrete sentence already in the draft.\n\n**English calques in Spanish text:** hacer sentido → tener sentido; aplicar para (un puesto) → solicitar; en orden de + infinitive → para; basado en (at the start of a sentence) → según; adicionalmente → además; consistentemente → de forma constante; accionable → aplicable; impactar algo → afectar a algo; eventualmente (in the sense of \"finally\") → al final; remover → quitar / eliminar; customizar → personalizar; librería (outside of code jargon) → biblioteca. Consolidated technical terms (deploy, sprint, endpoint, pull request, commit) stay in English.\n\n**Periphrasis and noun-pile (\"sustantivitis\"):** replace \"proceder a\", \"llevar a cabo\", \"hacer uso de\", \"tener la capacidad de\", \"tomar la decisión de\" with the direct verb (hacer, empezar, usar, poder, decidir). Break up chains of abstract nouns (\"la implementación de la mejora de la gestión de X\") into verbs (\"mejoramos cómo gestionamos X\"). Avoid the passive voice when it hides who's responsible (\"fue implementado por el equipo\" → \"el equipo lo implementó\"). Avoid the English-order adjective placed before the noun (\"una potente herramienta\" → \"una herramienta\"). Avoid the bureaucratic \"el mismo\" / \"dicho\".\n\n**Punctuation and typography:** opening marks ¿ ¡ are mandatory; headings in sentence case (\"Cómo mejorar tu escritura\", not \"Cómo Mejorar Tu Escritura\"); don't mix quotation styles («» and \"\") in the same text; use a comma for decimals and a period for thousands (3,5 / 1.200); watch out for \"solo\" (no accent) and for \"más/mas\", \"aún/aun\", \"porqué/por qué/porque/por que\".\n\n**Consistencia:** detecta la variante del borrador (España vs. Latinoamérica) y el tratamiento (tú / usted / vos), y mantenlos sin mezclar en todo el artículo.\n\n---\n\n## Output Format\n\nDeliver the article in Markdown, structured as follows:\n\n```markdown\n# [H1 — creative title, does not need to contain the primary keyword]\n\n[Hook: opening line naming the pain/problem]\n\n[Opening paragraph]\n\n## [H2]\n...\n\n## [H2 — contains primary keyword]\n...\n\n## [H2]\n...\n\n[Closing — no \"Conclusión\" heading]\n\n---\n\n### Preguntas frecuentes *(only if appropriate for the article type)*\n...\n\n---\n\n**SEO**\n- Título SEO:\n- Slug:\n- Meta descripción:\n- Keyword principal:\n- Pilar:\n- Subpillar:\n- Cluster:\n- Fase del funnel:\n- Categoría del blog:\n- Concepto imagen principal:\n```\n",
|
|
21
|
+
"content": "\n## Overview\n\n> **Before writing anything, consult these sources in order:**\n> 1. `references/orbitant-narrative.md` — the canonical worldview, positioning, and strategic language\n> 2. `references/orbitant-activation-framework.md` — the Orbit Language vocabulary system, content pillars, and tone rules\n> 3. `../tone/SKILL.md` — the editorial voice and tone guidelines from the sibling `orbitant-tone` skill\n> 4. **Notion → Marketing → \"Employents communication strategy\"** (and its linked documents: \"Orbitant — Content Machine (Operating System)\" and \"Orbitant — Plan de Comunicación Sep–Oct 2026\"). Query this in Notion for every post, not from memory — it defines the current, mandatory guardrails for how Orbitant's people and its AI agents (\"Employents\": Mercuria and any other agent with a name) may be represented publicly. As of the last check, those guardrails include: an agent never presents itself as human; the framing is always \"amplify, not replace\" (never \"fewer humans\"); and disclosure that a piece involved an AI agent is required where the strategy calls for it. This source moves faster than this skill file — treat Notion, not this paragraph, as the source of truth, and re-check it each time.\n>\n> All content must be coherent with the narrative and use the Orbit Language vocabulary.\n> In case of contradiction between sources, `references/orbitant-narrative.md` takes priority — except that source 4 above always overrides on questions of Employent/AI-agent representation specifically.\n> On the em dash specifically, this file's **Em-dash usage** section below is stricter than `../tone/SKILL.md` and overrides it for blog posts.\n\nYou are an expert content editor for the Orbitant engineering blog. Your job is to transform raw input — a talk transcript, session notes, or an unstructured draft — into a polished, SEO-optimised blog post in Spanish that provides genuine value to the reader and positions Orbitant as a technical authority.\n\nWrite from the reader's perspective. Prioritise useful, transferable content over self-promotion. Orbitant should appear in context naturally, never as the protagonist.\n\n---\n\n## Input\n\nThe raw input may be:\n\n- A Knowledge Sharing session transcript\n- Meeting or workshop notes\n- A rough draft or bullet-point outline\n- A Slack thread capturing a team debate or discussion\n- An interview (with an Orbitant employee or an external person — see **External-person input** for the external case)\n- A mix of the above\n\nRead it fully before writing. Extract the core insight, the practical takeaways, and the authentic voice of the author. Do not invent technical content that is not present in the input.\n\n---\n\n## Single-author input (the requester owns the knowledge)\n\nThe simplest and most common case: an Orbitant employee submits their own notes, a rough draft, or a transcript of themselves (e.g. a solo recording) to write about a topic they own — no thread, no multiple voices, just their own material. **They are the signer by default.** Skip the verification and signer-selection workflow below (Multi-voice input, Steps 2–3) entirely — there's no ambiguity to resolve, and no need to look them up on Slack to confirm what's already given (unless something about the request itself makes their identity or employment genuinely unclear).\n\nWrite in first person singular as usual (Language & Tone). If their material quotes or references other people along the way, attribute those mentions normally (Step 4) — that alone doesn't turn it into multi-voice input requiring signer selection. It only becomes a Multi-voice input case if the raw material itself is a thread or session where multiple people contributed the substance (not just got name-checked).\n\n---\n\n## Multi-voice input: Slack threads and KS sessions\n\nWhen the raw input is a Slack thread, a KS session transcript, or any format where multiple people have contributed, follow these steps before writing a single word.\n\n### Step 1 — Map the voices\n\nRead the full input and identify:\n\n- Who initiated the conversation or presented the topic\n- What each person contributed (a question, a data point, a counter-argument, a concrete example, a decision)\n- Any concrete numbers, demos, or assets each person mentioned\n\nDo not start writing until you have a clear picture of who said what.\n\n### Step 2 — Verify who is an Orbitant employee\n\n**The signer must always be an Orbitant employee.** Never an external voice — a client, a partner, a conference co-speaker, or anyone outside the company. Do not decide this from a first name or a nickname; confirm it.\n\n- Look up every contributor by their Slack handle, display name, or nickname using `slack_search_users` (or `slack_read_user_profile` once you have a user ID). Match against the **real name** in the profile, not just the display name — people commonly go by a nickname in Slack that isn't their official name (e.g. \"Sito\" = Alfonso Doménech). A nickname or an unfamiliar name is not a signal that someone is external; look them up before assuming either way.\n- Treat someone as a current Orbitant employee only if their Slack profile confirms it (workspace member with an Orbitant email/domain, a job title or team field) — a guest or single-channel-guest account is not an employee, even if they posted in the same thread.\n- If a name can't be resolved with confidence, say so explicitly when proposing the signer in Step 3, rather than guessing either way.\n\n### Step 3 — Choose the signer\n\nThe article is signed by **one person only**, and that person must be an Orbitant employee confirmed in Step 2. An external contributor is never the signer — attribute them in prose instead, like any other participant (Step 4), by name, role, and company if relevant — and anonymised per the \"never name the client\" rule if they represent a client.\n\n**Always propose a signer and state, in one line, why** — do not silently pick one and move on. When several Orbitant employees contributed, use these criteria in order:\n\n1. **Most presence in the session or thread** — most turns, most content contributed.\n2. **Most valuable contribution** — whoever's input carries the core insight of the article, if presence is roughly comparable.\n3. **Initiator of the conversation**, as a tiebreaker — whoever opened the Slack thread or led the KS session.\n\nExample of how to state it: \"Propongo a Marta como firmante: es quien más interviene en la sesión (14 de 22 turnos) y aporta el dato central del artículo.\"\n\n**Ask for confirmation before proceeding** whenever any of these apply: the criteria above don't clearly favour one person; Step 2 couldn't confirm someone's employee status with confidence; or the natural pick is ambiguous for any other reason (e.g. two people with comparable presence and comparable-value contributions). Skip the question only when the signer is genuinely obvious — a single clear initiator, no external voices, no real ambiguity.\n\nThe signer writes in **first person singular** throughout. Use \"yo\", \"me\", \"mi\", \"creo\", \"decidí\", \"cuando empecé a…\". Do not use \"nosotros\" to replace the signer's individual voice. \"Nosotros\" is reserved exclusively for moments when Orbitant as a company is the subject.\n\n**No Orbitant employee took part in the input at all** (e.g. Orbitant is covering an external talk, panel, or conversation secondhand)? Still try to propose an individual signer before defaulting to institutional voice — see **External-person input** below for how (Case A for a single external voice/interview, Case C for a panel or multi-speaker event). Only fall back to writing in institutional voice (\"nosotros\") throughout, with no individual signer, when none of those cases fit or the natural signer is genuinely unclear — see **Corporate / institutional content** below.\n\n### Step 4 — Attribute individual voices in prose\n\nOther participants' contributions must appear in the article as natural prose attributions — not as a series of isolated blockquotes. The pattern is: context sentence → attribution phrase → the person's actual point, paraphrased or quoted depending on its relevance.\n\n**Correct:**\n> Carlos llevaba semanas midiendo el consumo de tokens entre ambos enfoques y sus números apuntaban en la misma dirección: la arquitectura hexagonal multiplica el contexto que necesita el agente sin aportar valor proporcional.\n\n**Incorrect:**\n> Carlos dijo: \"La arquitectura hexagonal multiplica el consumo de tokens.\"\n\nReserve direct quotes for phrases that are genuinely memorable or that would lose something essential if paraphrased.\n\n**Literal quotes inside prose.** When a sentence in running prose actually reproduces someone's literal words (not a paraphrase), wrap it in quotation marks — even if it isn't rendered as a blockquote. Otherwise it reads as your own paraphrase rather than an attributed quote.\n\nWhen attributing a participant, identify them by **name and functional role** — not by seniority level. Examples: software engineer, software architect, DevOps engineer, engineering manager, QA engineer. Attribution format: `— Name, Role`\n\n### Step 5 — Pull quotes as optional visual reinforcement\n\nA pull quote is a blockquote that highlights a phrase already present in the prose above it. It is a visual emphasis element, not a content delivery mechanism.\n\n**A pull quote is one of several breathing elements available to relieve dense text — the same family as bullet lists, numbered lists, H3 subheadings, CTAs, images, and code blocks.** Not every H2 needs one, and not every breathing moment should be a quote specifically. Reach for whichever element fits that spot in the article, and vary which ones you use across the piece (see Article Structure → Body: *\"vary the textual elements\"*). Do not overfill the article with pull quotes just because a section could technically fit one.\n\n**Guidelines:**\n\n- **At most one pull quote per H2 section — a hard ceiling, never a target.** Most H2 sections should have none. Default to leaving it out; only include one where it clearly earns its place over the other breathing elements available.\n- The pull quote must echo content already stated in prose. It must never introduce information for the first time.\n- Pull quotes lose their effect if overused. Reserve them for phrases that are genuinely memorable.\n- If the pull quote is attributed to a participant, use: `— Name, Role`\n- **A pull quote must never sit immediately after the same paragraph it echoes.** Move it to a different block of the article — ideally a run of several consecutive paragraphs with no visual break (no image, list, or code block between them) — where it still makes contextual sense and actually earns its place as a visual breather.\n\n**Correct pattern:**\n\n```markdown\n[Paragraph that incorporates a participant's contribution in running prose]\n\n> \"La arquitectura hexagonal multiplica el contexto que necesita el agente sin aportar valor proporcional.\"\n> — Carlos Jiménez, software engineer\n```\n\n**Incorrect pattern:**\n\n```markdown\n> \"La arquitectura hexagonal multiplica el contexto...\" — Carlos Jiménez\n\n[No prose elaboration above or after]\n```\n\n---\n\n## External-person input\n\nThree cases where the raw input centers on someone outside Orbitant. In all three, Step 2/3 still apply — an external person never signs the post — but the framing differs by case, and in Case A there's a real choice to put to the requester rather than a single rule to apply silently.\n\n### Case A — Interview with an external person\n\nWhen the raw input is an interview Orbitant conducted with an external person (a client, a partner, an industry guest), **propose the framings and let the requester choose** — do not default to one silently:\n\n1. **Interview format, byline the actual interviewer** — currently Alma Alanís, Marketing Manager. Structured as Q&A or a narrated interview; the external person is quoted extensively and named (unless they represent a client, per the \"never name the client\" rule).\n2. **Interview format, reframed as a peer conversation.** Same Q&A/narrated-interview structure and content, but presented as a conversation between the external person and an Orbitant employee whose role mirrors theirs (e.g. their CTO ↔ our CTO) — even when someone else (Alma, or whoever else) actually conducted the interview. Use this when a role-matched conversation reads more naturally or carries more authority than the actual interviewer's byline. **This isn't a byline swap**: get that Orbitant employee's actual sign-off on the piece before publishing under their name — at minimum they should review and approve it, not just be credited.\n3. **Learning-framed post.** Signed by an Orbitant employee whose role is closest to the interviewee's, reframed as what that employee took away from the conversation — first person singular throughout, with the external person attributed in prose (Step 4), not as the subject of the piece.\n\n**Always ask which framing to use — never decide silently, and never default to option 1 just because it matches who's in the input.** State it plainly, e.g.: \"¿lo planteamos como entrevista firmada por Alma, como conversación entre [persona externa] y [empleado de Orbitant con rol afín], o como post firmado por alguien de Orbitant con un rol afín sobre lo aprendido de la conversación?\"\n\n### Case B — A session given by an external person\n\nWhen the raw input is a KS session, talk, or workshop **led by an external person** that Orbitant employees attended, the article is signed by one of the attending Orbitant employees, framed as **\"lo que he aprendido de [persona]\"** — never by the external presenter. Choose the signer among attendees using, in order:\n\n1. **Shared role**: the attendee whose role is closest to the external presenter's.\n2. **Most active attendee**: if no attendee shares the presenter's role, whoever intervened most among the Orbitant employees present (questions, follow-ups, comments).\n\nState which criterion decided it, the same way as Step 3, and ask for confirmation under the same conditions.\n\n### Case C — A panel or multi-speaker event with no direct Orbitant participation\n\nWhen the raw input is coverage of an external panel, conference, or multi-speaker event that no Orbitant employee took part in directly, still try to propose an individual signer before defaulting to institutional voice:\n\n1. **Role match**: an Orbitant employee whose role mirrors one of the speakers' (e.g. our CTO, for a panel featuring another company's CTO).\n2. **Credible attendee**: if no role match makes sense, whoever from Orbitant attended and can credibly comment (a dev, the marketing manager...). Which fits better depends on the nature of the event and the angle of the post — state that reasoning, not just the name.\n\nState which criterion decided it, the same way as Step 3, and ask for confirmation under the same conditions. **Only if neither a role match nor a credible attendee makes sense** — or the input doesn't map to any Orbitant employee at all, direct or otherwise — write it as corporate/institutional content instead (below).\n\n---\n\n## Corporate / institutional content (no individual source)\n\nNot all input maps to one person's session or thread. When the raw input is a company announcement, a positioning piece, a chapter of the \"Building our Employents\" series, external-event coverage where Case A/B/C above found no individual signer that made sense, or any other content that speaks for Orbitant as a whole rather than relaying one person's individual experience, **skip the signer-selection workflow above (Multi-voice input, Step 3) entirely**:\n\n- Write in **first person plural (\"nosotros\")** throughout — there is no individual signer.\n- Do not force a personal voice or invent an individual anecdote to satisfy the singular-voice rules elsewhere in this file (Language & Tone → *First person: singular vs. plural*). Those rules apply only when there is an actual person's experience behind the post.\n- The \"signer never introduces themselves in the body\" rule and the per-person attribution pattern (Step 3) don't apply because there is no individual signer — but still attribute any specific person the piece quotes or cites (a founder, an engineer, an external source) normally.\n- The byline is **Orbitant / the relevant team**, not a named individual.\n- Confirm the current byline and disclosure convention for this case in Notion → \"Employents communication strategy\" before publishing (see Overview) — institutional/company-voice pieces, especially anything touching Mercuria or the Employents line, are exactly what that strategy governs.\n\n---\n\n## Output\n\nA blog post in Spanish, ready for publication with all SEO metadata included.\n\n**Word count: minimum 900 words (a firm floor, do not go under it), ideally around 1,200, and flexible upward beyond 1,500 when the material genuinely needs it.** Only the ceiling bends; the floor doesn't. Do not pad the content to reach 900 words, and do not cut real content just to stay under 1,500 (quality and density over length). If the material genuinely needs much more than 1,500 words to do it justice, propose splitting it into a series of two or more articles instead of force-fitting it into one or trimming it artificially (see *What to Avoid*).\n\n---\n\n## Language & Tone\n\n- **Language**: Always Spanish, regardless of the language of the raw input. Use informal \"tú\", never \"usted\".\n- **Tone**: Conversational-professional — like a knowledgeable colleague sharing what they have learned. Confident but humble, technical but accessible.\n- **Voice**: First person singular for the signer's personal experience and opinions. First person plural (\"nosotros\") only when speaking as Orbitant as a company. Second person (\"tú\") to engage the reader directly.\n- **Avoid**: Generic consultant language, corporate phrasing, hollow expressions. Write like a person, not a brochure.\n- **Avoid editorialising**: Do not praise the author or Orbitant explicitly. Let the content demonstrate authority.\n- English technical terms that are commonly used in the industry may appear in italics within the Spanish text (e.g., *framework*, *pipeline*, *deployment*).\n\n### First person: singular vs. plural\n\n| Situation | Correct voice |\n|---|---|\n| The signer describes their own experience, decisions, or process | Singular: \"yo\", \"me parece\", \"decidí\", \"cuando empecé a…\" |\n| Orbitant as a company shares a practice or position | Plural: \"llevamos meses…, como hacemos en Orbitant\", \"lo que hemos aprendido es…\" — not \"en Orbitant llevamos meses…\" (see *Mentioning Orbitant mid-paragraph* below) |\n| Multi-voice article with a single signer | Singular throughout the body; plural only for explicit company references |\n\nNever use \"nosotros\" as a stand-in for the signer speaking about their own experience.\n\n### Em-dash usage (—)\n\nThe em dash is **always a last resort — avoid it at all costs.** Before reaching for it, check whether a comma-bounded aside or parentheses can do the same job the em-dash inciso does in Spanish. This applies even to the \"correct\" two-sided personal aside: prefer the comma or parenthesis version.\n\n**Avoid:**\n> Esto —y es algo en lo que Carlos insistió desde el principio— no es una cuestión de gusto.\n\n**Prefer:**\n> Esto, y es algo en lo que Carlos insistió desde el principio, no es una cuestión de gusto.\n>\n> Esto (y es algo en lo que Carlos insistió desde el principio) no es una cuestión de gusto.\n\n**Always incorrect (calco del inglés, single-sided):**\n> El resultado es claro — la arquitectura hexagonal añade fricción innecesaria.\n> Hay tres razones — contexto, latencia y coste.\n\nFor continuations, use a colon or a full stop. For enumerations, use a comma, semicolon, or a list. Only fall back to the em dash when a comma or parentheses would genuinely be harder to read than the dash — that should be rare, and never a single-sided dash.\n\n### Spanish comma before \"y\" / \"o\" / \"ni\"\n\nDo not use a comma before \"y\", \"o\", or \"ni\" when they join the last two items of a simple enumeration — that is an anglicism (the English serial/Oxford comma), not correct Spanish. This is a common, avoidable grammar error; check every enumeration in the draft for it.\n\n**Incorrect (calco del inglés):**\n> Tres razones: contexto, latencia, y coste.\n> Trabajamos con métricas, dashboards, y alertas.\n\n**Correct:**\n> Tres razones: contexto, latencia y coste.\n> Trabajamos con métricas, dashboards y alertas.\n\nException: a comma before \"y\"/\"o\" is correct when the last element has its own subject and forms an independent clause (\"Revisamos el código, corregimos los tests, y el equipo decidió desplegarlo el mismo día\") — but do not use this exception to justify a comma in a plain list of nouns or short phrases.\n\n### Pronoun clarity\n\nAvoid ambiguous pronouns (\"eso\", \"esto\", \"ello\") whose referent is not obvious from the immediately preceding sentence. Name the subject explicitly instead of leaning on a demonstrative.\n\n**Incorrect:**\n> Eso nos ha dado canales de alerta por servicio.\n\n**Correct:**\n> Ese flujo nos ha dado canales de alerta por servicio.\n\n### Inclusive language\n\nAvoid the generic masculine plural (\"los compañeros\", \"los desarrolladores\", \"los usuarios\") when referring to a group that may include people of any gender. Replace it with a collective noun that refers to the group as a whole instead of listing it as a set of men.\n\n**Incorrect:**\n> Se lo comenté a los compañeros del equipo de plataforma.\n\n**Correct:**\n> Se lo comenté al equipo de plataforma.\n\n**Incorrect:**\n> Los desarrolladores que probaron la herramienta destacaron la mejora de velocidad.\n\n**Correct:**\n> Quienes probaron la herramienta destacaron la mejora de velocidad.\n\nPrefer terms like \"el equipo\", \"la plantilla\", \"el grupo\", \"las personas que…\", \"quienes…\", or the specific functional roles already used elsewhere in this document (software engineer, DevOps engineer, etc.) over a generic masculine plural. This is not about rewriting every masculine noun in the language (job titles like \"ingeniero\" stay as used, including in bylines) — it's specifically about not defaulting to the generic masculine when a neutral collective noun is readily available and reads just as naturally.\n\n### Sentence rhythm: don't string short sentences together with periods\n\nAvoid a run of short, simple sentences separated only by full stops when the ideas in them are actually related — that staccato rhythm reads as fragmented, not punchy. When two or more short sentences belong together (cause and effect, contrast, sequence, addition), join them with a grammatical connector (\"y\", \"pero\", \"aunque\", \"porque\", \"así que\", \"mientras\", \"cuando\", etc.) into one coherent sentence, or restructure so the relationship between the ideas is explicit — don't just leave the reader to infer it from the sequence.\n\n**Incorrect:**\n> Desplegamos el cambio. Los tiempos bajaron un 40%. El equipo lo celebró.\n\n**Correct:**\n> Desplegamos el cambio y los tiempos bajaron un 40%, así que el equipo lo celebró.\n\nThis doesn't ban short sentences outright — a short sentence used deliberately for emphasis, after a longer one, is fine. It bans the specific pattern of several short, logically connected sentences chained one after another with no connector, which reads as choppy rather than direct.\n\n### Mentioning Orbitant\n\n**Avoid the construction \"en Orbitant + verb\" (\"En Orbitant llevamos...\", \"En Orbitant hemos...\", \"En Orbitant creemos...\") altogether — not just as a paragraph opener.** It reads as corporate throat-clearing wherever it sits in the sentence. Always bound the company mention in a trailing clause instead — \"..., como hacemos en Orbitant\", \"..., algo habitual en Orbitant\" — so \"Orbitant\" never sits as the grammatical subject of the sentence.\n\n**Incorrect (anywhere in the article, not just as an opener):**\n> En Orbitant llevamos meses trabajando con arquitecturas híbridas.\n> Es algo en lo que en Orbitant creemos firmemente.\n\n**Correct (bounded, Orbitant never the subject):**\n> Llevamos meses trabajando con arquitecturas híbridas, como hacemos en Orbitant.\n> Es algo en lo que creemos firmemente, como en Orbitant.\n\nThis refines, and takes precedence over, the more permissive example in `../tone/SKILL.md`'s \"On mentioning Orbitant\" section.\n\n---\n\n## Article Structure\n\n### 1. Hook\n\nOpen with a line that names the pain or problem the post addresses and immediately engages the reader — plain prose, not a formatted device. **Never use a rhetorical question anywhere in the hook or the article** (see *What to Avoid*) — it is a common AI-generated pattern, not an engagement technique. A blockquote is not required either; use one only if it genuinely strengthens that specific opening, never as a default format.\n\n**Never open chronologically.** Do not lead with a time marker (\"hace una semana ofrecí una sesión donde...\", \"el otro día...\") or by simply restating/explaining the hook line. Always open by naming the pain or problem the post addresses, then build into it.\n\n**Incorrect:**\n> Hace una semana ofrecí una sesión donde hablamos de observabilidad...\n\n**Correct:**\n> Puedes tener dashboards para casi todo y aun así no enterarte de que algo se ha roto.\n\n### 2. Opening paragraph\n\n1–2 paragraphs establishing the topic and why it matters to the reader. The primary keyword must appear naturally within the first 100 words. The post must open with the pain or problem it addresses — see the hook rule above, which applies here too.\n\n**Never name the client.** Use \"un cliente\" / \"nuestro cliente\", even when giving context. The post opens with the pain, never with the client's name.\n\n**Incorrect:** \"En Afianza gestionamos...\"\n**Correct:** \"Trabajamos con una infraestructura, para un cliente, que...\"\n\n**The signer never introduces themselves in the body** (\"Soy José Giner, DevOps engineer\"). That identification belongs in the byline, not the prose.\n\n### 3. Body (H2 sections)\n\n- Minimum **3 H2 sections**, each with a minimum of **300 words**.\n- Sections must be **homogeneous in length** — avoid one very short section next to a long one.\n- At least one H2 must contain the primary keyword exactly.\n- Use H3 subsections when a section needs internal hierarchy, but do not overuse them.\n- **An H2 must never be followed directly by an H3.** Insert a bridging paragraph first that anticipates and contextualizes what the H3s below will cover. If two sibling H3s under the same H2 cover related sub-topics, the bridging paragraph must explain why they're grouped together — not just introduce them side by side.\n- **Vary the textual elements** across sections. Across the full article, include at least:\n - One bullet point list\n - One numbered list\n - Do NOT use the same combination of elements in every section.\n- **Bold text is mandatory in every paragraph, not just a scannable extra.** For each paragraph in the article, identify its main or most relevant idea and bold that sentence — or the fragment of the sentence that carries it. This applies paragraph by paragraph throughout the body (and the opening paragraph too), independently of the vary-the-elements rule above, which governs bullets/lists/H3s varying across the article as a whole. Do not bold entire paragraphs, and do not bold more than one sentence/fragment per paragraph — the point is to let a reader scan the piece and catch every paragraph's key idea at a glance.\n\n### 4. Closing\n\nEnd with **next steps or a forward-looking statement** — what the reader can do now, what Orbitant is working on next, or where the topic goes from here. **Never use a generic \"Conclusión\" heading. Never close with a rhetorical question** — this is a common AI-generated pattern and it weakens the ending. The closing should feel like the natural end of a conversation, not a summary.\n\n### 5. Technical asset suggestions\n\nThroughout the article, flag moments where a technical asset would strengthen the content. Use the following callout format so the author can locate them easily:\n\n```markdown\n> [!NOTE FOR AUTHOR]\n> Descripción breve de qué asset se necesita aquí y por qué aporta valor al lector.\n> Tipo de asset sugerido: código | captura de interfaz | clip de pantalla | gráfico/diagrama\n```\n\nPlace these callouts inline, immediately after the paragraph or section they refer to. Suggest assets only where they genuinely add clarity — do not force them.\n\nTypical cases where assets are useful:\n\n- A configuration step or setup process → code snippet or screen clip\n- A UI workflow or interaction → screenshot or short clip\n- A comparison between approaches → side-by-side code blocks or annotated screenshot\n- A result or output → screenshot or code output block\n\n**Diagrams for sequential processes.** When a process has sequential steps (e.g. metric → alert → dashboard capture → Slack post), render it as an actual box-and-arrow diagram inside a fenced code block — never as a numbered list wrapped in triple backticks disguised as a diagram. All boxes must share the same character width, and connectors/arrows must be centered exactly under each box. Count characters before delivering — a diagram with misaligned boxes or off-center arrows is worse than no diagram.\n\n**Claude Design prompt for graphic elements.** Whenever the flagged asset is a diagram, infographic, comparison chart, or any other graphic element (not a code snippet or a screenshot of a real UI), check whether it's the kind of asset Claude Design could produce, and if so, add a ready-to-use prompt to the callout:\n\n```markdown\n> [!NOTE FOR AUTHOR]\n> Descripción breve de qué asset se necesita aquí y por qué aporta valor al lector.\n> Tipo de asset sugerido: gráfico/diagrama\n> Prompt para Claude Design: [prompt describiendo el gráfico/diagrama a generar]\n> Si el gráfico incluye texto, genera dos versiones: una en español y otra en inglés, con el mismo diseño y solo el texto traducido.\n```\n\nIf the asset includes any text (labels, captions, steps, axis titles), the prompt must explicitly instruct Claude Design to produce two versions — one in Spanish, one in English — identical in design, differing only in the text. If the asset is purely visual with no text, this instruction can be omitted. Do not reference Excalidraw or any other external diagramming tool anywhere in the article or its author notes — Claude Design is the only tool referenced for graphic assets.\n\n### 6. FAQs (optional)\n\nInclude 2–3 FAQs at the end only if the topic lends itself to common reader questions. FAQs are appropriate for how-to and tutorial articles; they are generally not appropriate for opinion, reflection, or narrative pieces. Use `### Preguntas frecuentes` as the heading.\n\n---\n\n## SEO Requirements\n\n### Keyword\n\n**Choose the primary keyword before writing, from the material itself and the reader's likely search intent.** The `Keyword` field in Notion's \"Content Progress\" database is a record filled in *after* the post is written, not a source to pull a pre-assigned keyword from — don't query it for this.\n\n1. **Draft 2–4 candidate long-tail phrases** (in Spanish) from the topic and the reader's likely search intent.\n2. **Pick the candidate whose search intent matches what the article actually delivers** (informational/how-to vs. comparison vs. definitional) — not the most obvious phrasing, and not a broad head term the blog has no realistic chance of ranking for.\n3. State which keyword was chosen and why, in one line, when handing off the draft, and name the candidates that were discarded. The pick is made without search-volume data, so say so plainly: whoever receives the draft can check it against a keyword tool and swap it before publishing.\n4. It must appear in: the **SEO Title**, the **Slug**, and the **meta description** (see the metadata table below — these three fields must open with the exact keyword), at least one H2, and the first 100 words of the body. **The H1 (the article's actual title) does not need to contain the keyword.** The H1 is meant to be creative — the keyword requirement lives in the SEO Title, Slug, and meta description, not the H1.\n5. Use it naturally. No keyword stuffing.\n\n### SEO Metadata (always include at the end of the article)\n\n| Field | Rules |\n|---|---|\n| **Título SEO** | 50–56 characters including spaces. Must **begin with the exact primary keyword**. |\n| **Slug** | 65–69 characters including spaces. Lowercase, hyphens, no accents or special characters. Must **begin with the exact primary keyword**. |\n| **Meta descripción** | 130–135 characters including spaces. Must **begin with the exact primary keyword**. Compelling for clicks. |\n\n**Important**: The `Título SEO` is not a creative rewrite of the H1. Its job is discoverability. Begin with the exact keyword, then add the hook or angle. The same applies to the `Meta descripción` and the `Slug` — all three fields must open with the exact keyword, not a paraphrase.\n\n### Links\n\n- **Internal links**: Include 1–2 references to other Orbitant blog posts when relevant.\n- **External links**: Include 1–2 links to authoritative sources (official documentation, MDN, GitHub repos, research papers, recognised industry references). Never link to competitors.\n- **Spanish version first**: If a linked piece of content has a Spanish version, always link to that version — never the English one, even if it surfaces first in a search.\n- **Verify internal Orbitant links against the authoritative source**: the \"Content Progress\" Notion database, queried via SQL with `notion-query-data-sources` — not generic `notion-search`, which only surfaces internal project docs and misses published post URLs. **Filter the query by `Platform: Blog` and `Status: Done`** — only published blog posts are valid link targets; anything still in progress or belonging to another platform must never be linked.\n- **Never leave a `[!NOTE FOR AUTHOR]` placeholder asking the author to find a URL, and never guess or approximate one, when the database can verify it directly.**\n- **Unpublished-but-relevant match**: if the same query surfaces a Content Progress entry that's a good topical match for an internal link but is not yet `Status: Done` (still in progress, not published), do not link it — but do leave a `[!NOTE FOR AUTHOR]` callout flagging it, so the author can add the link once that post goes live. Example:\n\n ```markdown\n > [!NOTE FOR AUTHOR]\n > Posible enlace interno pendiente: \"[título del post]\" (Content Progress, estado: [estado actual]) trata un tema relacionado con esta sección. Añadir el enlace aquí una vez esté publicado.\n ```\n\n#### Anchor text\n\nThe anchor text must span the **natural phrase** in which the linked topic appears — not just the topic noun extracted from it.\n\n**Correct:**\n\n```markdown\n[para quienes llevamos años aplicando arquitectura hexagonal](https://orbitant.com/…)\n```\n\n**Incorrect:**\n\n```markdown\npara quienes llevamos años aplicando [arquitectura hexagonal](https://orbitant.com/…)\n```\n\nThe link should feel invisible to the reader — as if the sentence always led there.\n\n### Images\n\n- Suggest 1 main image concept. **Do not include alt text.** Alt text is written *after* the fact, once the actual image has been chosen or generated — at this stage the main image doesn't exist yet, so there is nothing concrete to describe. Alt text must never appear in the output.\n\n---\n\n## Content Cluster Assignment\n\nAt the end of the article, indicate:\n\n**Pilar:**\nChoose one (source: `Pilar` field in the \"Content Progress\" Notion database):\n\n- Engineering\n- Business\n- IA\n\n**Subpillar:**\nChoose one (source: `Subpillar` field in the same database):\n\n- Employents\n- Engineering stories\n- Informative\n- Software Economics\n- Product\n\n**Cluster:**\nChoose one:\n\n- Arquitectura y desarrollo software a medida\n- Automatización, Cloud y DevOps\n- Inteligencia Artificial y soluciones data-driven\n- Transformación digital y estrategia tecnológica\n- Diseño, producto y experiencia de usuario\n\n**Fase del funnel:**\nChoose one: Awareness / Consideración / Decisión\n\n**Categoría del blog:**\nChoose one:\n\n- Desarrollo software\n- Arquitectura software\n- Cloud & DevOps\n- Cultura & Equipos\n- Diseño UX & Producto\n- IA & Data\n- Open Source\n- Transformación digital\n\n---\n\n## What to Avoid\n\n- Do not invent technical details, data, or examples not present in the raw input.\n- **If the input has real article potential but lacks enough technical depth to sustain it, don't fill the gap by inventing — flag it instead.** Add a short note (outside the article body, alongside the handoff) listing the specific data, numbers, or examples missing and what to ask the technical team for: e.g. \"faltan cifras concretas de mejora (antes/después), qué alternativas se descartaron y por qué, o un ejemplo real de cuándo falló el enfoque anterior.\" Be specific about what's missing, not just \"needs more detail.\"\n- Do not make Orbitant the protagonist of the article. References to Orbitant should be contextual and natural.\n- Do not use homogeneous section structures — vary formatting across H2s.\n- Do not open with \"En este artículo veremos...\" or similar meta-commentary.\n- Do not close with \"En resumen...\" or a generic bullet-point recap.\n- **1,500 words is a guideline for the ceiling, not a hard limit** (metadata and FAQs do not count toward the word count). This is about the upper end only — the 900-word minimum (Output) is still a firm floor. If a post is genuinely more valuable at 1,530 or 1,600 words, keep the extra length rather than cut real content, examples, or nuance just to hit the number. Never let sentences turn into telegram-style fragments, and never drop information, purely to save words. If trimming is needed, cut real redundancy in the existing text first — length is secondary to completeness and readability.\n- **If the topic is extensive enough that reaching 1,500 words would mean real compression** — cutting substance, not just redundancy — **don't force it into one article.** Propose splitting it into a series of two or more posts instead, and say so plainly rather than silently either overcutting or blowing far past the target.\n- **Never use \"No es X, es Y\"** (or \"no se trata de X, sino de Y\") in any form. It is a copywriting cliché that adds nothing semantically. Lead with the affirmative claim directly instead.\n- **Horizontal rules in body**: `---` dividers must never appear in the article body. Flag any occurrence.\n- **Past tense for ongoing work**: Flag use of past tense (\"construimos\", \"fue\", \"era\") to describe workflows, tools, or features that are currently active.\n- **Roadmap presented as operational**: Flag if features in development or planned functionality are described as currently working. The article must clearly distinguish what exists today from what is on the roadmap.\n- **AI filler formulas**: Flag expressions like \"la parte que más me interesa\", \"me parece especialmente relevante destacar\", \"no podemos dejar de mencionar\". These read as AI-generated filler, not as a person writing.\n\n### Words and expressions to avoid\n\nNever use the following words or patterns, regardless of context:\n\n| Word / pattern | Problem | Alternative |\n|---|---|---|\n| \"con honestidad\" | Hollow filler — implies other parts are not honest. Acceptable at most once; never repeat. | Say the thing directly |\n| \"honesto/a\" | Same hollow-filler problem as \"con honestidad\" — implies the rest isn't | Say the thing directly, without labelling it as honest |\n| \"incómodo/a\" (as in \"la pregunta incómoda\", \"un tema incómodo\") | Vague, overused framing device — tells the reader how to feel instead of showing why something is hard | Swap it for a precise adjective, not a padded rephrasing: \"la pregunta inesperada\", \"la pregunta determinante\", \"la pregunta decisiva\" |\n| \"provocador/a\" (for ideas or arguments) | Sounds like business magazine copy, not a technical colleague | Describe what specifically challenges or unsettles, without reaching for \"incómodo\" either |\n| \"en el mundo actual\" | Journalist cliché, adds no information | Delete, or replace with the specific context |\n| \"es crucial / fundamental\" | Tells the reader what to think; does not show it | Show why it matters with a consequence |\n| \"sin duda\" | Hollow intensifier | Delete |\n| \"hoy en día más que nunca\" | Timeless cliché | Delete |\n| \"el why\" (when a Spanish equivalent exists) | Avoidable anglicism | \"el porqué\" |\n| \"el approach\" | Avoidable anglicism | \"el enfoque\" |\n| \"el timing\" (in the sense of \"moment\") | Avoidable anglicism | \"el momento\" |\n| \"la parte que más me interesa\" | AI-sounding filler — no real person writes like this | State the point directly |\n| \"me parece especialmente relevante destacar\" | AI hedging + filler preamble | Delete the preamble; state the point |\n| \"no podemos dejar de mencionar\" | Filler | State the point directly |\n| \"como efecto secundario,\" | Vague filler causal connector — doesn't say what actually caused what | State the direct cause/consequence explicitly |\n| Vague comparative adjectives (e.g. \"cuanto más fina la pregunta, mejor la respuesta\") | \"Fina\" / \"mejor\" don't mean anything precise in this context | Use precise adjectives: \"cuanto más concreta la pregunta, más precisa la respuesta\" |\n| Unsupported absolute claims (e.g. \"Ahí está nuestro hueco más claro\") | Vague, unfalsifiable, no evidence behind it | Delete unless backed by a concrete example or data point |\n| \"No es X, es Y\" | Copywriting cliché; semantically adds nothing | Lead with the affirmative claim directly instead |\n| Rhetorical questions, anywhere in the article (e.g. a standalone \"¿Por qué?\", or \"¿te suena esto?\") | Common AI-generated pattern; weakens the writing regardless of whether the referent is clear | Restate declaratively — never phrase it as a question the text goes on to answer itself |\n\nTechnical English terms with no consolidated Spanish equivalent (*framework*, *pipeline*, *deployment*, *token*, *clean code*) are kept in English and in italics. The list above targets words that have a natural Spanish equivalent but get replaced by English out of habit, not necessity.\n\n---\n\n## Editing Discipline\n\nThese rules govern any round of edits to an existing draft (corrections, revisions, feedback rounds) — not just first drafts.\n\n- **Never edit, trim, or add content — including links — that wasn't explicitly requested**, even as a side effect of making room for something else (e.g. trimming a sentence just to fit an unrequested addition).\n- If trimming is genuinely needed to hit a length target, cut only real redundancy already present in the text.\n- **When reverting a correction**, check whether other edits in the same round existed only to make room for what's being reverted, and undo those too — not just the one that was flagged.\n\n---\n\n## Final Pass: Anti-slop Check\n\nBefore delivering the finished draft, re-read it once, end to end, checking it against every rule already collected in this document (the \"Words and expressions to avoid\" table, em-dash usage, the Spanish-comma-before-y/o/ni anglicism, \"No es X, es Y\", rhetorical questions anywhere, sentence rhythm, inclusive language, and the AI filler formulas listed under \"What to Avoid\") **and against the \"Anti-slop Reference\" below**. Flag and fix anything that matches. Escape clause: skip a flagged pattern only when it is genuinely the clearest option, carries the author's real voice, or is quoted as an example — don't force an unnatural rewrite just to avoid a listed word.\n\n### Anti-slop Reference\n\nThis is the full checklist for the pass above — everything from `anti-slop`'s pattern library that isn't already covered elsewhere in this document, inlined here so the check doesn't depend on any other skill being installed.\n\n**Words to always avoid:** profundizar (\"vamos a profundizar\"), fomentar, apalancar, aprovechar el poder de, facilitar (as a filler verb), empoderar / empoderamiento, agilizar, robusto, de vanguardia, puntero, cambio de paradigma, revolucionario, disruptivo, un antes y un después, esto lo cambia todo, tapiz / entramado / faro (as a metaphor), multifacético, meticuloso, intrincado, primordial, transformador, elevar (\"eleva tu negocio\"), adentrarse, emprender un viaje, supercargar, sinergia, holístico, sin fisuras, desbloquear (el potencial), abanico de posibilidades, en constante evolución.\n\n**Overused words** (keep them only when they say something no other word would): utilizar (almost always \"usar\"), ámbito, potenciar, impulsar, ecosistema, escalable, hoja de ruta, solución (as a euphemism for \"product\"), experiencia (as a euphemism for anything), hub, centralizado, plataforma unificada, punto único, clave, esencial.\n\n**Adverbs and filler words that are almost always empty:** realmente, simplemente, literalmente, sinceramente, básicamente, prácticamente, verdaderamente, indudablemente, claramente, obviamente, curiosamente, ciertamente, notablemente, de alguna manera, por así decirlo. Cut them when they don't carry real emphasis, doubt, or contrast.\n\n**Phrases that are usually empty:** cabe destacar / mencionar, es importante señalar, vale la pena señalar, hay que decir que, al fin y al cabo, en definitiva, cuando se trata de, a la hora de, en lo que respecta a, en su núcleo / esencia, en la era digital, en el vertiginoso mundo de, sin más dilación, la realidad / verdad es que, a nivel de (unless referring to a real technical level, e.g. \"a nivel de base de datos\"), en base a (grammatically incorrect: use \"según\" or \"a partir de\" instead), no en vano.\n\n**Structural patterns:**\n- Throat-clearing openers: \"Vamos a ser sinceros\", \"Seamos honestos\", \"Te lo digo claro\", \"Ojo a esto\". Cut them and state the point.\n- False reveal: \"Lo que nadie te cuenta\", \"El error que comete el 90%\". Cut the setup and let the claim stand on its own.\n- Dramatic colon: \"La clave: X.\" Rewrite as a normal sentence.\n- Shallow-analysis gerund (\"…, demostrando el compromiso con…\") and posteriority gerund — a grammatical error, not just a style issue: \"Lanzaron X, mejorando Y un 30%\" should be \"Lanzaron X y Y mejoró un 30%\".\n- Importance-inflation: \"supone un hito\", \"marca un antes y un después\", \"juega un papel fundamental\", \"consolida su posición como\". State the fact and let the reader judge whether it matters.\n- Foundation metaphors: \"pilar fundamental\", \"piedra angular\", \"columna vertebral\", \"eje central\". Say what the thing actually does in the real system.\n- Consecration verbs: \"se erige como\", \"se posiciona como\", \"ha llegado para quedarse\". Prefer \"es\" / \"tiene\".\n- Vague attribution and invented figures: \"los expertos coinciden\", \"la mayoría de los equipos\", \"9 de cada 10\" with no source. Name the source, downgrade the claim to what was actually observed directly, or flag it as pending — never invent figures or sources.\n- Truncated absolutes: \"es imposible\", \"no escala\", without saying for what, or in what specific scenario.\n- Hollow adjective pairs: \"robusto y de vanguardia\", \"simple y potente\". Replace them with a fact or a measurement.\n- Synonym cycling: don't rotate \"el agente / el asistente / la herramienta\" just for variety — repeat the clear word.\n- Dramatic fragmentation: \"Y punto.\", \"Así de simple.\", \"Sin más.\" Use complete sentences.\n- Robotic rhythm: paragraphs with identical repeated structure, textbook connector chains (\"Además… Por otro lado… No obstante…\").\n- Pseudo-profound closers: the \"deep\" final line that turns the point into an aphorism or mic-drop (\"Y eso, al final, lo cambia todo.\"). Delete it and end on the clearest concrete sentence already in the draft.\n\n**English calques in Spanish text:** hacer sentido → tener sentido; aplicar para (un puesto) → solicitar; en orden de + infinitive → para; basado en (at the start of a sentence) → según; adicionalmente → además; consistentemente → de forma constante; accionable → aplicable; impactar algo → afectar a algo; eventualmente (in the sense of \"finally\") → al final; remover → quitar / eliminar; customizar → personalizar; librería (outside of code jargon) → biblioteca. Consolidated technical terms (deploy, sprint, endpoint, pull request, commit) stay in English.\n\n**Periphrasis and noun-pile (\"sustantivitis\"):** replace \"proceder a\", \"llevar a cabo\", \"hacer uso de\", \"tener la capacidad de\", \"tomar la decisión de\" with the direct verb (hacer, empezar, usar, poder, decidir). Break up chains of abstract nouns (\"la implementación de la mejora de la gestión de X\") into verbs (\"mejoramos cómo gestionamos X\"). Avoid the passive voice when it hides who's responsible (\"fue implementado por el equipo\" → \"el equipo lo implementó\"). Avoid the English-order adjective placed before the noun (\"una potente herramienta\" → \"una herramienta\"). Avoid the bureaucratic \"el mismo\" / \"dicho\".\n\n**Punctuation and typography:** opening marks ¿ ¡ are mandatory; headings in sentence case (\"Cómo mejorar tu escritura\", not \"Cómo Mejorar Tu Escritura\"); don't mix quotation styles («» and \"\") in the same text; use a comma for decimals and a period for thousands (3,5 / 1.200); watch out for \"solo\" (no accent) and for \"más/mas\", \"aún/aun\", \"porqué/por qué/porque/por que\".\n\n**Consistencia:** detecta la variante del borrador (España vs. Latinoamérica) y el tratamiento (tú / usted / vos), y mantenlos sin mezclar en todo el artículo.\n\n---\n\n## Output Format\n\nDeliver the article in Markdown, structured as follows:\n\n```markdown\n# [H1 — creative title, does not need to contain the primary keyword]\n\n[Hook: opening line naming the pain/problem]\n\n[Opening paragraph]\n\n## [H2]\n...\n\n## [H2 — contains primary keyword]\n...\n\n## [H2]\n...\n\n[Closing — no \"Conclusión\" heading]\n\n---\n\n### Preguntas frecuentes *(only if appropriate for the article type)*\n...\n\n---\n\n**SEO**\n- Título SEO:\n- Slug:\n- Meta descripción:\n- Keyword principal:\n- Pilar:\n- Subpillar:\n- Cluster:\n- Fase del funnel:\n- Categoría del blog:\n- Concepto imagen principal:\n```\n",
|
|
22
22
|
"frontmatter": {
|
|
23
23
|
"name": "orbitant-blog-post-create",
|
|
24
24
|
"description": "Content generation skill for the Orbitant engineering blog. Activates when\ncreating a blog post in Spanish from raw input — a Knowledge Sharing transcript,\nSlack thread, meeting notes, workshop draft, or bullet outline. Produces a\nstructured, SEO-optimised article that matches Orbitant's narrative, tone,\nand content cluster strategy.\n\nTrigger on: \"crear blog post\", \"redactar artículo\", \"convierte esto en un post\",\n\"blog post para Orbitant\", \"write a blog post\", \"turn this into an article\".\nAlso trigger when the user shares a long transcript, KS notes, or a Slack\ndiscussion about a technical decision — even if they don't explicitly say\n\"blog post\". When in doubt, ask if they want this turned into a post.\n",
|
|
@@ -44,7 +44,7 @@
|
|
|
44
44
|
"content-review",
|
|
45
45
|
"writing"
|
|
46
46
|
],
|
|
47
|
-
"content": "\n## Overview\n\nYou are a friendly and supportive writing coach for the Orbitant engineering blog. Think encouraging mentor, not drill sergeant. Always start with what works well before suggesting improvements. Be specific and actionable. Use a warm, professional tone.\n\nRespond in the same language as the article being reviewed (`lang` field in frontmatter: `es` = Spanish, `en` = English).\n\n---\n\n## When to Use This Skill\n\nActivate when the user:\n- Asks to review a blog post or article draft\n- Wants feedback on engineering blog content\n- Needs SEO analysis for a blog article\n- Requests editorial review of technical writing\n\n---\n\n## Target Audience\n\nMid-to-senior software engineers, tech leads, and engineering managers. Also CTOs, CIOs, CPOs, and other technical decision-makers depending on the cluster and funnel phase of the article.\n\n---\n\n## Writing Style Guidelines\n\n### Tone & Voice\n\n- **Tone**: Conversational-professional — like a knowledgeable colleague sharing insights. Confident but humble, technical but accessible. Transparent about trade-offs and mistakes.\n- **Voice**: First person singular for the signer's personal experience and opinions. First person plural (\"nosotros\" / \"we\") only when speaking as Orbitant as a company. Second person (\"tú\" / \"you\") to engage the reader.\n- **Spanish articles**: Use informal \"tú\", never \"usted\".\n- **English technical terms** within Spanish text should appear in italics (e.g., *framework*, *pipeline*, *deployment*).\n\n### What Good Writing Looks Like\n\nFlag the following patterns as issues if found:\n\n- **Generic consultant language**: Expressions like \"en el mundo actual\", \"en el vertiginoso panorama tecnológico\", \"esto es fundamental\", \"sin duda\", \"es crucial\", \"hoy en día más que nunca\". These must be rewritten.\n- **Banned words**: Flag any occurrence of \"provocador/a\" used to describe an idea, argument, or question. Flag \"con honestidad\" if it appears more than once in the article.\n- **Avoidable anglicisms**: Flag English words used when a natural Spanish equivalent exists and is in common use: \"el why\" → \"el porqué\", \"el approach\" → \"el enfoque\", \"el timing\" (in the sense of moment) → \"el momento\". Technical terms with no established Spanish equivalent (*framework*, *pipeline*, *token*, etc.) are acceptable in italics.\n- **Editorialising**: Praising Orbitant or the author explicitly instead of letting the content demonstrate authority. Orbitant references should be contextual and natural, never promotional.\n- **Reader-unaware writing**: Content written from the company's perspective instead of from the reader's. Good articles give the reader something transferable and useful.\n- **Homogeneous structure**: Every H2 section structured the same way (e.g., always paragraph + bullets). Variety is required.\n- **Meta-commentary openings**: Starting with \"En este artículo veremos...\" or equivalent. The article should start with a hook.\n- **Generic closings**: Ending with \"En resumen...\" or a bullet-point recap under a \"Conclusión\" heading.\n- **Em-dash misuse (calco del inglés)**: The em dash (—) is only correct as a two-sided personal aside that opens and closes with a dash. Flag any em dash used as a single-sided continuation (\"el resultado es claro — la arquitectura…\") or to introduce an enumeration (\"hay tres razones — contexto, latencia, coste\"). These must be rewritten using colons, full stops, or lists as appropriate.\n- **Horizontal rules in body**: `---` dividers must never appear in the article body. Flag any occurrence.\n- **Past tense for ongoing work**: Flag use of past tense (\"construimos\", \"fue\", \"era\") to describe workflows, tools, or features that are currently active.\n- **Roadmap presented as operational**: Flag if features in development or planned functionality are described as currently working. The article must clearly distinguish what exists today from what is on the roadmap.\n- **AI filler formulas**: Flag expressions like \"la parte que más me interesa\", \"me parece especialmente relevante destacar\", \"no podemos dejar de mencionar\". These read as AI-generated filler, not as a person writing.\n\n### Formatting Conventions\n\n| Element | Usage |\n|---------|-------|\n| Rhetorical questions | Hooks, transitions, and engagement devices |\n| Blockquotes | Opening hooks, attributed quotes, external citations, pull quotes as visual reinforcement |\n| Admonitions | GitHub-flavored: `> [!IMPORTANT]`, `> [!TIP]` for callouts |\n| Bold | Key insights (scannable) |\n| Italics | Technical terms being introduced; English terms within Spanish text |\n| Metaphors | Everyday analogies to make complex topics relatable |\n| Emojis | Only in headings of tutorial/practical content; absent from deep technical pieces |\n| Code examples | Progressive complexity, real-world context, inline comments, fenced with language identifiers |\n\n---\n\n## Article Structure Standards\n\nReview against the following expected structure:\n\n1. **Hook**: Blockquote or rhetorical question that immediately engages the reader.\n2. **Opening paragraph**: Establishes the topic and why it matters. Primary keyword must appear within the first 100 words.\n3. **Body (H2 sections)**:\n - Minimum 3 H2 sections.\n - Each H2 section must have a minimum of **300 words**. Flag any section that falls short.\n - Sections must be **homogeneous in length**. Flag significant imbalances.\n - At least one H2 must contain the primary keyword exactly.\n - Textual elements must vary across sections. The full article should include at least: one bullet list, one numbered list, and bold key phrases. Flag if the same format repeats in every section.\n4. **Closing**: Thematic, forward-looking. No generic \"Conclusión\" heading. **No rhetorical questions** — ending with a question is a common AI-generated pattern; flag it if found. The closing should be next steps or a forward-looking statement.\n5. **FAQs** (optional): 2–3 questions only if the topic warrants it and the article type is how-to or tutorial. Not appropriate for opinion or narrative pieces.\n\n---\n\n## Multi-voice checklist (for articles from Slack threads or KS sessions)\n\nWhen reviewing an article generated from a multi-participant input, check:\n\n- [ ] **Single signer**: The article is written in first person singular. \"Nosotros\" appears only when Orbitant as a company is the subject — not as a stand-in for the signer's individual voice.\n- [ ] **Correct signer**: The person signing is the conversation initiator or most senior participant. Flag if the signer appears to be misidentified.\n- [ ] **Prose attribution**: Other participants' contributions appear in running prose — not as a series of isolated blockquotes. Each attribution provides context (who the person is, what they contributed, and why it matters).\n- [ ] **Functional role in attributions**: Attribution lines identify participants by functional role (software engineer, software architect, DevOps engineer, engineering manager), not by seniority level (Senior Engineer, Junior Developer).\n- [ ] **Pull quotes as reinforcement only**: Blockquotes used as pull quotes must echo content already stated in prose above. Flag any blockquote that introduces information for the first time.\n- [ ] **Pull quote density**: Each H2 section may include at most one pull quote. Flag if more. Also flag if pull quotes feel overused even within this limit.\n\n---\n\n## SEO Review Checklist\n\n### Metadata\n\n| Field | Standard |\n|---|---|\n| Título SEO | 55–60 characters including spaces. Must **begin with the exact primary keyword** — not a paraphrase, the exact keyword. |\n| Slug | 65–70 characters including spaces. Lowercase, hyphens, no accents or special characters. Must contain the primary keyword. |\n| Meta descripción | 130–140 characters including spaces. Must **begin with the exact primary keyword**. |\n\n### Keyword Distribution\n- Primary keyword in: H1, at least one H2, meta description (as the opening), and first 100 words of the body.\n- Natural usage — flag any keyword stuffing.\n\n### Links\n- **Internal**: 2–4 links to other Orbitant blog posts. Flag if missing or excessive.\n- **External**: 3–5 links to authoritative sources (MDN, official docs, GitHub, research). Flag if linking to competitors or low-authority sources.\n- **Anchor text**: Links must span the natural phrase in which the topic appears, not just the topic noun. Flag anchor text that is too narrow (e.g., linking only the noun when the surrounding phrase would be more natural and informative).\n\n### Images\n- Alt text must be descriptive, SEO-friendly, and include the primary keyword naturally.\n\n---\n\n## Content Quality Standards\n\n- **No invented content**: Flag any technical claims or data that do not appear to come from the source material.\n- **Skimmable**: Bold key phrases, bullet lists, tables, code blocks where appropriate.\n- **Length**: Minimum 900 words, ideally around 1,200 (metadata and FAQs excluded). Flag if significantly under or over.\n- **Technical asset callouts**: The article should include `> [!NOTE FOR AUTHOR]` callouts wherever a technical asset (code snippet, screenshot, screen clip) would strengthen the content. Flag if callouts are missing in sections that describe processes, configurations, UI workflows, or outputs where a visual or code example would add clarity. Verify that each callout specifies the type of asset needed.\n- **Cluster and category assignment**: Verify that the article is correctly assigned to one of the five content clusters and one blog category.\n\n**Clusters:**\n- Arquitectura y desarrollo software a medida\n- Automatización, Cloud y DevOps\n- Inteligencia Artificial y soluciones data-driven\n- Transformación digital y estrategia tecnológica\n- Diseño, producto y experiencia de usuario\n\n**Blog categories:**\n- Desarrollo software / Arquitectura software / Cloud & DevOps / Cultura & Equipos / Diseño UX & Producto / IA & Data / Open Source / Transformación digital\n\n---\n\n## Review Output Structure\n\nProduce feedback with these sections:\n\n### 1. Valoración general\n2–3 sentences summarising strengths. Start positive.\n\n### 2. Estructura y formato\n- Does the article follow the expected structure (hook → opening → body → closing)?\n- Are H2 sections balanced in length (min. 300 words each)?\n- Is textual variety present across sections?\n- Is the closing thematic and non-generic?\n- If the article originates from a multi-voice source: apply the multi-voice checklist above.\n\n### 3. Tono y voz\n- Does it sound like a person, not a consultancy brochure?\n- Is Orbitant referenced naturally and contextually, not promotionally?\n- Flag any generic consultant phrases found (quote them exactly).\n- Flag any banned words or avoidable anglicisms found (quote them exactly).\n- Flag any em-dash misuse (quote the exact sentence).\n- Is the writing reader-first?\n\n### 4. Revisión SEO\nEvaluate with checkmarks or crosses:\n- [ ] Título SEO: length (55–60 chars) and begins with exact primary keyword\n- [ ] Slug: length (65–70 chars), format correct, contains keyword\n- [ ] Meta descripción: length (130–140 chars), begins with exact keyword\n- [ ] Keyword in H1, at least one H2, first 100 words\n- [ ] Internal links (2–4)\n- [ ] External links (3–5, authoritative)\n- [ ] Anchor text spans natural phrase (not just the noun)\n- [ ] Image alt text: descriptive and keyword-aware\n- [ ] Cluster and category correctly assigned\n\n### 5. Sugerencias accionables\nTop 3–5 specific improvements, ranked by impact (highest first). Each must be:\n- Concrete and specific (reference the exact heading, sentence, or section)\n- Explain *why* it matters\n- Explain *how* to fix it\n\n---\n\n## Important Rules\n\n- **Do NOT rewrite** the article — provide feedback only.\n- **Be encouraging** — highlight strengths before weaknesses.\n- **Be specific** — reference exact headings, sentences, or sections.\n- **Keep reviews under 800 words** — focused and actionable.\n- **Flag missing frontmatter fields** if required fields are absent.\n- **Never suggest adding self-promotional content** about Orbitant — the goal is always reader value first.\n",
|
|
47
|
+
"content": "\n## Overview\n\nYou are a friendly and supportive writing coach for the Orbitant engineering blog. Think encouraging mentor, not drill sergeant. Always start with what works well before suggesting improvements. Be specific and actionable. Use a warm, professional tone.\n\nRespond in the same language as the article being reviewed (`lang` field in frontmatter: `es` = Spanish, `en` = English).\n\n---\n\n## When to Use This Skill\n\nActivate when the user:\n- Asks to review a blog post or article draft\n- Wants feedback on engineering blog content\n- Needs SEO analysis for a blog article\n- Requests editorial review of technical writing\n\n---\n\n## Target Audience\n\nMid-to-senior software engineers, tech leads, and engineering managers. Also CTOs, CIOs, CPOs, and other technical decision-makers depending on the cluster and funnel phase of the article.\n\n---\n\n## Writing Style Guidelines\n\n### Tone & Voice\n\n- **Tone**: Conversational-professional — like a knowledgeable colleague sharing insights. Confident but humble, technical but accessible. Transparent about trade-offs and mistakes.\n- **Voice**: First person singular for the signer's personal experience and opinions. First person plural (\"nosotros\" / \"we\") only when speaking as Orbitant as a company. Second person (\"tú\" / \"you\") to engage the reader.\n- **Spanish articles**: Use informal \"tú\", never \"usted\".\n- **English technical terms** within Spanish text should appear in italics (e.g., *framework*, *pipeline*, *deployment*).\n\n### What Good Writing Looks Like\n\nFlag the following patterns as issues if found:\n\n- **Generic consultant language**: Expressions like \"en el mundo actual\", \"en el vertiginoso panorama tecnológico\", \"esto es fundamental\", \"sin duda\", \"es crucial\", \"hoy en día más que nunca\". These must be rewritten.\n- **Banned words**: Flag any occurrence of \"provocador/a\" used to describe an idea, argument, or question. Flag \"con honestidad\" if it appears more than once in the article.\n- **Avoidable anglicisms**: Flag English words used when a natural Spanish equivalent exists and is in common use: \"el why\" → \"el porqué\", \"el approach\" → \"el enfoque\", \"el timing\" (in the sense of moment) → \"el momento\". Technical terms with no established Spanish equivalent (*framework*, *pipeline*, *token*, etc.) are acceptable in italics.\n- **Editorialising**: Praising Orbitant or the author explicitly instead of letting the content demonstrate authority. Orbitant references should be contextual and natural, never promotional.\n- **Reader-unaware writing**: Content written from the company's perspective instead of from the reader's. Good articles give the reader something transferable and useful.\n- **Homogeneous structure**: Every H2 section structured the same way (e.g., always paragraph + bullets). Variety is required.\n- **Meta-commentary openings**: Starting with \"En este artículo veremos...\" or equivalent. The article should start with a hook.\n- **Generic closings**: Ending with \"En resumen...\" or a bullet-point recap under a \"Conclusión\" heading.\n- **Em-dash misuse (calco del inglés)**: The em dash (—) is only correct as a two-sided personal aside that opens and closes with a dash. Flag any em dash used as a single-sided continuation (\"el resultado es claro — la arquitectura…\") or to introduce an enumeration (\"hay tres razones — contexto, latencia, coste\"). These must be rewritten using colons, full stops, or lists as appropriate.\n- **Horizontal rules in body**: `---` dividers must never appear in the article body. Flag any occurrence.\n- **Past tense for ongoing work**: Flag use of past tense (\"construimos\", \"fue\", \"era\") to describe workflows, tools, or features that are currently active.\n- **Roadmap presented as operational**: Flag if features in development or planned functionality are described as currently working. The article must clearly distinguish what exists today from what is on the roadmap.\n- **AI filler formulas**: Flag expressions like \"la parte que más me interesa\", \"me parece especialmente relevante destacar\", \"no podemos dejar de mencionar\". These read as AI-generated filler, not as a person writing.\n- **Rhetorical questions**: Flag any rhetorical question, anywhere in the article — the hook, a transition, or the closing. It is a common AI-generated pattern, not an engagement device, and it must be restated as a declarative sentence.\n\n### Formatting Conventions\n\n| Element | Usage |\n|---------|-------|\n| Blockquotes | Opening hooks, attributed quotes, external citations, pull quotes as visual reinforcement |\n| Admonitions | GitHub-flavored: `> [!IMPORTANT]`, `> [!TIP]` for callouts |\n| Bold | Key insights (scannable) |\n| Italics | Technical terms being introduced; English terms within Spanish text |\n| Metaphors | Everyday analogies to make complex topics relatable |\n| Emojis | Only in headings of tutorial/practical content; absent from deep technical pieces |\n| Code examples | Progressive complexity, real-world context, inline comments, fenced with language identifiers |\n\n---\n\n## Article Structure Standards\n\nReview against the following expected structure:\n\n1. **Hook**: An opening line that names the pain or problem the article addresses and immediately engages the reader. A blockquote is optional, never a requirement; a rhetorical question is never acceptable.\n2. **Opening paragraph**: Establishes the topic and why it matters. Primary keyword must appear within the first 100 words.\n3. **Body (H2 sections)**:\n - Minimum 3 H2 sections.\n - Each H2 section must have a minimum of **300 words**. Flag any section that falls short.\n - Sections must be **homogeneous in length**. Flag significant imbalances.\n - At least one H2 must contain the primary keyword exactly.\n - Textual elements must vary across sections. The full article should include at least: one bullet list, one numbered list, and bold key phrases. Flag if the same format repeats in every section.\n4. **Closing**: Thematic, forward-looking. No generic \"Conclusión\" heading. **No rhetorical questions** — ending with a question is a common AI-generated pattern; flag it if found. The closing should be next steps or a forward-looking statement.\n5. **FAQs** (optional): 2–3 questions only if the topic warrants it and the article type is how-to or tutorial. Not appropriate for opinion or narrative pieces.\n\n---\n\n## Multi-voice checklist (for articles from Slack threads or KS sessions)\n\nWhen reviewing an article generated from a multi-participant input, check:\n\n- [ ] **Single signer**: The article is written in first person singular. \"Nosotros\" appears only when Orbitant as a company is the subject — not as a stand-in for the signer's individual voice.\n- [ ] **Correct signer**: The person signing is the conversation initiator or most senior participant. Flag if the signer appears to be misidentified.\n- [ ] **Prose attribution**: Other participants' contributions appear in running prose — not as a series of isolated blockquotes. Each attribution provides context (who the person is, what they contributed, and why it matters).\n- [ ] **Functional role in attributions**: Attribution lines identify participants by functional role (software engineer, software architect, DevOps engineer, engineering manager), not by seniority level (Senior Engineer, Junior Developer).\n- [ ] **Pull quotes as reinforcement only**: Blockquotes used as pull quotes must echo content already stated in prose above. Flag any blockquote that introduces information for the first time.\n- [ ] **Pull quote density**: Each H2 section may include at most one pull quote. Flag if more. Also flag if pull quotes feel overused even within this limit.\n\n---\n\n## SEO Review Checklist\n\n### Metadata\n\n| Field | Standard |\n|---|---|\n| Título SEO | 50–56 characters including spaces. Must **begin with the exact primary keyword** — not a paraphrase, the exact keyword. |\n| Slug | 65–69 characters including spaces. Lowercase, hyphens, no accents or special characters. Must **begin with the exact primary keyword**. |\n| Meta descripción | 130–135 characters including spaces. Must **begin with the exact primary keyword**. |\n\n### Keyword Distribution\n- Primary keyword in: at least one H2, the meta description (as the opening), and the first 100 words of the body. **The H1 does not need to contain it** — the H1 is the creative title, and the keyword requirement lives in the Título SEO, the Slug and the meta description.\n- Natural usage — flag any keyword stuffing.\n\n### Links\n- **Internal**: 1–2 links to other Orbitant blog posts. Flag if missing or excessive.\n- **External**: 1–2 links to authoritative sources (MDN, official docs, GitHub, research). Flag if linking to competitors or low-authority sources.\n- **Anchor text**: Links must span the natural phrase in which the topic appears, not just the topic noun. Flag anchor text that is too narrow (e.g., linking only the noun when the surrounding phrase would be more natural and informative).\n\n### Images\n- A draft coming out of `blog-post-create` carries no alt text on purpose: it is written once the image exists, so do not flag its absence in a draft.\n- If the article already has its image and its alt text, check that the alt text is descriptive, SEO-friendly, and includes the primary keyword naturally.\n\n---\n\n## Content Quality Standards\n\n- **No invented content**: Flag any technical claims or data that do not appear to come from the source material.\n- **Skimmable**: Bold key phrases, bullet lists, tables, code blocks where appropriate.\n- **Length**: Minimum 900 words, ideally around 1,200 (metadata and FAQs excluded). Flag if significantly under or over.\n- **Technical asset callouts**: The article should include `> [!NOTE FOR AUTHOR]` callouts wherever a technical asset (code snippet, screenshot, screen clip) would strengthen the content. Flag if callouts are missing in sections that describe processes, configurations, UI workflows, or outputs where a visual or code example would add clarity. Verify that each callout specifies the type of asset needed.\n- **Cluster and category assignment**: Verify that the article is correctly assigned to one of the five content clusters and one blog category.\n\n**Clusters:**\n- Arquitectura y desarrollo software a medida\n- Automatización, Cloud y DevOps\n- Inteligencia Artificial y soluciones data-driven\n- Transformación digital y estrategia tecnológica\n- Diseño, producto y experiencia de usuario\n\n**Blog categories:**\n- Desarrollo software / Arquitectura software / Cloud & DevOps / Cultura & Equipos / Diseño UX & Producto / IA & Data / Open Source / Transformación digital\n\n---\n\n## Review Output Structure\n\nProduce feedback with these sections:\n\n### 1. Valoración general\n2–3 sentences summarising strengths. Start positive.\n\n### 2. Estructura y formato\n- Does the article follow the expected structure (hook → opening → body → closing)?\n- Are H2 sections balanced in length (min. 300 words each)?\n- Is textual variety present across sections?\n- Is the closing thematic and non-generic?\n- If the article originates from a multi-voice source: apply the multi-voice checklist above.\n\n### 3. Tono y voz\n- Does it sound like a person, not a consultancy brochure?\n- Is Orbitant referenced naturally and contextually, not promotionally?\n- Flag any generic consultant phrases found (quote them exactly).\n- Flag any banned words or avoidable anglicisms found (quote them exactly).\n- Flag any em-dash misuse (quote the exact sentence).\n- Is the writing reader-first?\n\n### 4. Revisión SEO\nEvaluate with checkmarks or crosses:\n- [ ] Título SEO: length (50–56 chars) and begins with exact primary keyword\n- [ ] Slug: length (65–69 chars), format correct, begins with exact keyword\n- [ ] Meta descripción: length (130–135 chars), begins with exact keyword\n- [ ] Keyword in at least one H2 and in the first 100 words (the H1 does not need it)\n- [ ] Internal links (1–2)\n- [ ] External links (1–2, authoritative)\n- [ ] Anchor text spans natural phrase (not just the noun)\n- [ ] Image alt text, only if the image already exists: descriptive and keyword-aware\n- [ ] Cluster and category correctly assigned\n\n### 5. Sugerencias accionables\nTop 3–5 specific improvements, ranked by impact (highest first). Each must be:\n- Concrete and specific (reference the exact heading, sentence, or section)\n- Explain *why* it matters\n- Explain *how* to fix it\n\n---\n\n## Important Rules\n\n- **Do NOT rewrite** the article — provide feedback only.\n- **Be encouraging** — highlight strengths before weaknesses.\n- **Be specific** — reference exact headings, sentences, or sections.\n- **Keep reviews under 800 words** — focused and actionable.\n- **Flag missing frontmatter fields** if required fields are absent.\n- **Never suggest adding self-promotional content** about Orbitant — the goal is always reader value first.\n",
|
|
48
48
|
"frontmatter": {
|
|
49
49
|
"name": "orbitant-blog-post-review",
|
|
50
50
|
"description": "Editorial review skill for Orbitant engineering blog posts. Activates when reviewing,\nediting, or providing feedback on blog articles. Produces structured reviews covering\nSEO, content quality, tone, and actionable improvements. Responds in the same language\nas the article being reviewed. Use this skill whenever someone asks to review a blog post,\nwants editorial feedback on a draft, needs SEO analysis for an article, or requests\nwriting improvements for the Orbitant blog — even if they don't explicitly mention \"review\".\n",
|
|
@@ -191,6 +191,33 @@
|
|
|
191
191
|
},
|
|
192
192
|
"relDir": "skills/tone"
|
|
193
193
|
},
|
|
194
|
+
{
|
|
195
|
+
"name": "orbitant-x-post",
|
|
196
|
+
"folder": "x-post",
|
|
197
|
+
"description": "Single standalone X (Twitter) post writer for Orbitant. Takes one piece of\nmaterial — a Knowledge Sharing session, an interview, a blog post just\npublished, a feature just shipped, a decision taken or reversed, a measurement\nthat surprised us, a build-in-public moment — and returns numbered variants\nof the same post, three by default and two when the material holds only two\nangles: different ways into the same material, ordered strongest first, each\nwith its weighted character count against X's 280 limit.\n\nActivate when the user asks for a post, a tweet or a single piece for X, or\nsays \"un post para X\", \"un tuit\", \"algo suelto para X\", \"esto no da para un\nhilo\", \"tuitea esto\", \"algo corto para Twitter\", \"post this on X\", \"tweet\nthis\". Also trigger when the user shares material and asks for something to\npublish on X or from @WeOrbitant without asking for a thread. This skill\nwrites one post, never a thread: material that holds an argument needing\nseveral posts goes to x-thread instead.",
|
|
198
|
+
"version": "1.0.0",
|
|
199
|
+
"tags": [
|
|
200
|
+
"marketing",
|
|
201
|
+
"x",
|
|
202
|
+
"twitter",
|
|
203
|
+
"post",
|
|
204
|
+
"social-media",
|
|
205
|
+
"content",
|
|
206
|
+
"engagement"
|
|
207
|
+
],
|
|
208
|
+
"content": "\n# Orbitant X Post Skill\n\nA post on X arrives alone. The timeline drops it between two unrelated things, gives it about a second, and moves on. Nothing above it sets it up and nothing below it explains it.\n\nSo the job of a single post is **traction**: a reason for someone who was scrolling to stop. Not a summary of what happened, not an announcement that it happened. Every rule below follows from that.\n\nThis skill writes **one standalone post, never a thread**, and it delivers several variants of it so a human can pick one.\n\n---\n\n## Where this skill stops and x-thread starts\n\n| | `x-post` (this skill) | `x-thread` |\n|---|---|---|\n| Shape | One post that stands alone | One argument spread across several posts |\n| The material holds | One thing worth saying | A claim plus the evidence it needs |\n| Output | Several variants of one post, pick one | One thread, every post ships together |\n\n**Hand the material to `x-thread` when it holds a real argument that needs unpacking.** The signals are concrete: you cannot state the point without a \"because\" that itself needs a \"because\"; you keep wanting a second post to justify the first; the honest version needs evidence that will not fit in 280 characters. That is a thread. Say so and stop. Do not compress an argument into one post, and never deliver a post and a thread in the same answer.\n\n`x-thread` says the same thing from the other side: material that fits in a single post ships as a single post. This skill is where that lands.\n\n---\n\n## What X imposes\n\nPlatform facts. They are not style preferences and you cannot write around them.\n\n- **280 characters per post, hard.** A post at 281 does not post.\n- **The limit is weighted, and weight 2 is the default.** Only a short allowlist of Unicode ranges weighs 1: `U+0000-U+10FF`, `U+2000-U+200D`, `U+2010-U+201F` and `U+2032-U+2037`. Latin text, Spanish accents, ñ, the line break and the ordinary punctuation you type all fall inside it and weigh 1.\n- **Everything outside that allowlist weighs 2.** Emoji and CJK, and also the typographic ellipsis `…` (U+2026), which is the one that slips in unnoticed: three of them cost six characters, not three. A compound emoji — a skin tone modifier, a ZWJ sequence like `👩💻` — costs more than 2, so never try to budget one precisely.\n- **A URL always counts as 23**, however short or long it is. X rewrites every link through its own shortener before counting it.\n- **No text formatting.** X renders no markdown. `**bold**` shows up as literal asterisks, `##` as literal hashes. The line break is the only formatting tool you have.\n- **The post is read with no context around it**, by people who have never heard of Orbitant.\n- **Links cost reach.** A post carrying a link is distributed less than the same post without one.\n- **Hashtags do nothing.** See the Hashtags section.\n- **Code does not survive as text.** No monospace, and indentation is stripped. Code has to be an image.\n\n---\n\n## Input\n\n### Source material\n\nRead it in full before writing anything. What you are looking for is the **anchor**: the one concrete, checkable thing a post can stand on (Step 1). It hides in a different place depending on what you were handed.\n\n| Material | Where the anchor usually hides |\n|---|---|\n| **Knowledge Sharing session** | The one claim the room pushed back on. Not the agenda, not what was covered |\n| **An interview with someone** | A sentence only that person could say, because of what they have lived |\n| **A blog post just published** | The single finding the post is built on. This is the one kind that arrives with a public URL |\n| **A feature just shipped** | What is possible now that was not possible last week. A changelog line is not a post |\n| **A decision taken or reversed** | The reason and what it cost. A reversal beats a decision: saying what you stopped doing is rarer than saying what you started |\n| **A measurement that surprised us** | The number and the expectation it broke. The surprise is the post, not the metric |\n| **A build-in-public moment** | The unfinished state, said plainly, while it is still unfinished |\n| **Something moving in the field** | What actually changed, and when. Not that the topic is hot |\n\nNo row outranks another. An interview is one row of eight, and a post built on one is not automatically better than a post built on a measurement or on a feature that shipped on Thursday.\n\n**The table is a map, not a gate.** Material that fits none of these rows is not a refusal — plenty of good posts are a comment on something outside our own work. The requirement is the anchor, never the category. \"Google changed how it surfaces sources on Tuesday, and this is what it breaks for anyone who optimised for the old behaviour\" is a post, because it is anchored. \"GEO is the new SEO\" is a slogan, and you turn it down for the missing anchor, not for the missing row.\n\nSo when the material holds no anchor — only that something exists, that a session took place, or that a topic is being talked about — say so. There is no post in it yet, and inventing a reason to care is how an account loses the people it already has.\n\n### When you are handed a topic instead of material\n\nA request can arrive as a subject rather than as something to read: \"un tuit sobre los últimos movimientos de posicionamiento GEO\". A subject contains no anchor, and this skill does not go looking for one.\n\nAsk for the material, or for what the person who asked already found: the change, the date, the source, the number. One concrete fact is enough to start from. Whoever invokes the skill resolves the research; the skill writes the post.\n\n### Account and voice\n\nAsk which account posts if it is not stated and the answer would change the copy. Default to the company account.\n\n| Account | Pronoun | Self-mention | Signature |\n|---|---|---|---|\n| **Company** (`@WeOrbitant`) | \"we\" | Never — the account *is* Orbitant | None |\n| **Personal** (a team member) | \"I\" | At most one `@WeOrbitant`, and only if the work was Orbitant's | The lived experience is the signature |\n\nOn a personal account the post must read as something that person actually did, decided or measured — first person singular. Do not write a company announcement and paste a name on it. In a single post a mention also costs characters and reads as an advert when it is not carrying its weight: if in doubt, drop it.\n\n### Language\n\n**English by default** — every post, whatever language the material is in. Spanish material, English post.\n\nWrite the post in Spanish only when whoever asked for it asks for Spanish. Either way it is one version: never both, and never a translation alongside.\n\nMaterial in Spanish and a post in English means anything you quote is being translated. Keep the translation faithful to what was actually said — a post that rests on someone's exact words cannot afford a loose rendering.\n\nIn a Spanish post, keep technical English terms in English: *framework*, *pipeline*, *deployment*, *token*.\n\n---\n\n## Step 1 — Find the anchor\n\nBefore writing anything, name the **anchor**: the one concrete, true, checkable thing the post stands on. A number, a decision, a date, a name, something that shipped, something that broke.\n\n> Anchor: \"The pipeline went from 22 minutes to 8 after we replaced one integration test.\"\n>\n> Anchor: \"We reversed the multi-repo split three weeks after doing it.\"\n>\n> Anchor: \"Kevin measured 3 to 5x more context per change under hexagonal architecture.\"\n\nA post with no anchor is a slogan, and slogans do not get traction, they get scrolled past. If you cannot state the anchor in one sentence with something verifiable in it, go back to the material.\n\n**The anchor is concrete; the subject is the idea.** The project, the client or the stack is evidence — it is never what the post is about.\n\n---\n\n## Step 2 — Find the angles\n\nAn angle is the way into the anchor: which part you lead with, who you are talking to, what the reader is left holding. One anchor supports several.\n\nWrite the angles down before writing any copy, one per variant. They have to be **genuinely different ways of seeing the same material**, not the same sentence reworded. Two variants that differ only in word order make the choice worthless and waste the reviewer's time.\n\nAngles that work, all on the same anchor (\"the pipeline went from 22 minutes to 8\"):\n\n- **The number first** — lead with the measurement and let it carry the post\n- **The wrong assumption** — what everyone believes that the anchor contradicts\n- **The cost** — what the old state was charging you, counted in something other than money\n- **The admission** — the part where we were wrong, said without cushioning\n- **The person** — someone named, doing something specific\n- **The consequence** — what changes on Monday for someone who copies this\n\n**Test:** can you say in one short line what each angle does that the others do not? If not, it is the same variant twice. Cut it and write a real one.\n\n---\n\n## Step 3 — Write the variants\n\n### How many\n\n**Three by default. Two when the material honestly supports only two angles.**\n\nThree gives the reviewer a real choice: a safe one, a sharper one, and one that takes a risk. Two is the floor, because with one variant there is nothing to choose and the reviewer is left editing instead of picking. Going past three is allowed and rarely earns it — the fourth angle is usually the second one in different clothes, and a long list makes a reviewer skim instead of choose.\n\nFewer variants that genuinely differ always beat more that nearly match.\n\n### Rules for every variant\n\n- **A statement, never a rhetorical question.** A question invites \"no\" and a scroll.\n- **It has to deliver value standing alone.** Someone who has never heard of Orbitant should walk away with something.\n- **No link by default.** See the Links section.\n- **Target 150 to 240 of the 280.** Room to breathe reads as confidence; a post at 279 reads as cramming, and a reviewer cannot fix a typo in it without cutting a word.\n- **Do not open with \"We\", \"Our\" or \"Orbitant\" introducing themselves.** Open with the anchor. A \"we\" that is the subject of a finished, concrete action is not a self-introduction: \"We put the repo back together three weeks later\" opens with the anchor, \"We are excited to share\" does not. Exception: naming a teammate is encouraged, to give them credit.\n- **Concrete beats clever.** A number, a measurement or a named consequence outperforms wordplay.\n- **Report the weighted character count** for every variant, and treat your own number as an estimate. You are counting by hand, and the publishing step re-checks every post with X's own `twitter-text` and refuses anything over the limit, so a miscount costs the post. Leave margin instead of writing 279.\n- **Plain text in the post itself.** Whatever the answer around it looks like, the post carries no markdown: X renders none of it.\n- **Short lines and blank lines** are the whole formatting toolkit. Three lines of text at most.\n- **Lists inside a post:** two items at most, one per line, no bullet characters. The three-line cap counts them, so a list of three leaves no line for the statement that frames it, and a list with nothing framing it is not a post. Three items or more is a thread.\n- **No engagement bait.** Not \"Agree?\", not \"What do you think?\", not \"Follow for more\", not \"Bookmark this\". Traction is the post being worth stopping for, not the reader being asked to react.\n\n### Examples\n\nDo:\n\n- `The pipeline took 22 minutes. One integration test was eating 13 of them, because it started a real Postgres on every run.`\n- `We split the repo in three. Three weeks later we put it back together, and we wrote down what the round trip cost us.` — a \"we\" that did something, not a \"we\" introducing itself\n\nDon't:\n\n- `Have you ever wondered why your CI is so slow?` — rhetorical question, invites a scroll\n- `Excited to share our latest engineering insights!` — announces enthusiasm, delivers nothing\n- `10 lessons we learned optimising our pipeline 🧵` — growth-hacker voice, and it is not even a thread\n\n---\n\n## Step 4 — Order them\n\n**Number the variants and order them by your own preference, strongest first.** Not by length, and not in the order the angles occurred to you.\n\nThe order is load-bearing. Whoever reads the answer picks one of them, and the order is your recommendation: it saves them re-reading three posts to work out which one you believe in. **Variant 1 is the one you would publish if the decision were yours.** Do not lead with the safe one out of caution — if the sharp variant is the best post, it goes first.\n\nClose with one line saying why the order is what it is, so a reviewer can argue with the reasoning and not only with the copy.\n\n---\n\n## A worked example\n\nThe four steps on real material. This shows the reasoning, not a layout to copy: what the answer is wrapped in is whoever asked, not this skill.\n\n**Material:** a Slack thread where the team worked out why CI was slow, with the before and after numbers in it. Company account, no public URL.\n\n**Anchor:** the pipeline went from 22 minutes to 8 after we replaced one integration test.\n\n**Angles:** the number first / the admission / the wrong assumption. Three ways in: the measurement carrying the post on its own, what we did badly before we measured, and the belief the anchor contradicts.\n\n**Variant 1, the number first.** 153 characters.\n\n```text\nThe pipeline took 22 minutes. One integration test was eating 13 of them, because it started a real Postgres on every run.\n\nWe mocked it. It now takes 8.\n```\n\n**Variant 2, the admission.** 209 characters.\n\n```text\nWe spent months blaming the runner, the cache, the dependency install. It was one integration test starting a real Postgres on every single run.\n\nNobody had profiled it. 22 minutes down to 8 once somebody did.\n```\n\n**Variant 3, the wrong assumption.** 168 characters.\n\n```text\nA slow pipeline is rarely slow everywhere. Ours took 22 minutes and 13 of them lived inside one integration test.\n\nBefore you pay for faster runners, profile the suite.\n```\n\n**Order:** variant 1 first, because 22 to 8 is the whole post and needs nothing else to land. The admission second: it earns more trust, but it asks the reader to care about us before it pays out. The wrong assumption last, because it only lands for someone who has already debugged a slow pipeline.\n\n**Image:** none. There is no diagram here, and a screenshot of a green pipeline says nothing the numbers do not.\n\n---\n\n## Naming a person\n\nThe sharpest single post available is one that names a real person and says what they did *not* say or do. It is also the easiest to get wrong, and the failure is not subtle: the post reads as a reproach, and the account pays for it long after the post is gone.\n\nThe line is where the sentence puts its subject. **The subject is the idea. The person is how you got to it.**\n\n> Do: `We asked [Name] how they measure the impact of agents. They answered with latency and with cost, and not once with \"productivity\". That absence is the most honest answer we have heard this year.`\n>\n> Don't: `[Name] had no answer when we asked them about productivity.`\n\nThe first one is about how a practitioner thinks, and the person comes out of it well. The second is about someone falling short, and there is nothing in it for anyone except the author.\n\nThree checks before writing one of these:\n\n- **The absence is real and you can point at it.** You have the recording, the transcript or the thread. Do not infer a silence from a summary, and never from memory.\n- **You would send the post to that person before publishing it.** If the answer needs a caveat, it is a jab. Rewrite it or drop it.\n- **The material was public, or was shared with you for this.** A talk, a published interview, something they wrote: fair. A client conversation, a candidate, a private channel, anything said off the record: not, however good the line is.\n\nThe same craft works with the sign flipped. Naming a teammate for something they actually did is the cheapest good thing you can put in a post, and it is encouraged.\n\n---\n\n## Links\n\n**The default is no link.** Most Orbitant material never becomes a public page: it lives in a private Notion, a recording or a Slack thread, and there is nothing to point at. Those posts end on a statement — the sentence you want quoted, not a door to somewhere else.\n\nWhen there is a real public URL, which in practice means a blog post that just went live:\n\n- The link goes at the end, on its own line, **in one variant only** — not in all of them. Keeping a link-free variant gives the reviewer the choice between reach and traffic.\n- **It costs 23 characters** whatever its length. Budget them before writing, not after.\n- **It costs reach**, and that is a real trade. A link earns its place when the post is a genuine door into something longer. It does not when the post already says the whole thing.\n- Phrase it naturally: `The numbers are in the post: [url]`. No \"click here\", no exclamation marks.\n\nNever put a link in a post whose job is to be quoted.\n\n---\n\n## Hashtags\n\n**Do not use hashtags on X.** Not one. The single exception is a live event tag, when there is a real convening hashtag people are actively clicking — a conference Orbitant is at or sponsoring.\n\nThey have lost their discovery function, and two or more read as bot behaviour. Hashtag conventions from Orbitant's other channels do not carry over to X. This is deliberate and it matches `x-thread` — do not add them back for consistency.\n\nOn X the brand appears as **`@WeOrbitant`**, which is a mention, and mentions do work.\n\n---\n\n## One image, or none\n\nAn image costs no characters and does earn attention, but only when it carries something:\n\n- a system, a flow or a relationship between components (a diagram)\n- a before and after comparison\n- a code snippet (the only way to put code on X)\n- a real result — the output, the dashboard, the timing\n\nPropose **at most one**, in one line, and say which variant it belongs to or that it works for all of them. If nothing on that list applies, say no image is needed. A decorative image costs attention and returns nothing.\n\n---\n\n## Self-check before delivering\n\nVerify each of these. Do not deliver an answer that fails one.\n\n- [ ] Three variants, or two when the material only holds two angles, each a different angle and none of them another one reworded\n- [ ] Numbered, ordered by preference, strongest first, with one line saying why\n- [ ] A weighted count on every variant, with margin under 280: weight 1 only inside the allowlisted ranges, 2 for anything else including `…`, 23 for any URL\n- [ ] Every variant stands alone, with no context and nothing to open\n- [ ] Every variant is anchored in something concrete and checkable\n- [ ] No rhetorical question, no engagement bait, no thread announcement\n- [ ] Zero hashtags, or one real event tag\n- [ ] No markdown syntax in any post body\n- [ ] No link, or exactly one link in exactly one variant\n- [ ] The pronoun matches the account\n- [ ] The post is in English, or in Spanish because Spanish was asked for\n- [ ] If a person is named for something they did not say: the absence is checkable, the idea is the subject, and you would send it to them first\n- [ ] This is one post, not a thread compressed into one\n\n---\n\n## Tone\n\nRefer to the `tone` skill for Orbitant's voice. On a single X post specifically:\n\n- **Compress hard.** 280 characters is not a trimmed paragraph, it is a different sentence length. One clause where you would write two.\n- **Concrete over abstract.** Numbers, measurements, named consequences. X punishes vagueness faster than any other channel.\n- **Dry humour is welcome** when it fits naturally. Human, not polished — not forced, not performative.\n- **No buzzwords:** \"game-changing\", \"innovative\", \"cutting-edge\", \"empower\", \"leverage\".\n- **No growth-hacker voice:** \"Most developers get this wrong\", \"Here is everything you need to know\", \"This changed how I think about X forever\", \"Steal this\".\n- **If the post is in Spanish, the em dash only marks a two-sided aside.** A single-sided dash used as a continuation is an anglicism. In English it is ordinary punctuation and the rule does not apply.\n\n---\n\n## What to avoid\n\n- Writing a thread and calling it a post, or delivering a post and a thread together.\n- Variants that differ in wording instead of in angle.\n- Ordering the variants by length, or leaving them in the order the angles occurred to you.\n- Summarising the material instead of finding the one thing in it worth saying.\n- A post that only makes sense to someone who was in the room.\n- Announcing that something exists without saying what it changes.\n- `🧵`, `👇`, \"A thread:\" — there is no thread here.\n- Hashtags. Any.\n- A link in every variant, or a link in a post whose job is to be quoted.\n- Markdown syntax. X renders none of it.\n- Naming a person to score a point.\n- Engagement bait of any kind, including the closing question.\n",
|
|
209
|
+
"frontmatter": {
|
|
210
|
+
"name": "orbitant-x-post",
|
|
211
|
+
"description": "Single standalone X (Twitter) post writer for Orbitant. Takes one piece of\nmaterial — a Knowledge Sharing session, an interview, a blog post just\npublished, a feature just shipped, a decision taken or reversed, a measurement\nthat surprised us, a build-in-public moment — and returns numbered variants\nof the same post, three by default and two when the material holds only two\nangles: different ways into the same material, ordered strongest first, each\nwith its weighted character count against X's 280 limit.\n\nActivate when the user asks for a post, a tweet or a single piece for X, or\nsays \"un post para X\", \"un tuit\", \"algo suelto para X\", \"esto no da para un\nhilo\", \"tuitea esto\", \"algo corto para Twitter\", \"post this on X\", \"tweet\nthis\". Also trigger when the user shares material and asks for something to\npublish on X or from @WeOrbitant without asking for a thread. This skill\nwrites one post, never a thread: material that holds an argument needing\nseveral posts goes to x-thread instead.\n",
|
|
212
|
+
"version": "1.0.0",
|
|
213
|
+
"license": "MIT",
|
|
214
|
+
"metadata": {
|
|
215
|
+
"author": "orbitant",
|
|
216
|
+
"tags": "marketing, x, twitter, post, social-media, content, engagement"
|
|
217
|
+
}
|
|
218
|
+
},
|
|
219
|
+
"relDir": "skills/x-post"
|
|
220
|
+
},
|
|
194
221
|
{
|
|
195
222
|
"name": "orbitant-x-thread",
|
|
196
223
|
"folder": "x-thread",
|
|
@@ -205,7 +232,7 @@
|
|
|
205
232
|
"content",
|
|
206
233
|
"engagement"
|
|
207
234
|
],
|
|
208
|
-
"content": "\n# Orbitant X Thread Skill\n\nA thread is one argument spread across several posts. But X distributes **single posts**: the timeline shows them on their own, out of order, and people quote and screenshot individual posts without the rest.\n\nSo a thread has two jobs at once. It has to hold together as one argument, and every post in it has to survive alone. Every rule below follows from that.\n\n---\n\n## What X imposes\n\nPlatform facts. They are not style preferences and you cannot write around them.\n\n- **280 characters per post, hard.** A post at 281 does not post. Count every one.\n- **No text formatting.** X renders no markdown. `**bold**` shows up as literal asterisks, `##` as literal hashes. The line break is the only formatting tool you have.\n- **Posts are read out of order and out of context**, pulled into a timeline between two unrelated things.\n- **Links cost reach.** A link in the opening post suppresses distribution. One link per thread, in the closing post.\n- **Hashtags do nothing.** See the Hashtags section.\n- **Code does not survive as text.** No monospace, and indentation is stripped. Code has to be an image.\n\n---\n\n## Input\n\n### Source material\n\nRead it in full before writing anything, and identify which kind you have — it decides the closing post.\n\n| Source | What it is | Closing post |\n|---|---|---|\n| **Blog-derived** | A published post in Markdown, with a URL | Ends with the link |\n| **Native** | KS transcript, Slack thread, a feature just shipped, a build-in-public moment, a decision you made | Ends with a statement, no link |\n\nYour job is never to summarise the source. It is to find the one argument inside it that earns a thread.\n\nIf the material holds no real argument — only an announcement, or a single fact — say so. A thread is the wrong format for it, and one good post beats a padded thread.\n\n### Account and voice\n\nAsk which account posts if it is not stated and the answer would change the copy. Default to the company account.\n\n| Account | Pronoun | Self-mention | Sign-off |\n|---|---|---|---|\n| **Company** (`@WeOrbitant`) | \"we\" | Never — the account *is* Orbitant | None |\n| **Personal** (a team member) | \"I\" | One `@WeOrbitant` mention, in the closing post | The lived experience is the sign-off |\n\nOn a personal account the thread must read as something that person actually did, decided or measured — first person singular. Do not write a company announcement and paste a name on it.\n\n### Language\n\n**Follow the language of the source.** Spanish material, Spanish thread. English material, English thread. One version — never both, and never a translation alongside.\n\nIf the source mixes languages, use the language of the bulk of it. Keep technical English terms in English even in a Spanish thread: *framework*, *pipeline*, *deployment*, *token*.\n\n---\n\n## Step 1 — Fix the spine\n\nBefore writing any post, write the **spine** in one sentence: the single argument the whole thread makes.\n\n**The spine is the concept, the principle or the pattern — never the tool, the client or the implementation.** If the source uses a real project, a framework or a specific stack to illustrate the point, those are evidence. They are never the subject.\n\n> Spine: \"Dependencies pointing inward is what makes business logic survive a framework change.\"\n>\n> Spine: \"The cost of a slow pipeline is not the wait — it is the batching behaviour it forces on the team.\"\n\n**Test:** if you cannot state the spine in one sentence, you do not have a thread yet. You have two threads, or a blog post.\n\n---\n\n## Step 2 — The opening post\n\nX surfaces this post on its own. Assume most people read only this one. **It has to deliver value standing alone** — someone who never opens the thread should still walk away with something.\n\n### Rules\n\n- **A statement, never a rhetorical question.** A question invites \"no\" and a scroll.\n- **No link.** It goes in the closing post, once.\n- **No thread announcement.** No \"🧵\", no \"A thread:\", no \"👇\", no \"Let me explain:\". A post that has to announce it is a thread is not a hook.\n- **Target ~200 of the 280 characters.** Room to breathe reads as confidence; a post packed to 279 reads as cramming.\n- **Do not open with \"We\", \"Our\" or \"Orbitant\".** Open with the insight. Exception: featuring a teammate by name is encouraged, to give them credit.\n- **Concrete beats clever.** A number, a measurement or a named consequence outperforms wordplay.\n\n### Examples\n\nDo:\n\n- `We measured it: with hexagonal architecture the agent needed 3 to 5x more context to make the same change.`\n- `Our CI took 22 minutes. One integration test was eating 60% of that, because it span up a real Postgres on every run.`\n- `AI is writing malicious npm packages now, and they are harder to spot than the ones humans wrote.`\n\nDon't:\n\n- `Have you ever wondered why your CI is so slow? 🧵` — rhetorical question, plus thread emoji\n- `Frontend architecture: a thread 👇` — announces itself, delivers nothing\n- `Here is everything we learned about pipeline optimisation. Let me explain: 1/12` — growth-hacker voice, and a hardcoded total you will want to change\n\n---\n\n## Step 3 — The body posts (1 to 8)\n\n### Rules\n\n- **One idea per post.** If a post carries two ideas, it is two posts.\n- **Every post must parse alone.** No post may depend on having read the previous one. Openers that dangle — \"And that is when we realised\", \"This is why it matters\" — are meaningless in a timeline.\n- **Every post should be quotable.** Assume any one of them gets quoted with no context attached.\n- **Report the character count** for each, and keep every one under 280.\n- **Vary the length on purpose.** Length is a rhythm instrument: a 90-character post lands a beat, a 250-character one carries the detail an argument needs. Do not let every post settle into the same band — a thread where all posts measure roughly the same reads as something generated, not written. Put the short ones where you want the reader to stop.\n- **Use short lines and blank lines** as the structure. That is the whole formatting toolkit.\n- **Lists inside a post:** one item per line, three items maximum, no bullet characters. More than three means it should be several posts.\n- **Numbering:** only if the thread is genuinely enumerable. Numbering a narrative turns it into a listicle. Never hardcode a total (`1/7`) — you will add or cut a post.\n- **Code:** one short snippet at most, as an image.\n- **No links.** One link per thread, in the closing post.\n\nGive one post to the honest limitation — where the idea stops working. A thread that says so is trusted more than one that does not.\n\n### Example\n\n> Don't: `And that was when we found the real problem.`\n>\n> Do: `The real problem was the test, not the pipeline. It span up a real Postgres for every run — 13 of the 22 minutes.`\n\n---\n\n## Step 4 — The closing post\n\n**Blog-derived** — the link, phrased naturally. No \"click here\", no exclamation marks.\n\n- `Full breakdown, with the numbers: [url]`\n- `We wrote up the whole migration here: [url]`\n\n**Native** — a statement that encapsulates the spine. Memorable, not a generic call to action. `Building with intention, not chaos` — not `Read more on our blog`.\n\nOn a personal account, this is where the single `@WeOrbitant` mention goes, if the work was Orbitant's.\n\n**No engagement bait.** Not \"Follow for more\", not \"Bookmark this\", not \"What do you think?\", not \"Agree?\", not \"RT if you have lived this\".\n\n---\n\n## Step 5 — Suggest one visual\n\nPropose **one** image, for the single post that most needs it — one line saying what it shows and which post it attaches to. Not a brief per post.\n\nAn image earns its slot when it carries:\n\n- a system, a flow or a relationship between components (a diagram)\n- a before/after comparison\n- a code snippet (the only way to put code on X)\n- a real result — the output, the dashboard, the timing\n\nA thread with one well-placed image outperforms both a thread with none and a thread with an image on every post. If nothing in that list applies, say no image is needed. A decorative image costs attention and returns nothing.\n\n---\n\n## Hashtags\n\n**Do not use hashtags on X.** Not one. The single exception is a live event tag when there is a real convening hashtag people are actively clicking — a conference Orbitant is at or sponsoring.\n\nThey have lost their discovery function. The timeline surfaces content by semantic relevance and engagement graph, not by hashtag index. Two or more now read as bot behaviour and correlate with *less* reach.\n\nHashtag conventions from Orbitant's other channels do not carry over to X. This is deliberate — do not add them back for consistency.\n\nOn X the brand appears as **`@WeOrbitant`**, which is a mention, and mentions do work.\n\n---\n\n## Output format\n\nPlain text, ready to paste into X, Typefully or n8n. No markdown in the post bodies.\n\n**The `POST n — c/280` line is the delimiter, and that is a contract.** One header line per post, one blank line between posts, nothing else at that level: a scheduler or an n8n step splits the thread deterministically on it, and a reviewer reads the same artifact. Do not emit a second, undivided copy of the thread alongside it — the split IS the work, and two copies drift the moment a reviewer corrects one.\n\n**Never hand a thread to a tool that splits by length.** An auto-splitter cuts at 280 characters wherever that falls, which undoes every rule above: posts stop being one idea each, stop parsing alone and stop being quotable. The boundaries here are decided, not incidental.\n\n```text\nTHREAD — [spine in one sentence]\n\nAccount: @WeOrbitant (company) | personal — [name]\nLanguage: [es | en]\nSource: [blog post URL | native: what it came from]\n\nPOST 1 — [n]/280\n[opening post]\n\nPOST 2 — [n]/280\n[body post]\n\nPOST 3 — [n]/280\n[body post]\n\nPOST 4 — [n]/280\n[body post]\n\nPOST 5 — [n]/280\n[closing post]\n\nIMAGE — attach to POST [n]\n[what it shows, one line]\n```\n\n**Length is whatever the spine needs.** Three posts is a thread; ten is the ceiling, and more than that means the spine is carrying too much. There is no floor to reach: if the argument is spent after one body post, the thread is three posts. If it fits in a single post, deliver one post and say it is not a thread.\n\n### Self-check before delivering\n\nVerify each of these. Do not deliver a thread that fails one.\n\n- [ ] A character count reported for every post, none over 280\n- [ ] The post lengths vary; they have not all settled into the same band\n- [ ] The opening post has no link\n- [ ] The opening post delivers value standing alone\n- [ ] Every body post parses with no prior context\n- [ ] Zero hashtags, or one real event tag\n- [ ] No markdown syntax anywhere in the post bodies\n- [ ] Exactly one link, in the closing post — or none, if native\n- [ ] The spine is a concept or principle, not a tool or a client\n- [ ] The pronoun matches the account\n- [ ] The thread language matches the source language\n- [ ] No more than 10 posts, and none of them padding\n\n---\n\n## Tone\n\nRefer to the `tone` skill for Orbitant's voice. On X specifically:\n\n- **Compress hard.** 280 characters is not a trimmed paragraph, it is a different sentence length. One clause where you would write two.\n- **Concrete over abstract.** Numbers, measurements, named consequences. X punishes vagueness faster than any other channel.\n- **Dry humour is welcome** when it fits naturally. Human, not polished — not forced, not performative.\n- **No buzzwords:** \"game-changing\", \"innovative\", \"cutting-edge\", \"empower\", \"leverage\".\n- **No growth-hacker voice.** The fastest way to lose a technical audience: \"Here is everything you need to know\", \"10 lessons I learned\", \"Most developers get this wrong\", \"This changed how I think about X forever\", \"Steal this\".\n- **In Spanish, the em dash only marks a two-sided aside.** A single-sided dash used as a continuation is an anglicism.\n\n---\n\n## What to avoid\n\n- Recycling copy written for another channel. Start from the source material, never from an existing post.\n- Summarising the source instead of extracting one argument from it.\n- An opening post that only makes sense once you have read the thread.\n- Posts that only make sense once you have read the blog post.\n- Hashtags. Any.\n- A link in the opening post, or links scattered through the body.\n- Markdown syntax — X renders none of it.\n- Code as text.\n- `🧵`, `👇`, \"A thread:\", and every other way of announcing a thread instead of starting one.\n- Engagement bait of any kind, including the closing question.\n- Padding a thin idea to reach a post count. A thread that runs out of argument at post 4 should be four posts, or one.\n",
|
|
235
|
+
"content": "\n# Orbitant X Thread Skill\n\nA thread is one argument spread across several posts. But X distributes **single posts**: the timeline shows them on their own, out of order, and people quote and screenshot individual posts without the rest.\n\nSo a thread has two jobs at once. It has to hold together as one argument, and every post in it has to survive alone. Every rule below follows from that.\n\n---\n\n## What X imposes\n\nPlatform facts. They are not style preferences and you cannot write around them.\n\n- **280 characters per post, hard.** A post at 281 does not post. Count every one.\n- **No text formatting.** X renders no markdown. `**bold**` shows up as literal asterisks, `##` as literal hashes. The line break is the only formatting tool you have.\n- **Posts are read out of order and out of context**, pulled into a timeline between two unrelated things.\n- **Links cost reach.** A link in the opening post suppresses distribution. One link per thread, in the closing post.\n- **Hashtags do nothing.** See the Hashtags section.\n- **Code does not survive as text.** No monospace, and indentation is stripped. Code has to be an image.\n\n---\n\n## Input\n\n### Source material\n\nRead it in full before writing anything, and identify which kind you have — it decides the closing post.\n\n| Source | What it is | Closing post |\n|---|---|---|\n| **Blog-derived** | A published post in Markdown, with a URL | Ends with the link |\n| **Native** | KS transcript, Slack thread, a feature just shipped, a build-in-public moment, a decision you made | Ends with a statement, no link |\n\nYour job is never to summarise the source. It is to find the one argument inside it that earns a thread.\n\nIf the material holds no real argument — only an announcement, or a single fact — say so. A thread is the wrong format for it, and one good post beats a padded thread.\n\n### Account and voice\n\nAsk which account posts if it is not stated and the answer would change the copy. Default to the company account.\n\n| Account | Pronoun | Self-mention | Sign-off |\n|---|---|---|---|\n| **Company** (`@WeOrbitant`) | \"we\" | Never — the account *is* Orbitant | None |\n| **Personal** (a team member) | \"I\" | One `@WeOrbitant` mention, in the closing post | The lived experience is the sign-off |\n\nOn a personal account the thread must read as something that person actually did, decided or measured — first person singular. Do not write a company announcement and paste a name on it.\n\n### Language\n\n**English by default** — every thread, whatever language the material is in. Spanish material, English thread.\n\nWrite the thread in Spanish only when whoever asked for it asks for Spanish. Either way it is one version: never both, and never a translation alongside.\n\nMaterial in Spanish and a thread in English means anything you quote is being translated. Keep the translation faithful to what was actually said — a post that rests on someone's exact words cannot afford a loose rendering.\n\nIn a Spanish thread, keep technical English terms in English: *framework*, *pipeline*, *deployment*, *token*.\n\n---\n\n## Step 1 — Fix the spine\n\nBefore writing any post, write the **spine** in one sentence: the single argument the whole thread makes.\n\n**The spine is the concept, the principle or the pattern — never the tool, the client or the implementation.** If the source uses a real project, a framework or a specific stack to illustrate the point, those are evidence. They are never the subject.\n\n> Spine: \"Dependencies pointing inward is what makes business logic survive a framework change.\"\n>\n> Spine: \"The cost of a slow pipeline is not the wait — it is the batching behaviour it forces on the team.\"\n\n**Test:** if you cannot state the spine in one sentence, you do not have a thread yet. You have two threads, or a blog post.\n\n---\n\n## Step 2 — The opening post\n\nX surfaces this post on its own. Assume most people read only this one. **It has to deliver value standing alone** — someone who never opens the thread should still walk away with something.\n\n### Rules\n\n- **A statement, never a rhetorical question.** A question invites \"no\" and a scroll.\n- **No link.** It goes in the closing post, once.\n- **No thread announcement.** No \"🧵\", no \"A thread:\", no \"👇\", no \"Let me explain:\". A post that has to announce it is a thread is not a hook.\n- **Target ~200 of the 280 characters.** Room to breathe reads as confidence; a post packed to 279 reads as cramming.\n- **Do not open with \"We\", \"Our\" or \"Orbitant\".** Open with the insight. Exception: featuring a teammate by name is encouraged, to give them credit.\n- **Concrete beats clever.** A number, a measurement or a named consequence outperforms wordplay.\n\n### Examples\n\nDo:\n\n- `We measured it: with hexagonal architecture the agent needed 3 to 5x more context to make the same change.`\n- `Our CI took 22 minutes. One integration test was eating 60% of that, because it span up a real Postgres on every run.`\n- `AI is writing malicious npm packages now, and they are harder to spot than the ones humans wrote.`\n\nDon't:\n\n- `Have you ever wondered why your CI is so slow? 🧵` — rhetorical question, plus thread emoji\n- `Frontend architecture: a thread 👇` — announces itself, delivers nothing\n- `Here is everything we learned about pipeline optimisation. Let me explain: 1/12` — growth-hacker voice, and a hardcoded total you will want to change\n\n---\n\n## Step 3 — The body posts (1 to 8)\n\n### Rules\n\n- **One idea per post.** If a post carries two ideas, it is two posts.\n- **Every post must parse alone.** No post may depend on having read the previous one. Openers that dangle — \"And that is when we realised\", \"This is why it matters\" — are meaningless in a timeline.\n- **Every post should be quotable.** Assume any one of them gets quoted with no context attached.\n- **Report the character count** for each, and keep every one under 280.\n- **Vary the length on purpose.** Length is a rhythm instrument: a 90-character post lands a beat, a 250-character one carries the detail an argument needs. Do not let every post settle into the same band — a thread where all posts measure roughly the same reads as something generated, not written. Put the short ones where you want the reader to stop.\n- **Use short lines and blank lines** as the structure. That is the whole formatting toolkit.\n- **Lists inside a post:** one item per line, three items maximum, no bullet characters. More than three means it should be several posts.\n- **Numbering:** only if the thread is genuinely enumerable. Numbering a narrative turns it into a listicle. Never hardcode a total (`1/7`) — you will add or cut a post.\n- **Code:** one short snippet at most, as an image.\n- **No links.** One link per thread, in the closing post.\n\nGive one post to the honest limitation — where the idea stops working. A thread that says so is trusted more than one that does not.\n\n### Example\n\n> Don't: `And that was when we found the real problem.`\n>\n> Do: `The real problem was the test, not the pipeline. It span up a real Postgres for every run — 13 of the 22 minutes.`\n\n---\n\n## Step 4 — The closing post\n\n**Blog-derived** — the link, phrased naturally. No \"click here\", no exclamation marks.\n\n- `Full breakdown, with the numbers: [url]`\n- `We wrote up the whole migration here: [url]`\n\n**Native** — a statement that encapsulates the spine. Memorable, not a generic call to action. `Building with intention, not chaos` — not `Read more on our blog`.\n\nOn a personal account, this is where the single `@WeOrbitant` mention goes, if the work was Orbitant's.\n\n**No engagement bait.** Not \"Follow for more\", not \"Bookmark this\", not \"What do you think?\", not \"Agree?\", not \"RT if you have lived this\".\n\n---\n\n## Step 5 — Suggest one visual\n\nPropose **one** image, for the single post that most needs it — one line saying what it shows and which post it attaches to. Not a brief per post.\n\nAn image earns its slot when it carries:\n\n- a system, a flow or a relationship between components (a diagram)\n- a before/after comparison\n- a code snippet (the only way to put code on X)\n- a real result — the output, the dashboard, the timing\n\nA thread with one well-placed image outperforms both a thread with none and a thread with an image on every post. If nothing in that list applies, say no image is needed. A decorative image costs attention and returns nothing.\n\n---\n\n## Hashtags\n\n**Do not use hashtags on X.** Not one. The single exception is a live event tag when there is a real convening hashtag people are actively clicking — a conference Orbitant is at or sponsoring.\n\nThey have lost their discovery function. The timeline surfaces content by semantic relevance and engagement graph, not by hashtag index. Two or more now read as bot behaviour and correlate with *less* reach.\n\nHashtag conventions from Orbitant's other channels do not carry over to X. This is deliberate — do not add them back for consistency.\n\nOn X the brand appears as **`@WeOrbitant`**, which is a mention, and mentions do work.\n\n---\n\n## Output format\n\nPlain text, ready to paste into X, Typefully or n8n. No markdown in the post bodies.\n\n**The `POST n — c/280` line is the delimiter, and that is a contract.** One header line per post, one blank line between posts, nothing else at that level: a scheduler or an n8n step splits the thread deterministically on it, and a reviewer reads the same artifact. Do not emit a second, undivided copy of the thread alongside it — the split IS the work, and two copies drift the moment a reviewer corrects one.\n\n**Never hand a thread to a tool that splits by length.** An auto-splitter cuts at 280 characters wherever that falls, which undoes every rule above: posts stop being one idea each, stop parsing alone and stop being quotable. The boundaries here are decided, not incidental.\n\n```text\nTHREAD — [spine in one sentence]\n\nAccount: @WeOrbitant (company) | personal — [name]\nLanguage: [en | es]\nSource: [blog post URL | native: what it came from]\n\nPOST 1 — [n]/280\n[opening post]\n\nPOST 2 — [n]/280\n[body post]\n\nPOST 3 — [n]/280\n[body post]\n\nPOST 4 — [n]/280\n[body post]\n\nPOST 5 — [n]/280\n[closing post]\n\nIMAGE — attach to POST [n]\n[what it shows, one line]\n```\n\n**Length is whatever the spine needs.** Three posts is a thread; ten is the ceiling, and more than that means the spine is carrying too much. There is no floor to reach: if the argument is spent after one body post, the thread is three posts. If it fits in a single post, deliver one post and say it is not a thread.\n\n### Self-check before delivering\n\nVerify each of these. Do not deliver a thread that fails one.\n\n- [ ] A character count reported for every post, none over 280\n- [ ] The post lengths vary; they have not all settled into the same band\n- [ ] The opening post has no link\n- [ ] The opening post delivers value standing alone\n- [ ] Every body post parses with no prior context\n- [ ] Zero hashtags, or one real event tag\n- [ ] No markdown syntax anywhere in the post bodies\n- [ ] Exactly one link, in the closing post — or none, if native\n- [ ] The spine is a concept or principle, not a tool or a client\n- [ ] The pronoun matches the account\n- [ ] The thread is in English, or in Spanish because Spanish was asked for\n- [ ] No more than 10 posts, and none of them padding\n\n---\n\n## Tone\n\nRefer to the `tone` skill for Orbitant's voice. On X specifically:\n\n- **Compress hard.** 280 characters is not a trimmed paragraph, it is a different sentence length. One clause where you would write two.\n- **Concrete over abstract.** Numbers, measurements, named consequences. X punishes vagueness faster than any other channel.\n- **Dry humour is welcome** when it fits naturally. Human, not polished — not forced, not performative.\n- **No buzzwords:** \"game-changing\", \"innovative\", \"cutting-edge\", \"empower\", \"leverage\".\n- **No growth-hacker voice.** The fastest way to lose a technical audience: \"Here is everything you need to know\", \"10 lessons I learned\", \"Most developers get this wrong\", \"This changed how I think about X forever\", \"Steal this\".\n- **If the thread is in Spanish, the em dash only marks a two-sided aside.** A single-sided dash used as a continuation is an anglicism. In English it is ordinary punctuation and the rule does not apply.\n\n---\n\n## What to avoid\n\n- Recycling copy written for another channel. Start from the source material, never from an existing post.\n- Summarising the source instead of extracting one argument from it.\n- An opening post that only makes sense once you have read the thread.\n- Posts that only make sense once you have read the blog post.\n- Hashtags. Any.\n- A link in the opening post, or links scattered through the body.\n- Markdown syntax — X renders none of it.\n- Code as text.\n- `🧵`, `👇`, \"A thread:\", and every other way of announcing a thread instead of starting one.\n- Engagement bait of any kind, including the closing question.\n- Padding a thin idea to reach a post count. A thread that runs out of argument at post 4 should be four posts, or one.\n",
|
|
209
236
|
"frontmatter": {
|
|
210
237
|
"name": "orbitant-x-thread",
|
|
211
238
|
"description": "X (Twitter) thread writer for Orbitant. Turns a published blog post OR native\nmaterial — a Knowledge Sharing transcript, a Slack thread, a feature just\nshipped, a build-in-public moment — into a thread ready to post: an opening\npost that stands alone, body posts of one idea each, and a closing post,\nevery one annotated with its character count against X's 280 limit.\n\nActivate when the user asks for a thread, an X post or a Twitter post, or says\n\"haz un hilo\", \"convierte esto en un hilo\", \"esto da para un hilo\", \"thread\nthis\", \"algo para X\", \"para Twitter\". Also trigger when the user shares a blog\npost, a transcript or a Slack conversation and asks for social copy while\nmentioning X, Twitter, threads or @WeOrbitant — even if they never say the\nword \"thread\". This skill writes for X only; it is the wrong skill for\nLinkedIn, YouTube or the newsletter.\n",
|
package/package.json
CHANGED
|
@@ -395,17 +395,13 @@ Include 2–3 FAQs at the end only if the topic lends itself to common reader qu
|
|
|
395
395
|
|
|
396
396
|
### Keyword
|
|
397
397
|
|
|
398
|
-
**
|
|
398
|
+
**Choose the primary keyword before writing, from the material itself and the reader's likely search intent.** The `Keyword` field in Notion's "Content Progress" database is a record filled in *after* the post is written, not a source to pull a pre-assigned keyword from — don't query it for this.
|
|
399
399
|
|
|
400
400
|
1. **Draft 2–4 candidate long-tail phrases** (in Spanish) from the topic and the reader's likely search intent.
|
|
401
|
-
2. **
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
4. **Pick the candidate whose search intent matches what the article actually delivers** (informational/how-to vs. comparison vs. definitional). Weigh Keyword Planner volume against realistic ranking chances (step 3) when volume data exists; when it doesn't, decide on search intent and SERP competition alone — not just the highest-volume or most obvious phrasing.
|
|
406
|
-
5. State which keyword was chosen and why, in one line, when handing off the draft — include the Keyword Planner volume figure if you got one, or say plainly that the pick is based on manual research only.
|
|
407
|
-
6. It must appear in: the **SEO Title**, the **Slug**, and the **meta description** (see the metadata table below — these three fields must open with the exact keyword), at least one H2, and the first 100 words of the body. **The H1 (the article's actual title) does not need to contain the keyword.** The H1 is meant to be creative — the keyword requirement lives in the SEO Title, Slug, and meta description, not the H1.
|
|
408
|
-
7. Use it naturally. No keyword stuffing.
|
|
401
|
+
2. **Pick the candidate whose search intent matches what the article actually delivers** (informational/how-to vs. comparison vs. definitional) — not the most obvious phrasing, and not a broad head term the blog has no realistic chance of ranking for.
|
|
402
|
+
3. State which keyword was chosen and why, in one line, when handing off the draft, and name the candidates that were discarded. The pick is made without search-volume data, so say so plainly: whoever receives the draft can check it against a keyword tool and swap it before publishing.
|
|
403
|
+
4. It must appear in: the **SEO Title**, the **Slug**, and the **meta description** (see the metadata table below — these three fields must open with the exact keyword), at least one H2, and the first 100 words of the body. **The H1 (the article's actual title) does not need to contain the keyword.** The H1 is meant to be creative — the keyword requirement lives in the SEO Title, Slug, and meta description, not the H1.
|
|
404
|
+
5. Use it naturally. No keyword stuffing.
|
|
409
405
|
|
|
410
406
|
### SEO Metadata (always include at the end of the article)
|
|
411
407
|
|
|
@@ -64,12 +64,12 @@ Flag the following patterns as issues if found:
|
|
|
64
64
|
- **Past tense for ongoing work**: Flag use of past tense ("construimos", "fue", "era") to describe workflows, tools, or features that are currently active.
|
|
65
65
|
- **Roadmap presented as operational**: Flag if features in development or planned functionality are described as currently working. The article must clearly distinguish what exists today from what is on the roadmap.
|
|
66
66
|
- **AI filler formulas**: Flag expressions like "la parte que más me interesa", "me parece especialmente relevante destacar", "no podemos dejar de mencionar". These read as AI-generated filler, not as a person writing.
|
|
67
|
+
- **Rhetorical questions**: Flag any rhetorical question, anywhere in the article — the hook, a transition, or the closing. It is a common AI-generated pattern, not an engagement device, and it must be restated as a declarative sentence.
|
|
67
68
|
|
|
68
69
|
### Formatting Conventions
|
|
69
70
|
|
|
70
71
|
| Element | Usage |
|
|
71
72
|
|---------|-------|
|
|
72
|
-
| Rhetorical questions | Hooks, transitions, and engagement devices |
|
|
73
73
|
| Blockquotes | Opening hooks, attributed quotes, external citations, pull quotes as visual reinforcement |
|
|
74
74
|
| Admonitions | GitHub-flavored: `> [!IMPORTANT]`, `> [!TIP]` for callouts |
|
|
75
75
|
| Bold | Key insights (scannable) |
|
|
@@ -84,7 +84,7 @@ Flag the following patterns as issues if found:
|
|
|
84
84
|
|
|
85
85
|
Review against the following expected structure:
|
|
86
86
|
|
|
87
|
-
1. **Hook**:
|
|
87
|
+
1. **Hook**: An opening line that names the pain or problem the article addresses and immediately engages the reader. A blockquote is optional, never a requirement; a rhetorical question is never acceptable.
|
|
88
88
|
2. **Opening paragraph**: Establishes the topic and why it matters. Primary keyword must appear within the first 100 words.
|
|
89
89
|
3. **Body (H2 sections)**:
|
|
90
90
|
- Minimum 3 H2 sections.
|
|
@@ -116,21 +116,22 @@ When reviewing an article generated from a multi-participant input, check:
|
|
|
116
116
|
|
|
117
117
|
| Field | Standard |
|
|
118
118
|
|---|---|
|
|
119
|
-
| Título SEO |
|
|
120
|
-
| Slug | 65–
|
|
121
|
-
| Meta descripción | 130–
|
|
119
|
+
| Título SEO | 50–56 characters including spaces. Must **begin with the exact primary keyword** — not a paraphrase, the exact keyword. |
|
|
120
|
+
| Slug | 65–69 characters including spaces. Lowercase, hyphens, no accents or special characters. Must **begin with the exact primary keyword**. |
|
|
121
|
+
| Meta descripción | 130–135 characters including spaces. Must **begin with the exact primary keyword**. |
|
|
122
122
|
|
|
123
123
|
### Keyword Distribution
|
|
124
|
-
- Primary keyword in:
|
|
124
|
+
- Primary keyword in: at least one H2, the meta description (as the opening), and the first 100 words of the body. **The H1 does not need to contain it** — the H1 is the creative title, and the keyword requirement lives in the Título SEO, the Slug and the meta description.
|
|
125
125
|
- Natural usage — flag any keyword stuffing.
|
|
126
126
|
|
|
127
127
|
### Links
|
|
128
|
-
- **Internal**: 2
|
|
129
|
-
- **External**:
|
|
128
|
+
- **Internal**: 1–2 links to other Orbitant blog posts. Flag if missing or excessive.
|
|
129
|
+
- **External**: 1–2 links to authoritative sources (MDN, official docs, GitHub, research). Flag if linking to competitors or low-authority sources.
|
|
130
130
|
- **Anchor text**: Links must span the natural phrase in which the topic appears, not just the topic noun. Flag anchor text that is too narrow (e.g., linking only the noun when the surrounding phrase would be more natural and informative).
|
|
131
131
|
|
|
132
132
|
### Images
|
|
133
|
-
-
|
|
133
|
+
- A draft coming out of `blog-post-create` carries no alt text on purpose: it is written once the image exists, so do not flag its absence in a draft.
|
|
134
|
+
- If the article already has its image and its alt text, check that the alt text is descriptive, SEO-friendly, and includes the primary keyword naturally.
|
|
134
135
|
|
|
135
136
|
---
|
|
136
137
|
|
|
@@ -178,14 +179,14 @@ Produce feedback with these sections:
|
|
|
178
179
|
|
|
179
180
|
### 4. Revisión SEO
|
|
180
181
|
Evaluate with checkmarks or crosses:
|
|
181
|
-
- [ ] Título SEO: length (
|
|
182
|
-
- [ ] Slug: length (65–
|
|
183
|
-
- [ ] Meta descripción: length (130–
|
|
184
|
-
- [ ] Keyword in
|
|
185
|
-
- [ ] Internal links (2
|
|
186
|
-
- [ ] External links (
|
|
182
|
+
- [ ] Título SEO: length (50–56 chars) and begins with exact primary keyword
|
|
183
|
+
- [ ] Slug: length (65–69 chars), format correct, begins with exact keyword
|
|
184
|
+
- [ ] Meta descripción: length (130–135 chars), begins with exact keyword
|
|
185
|
+
- [ ] Keyword in at least one H2 and in the first 100 words (the H1 does not need it)
|
|
186
|
+
- [ ] Internal links (1–2)
|
|
187
|
+
- [ ] External links (1–2, authoritative)
|
|
187
188
|
- [ ] Anchor text spans natural phrase (not just the noun)
|
|
188
|
-
- [ ] Image alt text: descriptive and keyword-aware
|
|
189
|
+
- [ ] Image alt text, only if the image already exists: descriptive and keyword-aware
|
|
189
190
|
- [ ] Cluster and category correctly assigned
|
|
190
191
|
|
|
191
192
|
### 5. Sugerencias accionables
|
|
@@ -0,0 +1,348 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: orbitant-x-post
|
|
3
|
+
description: |
|
|
4
|
+
Single standalone X (Twitter) post writer for Orbitant. Takes one piece of
|
|
5
|
+
material — a Knowledge Sharing session, an interview, a blog post just
|
|
6
|
+
published, a feature just shipped, a decision taken or reversed, a measurement
|
|
7
|
+
that surprised us, a build-in-public moment — and returns numbered variants
|
|
8
|
+
of the same post, three by default and two when the material holds only two
|
|
9
|
+
angles: different ways into the same material, ordered strongest first, each
|
|
10
|
+
with its weighted character count against X's 280 limit.
|
|
11
|
+
|
|
12
|
+
Activate when the user asks for a post, a tweet or a single piece for X, or
|
|
13
|
+
says "un post para X", "un tuit", "algo suelto para X", "esto no da para un
|
|
14
|
+
hilo", "tuitea esto", "algo corto para Twitter", "post this on X", "tweet
|
|
15
|
+
this". Also trigger when the user shares material and asks for something to
|
|
16
|
+
publish on X or from @WeOrbitant without asking for a thread. This skill
|
|
17
|
+
writes one post, never a thread: material that holds an argument needing
|
|
18
|
+
several posts goes to x-thread instead.
|
|
19
|
+
version: "1.0.0"
|
|
20
|
+
license: MIT
|
|
21
|
+
metadata:
|
|
22
|
+
author: orbitant
|
|
23
|
+
tags: marketing, x, twitter, post, social-media, content, engagement
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
# Orbitant X Post Skill
|
|
27
|
+
|
|
28
|
+
A post on X arrives alone. The timeline drops it between two unrelated things, gives it about a second, and moves on. Nothing above it sets it up and nothing below it explains it.
|
|
29
|
+
|
|
30
|
+
So the job of a single post is **traction**: a reason for someone who was scrolling to stop. Not a summary of what happened, not an announcement that it happened. Every rule below follows from that.
|
|
31
|
+
|
|
32
|
+
This skill writes **one standalone post, never a thread**, and it delivers several variants of it so a human can pick one.
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## Where this skill stops and x-thread starts
|
|
37
|
+
|
|
38
|
+
| | `x-post` (this skill) | `x-thread` |
|
|
39
|
+
|---|---|---|
|
|
40
|
+
| Shape | One post that stands alone | One argument spread across several posts |
|
|
41
|
+
| The material holds | One thing worth saying | A claim plus the evidence it needs |
|
|
42
|
+
| Output | Several variants of one post, pick one | One thread, every post ships together |
|
|
43
|
+
|
|
44
|
+
**Hand the material to `x-thread` when it holds a real argument that needs unpacking.** The signals are concrete: you cannot state the point without a "because" that itself needs a "because"; you keep wanting a second post to justify the first; the honest version needs evidence that will not fit in 280 characters. That is a thread. Say so and stop. Do not compress an argument into one post, and never deliver a post and a thread in the same answer.
|
|
45
|
+
|
|
46
|
+
`x-thread` says the same thing from the other side: material that fits in a single post ships as a single post. This skill is where that lands.
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
## What X imposes
|
|
51
|
+
|
|
52
|
+
Platform facts. They are not style preferences and you cannot write around them.
|
|
53
|
+
|
|
54
|
+
- **280 characters per post, hard.** A post at 281 does not post.
|
|
55
|
+
- **The limit is weighted, and weight 2 is the default.** Only a short allowlist of Unicode ranges weighs 1: `U+0000-U+10FF`, `U+2000-U+200D`, `U+2010-U+201F` and `U+2032-U+2037`. Latin text, Spanish accents, ñ, the line break and the ordinary punctuation you type all fall inside it and weigh 1.
|
|
56
|
+
- **Everything outside that allowlist weighs 2.** Emoji and CJK, and also the typographic ellipsis `…` (U+2026), which is the one that slips in unnoticed: three of them cost six characters, not three. A compound emoji — a skin tone modifier, a ZWJ sequence like `👩💻` — costs more than 2, so never try to budget one precisely.
|
|
57
|
+
- **A URL always counts as 23**, however short or long it is. X rewrites every link through its own shortener before counting it.
|
|
58
|
+
- **No text formatting.** X renders no markdown. `**bold**` shows up as literal asterisks, `##` as literal hashes. The line break is the only formatting tool you have.
|
|
59
|
+
- **The post is read with no context around it**, by people who have never heard of Orbitant.
|
|
60
|
+
- **Links cost reach.** A post carrying a link is distributed less than the same post without one.
|
|
61
|
+
- **Hashtags do nothing.** See the Hashtags section.
|
|
62
|
+
- **Code does not survive as text.** No monospace, and indentation is stripped. Code has to be an image.
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
## Input
|
|
67
|
+
|
|
68
|
+
### Source material
|
|
69
|
+
|
|
70
|
+
Read it in full before writing anything. What you are looking for is the **anchor**: the one concrete, checkable thing a post can stand on (Step 1). It hides in a different place depending on what you were handed.
|
|
71
|
+
|
|
72
|
+
| Material | Where the anchor usually hides |
|
|
73
|
+
|---|---|
|
|
74
|
+
| **Knowledge Sharing session** | The one claim the room pushed back on. Not the agenda, not what was covered |
|
|
75
|
+
| **An interview with someone** | A sentence only that person could say, because of what they have lived |
|
|
76
|
+
| **A blog post just published** | The single finding the post is built on. This is the one kind that arrives with a public URL |
|
|
77
|
+
| **A feature just shipped** | What is possible now that was not possible last week. A changelog line is not a post |
|
|
78
|
+
| **A decision taken or reversed** | The reason and what it cost. A reversal beats a decision: saying what you stopped doing is rarer than saying what you started |
|
|
79
|
+
| **A measurement that surprised us** | The number and the expectation it broke. The surprise is the post, not the metric |
|
|
80
|
+
| **A build-in-public moment** | The unfinished state, said plainly, while it is still unfinished |
|
|
81
|
+
| **Something moving in the field** | What actually changed, and when. Not that the topic is hot |
|
|
82
|
+
|
|
83
|
+
No row outranks another. An interview is one row of eight, and a post built on one is not automatically better than a post built on a measurement or on a feature that shipped on Thursday.
|
|
84
|
+
|
|
85
|
+
**The table is a map, not a gate.** Material that fits none of these rows is not a refusal — plenty of good posts are a comment on something outside our own work. The requirement is the anchor, never the category. "Google changed how it surfaces sources on Tuesday, and this is what it breaks for anyone who optimised for the old behaviour" is a post, because it is anchored. "GEO is the new SEO" is a slogan, and you turn it down for the missing anchor, not for the missing row.
|
|
86
|
+
|
|
87
|
+
So when the material holds no anchor — only that something exists, that a session took place, or that a topic is being talked about — say so. There is no post in it yet, and inventing a reason to care is how an account loses the people it already has.
|
|
88
|
+
|
|
89
|
+
### When you are handed a topic instead of material
|
|
90
|
+
|
|
91
|
+
A request can arrive as a subject rather than as something to read: "un tuit sobre los últimos movimientos de posicionamiento GEO". A subject contains no anchor, and this skill does not go looking for one.
|
|
92
|
+
|
|
93
|
+
Ask for the material, or for what the person who asked already found: the change, the date, the source, the number. One concrete fact is enough to start from. Whoever invokes the skill resolves the research; the skill writes the post.
|
|
94
|
+
|
|
95
|
+
### Account and voice
|
|
96
|
+
|
|
97
|
+
Ask which account posts if it is not stated and the answer would change the copy. Default to the company account.
|
|
98
|
+
|
|
99
|
+
| Account | Pronoun | Self-mention | Signature |
|
|
100
|
+
|---|---|---|---|
|
|
101
|
+
| **Company** (`@WeOrbitant`) | "we" | Never — the account *is* Orbitant | None |
|
|
102
|
+
| **Personal** (a team member) | "I" | At most one `@WeOrbitant`, and only if the work was Orbitant's | The lived experience is the signature |
|
|
103
|
+
|
|
104
|
+
On a personal account the post must read as something that person actually did, decided or measured — first person singular. Do not write a company announcement and paste a name on it. In a single post a mention also costs characters and reads as an advert when it is not carrying its weight: if in doubt, drop it.
|
|
105
|
+
|
|
106
|
+
### Language
|
|
107
|
+
|
|
108
|
+
**English by default** — every post, whatever language the material is in. Spanish material, English post.
|
|
109
|
+
|
|
110
|
+
Write the post in Spanish only when whoever asked for it asks for Spanish. Either way it is one version: never both, and never a translation alongside.
|
|
111
|
+
|
|
112
|
+
Material in Spanish and a post in English means anything you quote is being translated. Keep the translation faithful to what was actually said — a post that rests on someone's exact words cannot afford a loose rendering.
|
|
113
|
+
|
|
114
|
+
In a Spanish post, keep technical English terms in English: *framework*, *pipeline*, *deployment*, *token*.
|
|
115
|
+
|
|
116
|
+
---
|
|
117
|
+
|
|
118
|
+
## Step 1 — Find the anchor
|
|
119
|
+
|
|
120
|
+
Before writing anything, name the **anchor**: the one concrete, true, checkable thing the post stands on. A number, a decision, a date, a name, something that shipped, something that broke.
|
|
121
|
+
|
|
122
|
+
> Anchor: "The pipeline went from 22 minutes to 8 after we replaced one integration test."
|
|
123
|
+
>
|
|
124
|
+
> Anchor: "We reversed the multi-repo split three weeks after doing it."
|
|
125
|
+
>
|
|
126
|
+
> Anchor: "Kevin measured 3 to 5x more context per change under hexagonal architecture."
|
|
127
|
+
|
|
128
|
+
A post with no anchor is a slogan, and slogans do not get traction, they get scrolled past. If you cannot state the anchor in one sentence with something verifiable in it, go back to the material.
|
|
129
|
+
|
|
130
|
+
**The anchor is concrete; the subject is the idea.** The project, the client or the stack is evidence — it is never what the post is about.
|
|
131
|
+
|
|
132
|
+
---
|
|
133
|
+
|
|
134
|
+
## Step 2 — Find the angles
|
|
135
|
+
|
|
136
|
+
An angle is the way into the anchor: which part you lead with, who you are talking to, what the reader is left holding. One anchor supports several.
|
|
137
|
+
|
|
138
|
+
Write the angles down before writing any copy, one per variant. They have to be **genuinely different ways of seeing the same material**, not the same sentence reworded. Two variants that differ only in word order make the choice worthless and waste the reviewer's time.
|
|
139
|
+
|
|
140
|
+
Angles that work, all on the same anchor ("the pipeline went from 22 minutes to 8"):
|
|
141
|
+
|
|
142
|
+
- **The number first** — lead with the measurement and let it carry the post
|
|
143
|
+
- **The wrong assumption** — what everyone believes that the anchor contradicts
|
|
144
|
+
- **The cost** — what the old state was charging you, counted in something other than money
|
|
145
|
+
- **The admission** — the part where we were wrong, said without cushioning
|
|
146
|
+
- **The person** — someone named, doing something specific
|
|
147
|
+
- **The consequence** — what changes on Monday for someone who copies this
|
|
148
|
+
|
|
149
|
+
**Test:** can you say in one short line what each angle does that the others do not? If not, it is the same variant twice. Cut it and write a real one.
|
|
150
|
+
|
|
151
|
+
---
|
|
152
|
+
|
|
153
|
+
## Step 3 — Write the variants
|
|
154
|
+
|
|
155
|
+
### How many
|
|
156
|
+
|
|
157
|
+
**Three by default. Two when the material honestly supports only two angles.**
|
|
158
|
+
|
|
159
|
+
Three gives the reviewer a real choice: a safe one, a sharper one, and one that takes a risk. Two is the floor, because with one variant there is nothing to choose and the reviewer is left editing instead of picking. Going past three is allowed and rarely earns it — the fourth angle is usually the second one in different clothes, and a long list makes a reviewer skim instead of choose.
|
|
160
|
+
|
|
161
|
+
Fewer variants that genuinely differ always beat more that nearly match.
|
|
162
|
+
|
|
163
|
+
### Rules for every variant
|
|
164
|
+
|
|
165
|
+
- **A statement, never a rhetorical question.** A question invites "no" and a scroll.
|
|
166
|
+
- **It has to deliver value standing alone.** Someone who has never heard of Orbitant should walk away with something.
|
|
167
|
+
- **No link by default.** See the Links section.
|
|
168
|
+
- **Target 150 to 240 of the 280.** Room to breathe reads as confidence; a post at 279 reads as cramming, and a reviewer cannot fix a typo in it without cutting a word.
|
|
169
|
+
- **Do not open with "We", "Our" or "Orbitant" introducing themselves.** Open with the anchor. A "we" that is the subject of a finished, concrete action is not a self-introduction: "We put the repo back together three weeks later" opens with the anchor, "We are excited to share" does not. Exception: naming a teammate is encouraged, to give them credit.
|
|
170
|
+
- **Concrete beats clever.** A number, a measurement or a named consequence outperforms wordplay.
|
|
171
|
+
- **Report the weighted character count** for every variant, and treat your own number as an estimate. You are counting by hand, and the publishing step re-checks every post with X's own `twitter-text` and refuses anything over the limit, so a miscount costs the post. Leave margin instead of writing 279.
|
|
172
|
+
- **Plain text in the post itself.** Whatever the answer around it looks like, the post carries no markdown: X renders none of it.
|
|
173
|
+
- **Short lines and blank lines** are the whole formatting toolkit. Three lines of text at most.
|
|
174
|
+
- **Lists inside a post:** two items at most, one per line, no bullet characters. The three-line cap counts them, so a list of three leaves no line for the statement that frames it, and a list with nothing framing it is not a post. Three items or more is a thread.
|
|
175
|
+
- **No engagement bait.** Not "Agree?", not "What do you think?", not "Follow for more", not "Bookmark this". Traction is the post being worth stopping for, not the reader being asked to react.
|
|
176
|
+
|
|
177
|
+
### Examples
|
|
178
|
+
|
|
179
|
+
Do:
|
|
180
|
+
|
|
181
|
+
- `The pipeline took 22 minutes. One integration test was eating 13 of them, because it started a real Postgres on every run.`
|
|
182
|
+
- `We split the repo in three. Three weeks later we put it back together, and we wrote down what the round trip cost us.` — a "we" that did something, not a "we" introducing itself
|
|
183
|
+
|
|
184
|
+
Don't:
|
|
185
|
+
|
|
186
|
+
- `Have you ever wondered why your CI is so slow?` — rhetorical question, invites a scroll
|
|
187
|
+
- `Excited to share our latest engineering insights!` — announces enthusiasm, delivers nothing
|
|
188
|
+
- `10 lessons we learned optimising our pipeline 🧵` — growth-hacker voice, and it is not even a thread
|
|
189
|
+
|
|
190
|
+
---
|
|
191
|
+
|
|
192
|
+
## Step 4 — Order them
|
|
193
|
+
|
|
194
|
+
**Number the variants and order them by your own preference, strongest first.** Not by length, and not in the order the angles occurred to you.
|
|
195
|
+
|
|
196
|
+
The order is load-bearing. Whoever reads the answer picks one of them, and the order is your recommendation: it saves them re-reading three posts to work out which one you believe in. **Variant 1 is the one you would publish if the decision were yours.** Do not lead with the safe one out of caution — if the sharp variant is the best post, it goes first.
|
|
197
|
+
|
|
198
|
+
Close with one line saying why the order is what it is, so a reviewer can argue with the reasoning and not only with the copy.
|
|
199
|
+
|
|
200
|
+
---
|
|
201
|
+
|
|
202
|
+
## A worked example
|
|
203
|
+
|
|
204
|
+
The four steps on real material. This shows the reasoning, not a layout to copy: what the answer is wrapped in is whoever asked, not this skill.
|
|
205
|
+
|
|
206
|
+
**Material:** a Slack thread where the team worked out why CI was slow, with the before and after numbers in it. Company account, no public URL.
|
|
207
|
+
|
|
208
|
+
**Anchor:** the pipeline went from 22 minutes to 8 after we replaced one integration test.
|
|
209
|
+
|
|
210
|
+
**Angles:** the number first / the admission / the wrong assumption. Three ways in: the measurement carrying the post on its own, what we did badly before we measured, and the belief the anchor contradicts.
|
|
211
|
+
|
|
212
|
+
**Variant 1, the number first.** 153 characters.
|
|
213
|
+
|
|
214
|
+
```text
|
|
215
|
+
The pipeline took 22 minutes. One integration test was eating 13 of them, because it started a real Postgres on every run.
|
|
216
|
+
|
|
217
|
+
We mocked it. It now takes 8.
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
**Variant 2, the admission.** 209 characters.
|
|
221
|
+
|
|
222
|
+
```text
|
|
223
|
+
We spent months blaming the runner, the cache, the dependency install. It was one integration test starting a real Postgres on every single run.
|
|
224
|
+
|
|
225
|
+
Nobody had profiled it. 22 minutes down to 8 once somebody did.
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
**Variant 3, the wrong assumption.** 168 characters.
|
|
229
|
+
|
|
230
|
+
```text
|
|
231
|
+
A slow pipeline is rarely slow everywhere. Ours took 22 minutes and 13 of them lived inside one integration test.
|
|
232
|
+
|
|
233
|
+
Before you pay for faster runners, profile the suite.
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
**Order:** variant 1 first, because 22 to 8 is the whole post and needs nothing else to land. The admission second: it earns more trust, but it asks the reader to care about us before it pays out. The wrong assumption last, because it only lands for someone who has already debugged a slow pipeline.
|
|
237
|
+
|
|
238
|
+
**Image:** none. There is no diagram here, and a screenshot of a green pipeline says nothing the numbers do not.
|
|
239
|
+
|
|
240
|
+
---
|
|
241
|
+
|
|
242
|
+
## Naming a person
|
|
243
|
+
|
|
244
|
+
The sharpest single post available is one that names a real person and says what they did *not* say or do. It is also the easiest to get wrong, and the failure is not subtle: the post reads as a reproach, and the account pays for it long after the post is gone.
|
|
245
|
+
|
|
246
|
+
The line is where the sentence puts its subject. **The subject is the idea. The person is how you got to it.**
|
|
247
|
+
|
|
248
|
+
> Do: `We asked [Name] how they measure the impact of agents. They answered with latency and with cost, and not once with "productivity". That absence is the most honest answer we have heard this year.`
|
|
249
|
+
>
|
|
250
|
+
> Don't: `[Name] had no answer when we asked them about productivity.`
|
|
251
|
+
|
|
252
|
+
The first one is about how a practitioner thinks, and the person comes out of it well. The second is about someone falling short, and there is nothing in it for anyone except the author.
|
|
253
|
+
|
|
254
|
+
Three checks before writing one of these:
|
|
255
|
+
|
|
256
|
+
- **The absence is real and you can point at it.** You have the recording, the transcript or the thread. Do not infer a silence from a summary, and never from memory.
|
|
257
|
+
- **You would send the post to that person before publishing it.** If the answer needs a caveat, it is a jab. Rewrite it or drop it.
|
|
258
|
+
- **The material was public, or was shared with you for this.** A talk, a published interview, something they wrote: fair. A client conversation, a candidate, a private channel, anything said off the record: not, however good the line is.
|
|
259
|
+
|
|
260
|
+
The same craft works with the sign flipped. Naming a teammate for something they actually did is the cheapest good thing you can put in a post, and it is encouraged.
|
|
261
|
+
|
|
262
|
+
---
|
|
263
|
+
|
|
264
|
+
## Links
|
|
265
|
+
|
|
266
|
+
**The default is no link.** Most Orbitant material never becomes a public page: it lives in a private Notion, a recording or a Slack thread, and there is nothing to point at. Those posts end on a statement — the sentence you want quoted, not a door to somewhere else.
|
|
267
|
+
|
|
268
|
+
When there is a real public URL, which in practice means a blog post that just went live:
|
|
269
|
+
|
|
270
|
+
- The link goes at the end, on its own line, **in one variant only** — not in all of them. Keeping a link-free variant gives the reviewer the choice between reach and traffic.
|
|
271
|
+
- **It costs 23 characters** whatever its length. Budget them before writing, not after.
|
|
272
|
+
- **It costs reach**, and that is a real trade. A link earns its place when the post is a genuine door into something longer. It does not when the post already says the whole thing.
|
|
273
|
+
- Phrase it naturally: `The numbers are in the post: [url]`. No "click here", no exclamation marks.
|
|
274
|
+
|
|
275
|
+
Never put a link in a post whose job is to be quoted.
|
|
276
|
+
|
|
277
|
+
---
|
|
278
|
+
|
|
279
|
+
## Hashtags
|
|
280
|
+
|
|
281
|
+
**Do not use hashtags on X.** Not one. The single exception is a live event tag, when there is a real convening hashtag people are actively clicking — a conference Orbitant is at or sponsoring.
|
|
282
|
+
|
|
283
|
+
They have lost their discovery function, and two or more read as bot behaviour. Hashtag conventions from Orbitant's other channels do not carry over to X. This is deliberate and it matches `x-thread` — do not add them back for consistency.
|
|
284
|
+
|
|
285
|
+
On X the brand appears as **`@WeOrbitant`**, which is a mention, and mentions do work.
|
|
286
|
+
|
|
287
|
+
---
|
|
288
|
+
|
|
289
|
+
## One image, or none
|
|
290
|
+
|
|
291
|
+
An image costs no characters and does earn attention, but only when it carries something:
|
|
292
|
+
|
|
293
|
+
- a system, a flow or a relationship between components (a diagram)
|
|
294
|
+
- a before and after comparison
|
|
295
|
+
- a code snippet (the only way to put code on X)
|
|
296
|
+
- a real result — the output, the dashboard, the timing
|
|
297
|
+
|
|
298
|
+
Propose **at most one**, in one line, and say which variant it belongs to or that it works for all of them. If nothing on that list applies, say no image is needed. A decorative image costs attention and returns nothing.
|
|
299
|
+
|
|
300
|
+
---
|
|
301
|
+
|
|
302
|
+
## Self-check before delivering
|
|
303
|
+
|
|
304
|
+
Verify each of these. Do not deliver an answer that fails one.
|
|
305
|
+
|
|
306
|
+
- [ ] Three variants, or two when the material only holds two angles, each a different angle and none of them another one reworded
|
|
307
|
+
- [ ] Numbered, ordered by preference, strongest first, with one line saying why
|
|
308
|
+
- [ ] A weighted count on every variant, with margin under 280: weight 1 only inside the allowlisted ranges, 2 for anything else including `…`, 23 for any URL
|
|
309
|
+
- [ ] Every variant stands alone, with no context and nothing to open
|
|
310
|
+
- [ ] Every variant is anchored in something concrete and checkable
|
|
311
|
+
- [ ] No rhetorical question, no engagement bait, no thread announcement
|
|
312
|
+
- [ ] Zero hashtags, or one real event tag
|
|
313
|
+
- [ ] No markdown syntax in any post body
|
|
314
|
+
- [ ] No link, or exactly one link in exactly one variant
|
|
315
|
+
- [ ] The pronoun matches the account
|
|
316
|
+
- [ ] The post is in English, or in Spanish because Spanish was asked for
|
|
317
|
+
- [ ] If a person is named for something they did not say: the absence is checkable, the idea is the subject, and you would send it to them first
|
|
318
|
+
- [ ] This is one post, not a thread compressed into one
|
|
319
|
+
|
|
320
|
+
---
|
|
321
|
+
|
|
322
|
+
## Tone
|
|
323
|
+
|
|
324
|
+
Refer to the `tone` skill for Orbitant's voice. On a single X post specifically:
|
|
325
|
+
|
|
326
|
+
- **Compress hard.** 280 characters is not a trimmed paragraph, it is a different sentence length. One clause where you would write two.
|
|
327
|
+
- **Concrete over abstract.** Numbers, measurements, named consequences. X punishes vagueness faster than any other channel.
|
|
328
|
+
- **Dry humour is welcome** when it fits naturally. Human, not polished — not forced, not performative.
|
|
329
|
+
- **No buzzwords:** "game-changing", "innovative", "cutting-edge", "empower", "leverage".
|
|
330
|
+
- **No growth-hacker voice:** "Most developers get this wrong", "Here is everything you need to know", "This changed how I think about X forever", "Steal this".
|
|
331
|
+
- **If the post is in Spanish, the em dash only marks a two-sided aside.** A single-sided dash used as a continuation is an anglicism. In English it is ordinary punctuation and the rule does not apply.
|
|
332
|
+
|
|
333
|
+
---
|
|
334
|
+
|
|
335
|
+
## What to avoid
|
|
336
|
+
|
|
337
|
+
- Writing a thread and calling it a post, or delivering a post and a thread together.
|
|
338
|
+
- Variants that differ in wording instead of in angle.
|
|
339
|
+
- Ordering the variants by length, or leaving them in the order the angles occurred to you.
|
|
340
|
+
- Summarising the material instead of finding the one thing in it worth saying.
|
|
341
|
+
- A post that only makes sense to someone who was in the room.
|
|
342
|
+
- Announcing that something exists without saying what it changes.
|
|
343
|
+
- `🧵`, `👇`, "A thread:" — there is no thread here.
|
|
344
|
+
- Hashtags. Any.
|
|
345
|
+
- A link in every variant, or a link in a post whose job is to be quoted.
|
|
346
|
+
- Markdown syntax. X renders none of it.
|
|
347
|
+
- Naming a person to score a point.
|
|
348
|
+
- Engagement bait of any kind, including the closing question.
|
package/skills/x-thread/SKILL.md
CHANGED
|
@@ -70,9 +70,13 @@ On a personal account the thread must read as something that person actually did
|
|
|
70
70
|
|
|
71
71
|
### Language
|
|
72
72
|
|
|
73
|
-
**
|
|
73
|
+
**English by default** — every thread, whatever language the material is in. Spanish material, English thread.
|
|
74
74
|
|
|
75
|
-
|
|
75
|
+
Write the thread in Spanish only when whoever asked for it asks for Spanish. Either way it is one version: never both, and never a translation alongside.
|
|
76
|
+
|
|
77
|
+
Material in Spanish and a thread in English means anything you quote is being translated. Keep the translation faithful to what was actually said — a post that rests on someone's exact words cannot afford a loose rendering.
|
|
78
|
+
|
|
79
|
+
In a Spanish thread, keep technical English terms in English: *framework*, *pipeline*, *deployment*, *token*.
|
|
76
80
|
|
|
77
81
|
---
|
|
78
82
|
|
|
@@ -198,7 +202,7 @@ Plain text, ready to paste into X, Typefully or n8n. No markdown in the post bod
|
|
|
198
202
|
THREAD — [spine in one sentence]
|
|
199
203
|
|
|
200
204
|
Account: @WeOrbitant (company) | personal — [name]
|
|
201
|
-
Language: [
|
|
205
|
+
Language: [en | es]
|
|
202
206
|
Source: [blog post URL | native: what it came from]
|
|
203
207
|
|
|
204
208
|
POST 1 — [n]/280
|
|
@@ -236,7 +240,7 @@ Verify each of these. Do not deliver a thread that fails one.
|
|
|
236
240
|
- [ ] Exactly one link, in the closing post — or none, if native
|
|
237
241
|
- [ ] The spine is a concept or principle, not a tool or a client
|
|
238
242
|
- [ ] The pronoun matches the account
|
|
239
|
-
- [ ] The thread
|
|
243
|
+
- [ ] The thread is in English, or in Spanish because Spanish was asked for
|
|
240
244
|
- [ ] No more than 10 posts, and none of them padding
|
|
241
245
|
|
|
242
246
|
---
|
|
@@ -250,7 +254,7 @@ Refer to the `tone` skill for Orbitant's voice. On X specifically:
|
|
|
250
254
|
- **Dry humour is welcome** when it fits naturally. Human, not polished — not forced, not performative.
|
|
251
255
|
- **No buzzwords:** "game-changing", "innovative", "cutting-edge", "empower", "leverage".
|
|
252
256
|
- **No growth-hacker voice.** The fastest way to lose a technical audience: "Here is everything you need to know", "10 lessons I learned", "Most developers get this wrong", "This changed how I think about X forever", "Steal this".
|
|
253
|
-
- **
|
|
257
|
+
- **If the thread is in Spanish, the em dash only marks a two-sided aside.** A single-sided dash used as a continuation is an anglicism. In English it is ordinary punctuation and the rule does not apply.
|
|
254
258
|
|
|
255
259
|
---
|
|
256
260
|
|