feat(linkedin-studio): research-engine config layer — sources + scoring modes + MCP profile (§5 slice 2a) [skip-docs]
Declaration/config groundwork that slice 2b's trend-spotter upgrade reads.
Standalone (no agent wiring yet — that's 2b), mirroring slice 1's pattern;
[skip-docs] for the same reason slice 1 was — user-facing docs land when 2b
wires the engine live.
- references/trend-scoring-modes.md: methodology SSOT for two rubrics —
kortform (feed post, timing 20%) + long-form (chronicle, depth 25% / timing 10%,
per tema-research-motor-spec §4.2). Both sum to 100%. trend-spotter renders from
this in 2b instead of inlining a matrix (S12-consistent).
- config/trends-sources.template.md: shipped generic source-list defaults →
user override at ${LINKEDIN_STUDIO_DATA}/trends/sources.md (data-dir, survives
reinstall; same template->data-dir pattern as user-profile).
- user-profile.template.md: new "Research Tooling" section — declared research MCPs
(Tavily/Gemini/Perplexity/Other) + WebSearch/WebFetch floor. 2b routes MCP-first.
- setup.md Step 3f + onboarding.md Phase 2: ask "which research MCPs?" -> profile.
Store only what the user declares; no hard-coded MCP names.
- test-runner.sh: EXPECT_REFS 26->27; generalized the M0 +1 delta-guard into a
named-post-M0-additions guard (POSTM0_REFS) so a legit later ref doc passes while
the anti-masking intent holds. Gate green 84/0/0.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RBMKqPSVbvSZHtQ4heM1UY
This commit is contained in:
parent
be21788321
commit
b89868e3b1
6 changed files with 225 additions and 11 deletions
|
|
@ -53,12 +53,16 @@ warn() { echo -e "${YELLOW}⚠${NC} $1"; WARN=$((WARN + 1)); }
|
|||
# with the files when adding/removing an agent, command, reference, or skill.
|
||||
EXPECT_AGENTS=19
|
||||
EXPECT_COMMANDS=29
|
||||
EXPECT_REFS=26
|
||||
EXPECT_REFS=27
|
||||
EXPECT_SKILLS=6
|
||||
# Pre-M0 references/ baseline was 25; M0 adds exactly one ref doc
|
||||
# (references/data-path-convention.md). The "delta = +1" assert below proves the
|
||||
# bump was a single intended addition, not a larger jump masking an extra doc (m3/m11).
|
||||
# Pre-M0 references/ baseline was 25. Every ref doc added since is NAMED below, so the
|
||||
# count bump always maps to an intended, named addition — never an incidental doc masked
|
||||
# by the bump (m3/m11). M0 added data-path-convention.md; each later slice appends its
|
||||
# doc to POSTM0_REFS. The assert below proves EXPECT_REFS == 25 + 1 (M0) + |POSTM0_REFS|
|
||||
# AND that every named doc actually exists. bash 3.2-safe: plain indexed array.
|
||||
REFS_BASELINE_PRE_M0=25
|
||||
M0_REF="references/data-path-convention.md"
|
||||
POSTM0_REFS=("references/trend-scoring-modes.md") # research-engine slice 2a (scoring SSOT)
|
||||
|
||||
echo "================================================"
|
||||
echo "LinkedIn Studio Plugin — Structure Validator"
|
||||
|
|
@ -101,12 +105,19 @@ assert_count "commands/*.md" "$COMMANDS" "$EXPECT_COMMANDS"
|
|||
assert_count "references/*.md" "$REFS" "$EXPECT_REFS"
|
||||
assert_count "skills/*/SKILL.md" "$SKILLS" "$EXPECT_SKILLS"
|
||||
|
||||
# M0 references/ delta = exactly +1, and the one added doc is the D3 convention.
|
||||
# Guards against the bump silently absorbing an incidental extra ref doc (m3/m11).
|
||||
if [ "$EXPECT_REFS" -eq $((REFS_BASELINE_PRE_M0 + 1)) ] && [ -f references/data-path-convention.md ]; then
|
||||
pass "references/ delta = exactly +1 (M0 added data-path-convention.md; ${REFS_BASELINE_PRE_M0}→${EXPECT_REFS})"
|
||||
# references/ count must map 1:1 to the NAMED additions (M0 + every later slice's doc),
|
||||
# and each named doc must exist. Guards against the bump silently absorbing an incidental
|
||||
# extra ref doc (m3/m11). To add a ref doc: append it to POSTM0_REFS and bump EXPECT_REFS.
|
||||
NAMED_REFS_OK=1
|
||||
[ -f "$M0_REF" ] || NAMED_REFS_OK=0
|
||||
for r in "${POSTM0_REFS[@]}"; do
|
||||
[ -f "$r" ] || NAMED_REFS_OK=0
|
||||
done
|
||||
EXPECT_NAMED=$((REFS_BASELINE_PRE_M0 + 1 + ${#POSTM0_REFS[@]}))
|
||||
if [ "$EXPECT_REFS" -eq "$EXPECT_NAMED" ] && [ "$NAMED_REFS_OK" -eq 1 ]; then
|
||||
pass "references/ count maps to named additions (${REFS_BASELINE_PRE_M0} baseline +1 M0 +${#POSTM0_REFS[@]} post-M0 = ${EXPECT_REFS}; all named docs exist)"
|
||||
else
|
||||
fail "references/ delta != +1 — M0 must add exactly one ref doc (the D3 convention), not $((EXPECT_REFS - REFS_BASELINE_PRE_M0))"
|
||||
fail "references/ count != named additions — bump EXPECT_REFS and name the doc in POSTM0_REFS (expected ${EXPECT_NAMED}, have ${EXPECT_REFS}; named-docs-exist=${NAMED_REFS_OK})"
|
||||
fi
|
||||
|
||||
# Cross-check the CLAUDE.md declared headers against the contract (doc-drift guard)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue