skills/tag-by-topic/SKILL.md
--- name: tag-by-topic description: Assigns 1-4 topic tags to a seed body from the controlled vocabulary in substacker shared-context/topic-ledger.md. Prevents tag sprawl at small-corpus scale by requiring existing-tag match or logged addition. Uses keyword + title match; logs near-miss candidates to pending-tags. Use after format normalization and before dedupe. Trigger keywords: tag, topics, categorize, classify, taxonomy, controlled vocabulary, topic ledger. --- # Tag by Topic ## Table of C
npx skillsauth add lyndonkl/claude skills/tag-by-topicInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
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.development
--- name: zettel-note description: The note-writing discipline for this vault's evergreen knowledge graph, modeled on a Zettelkasten reading companion and governed by the vault conventions. Enforces declarative-claim titles, one claim per note (atomicity), own-words prose with no block quotes, the piped [[slug|Title]] link form, the labeled link-relationship vocabulary (Confirms/Contradicts/Extends/Context/Prerequisite/Builds-on/Applies/Example-of/Contrasts-with), 3-6 links per note, and search-
development
Plans between-round FIFA World Cup Fantasy transfers — budgets the round's free transfer(s), forces out players whose nation has been eliminated, chases fixture-swing drops, upgrades on value, and decides when a rebuild is large enough to fire the Wildcard instead of spending free transfers one at a time. Ranks candidate in/out pairs by EV gain over each player's remaining survival horizon (delta xEV weighted by progression_carry) MINUS transfer cost (a free transfer is cheap, a points hit is real, churning the squad for marginal swings is a critic flag), and tags forced/fixture/upgrade priority. Emits a `transfer-plan` signal. Use when called by wc-squad-architect (whose transfer work this skill is the engine for) and by the strategists in the populate stage when their candidate is transfer-adjacent rather than a full rebuild.
testing
Reads and updates the FIFA World Cup Fantasy tournament state machine (footballfantasy/context/tournament-state.md) — the temporal backbone tracking phase (pre-tournament → group MD1-3 → R32 → R16 → QF → SF → final), budget ($100m group / $105m knockouts), nation cap (3 group, loosening in knockouts), chips remaining, surviving nations, each owned player's elimination-risk horizon, and deadlines. Validates state on load (count/feasibility checks), applies phase transitions, and appends to the append-only state log (never silent overwrite). Use to load state at the start of a run and to commit state changes after the manager makes a move.
development
Validates and persists FIFA World Cup Fantasy signal files to signals/YYYY-MM-DD-<type>.md. Checks the required frontmatter (type, round, date, emitted_by, confidence, source_urls), range-checks declared numeric signals, confirms every factual claim carries a source URL or "manager-provided", rejects unknown signal types, and refuses to persist a signal that fails validation (logging the failure instead). Keeps the inter-agent signal layer auditable so downstream agents can trust what they read and never re-derive it. Use whenever an agent or skill writes a signal.