fix(linkedin-studio): S10 — generalize stale-stat lint to the pattern class + permanent non-vacuity self-test
Closes the S9 re-review (1 BLOCKER + 2 MAJOR, all grep-verified). The survivor
set converged 8 -> 6 -> 2; this closes the meta-problem behind the convergence,
not just the two lines.
BLOCKER — references/glossary.md:10: drop the fabricated "150-parameter
foundation model" (a garbled 150B that the S9 enumerative grep/lint, requiring a
"B"/"billion", could not match). Reframe to "a real input to LinkedIn's 2026
relevance-ranking model" with no parameter count, citing
algorithm-signals-reference.md inline — which makes the :12 "Used in" provenance
accurate (the reference does state the relevance-ranking framing; it never stated
"150-parameter").
MAJOR — CHANGELOG.md:308: de-brand "360Brew profile optimization (January 2026
algorithm update)" -> "Profile/topic-relevance optimization". Removes the
unpublishable brand + asserted Jan-2026 date, honouring v4.0.0's "removed
everywhere" claim. It was the only STALE_STATS hit in CHANGELOG.
MAJOR — scripts/test-runner.sh: the rebuilt lint was enumerative on surface form.
Generalize it to the PATTERN CLASS so the same grep that defines the SC fails on
any surface form, present or future:
- STALE_STATS model token: "150 ?B param|150 billion param"
-> "[0-9]+[ -]?(B|billion)?[ -]?param"
(covers 150-parameter / 150B param / 150 billion param). This robustifies the
review's literal suggestion "[0-9]+[ -]?(B|billion )?param", which missed the
space form "150B param"; the separator is moved out of the group.
- STAT_HITS grep scope += CHANGELOG.md (the 360Brew survivor lived outside it).
- Permanent non-vacuity SELF-TEST before the real scan: 13 forbidden probes must
match (incl. the exact "150-parameter" survivor), 8 legitimate probes must not
("Language parameter", "parameterized", "different parameters",
"175-milliarders parametermodell", 5x5x5, cadence, pixel dims, "10x your
reach"). S7->S9 each shipped a green lint because the proof was run by hand and
never committed; this makes narrowing STALE_STATS fail the suite.
Verification: test-runner.sh 67/0/0 exit 0 (was 66/0/0; +1 self-test);
node --test 94/94; broadened exhaustive grep across the tree -> zero survivors.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
parent
0c9c02a2b1
commit
853cad3ade
3 changed files with 70 additions and 7 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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`
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue