docs(marketing): document blog picker performance bias and comparison-listicle conventions#1288
docs(marketing): document blog picker performance bias and comparison-listicle conventions#1288antoinedc wants to merge 1 commit into
Conversation
…-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 SummaryThis doc-only PR adds four sections to
Confidence Score: 2/5Not 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
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"]
|
| @@ -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. | |||
|
|
|||
There was a problem hiding this 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.
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.| **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. | ||
|
|
There was a problem hiding this 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).
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.|
|
||
| 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 |
There was a problem hiding this 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.
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.
Summary
Doc-only follow-up to #1287. Updates
.claude/references/MARKETING.mdso future sessions/contributors understand the new picker behavior without re-reading the code.Adds:
CLUSTER_PERFORMANCE_MULTIPLIERinconfig.js, applied inclassifyAndScore. Sourced from PostHog 30d sustained-traffic data, refresh quarterly.pickNextTopicforce-picks a comparison-listicle every 4 articles fromLISTICLE_TOPICS, seeded withnode blog/pipeline/seed-listicles.js(idempotent).pickNextTopicuses frontmatterdate:for chronological ordering, notarticlePath(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