Help us improve
Share bugs, ideas, or general feedback.
From thinking-frameworks-skills
Scores and assigns 1-4 controlled-vocabulary tags to content using keyword + title matching, logs near-miss proposals for vocabulary extension.
npx claudepluginhub lyndonkl/claude --plugin thinking-frameworks-skillsHow this skill is triggered — by the user, by Claude, or both
Slash command
/thinking-frameworks-skills:tag-by-topicThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
- [Workflow](#workflow)
Cross-references Trend Scout candidate items against a topic ledger to classify as NEW or overlapping with seeds, drafts, or published posts, adding reinforcement angles for published overlaps.
Adds 2-5 tags to untagged papers by reading notes.md and description.md. Prefers existing tags from index.md or tags.yaml. Run on single directory or --all.
Generates platform-appropriate tags and keywords for videos or articles to improve discoverability without keyword stuffing.
Share bugs, ideas, or general feedback.
Related skills: Called by ingest-inbox-item step 2. Writes to topic-ledger.md pending-tags section when proposing additions. Upstream of update-topic-ledger (which records the finalized counts per tag).
Tag one seed:
- [ ] Step 1: Read shared-context/topic-ledger.md — collect current tag set
- [ ] Step 2: Score each existing tag against body + title (keyword + weighted title match)
- [ ] Step 3: Select top 1-4 tags above threshold
- [ ] Step 4: If top-1 score below threshold, propose new tag in kebab-case; log to pending-tags
- [ ] Step 5: Return {topics: [str], pending_tags: [str]}
For each existing tag, compute:
keyword_match = number of times tag-words appear in body (normalized by body length)title_match = 3× if tag-words appear in title, else 0score = keyword_match + title_matchThreshold for selection: score ≥ 0.3 (tunable — start at 0.3, adjust if tagging is noisy).
unclassified and log this as a signal that vocabulary may need extension.If the top-1 score is below threshold, the body is about something the vocabulary doesn't cover. Propose a new tag:
^[a-z0-9]+(-[a-z0-9]+)*$.topic-ledger.md#pending-tags:
- tag: {proposed-tag}
proposed_at: YYYY-MM-DD
seed_id: {seed-id}
justification: "{one-line reason}"
topics, so the seed is not untagged.Never silently add to canonical vocabulary. The writer reviews pending-tags and promotes.
unclassified if truly nothing fits).^[a-z0-9]+(-[a-z0-9]+)*$.Input seed body (dropout-as-ensemble):
had a thought while running — dropout is secretly an ensemble method. each forward pass is a different sub-network. so at test time when you turn dropout off and scale, you're averaging predictions across exponentially many thinned networks. this is why it generalizes. not "regularization" in the L2 sense. more like bagging.
Existing tags (from topic-ledger.md): regularization, attention-mechanism, rag, emergence, kalshi, ipl-cricket, pathology-ai.
Scoring:
regularization: keyword "regularization" in body → 0.4. Score: 0.4.ensembling: NOT in vocabulary → propose.dropout: NOT in vocabulary → propose.Output:
topics: [regularization] (only one existing tag scored above threshold)pending_tags: [ensembling, dropout] logged to topic-ledger with this seed-id.The writer reviews pending and either promotes both to canonical or renames to existing synonyms.
unclassified if nothing fits.^[a-z0-9]+(-[a-z0-9]+)*$. Reject any other form.score-intuition-density or dedupe-against-corpus logic here — this is topic-only.{topics: [str], pending_tags: [str]}.topic-ledger.md#pending-tags.