From c43e1f881aa442f34f5905a48402c19360ddd193 Mon Sep 17 00:00:00 2001 From: Rene Fichtmueller Date: Sun, 5 Apr 2026 23:55:56 +0200 Subject: [PATCH] =?UTF-8?q?fix(blog):=20hard=20story=20blacklist=20in=20ST?= =?UTF-8?q?EP4=20+=20LinkedIn=20=E2=80=94=20ban=202AM/dirty=20connector/la?= =?UTF-8?q?b-vs-prod=20stories?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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. --- packages/api/src/llm/fo-blog-pipeline.ts | 44 +++++++++++++++++++++++- packages/api/src/routes/blog.ts | 3 +- 2 files changed, 45 insertions(+), 2 deletions(-) diff --git a/packages/api/src/llm/fo-blog-pipeline.ts b/packages/api/src/llm/fo-blog-pipeline.ts index 31f6844..f51cb41 100644 --- a/packages/api/src/llm/fo-blog-pipeline.ts +++ b/packages/api/src/llm/fo-blog-pipeline.ts @@ -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. diff --git a/packages/api/src/routes/blog.ts b/packages/api/src/routes/blog.ts index dd4a1ab..a545404 100644 --- a/packages/api/src/routes/blog.ts +++ b/packages/api/src/routes/blog.ts @@ -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;