Skip to content

docs(marketing): document blog picker performance bias and comparison-listicle conventions#1288

Open
antoinedc wants to merge 1 commit into
developfrom
docs/blog-picker-conventions
Open

docs(marketing): document blog picker performance bias and comparison-listicle conventions#1288
antoinedc wants to merge 1 commit into
developfrom
docs/blog-picker-conventions

Conversation

@antoinedc
Copy link
Copy Markdown
Member

Summary

Doc-only follow-up to #1287. Updates .claude/references/MARKETING.md so future sessions/contributors understand the new picker behavior without re-reading the code.

Adds:

  • Per-cluster performance multipliersCLUSTER_PERFORMANCE_MULTIPLIER in config.js, applied in classifyAndScore. Sourced from PostHog 30d sustained-traffic data, refresh quarterly.
  • Comparison Listicle as the 6th content type — corrects the previous "5 Content Types" line.
  • Listicle cadence overridepickNextTopic force-picks a comparison-listicle every 4 articles from LISTICLE_TOPICS, seeded with node blog/pipeline/seed-listicles.js (idempotent).
  • Recency ordering notepickNextTopic uses frontmatter date: for chronological ordering, not articlePath (slug, no date prefix). Same gotcha Greptile flagged on Bias blog picker toward proven-performing clusters; schedule comparison-listicles every 4 articles #1287.

No code changes. No behavior changes.

Test plan

🧙 Built with WOZCODE

…-listicle content type, and listicle cadence override

Future sessions need to know:
- Cluster scores are multiplied by CLUSTER_PERFORMANCE_MULTIPLIER (config.js)
  before the threshold check; refresh the constants quarterly from PostHog
- There are now 6 content types, not 5 (Comparison Listicle added)
- pickNextTopic() force-picks a listicle every 4 articles via
  LISTICLE_TOPICS in config.js, seeded onto the GH project board with
  seed-listicles.js (idempotent)
- pickNextTopic uses frontmatter date:, not articlePath, to order
  Published cards chronologically — articlePath is a slug, no date prefix

Co-Authored-By: WOZCODE <contact@withwoz.com>
@greptile-apps
Copy link
Copy Markdown

greptile-apps Bot commented May 4, 2026

Greptile Summary

This doc-only PR adds four sections to .claude/references/MARKETING.md describing picker behavior said to have landed in #1287, but none of the documented features are present in the codebase: CLUSTER_PERFORMANCE_MULTIPLIER is absent from config.js, comparison-listicle is not in contentTypeOptions, LISTICLE_TOPICS and seed-listicles.js don't exist, and pickNextTopic contains no listicle-cadence or frontmatter-date logic.

  • P1CLUSTER_PERFORMANCE_MULTIPLIER and per-cluster multiplier logic are not in config.js or classify.js.
  • P1comparison-listicle content type is not registered; LISTICLE_TOPICS, seed-listicles.js, and the every-4-articles cadence don't exist anywhere.
  • P1pickNextTopic never reads frontmatter date:; the recency-ordering note documents a non-existent code path.

Confidence Score: 2/5

Not safe to merge — the documentation describes multiple features that don't exist in the codebase, which will mislead future contributors.

Four independent P1 findings: every new section added by this PR documents code (constants, files, logic) that is absent from the actual pipeline implementation. The PR's own test plan asks to confirm the documented behavior matches what landed in #1287, but that check would fail across all four additions.

.claude/references/MARKETING.md — all four new sections document non-existent functionality.

Important Files Changed

Filename Overview
.claude/references/MARKETING.md Documentation update describing four features — CLUSTER_PERFORMANCE_MULTIPLIER, comparison-listicle content type, LISTICLE_TOPICS/seed-listicles.js listicle cadence, and frontmatter-based recency ordering — none of which exist in the actual pipeline code (config.js, classify.js, project.js).

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    A["MARKETING.md documents"] --> B["CLUSTER_PERFORMANCE_MULTIPLIER\nin config.js"]
    A --> C["comparison-listicle\ncontent type"]
    A --> D["LISTICLE_TOPICS + seed-listicles.js\n+ every-4-articles cadence"]
    A --> E["pickNextTopic reads\nfrontmatter date:"]

    B -->|"❌ Does not exist"| F["config.js has no such constant\nclassify.js has no multiplier logic"]
    C -->|"❌ Not registered"| G["contentTypeOptions has 5 keys only\nsuggestContentType never returns it"]
    D -->|"❌ Does not exist"| H["LISTICLE_TOPICS absent from config.js\nseed-listicles.js file missing\npickNextTopic has no cadence override"]
    E -->|"❌ Incorrect"| I["pickNextTopic sorts by score only\nno frontmatter parsing, no articlesSinceListicle"]
Loading

Comments Outside Diff (1)

  1. .claude/references/MARKETING.md, line 115 (link)

    P1 pickNextTopic does not read frontmatter date: fields

    The actual implementation in project.js reads project board items via gh project item-list and sorts exclusively by score (line 140). It never touches article frontmatter or counts articlesSinceListicle. Documenting a date: gotcha for a code path that doesn't exist may mislead contributors debugging unrelated ordering issues.

    Prompt To Fix With AI
    This is a comment left during a code review.
    Path: .claude/references/MARKETING.md
    Line: 115
    
    Comment:
    **`pickNextTopic` does not read frontmatter `date:` fields**
    
    The actual implementation in `project.js` reads project board items via `gh project item-list` and sorts exclusively by `score` (line 140). It never touches article frontmatter or counts `articlesSinceListicle`. Documenting a `date:` gotcha for a code path that doesn't exist may mislead contributors debugging unrelated ordering issues.
    
    How can I resolve this? If you propose a fix, please make it concise.

    Fix in Claude Code

Fix All in Claude Code

Prompt To Fix All With AI
Fix the following 4 code review issues. Work through them one at a time, proposing concise fixes.

---

### Issue 1 of 4
.claude/references/MARKETING.md:89
**Documented constant does not exist in `config.js`**

`CLUSTER_PERFORMANCE_MULTIPLIER` is not defined anywhere in `blog/pipeline/config.js` or anywhere else in the repo. Similarly, `classifyAndScore` in `classify.js` contains no per-cluster multiplier logic — it scores purely with `WEIGHTS` constants. A contributor following this doc to "update the constants" after refreshing PostHog data will find nothing to update.

### Issue 2 of 4
.claude/references/MARKETING.md:93
**`comparison-listicle` content type is not registered in `config.js`**

`PROJECT.contentTypeOptions` in `config.js` has exactly 5 keys (`erc-tutorial`, `eip-explainer`, `research-deep-dive`, `upgrade-guide`, `trend-survey`) — `comparison-listicle` is absent. `suggestContentType` in `classify.js` never returns that value either. Any card the picker tries to set with this type will silently skip the field assignment (see `setProjectFields` — it no-ops when `contentTypeOptionId` is falsy).

### Issue 3 of 4
.claude/references/MARKETING.md:103-113
**Listicle cadence, `LISTICLE_TOPICS`, and `seed-listicles.js` do not exist**

Three things documented here are absent from the codebase: (1) `LISTICLE_TOPICS` is not defined in `config.js`; (2) `blog/pipeline/seed-listicles.js` does not exist; (3) `pickNextTopic` in `project.js` has no listicle-cadence override, no `articlesSinceListicle` counter, and no force-pick logic — it simply returns the highest-scoring Detected/Backlog card sorted by score. Running `node blog/pipeline/seed-listicles.js` as instructed will throw `MODULE_NOT_FOUND`.

### Issue 4 of 4
.claude/references/MARKETING.md:115
**`pickNextTopic` does not read frontmatter `date:` fields**

The actual implementation in `project.js` reads project board items via `gh project item-list` and sorts exclusively by `score` (line 140). It never touches article frontmatter or counts `articlesSinceListicle`. Documenting a `date:` gotcha for a code path that doesn't exist may mislead contributors debugging unrelated ordering issues.

Reviews (1): Last reviewed commit: "docs(marketing): document cluster perfor..." | Re-trigger Greptile

@@ -87,9 +87,11 @@ Collects from 5 sources, classifies into 12 topic clusters, scores, creates GitH

**Scoring weights:** EIP=3, ERC=3, ethresearch=2, arxiv=2, magicians=1, Google Trends=0.5. Threshold: 5 pts.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Documented constant does not exist in config.js

CLUSTER_PERFORMANCE_MULTIPLIER is not defined anywhere in blog/pipeline/config.js or anywhere else in the repo. Similarly, classifyAndScore in classify.js contains no per-cluster multiplier logic — it scores purely with WEIGHTS constants. A contributor following this doc to "update the constants" after refreshing PostHog data will find nothing to update.

Prompt To Fix With AI
This is a comment left during a code review.
Path: .claude/references/MARKETING.md
Line: 89

Comment:
**Documented constant does not exist in `config.js`**

`CLUSTER_PERFORMANCE_MULTIPLIER` is not defined anywhere in `blog/pipeline/config.js` or anywhere else in the repo. Similarly, `classifyAndScore` in `classify.js` contains no per-cluster multiplier logic — it scores purely with `WEIGHTS` constants. A contributor following this doc to "update the constants" after refreshing PostHog data will find nothing to update.

How can I resolve this? If you propose a fix, please make it concise.

Fix in Claude Code

**Per-cluster performance multipliers** (`CLUSTER_PERFORMANCE_MULTIPLIER` in `config.js`, applied in `classifyAndScore`): boost top performers (account-abstraction, security-auditing, evm-internals at 1.3-1.5x) and dampen underperformers (ai-agents-onchain 0.7x, zk-cryptography 0.6x). Derived from PostHog 30d sustained-traffic data. **Refresh quarterly** by re-running the analysis and updating the constants.

**12 Topic Clusters:** AI Agents Onchain, Account Abstraction, Encrypted Mempools & Privacy, Payments & Streams, Security & Auditing, L2 & Rollups, ZK & Cryptography, DeFi Primitives, NFT & Token Standards, EVM Internals, Protocol & Networking, Governance & Standards.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 comparison-listicle content type is not registered in config.js

PROJECT.contentTypeOptions in config.js has exactly 5 keys (erc-tutorial, eip-explainer, research-deep-dive, upgrade-guide, trend-survey) — comparison-listicle is absent. suggestContentType in classify.js never returns that value either. Any card the picker tries to set with this type will silently skip the field assignment (see setProjectFields — it no-ops when contentTypeOptionId is falsy).

Prompt To Fix With AI
This is a comment left during a code review.
Path: .claude/references/MARKETING.md
Line: 93

Comment:
**`comparison-listicle` content type is not registered in `config.js`**

`PROJECT.contentTypeOptions` in `config.js` has exactly 5 keys (`erc-tutorial`, `eip-explainer`, `research-deep-dive`, `upgrade-guide`, `trend-survey`) — `comparison-listicle` is absent. `suggestContentType` in `classify.js` never returns that value either. Any card the picker tries to set with this type will silently skip the field assignment (see `setProjectFields` — it no-ops when `contentTypeOptionId` is falsy).

How can I resolve this? If you propose a fix, please make it concise.

Fix in Claude Code

Comment on lines 103 to 113

Picks the highest-scoring "Detected" card (round-robin by cluster), runs 3-phase Claude pipeline, generates images, publishes directly to develop. No manual review step.

**Listicle cadence override** (`pickNextTopic` in `project.js`): every 4 articles, force-pick the highest-scoring `comparison-listicle` from Detected/Backlog if any exist. Listicles outperform other formats ~3x but the trend scan doesn't generate them — they come from `LISTICLE_TOPICS` in `config.js`, seeded onto the project board via `node blog/pipeline/seed-listicles.js`.

**Adding a new listicle topic:** append to `LISTICLE_TOPICS` (title, cluster, score, body brief), run `node blog/pipeline/seed-listicles.js` (idempotent — skips existing titles). The picker will surface it on its next listicle-cadence trigger.

**Recency ordering:** `pickNextTopic` reads `date:` from each Published article's frontmatter to count `articlesSinceListicle` correctly. Don't try to use `articlePath` for ordering — it's a slug, not date-prefixed.

**Execution flow:**
1. `git pull` latest develop
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Listicle cadence, LISTICLE_TOPICS, and seed-listicles.js do not exist

Three things documented here are absent from the codebase: (1) LISTICLE_TOPICS is not defined in config.js; (2) blog/pipeline/seed-listicles.js does not exist; (3) pickNextTopic in project.js has no listicle-cadence override, no articlesSinceListicle counter, and no force-pick logic — it simply returns the highest-scoring Detected/Backlog card sorted by score. Running node blog/pipeline/seed-listicles.js as instructed will throw MODULE_NOT_FOUND.

Prompt To Fix With AI
This is a comment left during a code review.
Path: .claude/references/MARKETING.md
Line: 103-113

Comment:
**Listicle cadence, `LISTICLE_TOPICS`, and `seed-listicles.js` do not exist**

Three things documented here are absent from the codebase: (1) `LISTICLE_TOPICS` is not defined in `config.js`; (2) `blog/pipeline/seed-listicles.js` does not exist; (3) `pickNextTopic` in `project.js` has no listicle-cadence override, no `articlesSinceListicle` counter, and no force-pick logic — it simply returns the highest-scoring Detected/Backlog card sorted by score. Running `node blog/pipeline/seed-listicles.js` as instructed will throw `MODULE_NOT_FOUND`.

How can I resolve this? If you propose a fix, please make it concise.

Fix in Claude Code

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