fix(linkedin-studio): S12 — close S11 re-review + render-chain-propagation lint guard
Closes the 2 grep-verified findings from the S11 cold full-brief re-review
(docs/remediation/review.md, BLOCK 1/0/1/0, 0 dropped). Both were the NEXT
RING of the meta-class S10/S11 converged: a propagation miss — the fix had
landed where the SC named the file, not in the render-source it depends on.
BLOCKER (command->reference propagation): references/ab-testing-framework.md:166
still shipped the banned A/B "Significant? (>20%)" Yes/No verdict column while
commands/ab-test.md (which RENDERS from it, inlined at :30, presented at :69)
had been cleaned to the honest "Directional?" framing. Re-framed the reference
result template to match the command verbatim (header + the directional note)
and retuned :38 "20% significance threshold" -> "minimum-meaningful-difference
threshold". The whole render chain is now significance-verdict-free.
MINOR ($-replacement, class-closed not line-patched): the newest-first section
appends/rewrites in hooks/scripts/state-updater.mjs passed a replacement STRING
embedding untrusted user content to String.replace, so dollar-sequences
($1 / $& / dollar-backtick / dollar-apostrophe / $$) in a topic/hook/partner
(e.g. "$100 budget cut") re-injected the captured heading and dropped
characters, silently corrupting state. Converted all 5 content-bearing sites
(Recent Posts, prune, Milestone Log, First-Hour, Outreach) to replacement
FUNCTIONS; the 3 remaining $1 sites only interpolate date scalars. +4
$-bearing regression tests — incl. the prune fixture, which itself had to
switch to a function (the bug bit the fixture as it was being written).
META (generalize the lint to the propagation-miss class): new test-runner.sh
Section 11 — render-chain propagation guard. Forbids the significance-verdict
column (Significant? adjacent to "(" or a table pipe) across the WHOLE render
chain (commands + every inlined reference + adjacent surfaces), with a
permanent non-vacuity self-test (3 verdict forms caught, 6 legitimate
Significant/significance/Directional? forms ignored) and an e2e mutation-proof.
Generalizes S10/S11's "fix the class, not the line" to command->reference.
Pre-patch render-chain sweep confirmed ab-testing-framework.md was the SOLE
propagation survivor (so a 6th review finds no 3rd). test-runner.sh 70/0/0;
node --test 98/98. CLAUDE.md lint enumeration synced.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
parent
433c2efb3d
commit
36f79dd702
5 changed files with 183 additions and 10 deletions
|
|
@ -12,7 +12,9 @@
|
|||
# tree) was added in remediation Step 3; the version-consistency grep in
|
||||
# Step 21; the agent model-consistency guard (each agents/<name>.md frontmatter
|
||||
# model: must match every surface declaration, and canonical rosters must list
|
||||
# every agent) in S11. All three are live below (Sections 8, 9 and 10).
|
||||
# every agent) in S11; the render-chain propagation guard (no honesty pattern a
|
||||
# command was cleaned of survives in the reference it renders from) in S12. All
|
||||
# four are live below (Sections 8, 9, 10 and 11).
|
||||
#
|
||||
# Usage: bash scripts/test-runner.sh
|
||||
# bash 3.2-safe: plain arrays only, no `declare -A`, no `mapfile`/`readarray`.
|
||||
|
|
@ -341,6 +343,80 @@ fi
|
|||
|
||||
echo ""
|
||||
|
||||
# --- Section 11: Render-Chain Propagation ---
|
||||
echo "--- Render-Chain Propagation ---"
|
||||
|
||||
# Commands render from the references they inline via
|
||||
# ${CLAUDE_PLUGIN_ROOT}/references/…. An honesty pattern removed from a command
|
||||
# surface must NOT survive in the reference that command renders from — otherwise
|
||||
# the user still hits it. Added in S12 after a cold full-brief review found the
|
||||
# banned A/B significance-verdict column (`Significant? (>20%)` with Yes/No cells)
|
||||
# still shipping in references/ab-testing-framework.md while commands/ab-test.md had
|
||||
# already been cleaned to the honest "Directional?" framing. The command-level fix
|
||||
# never propagated to its render-source, and Section 8's STALE_STATS grep targets
|
||||
# magnitudes, not this construct, so the survivor passed green. This generalizes the
|
||||
# fix from "clean the command" to "the banned construct is forbidden across the
|
||||
# WHOLE render chain (commands AND references)". Future propagation-class patterns
|
||||
# get appended to PROP_FORBIDDEN, mirroring how Section 8's STALE_STATS grew to the
|
||||
# full criterion rather than the single named token.
|
||||
#
|
||||
# Forbidden: the significance-VERDICT column — `Significant?` adjacent to a `(` (the
|
||||
# `(>20%)` verdict parenthetical) or a table pipe (`| Significant?`). The defect is a
|
||||
# column steering users to record a statistical-significance call that organic
|
||||
# personal-post volume never reaches; "directional" is the honest frame. Legitimate
|
||||
# descriptive prose ("Significantly higher", "Significant capability", "statistical
|
||||
# significance", a bare sentence-final "significant?") carries no `(`/`|`-adjacency
|
||||
# and is left alone.
|
||||
PROP_FORBIDDEN='Significant\?[[:space:]]*\(|\|[[:space:]]*Significant\?'
|
||||
# Non-vacuity self-test (mirrors Section 8): the criterion is only meaningful if it
|
||||
# MATCHES the verdict-column forms and IGNORES legitimate prose. Runs on every
|
||||
# invocation BEFORE the real scan, so weakening the pattern fails the suite instead
|
||||
# of silently certifying an unenforced guard. The positive set covers the exact S12
|
||||
# survivor + its bare-column variant; the negative set covers the honest
|
||||
# "Directional?" fix and every legitimate "Significant"/"significance" string the
|
||||
# tree carries today.
|
||||
PROP_SELFTEST_OK=1
|
||||
while IFS= read -r probe; do
|
||||
[ -z "$probe" ] && continue
|
||||
if ! echo "$probe" | grep -qE "$PROP_FORBIDDEN"; then
|
||||
PROP_SELFTEST_OK=0; echo " non-vacuity FAIL: forbidden form not caught -> $probe"
|
||||
fi
|
||||
done <<'PROP_POSITIVE'
|
||||
| Difference | Significant? (>20%) |
|
||||
Significant? (>20%)
|
||||
| Significant? |
|
||||
PROP_POSITIVE
|
||||
while IFS= read -r probe; do
|
||||
[ -z "$probe" ] && continue
|
||||
if echo "$probe" | grep -qE "$PROP_FORBIDDEN"; then
|
||||
PROP_SELFTEST_OK=0; echo " false-positive FAIL: legitimate form caught -> $probe"
|
||||
fi
|
||||
done <<'PROP_NEGATIVE'
|
||||
| Difference | Directional? (>20% gap) |
|
||||
Significantly higher weight than generic responses
|
||||
Significant capability breakthroughs
|
||||
Significantly Behind (<50%)
|
||||
LinkedIn analytics does not support statistical significance tests
|
||||
Is the difference significant? Probably not.
|
||||
PROP_NEGATIVE
|
||||
if [ "$PROP_SELFTEST_OK" -eq 1 ]; then
|
||||
pass "render-chain propagation self-test: 3 verdict-column forms caught, 6 legitimate forms ignored"
|
||||
else
|
||||
fail "render-chain propagation self-test failed — the guard no longer enforces the criterion"
|
||||
fi
|
||||
|
||||
# Real scan across the whole user-facing render chain (commands + every reference
|
||||
# they inline) plus the adjacent surfaces a copy could migrate the table into.
|
||||
PROP_HITS=$(grep -rnE "$PROP_FORBIDDEN" references/ commands/ skills/ hooks/prompts/ agents/ assets/templates/ assets/checklists/ 2>/dev/null || true)
|
||||
if [ -z "$PROP_HITS" ]; then
|
||||
pass "no significance-verdict column survives in any command or its render-source reference"
|
||||
else
|
||||
fail "significance-verdict column reintroduced — use the honest 'Directional?' framing (see commands/ab-test.md):"
|
||||
echo "$PROP_HITS"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
|
||||
# --- Summary ---
|
||||
echo "================================================"
|
||||
echo "RESULTS"
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue