claude-skills/marketing/linkedin/skills/linkedin-profile
Claude 8a16de83c1
fix(linkedin): bound the exemption context to its own clause, match outcome words on boundaries
Two findings from the fifth review round, both reproduced first.

1. `context` used a fixed 40-character forward window, which is not the
   "immediately after the matched word" the comment claimed - it reaches into the
   next clause, so a later occurrence's context could excuse an earlier,
   unrelated one:

       automate connects and automate posting via native scheduler.   -> 0 ALLOW
       automate connects. and automate posting via native scheduler.  -> 4 REFUSE

   The only difference is a period. A gate whose verdict turns on incidental
   phrasing length is not a gate. `_clause_after` now cuts the window at the first
   clause boundary (comma, sentence end, or a coordinating conjunction), keeping
   the character cap as a ceiling so one long unpunctuated clause cannot drift
   either. This is the same class as the round-3 `signal` fix, still open on the
   `context` path - the only exemption that uses it.

   Verified: five bleed variants move ALLOW -> REFUSE, three endorsed phrasings
   ("automate posting via linkedin's native scheduler") still ALLOW, and the
   round-4 per-occurrence cases still refuse.

2. `OUTCOME_WORDS` was tested with `w in low`, so "led" credited "scheduled",
   "installed", "handled" and "recalled", and "cut" credited "executed" - a duty
   bullet like "Scheduled onboarding for new hires" scored as outcome-carrying.
   That is the substring defect removing bare "to"/"from"/"x" was meant to end;
   these two survived it. Now matched on word boundaries. "%" moves out of the
   tuple entirely, since OUTCOME_SHAPES already carries the stricter `\d+\s*%`.

   Verified: 7 duty bullets no longer credited, 6 genuine outcome bullets still
   are.

Blocking gates green - compileall, check_paths, check_frontmatter,
check_dual_publish, check_model_freshness, check_skill_names, check_plugin_json
--all, derive_counters --check, smoke_scripts 696/696. The 18-case adversarial
battery is 18/18. Pinned sample outputs unchanged: headline 93/SHIP, profile
auditor 37/WEAK, analyzer 6 TYPICAL / 3 STRONG / 3 WEAK.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BswsZp5zrJWFAGU6KWNA1s
2026-08-26 15:03:42 +00:00
..
assets feat(marketing): add linkedin plugin — organic presence with platform rules in code 2026-08-25 07:32:30 +00:00
references feat(marketing): add linkedin plugin — organic presence with platform rules in code 2026-08-25 07:32:30 +00:00
scripts fix(linkedin): bound the exemption context to its own clause, match outcome words on boundaries 2026-08-26 15:03:42 +00:00
SKILL.md feat(marketing): add linkedin plugin — organic presence with platform rules in code 2026-08-25 07:32:30 +00:00