DOWNLINK Social Repurposer
Turn a shipped DOWNLINK entry into a platform-native social artefact (X thread, LinkedIn post, Bluesky post, or newsletter excerpt) through a per-platform lens.
inputs
| name | required | default |
|---|---|---|
slug |
yes | — |
platform |
yes | — |
abacus_path |
no | — |
source_notes |
no | — |
entry_title |
no | — |
entry_published_at |
no | — |
today |
no | — |
lens_role |
no | — |
lens_allowed_domains |
no | — |
lens_allowed_diagrams_primary |
no | — |
lens_allowed_diagrams_secondary |
no | — |
lens_anti_slop |
no | — |
lens_default_access |
no | — |
lens_sections |
no | — |
lens_source_roots |
no | — |
routing
triggers
- repurpose the downlink entry for social
- write the x thread for this post
- linkedin post for this entry
- bluesky post for this entry
- newsletter excerpt for this entry
- cross-platform variants for a downlink post
not for
- authoring the entry itself (use downlink-entry-author)
- projecting an entry onto landing (use downlink-publish)
- posting or scheduling to any platform (this prompt writes artefacts, it does not publish them)
- inventing an entry that has not shipped yet
prompt
<task>
<role>{{lens_role}}</role>
<input>
<slug>{{slug}}</slug>
<platform>{{platform}}</platform>
<entry_title>{{entry_title}}</entry_title>
<entry_published_at>{{entry_published_at}}</entry_published_at>
<abacus_path>{{abacus_path}}</abacus_path>
<today>{{today}}</today>
<source_notes>{{source_notes}}</source_notes>
</input>
<orientation>
Read the entry in full before writing a word:
{{abacus_path}}/{{lens_source_roots}}{{slug}}.md
You are repurposing a thing that exists. Every claim you make must trace
to that entry. If the entry hedges a number as inferred, you hedge it
too. If the entry does not say a thing, you do not say it either.
The entry's voice is the constraint that outranks the platform's. Match
it.
</orientation>
<lens>
<allowed_domains>{{lens_allowed_domains}}</allowed_domains>
<allowed_diagrams_primary>{{lens_allowed_diagrams_primary}}</allowed_diagrams_primary>
<allowed_diagrams_secondary>{{lens_allowed_diagrams_secondary}}</allowed_diagrams_secondary>
<anti_slop>{{lens_anti_slop}}</anti_slop>
<default_access>{{lens_default_access}}</default_access>
<sections>{{lens_sections}}</sections>
</lens>
<rules>
<rule>
Write for {{platform}} natively. The failure mode of this job is one
paragraph re-cut four ways: the same sentences with different line
breaks. If your output would work unchanged on another platform, you
have not used the lens.
</rule>
<rule>
No em dashes anywhere a reader can see them. This is the surface's
preference, not the platform's, and it applies to every lens.
</rule>
<rule>
Never claim the entry is featured on DOWNLINK. The featured slot is a
hardcoded constant in landing and this prompt cannot change it.
</rule>
<rule>
Honour {{source_notes}} when it carries copy the author already wrote.
Improve it against the lens rather than replacing it wholesale, and say
what you changed and why. Ignoring an author's own hook to write your
own is not a repurposing job.
</rule>
<rule>
Emit an abacus artefact, not a bare block of text. Type is social-post
for a single post (bluesky, linkedin, newsletter) and social-thread for
a sequential thread (x). Carry linked_journal: {{slug}} so the variant
points back at its entry, and stage it in 30-approved rather than
40-shipped: this prompt writes copy, it does not publish it, and
pretending otherwise puts unposted drafts in the shipped stage.
</rule>
<rule>
Do not date the artefact before {{entry_published_at}}. A variant that
predates the thing it links to is a lie the vault will preserve.
</rule>
<rule>
Copy the frontmatter shape from an existing artefact of the same type
in the vault rather than from _templates/, which is stale for these
surfaces.
</rule>
</rules>
<output_format>
<report>
Two or three sentences of plain prose first: the angle you took, why it
fits {{platform}} specifically, and anything in the entry you chose not
to use. If {{source_notes}} carried existing copy, say what you kept
and what you changed.
</report>
<file>
Then exactly one FILE-marker block:
<!-- FILE: 30-approved/social/{{platform}}-{{slug}}.md -->
...complete artefact, frontmatter and body...
<!-- END FILE -->
</file>
<verification>
Then state plainly that you checked: zero em dashes, every claim traces
to the entry, the lens anti-slop rules hold, and no engagement bait. If
a check fails, say which rather than claiming it passed.
</verification>
</output_format>
</task>
task
role
{{lens_role}}
input
slug
{{slug}}
platform
{{platform}}
entry_title
{{entry_title}}
entry_published_at
{{entry_published_at}}
abacus_path
{{abacus_path}}
today
{{today}}
source_notes
{{source_notes}}
orientation
Read the entry in full before writing a word: {{abacus_path}}/{{lens_source_roots}}{{slug}}.md You are repurposing a thing that exists. Every claim you make must trace to that entry. If the entry hedges a number as inferred, you hedge it too. If the entry does not say a thing, you do not say it either. The entry's voice is the constraint that outranks the platform's. Match it.
lens
allowed_domains
{{lens_allowed_domains}}
allowed_diagrams_primary
{{lens_allowed_diagrams_primary}}
allowed_diagrams_secondary
{{lens_allowed_diagrams_secondary}}
anti_slop
{{lens_anti_slop}}
default_access
{{lens_default_access}}
sections
{{lens_sections}}
rules
- Write for {{platform}} natively. The failure mode of this job is one paragraph re-cut four ways: the same sentences with different line breaks. If your output would work unchanged on another platform, you have not used the lens.
- No em dashes anywhere a reader can see them. This is the surface's preference, not the platform's, and it applies to every lens.
- Never claim the entry is featured on DOWNLINK. The featured slot is a hardcoded constant in landing and this prompt cannot change it.
- Honour {{source_notes}} when it carries copy the author already wrote. Improve it against the lens rather than replacing it wholesale, and say what you changed and why. Ignoring an author's own hook to write your own is not a repurposing job.
- Emit an abacus artefact, not a bare block of text. Type is social-post for a single post (bluesky, linkedin, newsletter) and social-thread for a sequential thread (x). Carry linked_journal: {{slug}} so the variant points back at its entry, and stage it in 30-approved rather than 40-shipped: this prompt writes copy, it does not publish it, and pretending otherwise puts unposted drafts in the shipped stage.
- Do not date the artefact before {{entry_published_at}}. A variant that predates the thing it links to is a lie the vault will preserve.
- Copy the frontmatter shape from an existing artefact of the same type in the vault rather than from _templates/, which is stale for these surfaces.
output_format
report
Two or three sentences of plain prose first: the angle you took, why it fits {{platform}} specifically, and anything in the entry you chose not to use. If {{source_notes}} carried existing copy, say what you kept and what you changed.
file
Then exactly one FILE-marker block: <!-- FILE: 30-approved/social/{{platform}}-{{slug}}.md --> ...complete artefact, frontmatter and body... <!-- END FILE -->
verification
Then state plainly that you checked: zero em dashes, every claim traces to the entry, the lens anti-slop rules hold, and no engagement bait. If a check fails, say which rather than claiming it passed.
notes
Failure modes:
- slug does not exist in 40-shipped/blog: guard.sh aborts. Repurposing an
unshipped entry is how you end up promising something that is not live.
- platform has no lens: guard.sh aborts and lists the available lenses.
- Entry is published:false: guard.sh warns. The variants would point at a
page that does not render.
- Unresolved {{lens_*}} placeholder survives rendering: guard.sh aborts.
Same defensive check the crumb extractor runs.
Voice rules that apply to every lens, because they are the surface's and
not the platform's:
- no em dashes in anything a reader sees. Author preference, no test
behind it.
- the entry's own voice is lowercase and plain. A variant that suddenly
sounds like a LinkedIn growth account is wrong even when the platform is
LinkedIn.
- never claim an entry is featured. The featured slot is a hardcoded
constant in landing and this prompt cannot change it.
On why this prompt exists: the artefact that seeded it arrived with a
cross_platform frontmatter block carrying an X thread, a LinkedIn post, a
Bluesky post and a newsletter excerpt. None of those fields are in the
abacus schema, and landing's transform.ts builds a whitelist, so they were
silently dropped at projection and the copy was lost. Social variants are
their own artefacts in the vault. That is what this emits.
description
Reads a shipped DOWNLINK entry from the abacus vault and emits one social artefact for a named platform, written natively for that platform rather than the same paragraph re-cut four ways. Platform selection is a lens, following the same mechanism the crumb extractor uses for audiences: each lens carries the voice, the length discipline, the permitted angles, and the anti-slop rules for its surface. Output is an abacus social-post or social-thread artefact with a linked_journal pointer back to the entry, so the variants live in the vault as first-class content instead of as inert frontmatter on the blog post. Use when an entry has shipped and needs its cross-platform variants.