diff --git a/plugins/linkedin-studio/CHANGELOG.md b/plugins/linkedin-studio/CHANGELOG.md index 63fb634..afbd9be 100644 --- a/plugins/linkedin-studio/CHANGELOG.md +++ b/plugins/linkedin-studio/CHANGELOG.md @@ -305,7 +305,7 @@ First formal version. Previously unversioned. - 15 specialized agents - 8 hooks for workflow automation - Analytics system with CSV import -- 360Brew profile optimization (January 2026 algorithm update) +- Profile/topic-relevance optimization - Content matrix system (40+ post ideas from single topic) - Personalization engine - 20 reference documents for LinkedIn best practices diff --git a/plugins/linkedin-studio/references/glossary.md b/plugins/linkedin-studio/references/glossary.md index 20c8dc2..6949fa4 100644 --- a/plugins/linkedin-studio/references/glossary.md +++ b/plugins/linkedin-studio/references/glossary.md @@ -7,7 +7,7 @@ Alphabetical glossary of specialized terminology used across the plugin. Each te ## 3 ### Profile/topic relevance -LinkedIn's 150-parameter foundation model that validates creator profiles before distributing content. Checks expertise alignment across About section, Experience, content history, network quality, and engagement patterns. Content from unvalidated profiles receives limited distribution. +How well a creator's profile and expertise align with the topic they post about — a real input to LinkedIn's 2026 relevance-ranking model that gates distribution. The model checks expertise alignment across the About section, Experience, content history, network quality, and engagement patterns; content from profiles with weak topic alignment receives limited distribution. (The relevance-ranking model's production name and size are not publishable as fact — see `references/algorithm-signals-reference.md`.) **Used in:** `references/algorithm-signals-reference.md`, `skills/linkedin-studio/SKILL.md`, `agents/content-optimizer.md` diff --git a/plugins/linkedin-studio/scripts/test-runner.sh b/plugins/linkedin-studio/scripts/test-runner.sh index ebb6f35..96b50fb 100755 --- a/plugins/linkedin-studio/scripts/test-runner.sh +++ b/plugins/linkedin-studio/scripts/test-runner.sh @@ -202,19 +202,82 @@ echo "--- Algorithm-Stat Consistency ---" # - Video-multiplier folklore: "5x more conversations" → reference: video declining, no multiplier # - Engagement-coefficient system: 7-9x, 2.5x, 0.2x, (10x), (8x), "10x weight" # → reference: "never hard coefficients to optimize against" -# - Model params/brand/date: 150B param / 150 billion param / 360Brew / January 2026 +# - Model params/brand/date: the PATTERN CLASS [0-9]+[ -]?(B|billion)?[ -]?param +# (covers 150-parameter / 150B param / 150 billion param) / 360Brew / January 2026 # → reference: "Not publishable as fact" +# +# S10: the model-precision token is now the pattern CLASS, not a literal-token +# list. S9 forbade only "150 ?B param|150 billion param"; a hyphenated +# "150-parameter" (no "B") slipped both the discovery grep and the lint, surviving +# in glossary.md:10. The criterion is "no asserted model precision in ANY surface +# form", so the lint now enforces the shape (a number adjacent to "param"), not an +# enumeration. An adjacent digit is REQUIRED, so legitimate "param" uses with no +# leading number — "Language parameter", "parameterized", "different parameters", +# "«parametere»", "175-milliarders parametermodell" — do not match. # Bare "10x"/"15x"/"5x" are deliberately NOT forbidden — they carry legitimate # uses (collaboration "10x your reach" hyperbole, "5x5x5", posting cadence, pixel # dims like 1080x1350), so each token targets the retired *phrasing*, not the bare # number. # # Scope covers every dir the criterion's grep covers, including assets/checklists/ -# (the 360Brew survivor lived there, outside the S8 scan) and assets/templates/. -# assets/{templates,checklists}/ — not all of assets/ — keeps the scan off +# (the 360Brew survivor lived there, outside the S8 scan), assets/templates/, and +# CHANGELOG.md (S10: the 360Brew/January-2026 survivor lived there, outside the S9 +# scope). assets/{templates,checklists}/ — not all of assets/ — keeps the scan off # gitignored runtime data (assets/analytics/, assets/drafts/, voice-samples/). -STALE_STATS='40-50%|25-40%|6\.6%|6\.60%|1\.92%|15x more reach|15x more algorithmic|5x more effective|5x less valuable|5x more reach than|5x more conversations|7-9x|2\.5x|0\.2x|\(10x\)|\(8x\)|10x weight|-40-60%|150 ?B param|150 billion param|360Brew|January 2026' -STAT_HITS=$(grep -rnE "$STALE_STATS" references/ commands/ skills/ hooks/prompts/ agents/ assets/templates/ assets/checklists/ CLAUDE.md README.md .claude-plugin/plugin.json 2>/dev/null | grep -v 'algorithm-signals-reference' || true) +STALE_STATS='40-50%|25-40%|6\.6%|6\.60%|1\.92%|15x more reach|15x more algorithmic|5x more effective|5x less valuable|5x more reach than|5x more conversations|7-9x|2\.5x|0\.2x|\(10x\)|\(8x\)|10x weight|-40-60%|[0-9]+[ -]?(B|billion)?[ -]?param|360Brew|January 2026' +# Non-vacuity self-test (S10). A grep criterion is only meaningful if it actually +# MATCHES the forbidden forms and does NOT match legitimate ones. S7→S9 each +# shipped a lint that passed green while a survivor slipped, because the proof was +# run once by hand and never committed — so a hyphenated "150-parameter" form was +# never re-checked. This makes the proof PERMANENT: it runs on every invocation +# BEFORE the real scan, so narrowing STALE_STATS back to a literal-token list fails +# the suite instead of silently certifying an unenforced criterion. The positive +# set covers all three model-precision surface forms (incl. the exact S10 +# "150-parameter" survivor); the negative set covers the legitimate "param"/x uses +# that live in the tree today. +SELFTEST_OK=1 +while IFS= read -r probe; do + [ -z "$probe" ] && continue + if ! echo "$probe" | grep -qE "$STALE_STATS"; then + SELFTEST_OK=0; echo " non-vacuity FAIL: forbidden form not caught -> $probe" + fi +done <<'POSITIVE' +40-50% link penalty +6.6% carousel rate +1.92% reach +15x more reach +5x more conversations +7-9x weight +(10x) coefficient +10x weight +150-parameter foundation model +150B parameter foundation model +150 billion parameter model +360Brew +January 2026 algorithm update +POSITIVE +while IFS= read -r probe; do + [ -z "$probe" ] && continue + if echo "$probe" | grep -qE "$STALE_STATS"; then + SELFTEST_OK=0; echo " false-positive FAIL: legitimate form caught -> $probe" + fi +done <<'NEGATIVE' +5x5x5 pre-posting method +post 3x per week +1080x1350 pixels +10x your reach +Language parameter (configurable) +parameterized content-gatekeeper +Start over with different parameters +175-milliarders parametermodell +NEGATIVE +if [ "$SELFTEST_OK" -eq 1 ]; then + pass "STALE_STATS self-test: 13 forbidden forms caught, 8 legitimate forms ignored" +else + fail "STALE_STATS self-test failed — the lint no longer enforces the full criterion" +fi + +STAT_HITS=$(grep -rnE "$STALE_STATS" references/ commands/ skills/ hooks/prompts/ agents/ assets/templates/ assets/checklists/ CLAUDE.md README.md CHANGELOG.md .claude-plugin/plugin.json 2>/dev/null | grep -v 'algorithm-signals-reference' || true) if [ -z "$STAT_HITS" ]; then pass "no stale algorithm magnitudes / model brand outside the canonical reference" else