Agent skill

Signal Scoring

by grandamenium in grandamenium/cortextos

Score, deduplicate, rank, and select fresh research signals from SQLite using the configured rubric.

MITAuto-check passedEducation

Install Signal Scoring

skills CLI
$ npx skills add grandamenium/cortextos --skill signal-scoring -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install grandamenium/cortextos signal-scoring --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/grandamenium/cortextos.git skills-src && mkdir -p .claude/skills && cp -r skills-src/community/agents/research-agent/.claude/skills/signal-scoring .claude/skills/signal-scoring && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
signal-scoring
GitHub stars
101
Token cost
~2.2k tokens
SKILL.md length
251 words
Files
1
Skills in repo
55
Repo updated
First seen
Licence
MIT

At a glance

Score, deduplicate, rank, and select fresh research signals from SQLite using the configured rubric.

  • Works in 6 steps: Fetch candidates from DB → Load rubric → Score each item → …
  • Tasks that involve Quizzes and assessments
  • SKILL.md covers When to Use, Input, Output and Scoring Process, plus 1 more section
  • Instructions only: no scripts, shell commands, URLs or credentials in SKILL.md

What it does

Signal Scoring is an agent skill from grandamenium/cortextos. Score, deduplicate, rank, and select fresh research signals from SQLite using the configured rubric.

Its SKILL.md is about 2.2k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

It sits in Education, covering Quizzes and assessments. It works with SQLite. The licence is MIT.

When your agent uses it

  • Tasks that involve Quizzes and assessments

Example prompts

  • “/signal-scoring”

Requirements

  • Python 3

Workflow steps

6 steps, taken from the step headings in SKILL.md.

  1. Fetch candidates from DB
  2. Load rubric
  3. Score each item
  4. Deduplicate by topic
  5. Apply threshold and select top N
  6. Mark delivered_at (AFTER delivery succeeds)

What it can do on your machine

Read from SKILL.md and the folder at commit 6f93838. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    No scripts in the folder and no shell commands in SKILL.md (its code samples are python).

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Signal Scoring loads about 2.2k tokens when it runs. Until then it costs about 29 tokens; SKILL.md has 251 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~29
When it runs · the whole SKILL.md, loaded when a task matches
~2.2k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from grandamenium/cortextos at commit 6f93838, republished under its MIT licence (© grandamenium). 251 words, ~2,183 tokens.

Download SKILL.mdSave it as .claude/skills/signal-scoring/SKILL.md (or your agent's skills folder).
name
signal-scoring
description
Score, deduplicate, rank, and select fresh research signals from SQLite using the configured rubric.

Signal Scoring

Score, rank, and select signals from the local SQLite database. Produces the shortlist that gets passed to brief-generation.


When to Use

After source-collection completes, before brief-generation.


Input

  • research/db/signals.db -- signal database populated by source-collection
  • research/scoring-rubric.json (copy from scoring-rubric.example.json, tune weights)
  • config.json (for runtime paths and window settings)

Output

  • research/output/YYYY-MM-DD/signals-selected.json -- shortlisted items with scores, ready for brief-generation
  • Score summary appended to research/output/YYYY-MM-DD/run.log

Note: delivered_at is NOT set here. It is set by delivery-routing after successful delivery.


Scoring Process

Step 1: Fetch candidates from DB

Pull items seen in the configured recent window. Suppress items delivered within research.suppress_delivered_hours (default 72). Use a subquery to get only the latest metric row per item.

python
import sqlite3, datetime as dt, json

def open_db(db_path):
    conn = sqlite3.connect(db_path)
    conn.row_factory = sqlite3.Row
    return conn

def recent_candidates(conn, window_hours=24, suppress_delivered_hours=72):
    seen_cutoff = (dt.datetime.utcnow() - dt.timedelta(hours=window_hours)).isoformat()
    delivered_cutoff = (dt.datetime.utcnow() - dt.timedelta(hours=suppress_delivered_hours)).isoformat()
    return conn.execute("""
        SELECT i.*,
               m.stars, m.score, m.comments, m.views, m.likes, m.forks,
               m.shares, m.saves, m.bookmarks, m.reposts, m.quotes
        FROM items i
        LEFT JOIN metric_snapshots m ON m.id = (
            SELECT id FROM metric_snapshots
            WHERE item_id = i.id
            ORDER BY collected_at DESC LIMIT 1
        )
        WHERE i.last_seen_at >= ?
          AND (i.delivered_at IS NULL OR i.delivered_at < ?)
        ORDER BY i.last_seen_at DESC
    """, (seen_cutoff, delivered_cutoff)).fetchall()
Step 2: Load rubric
python
def load_rubric(rubric_path):
    with open(rubric_path) as f:
        return json.load(f)

Expected flat keys (from scoring-rubric.json):

  • base_weight, fit_weight, velocity_weight
  • niche_bonus, tutorial_bonus, platform_bonus
  • engagement_normalization (dict with per-platform scale factors)
  • keyword_boosts.keywords (list of niche keywords for bonus scoring)
Step 3: Score each item
python
def score_item(item, conn, rubric):
    """
    rubric: dict loaded from research/scoring-rubric.json.
    """
    text = " ".join(str(item[k] or "") for k in ["title", "summary", "text", "source_name"]).lower()

    base = normalize_engagement(item, rubric)
    fit = compute_fit(text, rubric.get("niche_terms", []), rubric.get("tutorial_terms", []))
    velocity = compute_velocity(item["id"], conn)

    bonus = 0
    if any(t in text for t in rubric.get("niche_terms", [])):
        bonus += rubric.get("niche_bonus", 1.5)
    if any(t in text for t in rubric.get("tutorial_terms", [])):
        bonus += rubric.get("tutorial_bonus", 1.0)
    if item["platform"] in rubric.get("high_value_platforms", []):
        bonus += rubric.get("platform_bonus", 0.5)
    bonus += rubric.get("source_type_bonuses", {}).get(item["platform"], 0)

    # keyword_boosts from rubric (up to +2)
    kw_matches = sum(1 for kw in rubric.get("keyword_boosts", {}).get("keywords", []) if kw in text)
    bonus += min(kw_matches, 2)

    return (
        base * rubric.get("base_weight", 1.0)
        + fit * rubric.get("fit_weight", 0.3)
        + velocity * rubric.get("velocity_weight", 0.2)
        + bonus
    )

def normalize_engagement(item, rubric):
    norm = rubric.get("engagement_normalization", {})
    platform = item["platform"] or ""
    if platform == "github":
        return min((item["stars"] or 0) / norm.get("github_stars_per_10", 500), 10)
    elif platform == "reddit":
        return min((item["score"] or 0) / norm.get("reddit_score_per_10", 100), 10)
    elif platform == "hacker_news":
        return min((item["score"] or 0) / norm.get("hn_score_per_10", 50), 10)
    elif platform in ("youtube", "x", "instagram", "tiktok"):
        views = item["views"] or item["likes"] or 0
        return min(views / norm.get("social_views_per_10", 10000), 10)
    elif platform == "arxiv":
        return 6   # academic papers: moderate default
    else:
        return 3   # rss / unknown

def compute_fit(text, niche_terms, tutorial_terms):
    fit = 0
    if any(t in text for t in niche_terms):
        fit += 5
    if any(t in text for t in tutorial_terms):
        fit += 3
    return min(fit, 10)

def compute_velocity(item_id, conn):
    rows = conn.execute(
        """SELECT stars, score, views, likes, comments, collected_at
           FROM metric_snapshots
           WHERE item_id = ?
           ORDER BY collected_at""",
        (item_id,)
    ).fetchall()
    if len(rows) < 2:
        return 0
    earliest, latest = rows[0], rows[-1]
    delta = (
        ((latest["stars"] or 0) - (earliest["stars"] or 0)) +
        ((latest["score"] or 0) - (earliest["score"] or 0)) +
        ((latest["views"] or 0) - (earliest["views"] or 0))
    )
    return min(delta / 100, 10)
Step 4: Deduplicate by topic

If two items cover the same announcement, keep the higher-scoring one.

python
import re

def topic_key(item):
    text = re.sub(r"[^a-z0-9]+", " ", (item["title"] or "").lower())
    words = [w for w in text.split() if len(w) > 3][:8]
    return f"{item['platform'] or 'web'}:{'-'.join(words)}"

def dedup_by_topic(scored_items):
    best = {}
    for score, item in scored_items:
        key = topic_key(item)
        if key not in best or score > best[key][0]:
            best[key] = (score, item)
    return list(best.values())
Step 5: Apply threshold and select top N
python
def select_top(conn, rubric, runtime_config, out_path, run_date):
    research_config = runtime_config.get("research", {})
    window_hours = research_config.get("signal_window_hours", 24)
    suppress_hours = research_config.get("suppress_delivered_hours", 72)
    top_n = rubric.get("top_n", 8)
    threshold = rubric.get("minimum_score_threshold", 5.0)

    candidates = recent_candidates(conn, window_hours, suppress_hours)
    scored = [(score_item(row, conn, rubric), row) for row in candidates]
    scored = [(s, i) for s, i in scored if s >= threshold]
    scored = dedup_by_topic(scored)
    scored.sort(key=lambda x: x[0], reverse=True)
    selected = scored[:top_n]

    # Write selected items to disk -- do NOT mark delivered_at here
    output = []
    for rank, (score, item) in enumerate(selected, 1):
        output.append({
            "rank": rank,
            "platform": item["platform"],
            "canonical_key": item["canonical_key"],
            "title": item["title"],
            "url": item["url"],
            "author": item["author"],
            "source_name": item["source_name"],
            "published_at": item["published_at"],
            "summary": item["summary"],
            "score": round(score, 2),
            "score_components": {
                "note": "base + fit + velocity + configured bonuses; keep detailed components when your implementation exposes them"
            }
        })

    with open(out_path, "w") as f:
        json.dump(output, f, indent=2)

    filtered = len(candidates) - len([s for s, _ in scored if s >= threshold])
    log_line = f"Scoring: {len(candidates)} candidates, {len(selected)} selected, {filtered} below threshold"
    print(log_line)
    return output
Step 6: Mark delivered_at (AFTER delivery succeeds)

delivered_at is set by delivery-routing, not here. This separation ensures items are not suppressed if delivery fails.

python
# Called by delivery-routing after successful send:
def mark_delivered(conn, selected_items):
    now = dt.datetime.utcnow().isoformat()
    for item in selected_items:
        conn.execute(
            "UPDATE items SET delivered_at=? WHERE canonical_key=?",
            (now, item["canonical_key"])
        )
    conn.commit()

Scoring Notes

  • Tune niche_terms in research/scoring-rubric.json first -- highest-leverage lever.
  • For GitHub: star velocity is the best novelty signal for new vs. established repos.
  • For arXiv: skip velocity (papers don't accumulate metrics fast). Use base 6 default.
  • When uncertain between two items, prefer the more specific title.
  • If fewer than top_n pass threshold, brief only those. Do not pad.

© grandamenium, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in community/agents/research-agent/.claude/skills/signal-scoring of grandamenium/cortextos.

Open the folder on GitHubat commit 6f93838

Compare with similar skills

Signal Scoring next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Signal Scoring compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Signal Scoring this skillgrandamenium/cortextos101—~2.2kAutomated safety check: PassMIT
Cheat StatusXBuilderLAB/cheat-on-content7.2k—~1.5kAutomated safety check: NotesMIT
DeepTutor CLIHKUDS/DeepTutor41k—~2.8kAutomated safety check: PassApache-2.0
AI Engineering Placement Quizrohitg00/ai-engineering-from-scratch67k—~2kAutomated safety check: PassMIT
Codebase to Coursezarazhangrui/codebase-to-course5.7k—~4.4kAutomated safety check: PassNone
AI Engineering Phase Quizrohitg00/ai-engineering-from-scratch67k—~2.1kAutomated safety check: PassMIT

Similar skills

  • Cheat Status

    XBuilderLAB/cheat-on-content

    cheat-on-content 的状态看板。显示当前模式 / rubric 版本 / 校准进度 / 待复盘 / pool 状态 / 是否该升级 SQLite / 是否该 bump rubric。任何时候都可调,无副作用。触发词:"状态"/"看板"/"status"/"我现在该做什么"/"进度怎么样"。

    7.2k GitHub stars~1.5k tokensUpdated 6 days ago
    EducationAuto-check: notes
  • DeepTutor CLI

    HKUDS/DeepTutor

    Teaches the agent to set up and run DeepTutor from the command line: chat and capabilities, knowledge bases, partners, memory, sessions, notebooks and the server or Web app.

    41k GitHub stars~2.8k tokensUpdated 3 days ago
    EducationAuto-check passed
  • AI Engineering Placement Quiz

    rohitg00/ai-engineering-from-scratch

    Runs a 10-question quiz across five areas to place a learner in the AI Engineering from Scratch curriculum, so they skip what they already know.

    67k GitHub stars~2k tokensUpdated today
    EducationAuto-check passed
  • Codebase to Course

    zarazhangrui/codebase-to-course

    Turns a codebase into an interactive single-page HTML course for non-technical learners, with scroll modules, animated diagrams, quizzes and plain-English code translations.

    5.7k GitHub stars~4.4k tokensUpdated 6 mo ago
    EducationAuto-check passed
  • AI Engineering Phase Quiz

    rohitg00/ai-engineering-from-scratch

    Quizzes you on a completed phase of the AI Engineering from Scratch course, taking a phase number or name and mapping it to that phase's directory.

    67k GitHub stars~2.1k tokensUpdated today
    EducationAuto-check passed
  • Scholar Evaluation

    K-Dense-AI/claude-scientific-writer

    Provide qualitative-first, evidence-traceable developmental review of scholarly works and audit low-stakes research-assessment rubrics with optional local quality controls.

    2.4k GitHub starsUsed in 2 repos~2.9k tokens
    EducationAuto-check: notes

More from grandamenium/cortextos

All 55 skills in this repo
  • Cortext Self Diagnosis

    grandamenium/cortextos

    Diagnose cortextOS itself when the framework misbehaves — an agent has gone silent or wedged, agents are crash-looping, Telegram or agent-to-agent messages are not arriving, crons did not fire, an…

    101 GitHub stars~3.7k tokensUpdated 18 days ago
    Auto-check passed
  • Activity Channel

    grandamenium/cortextos

    You have completed something significant and want the whole org — all agents and the user — to know about it.

    101 GitHub stars~624 tokensUpdated 18 days ago
    Auto-check passed
  • Agentcard Purchase

    grandamenium/cortextos

    You need to make a purchase on behalf of the user — buy a SaaS subscription, pay for an API, purchase a domain, or any transaction requiring a credit card.

    101 GitHub stars~1.1k tokensUpdated 18 days ago
    Auto-check passed
  • Claude To Codex Migration

    grandamenium/cortextos

    Migrate ANY cortextOS agent from the claude-code runtime to the live codex-app-server runtime.

    101 GitHub stars~12k tokensUpdated 18 days ago
    Auto-check: warnings
  • Bus Reference

    grandamenium/cortextos

    Complete cortextos bus CLI reference - all available commands with examples.

    101 GitHub stars~3.8k tokensUpdated 18 days ago
    Auto-check passed
  • Business News Monitor

    grandamenium/cortextos

    Daily cron-driven scan of news/forums/social in a domain to surface market shifts, new competitors, regulatory changes, and net-new opportunities.

    101 GitHub stars~1.3k tokensUpdated 18 days ago
    Auto-check passed

Works with

Categories

Questions about Signal Scoring

What does Signal Scoring do?

Score, deduplicate, rank, and select fresh research signals from SQLite using the configured rubric. Signal Scoring is an agent skill from grandamenium/cortextos. Score, deduplicate, rank, and select fresh research signals from SQLite using the configured rubric.

When should I use Signal Scoring?

Signal Scoring fits situations like: tasks that involve Quizzes and assessments.

How do I install Signal Scoring in Claude Code?

Run `npx skills add grandamenium/cortextos --skill signal-scoring -a claude-code`. Or copy the skill folder (community/agents/research-agent/.claude/skills/signal-scoring in grandamenium/cortextos) into .claude/skills/signal-scoring in your project. Claude Code loads it when a task matches its description.

How do I install Signal Scoring in Codex?

Run `npx skills add grandamenium/cortextos --skill signal-scoring -a codex`. Or copy the skill folder (community/agents/research-agent/.claude/skills/signal-scoring in grandamenium/cortextos) into .agents/skills/signal-scoring in your project. Codex loads it when a task matches its description.

Can I use Signal Scoring in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add grandamenium/cortextos --skill signal-scoring -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/signal-scoring, .gemini/skills/signal-scoring, .github/skills/signal-scoring and .opencode/skills/signal-scoring in your project.

What does Signal Scoring need to run?

SKILL.md names no scripts, command-line tools or credentials: Signal Scoring is instructions for the agent only. Our summary lists: Python 3.

Does Signal Scoring access the network?

SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.

Is Signal Scoring safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Signal Scoring use?

Signal Scoring is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Signal Scoring use?

About 2.2k tokens (SKILL.md is roughly 8.7k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Signal Scoring?

Skills that share tags, products or a category with Signal Scoring: Cheat Status (XBuilderLAB/cheat-on-content, 7.2k stars), DeepTutor CLI (HKUDS/DeepTutor, 41k stars), AI Engineering Placement Quiz (rohitg00/ai-engineering-from-scratch, 67k stars) and Codebase to Course (zarazhangrui/codebase-to-course, 5.7k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Signal Scoring?

grandamenium (a GitHub user) maintains it in grandamenium/cortextos, which has 101 GitHub stars. The repository holds 55 skills in this directory. The repository was last updated on September 23, 2026.

Source: grandamenium/cortextos on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.