Skip to content

Add /blog-next: the pipeline had no owner for what to write - #580

Merged
pftg merged 6 commits into
masterfrom
blog-next-skill
Aug 22, 2026
Merged

Add /blog-next: the pipeline had no owner for what to write#580
pftg merged 6 commits into
masterfrom
blog-next-skill

Conversation

@pftg

@pftg pftg commented Aug 22, 2026

Copy link
Copy Markdown
Member

Topic selection had no owner. Any request to write a post entered the pipeline at the draft step, so a decayed queue row or a dedup collision was only discovered after a draft existed. This adds the missing half and records what three live GSC pulls did to the queue.

Docs, skills and .okf/ only — no content/, no templates, no CSS. Per #577, docs-only merges on local gates.

Per commit

Add the /blog-next skill — Stage A (generate candidates, then audit them), Stage B (research), Stage C (outline + gate). Never writes a post; hands a gated outline to blog-post-coordinator.

The load-bearing rule, learned from two audits that falsified the queue's own lead item: search demand cannot generate topics on this property, it can only veto them. The blog earns ~0.69 named non-brand clicks/day and the ICP is absent from the query data, so a search-driven queue returns HOLD forever.

.gitignore needed three fixes for the skill to ship at all: the directory was ignored as claude-flow scaffolding; a directory negation does not cover file-pattern rules matching deeper; and .claude/**/*.json still swallowed evals.json inside the un-ignored directory. Caught by peer review, not by me — git check-ignore -v returns exit 0 on an un-ignored file, so it reads as confirmation either way. git status --untracked-files=all is the reliable check.

Wire /blog-next into the pipeline — both blog agents now accept a gated outline instead of re-deriving the topic; the batch orchestrator reads §13 (§12 was retired but still referenced).

Adds STEP 4e — SELF-CRITIQUE (BLOCKING): reflexion-reflect before the critic panel. Already live in the LinkedIn and course lanes, simply absent from the blog lane — the lane with the most voice-sensitive output.

Fixes a gate-inverting collision in CLAUDE.md: slop >= 8/10 (blog, higher better) and Slop <= 25 (course, 0-100, lower better) were both written as "the slop gate".

Content can run unattended, but only with three exits — SHIPPED / HOLD-with-evidence (a terminal success) / BLOCKED on a named decision. A two-exit loop always ships, because stopping feels like failing.

Not theoretical: two /blog-next runs this day correctly ended in HOLD. A two-exit loop writes both posts. The completion promise must be about gates, never quality — a promise containing "the post is good" is unfalsifiable, and an agent under loop pressure will assert it.

Three live GSC pulls — §13d/e/f, each recording the number that killed a row:

  • N2 falsified. Its 52x is a denominator, not a reader response: (c1/i1)/(c2/i2) factorises to 1.4x clicks × 37.2x impressions. N3's addressable volume corrected 6,895 → ~550 (synthetic query family).
  • §13d's own replacement retracted — one query, already won, ceiling +0.13 clicks/day.
  • N7 "how AI helps developers" DO-NOT-WRITE — 61 slugs already match, six of them shipped near-duplicate pairs; 180 query rows at zero clicks; and it addresses developers where the ICP is a non-technical founder.
  • N8 vertical ai agents FLAG-not-write — the first row whose arithmetic clears the demand floor, and still not worth a slot: family decaying 2x, SERP held by Salesforce/IBM/Google, our asset a 3-minute dev.to import.
  • N9 SCHEDULED — first-party benchmark of the AI code-search MCP tools.

analytics-access.md gains the traps these pulls earned: Trap C (page position is an artifact whenever the CTR is), Trap D (query-vs-query is the legitimate comparison level), the synthetic-query-family tell, and Trap A generalised — a filter truncates a denominator as readily as a row limit, and has_more: false means complete given the filter. Both generalisations came from my own errors this session, documented in §13f.

Rewrite bip-agents post idea-first — opened with a parable and reached the idea in beat 3; influencers in this lane open with the claim. 141 words, zero em dashes. reflexion-reflect caught three defects self-review had passed: a slogany flip, "explicitly rejected" where the notes say "deferred", and an unverifiable "The same morning".

§13g — Paul's "structure a team with AI harnesses" row resolves to UPGRADE claude-code-xp-team-workflow, not a new post. Stated in the section: that verdict rests on reading the post, not a measurement chain, so it did not pass the Stage A reviewer gate the other verdicts did — flagged so nobody later cites it as gate-passed.

Gates

  • bin/hugo-buildgreen, 1181 pages, no errors.
  • Visual suites correctly skipped: the diff touches no template, stylesheet or body HTML.

Review links

  • LinkedIn draft: http://localhost:<session port>/linkedin/personal/bip-agents-cancelled-own-backlog/

🤖 Generated with Claude Code

https://claude.ai/code/session_016PUkwFTsiv7EB2DYKogbpg

pftg and others added 6 commits August 22, 2026 13:07
The blog pipeline had no owner for topic selection. Any request to write
a post entered at the draft step, so a decayed queue row or a dedup
collision was only discovered after a draft existed.

/blog-next owns Stage A (generate candidates, then audit them), Stage B
(research primary sources) and Stage C (outline + gate), and hands a
gated outline to blog-post-coordinator. It never writes a post.

The load-bearing rule, learned from two audits that falsified the queue's
own lead item: search demand cannot GENERATE topics on this property, it
can only VETO them. The blog earns ~0.69 named non-brand clicks/day and
the ICP is absent from the query data, so a search-driven queue returns
HOLD forever.

.gitignore needed three fixes for the skill to ship at all: the directory
was ignored as claude-flow scaffolding, a directory negation does not
cover file-pattern rules matching deeper, and `.claude/**/*.json` still
swallowed evals.json inside an un-ignored directory.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016PUkwFTsiv7EB2DYKogbpg
Both blog agents now accept a gated outline from upstream instead of
re-deriving the topic, and blog-batch-orchestrator reads §13 (§12 was
retired but still referenced).

blog-pipeline.md gains STEP 4e - SELF-CRITIQUE (BLOCKING): reflexion-reflect
before the critic panel. That gate was already live in the LinkedIn and
course lanes and simply absent from the blog lane, which is the lane with
the most voice-sensitive output.

CLAUDE.md fixes a collision that could silently invert a gate: "slop >= 8/10"
(blog, higher is better) and "Slop <= 25" (course, 0-100, lower is better)
were both written as "the slop gate".

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016PUkwFTsiv7EB2DYKogbpg
A loop whose only outcomes are SHIPPED and ITERATE will always ship
something. Stopping feels like failing, so the loop manufactures a post.

Three exits: SHIPPED, HOLD-with-evidence (a terminal SUCCESS, not a
failure), BLOCKED on a named decision.

Evidence this is not theoretical: on 2026-08-22 two /blog-next runs
correctly ended in HOLD. The groomed queue's lead row was an artifact
(a 52x "finding" that factorises to 1.4x clicks x 37.2x impressions),
and its same-day replacement failed dedup. A two-exit loop would have
written both.

The completion promise must be about GATES, never about quality. A promise
containing "the post is good" is unfalsifiable, and an agent under loop
pressure will assert it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016PUkwFTsiv7EB2DYKogbpg
…uled

20.09 gains §13d/e/f, each recording the number that killed a row so
nobody re-proposes it from intuition next quarter.

- §13d: N2 FALSIFIED. Its 52x is a denominator, not a reader response -
  (c1/i1)/(c2/i2) factorises to 1.4x clicks x 37.2x impressions. N3's
  addressable volume corrected 6,895 -> ~550 (synthetic query family).
- §13e: §13d's own replacement retracted - one query, already won, ceiling
  +0.13 clicks/day. Demand floor introduced: 0.69 non-brand clicks/day.
- §13f: N7 "how AI helps developers" DO-NOT-WRITE (61-slug saturation with
  six shipped near-duplicate pairs, 180 query rows at zero clicks, and it
  addresses developers where the ICP is a non-technical founder). N8
  `vertical ai agents` FLAG-not-write - the first row whose arithmetic
  clears the floor, still not worth a slot. N9 SCHEDULED.

analytics-access.md gains the traps these pulls earned: Trap C (page
position is an artifact whenever the CTR is), Trap D (query-vs-query is
the legitimate comparison level), the synthetic-query-family tell, and
Trap A generalised - a FILTER truncates a denominator as readily as a row
limit, and `has_more: false` means complete GIVEN THE FILTER.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016PUkwFTsiv7EB2DYKogbpg
The draft opened with a parable and reached the idea in beat 3. Influencer
posts in this lane (Cutler, Rossi, Holub) open with the claim and use the
anecdote as evidence. Rewritten to that skeleton: 141 words, zero em dashes.

reflexion-reflect caught three defects before handback that self-review
had passed: a slogany flip ("does the opposite. It refuses work"), "explicitly
rejected" where the notes say "deferred", and an unverifiable "The same morning".

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016PUkwFTsiv7EB2DYKogbpg
The row "how to structure team with AI harnesses without losing the control"
collides near-totally with claude-code-xp-team-workflow (2026-05-04), which
already carries the roles, the cadences, and the arbitration rule.

Recorded as an UPGRADE with the material the published post predates: three
exits rather than two, HOLD as a terminal success, author≠verifier as a
different agent TYPE, and four errors the gates caught that self-review passed.

Job declared arrival-purposed, so the search floor does not apply - quoting it
would be the category error §13e warns about.

Stated in the section: this verdict rests on READING the post, not on a
measurement chain, so it did not go through the Stage A reviewer gate that
§13d/e/f verdicts did. Flagged so nobody later cites it as gate-passed.

The verdict had been reported in chat only, which the async-first rule forbids -
a task is not done until a cold session can read its state with zero questions.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016PUkwFTsiv7EB2DYKogbpg
@coderabbitai

coderabbitai Bot commented Aug 22, 2026

Copy link
Copy Markdown
Contributor

Important

  • 🔍 Trigger review

This repository does not receive automatic reviews because it has fewer than 10 stars.

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 776db92a-25e9-4e07-abde-1b25198961f8


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@pftg
pftg merged commit c87a5e5 into master Aug 22, 2026
4 checks passed
@pftg
pftg deleted the blog-next-skill branch August 22, 2026 11:45
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant