fix(blog): hard story blacklist in STEP4 + LinkedIn — ban 2AM/dirty connector/lab-vs-prod stories

10 specific story patterns banned directly in draft prompt.
LinkedIn banned hooks: 'Everything looks fine', 'CRC creeping', 'Same optics same setup'.
Title Contract now injected into STEP4 as binding constraint.
This commit is contained in:
Rene Fichtmueller 2026-04-05 23:55:56 +02:00
parent 80435f8e07
commit c43e1f881a
2 changed files with 45 additions and 2 deletions

View File

@ -504,14 +504,41 @@ TECHNICAL ACCURACY (HARD FAILS):
- SR4 and DR4 both use 8 fibers. Difference = fiber type (MMF vs SMF), not count.
- 400G per port 10-15W. Not per chassis. Not "1kW per port."
STORY BLACKLIST HARD BAN (auto-reject if any appear)
The following story patterns have been used too many times. They are BANNED:
1. "I remember working on a deployment/migration at 2AM..." BANNED
2. "Everything looked clean in the lab, but production..." BANNED
3. "CRC errors started creeping in after hours of operation" BANNED
4. "Optics get blamed first. Swapped. Replaced. Moved." BANNED
5. "Someone finally checked the physical layer / grabbed a scope" BANNED
6. "Same optics. Same setup. Different result." BANNED (as climax)
7. "It was a dirty connector" BANNED (as story resolution)
8. "400G doesn't fail in design. It fails when..." BANNED (as ending)
9. Late-night debugging stories of any kind BANNED
10. Any "lab vs production" arc as the main story BANNED
INSTEAD match your stories to the TITLE CONTRACT angle:
- ECONOMIC article use cost examples, TCO math, budget surprises, SLA penalty stories
- DECISION article use procurement scenarios, vendor negotiations, comparison frameworks
- MARKET article use pricing data, trend observations, timing decisions
- OPERATIONAL article use process improvements, validation playbooks, team workflows
- MIGRATION article use timeline realities, planning vs reality, month-by-month observations
{{TITLE_CONTRACT_INJECT}}
CONTENT APPROACH:
- Include production failures as narrative ("links that don't behave consistently")
- Match ALL content to the Title Contract promise every paragraph must serve the headline
- Include real costs as consequences in the flow ("that's where the real cost sits")
- Include what not to do as a single direct statement, not a section
- Every number gets context (deployment size, vendor type, conditions)
- Max 3-4 core ideas pick the best and develop them through experience
- ONE story max per article and it must be relevant to the ANGLE, not the physical layer default
MINIMUM 2500 words. No placeholders. No TODO markers. No sections. Complete prose article.
@ -2147,6 +2174,21 @@ export const STEP_LINKEDIN_POST = `Write a LinkedIn post for this article using
GOAL: Posts that feel like real experience. Not content. Not marketing.
BANNED HOOKS (already used do NOT repeat):
- "Everything looks fine. Until it doesn't." BANNED
- "You bring up a new batch of 400G links..." BANNED
- "Lab tests were clean. Traffic is stable." BANNED
- Any variation of the Physical Layer debugging story BANNED
BANNED BEATS:
- "CRC errors start creeping in" BANNED
- "Optics get blamed. Swapped. Replaced." BANNED
- "Same optics. Same setup. Different result." BANNED (as punchline)
- "At 100G, you get away with it. At 400G, you don't." BANNED (overused closer)
You MUST create a FRESH hook and story that matches THIS article's angle.
Read the article and extract its UNIQUE angle then write a post about THAT, not about physical layer debugging.
Engineers must recognize themselves in this post.
Not be lectured. Not be sold to. Not be impressed by vocabulary.

View File

@ -1174,7 +1174,8 @@ async function runLlmPipeline(
const step4 = await generate(systemPrompt,
STEP4_MASTER_DRAFT
.replace("{{OUTLINE}}", step3.text)
.replace("{{CONTEXT_DATA}}", contextData + "\n\nTITLE CONTRACT (you MUST fulfill this — the article must match the headline promise):\n" + titleContract),
.replace("{{TITLE_CONTRACT_INJECT}}", "TITLE CONTRACT FOR THIS ARTICLE (BINDING — every paragraph must serve this promise):\n" + titleContract)
.replace("{{CONTEXT_DATA}}", contextData),
{ ...LLM_OPTS, maxTokens: 8192 }
);
stepsCompleted = 4;