Agent skill

Box Least Squares

by benchflow-ai in benchflow-ai/skillsbench

Box Least Squares (BLS) periodogram for detecting transiting exoplanets and eclipsing binaries.

Apache-2.0Auto-check passedResearch & Science

Install Box Least Squares

skills CLI
$ npx skills add benchflow-ai/skillsbench --skill box-least-squares -a claude-code

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

GitHub CLI
$ gh skill install benchflow-ai/skillsbench box-least-squares --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/benchflow-ai/skillsbench.git skills-src && mkdir -p .claude/skills && cp -r skills-src/tasks/exoplanet-detection-period/environment/skills/box-least-squares .claude/skills/box-least-squares && 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
box-least-squares
GitHub stars
1.8k
Token cost
~2.6k tokens
SKILL.md length
713 words
Files
1
Skills in repo
189
Repo updated
First seen
Licence
Apache-2.0

At a glance

Box Least Squares (BLS) periodogram for detecting transiting exoplanets and eclipsing binaries.

  • Works in 2 steps: Log Likelihood (default) → Signal-to-Noise Ratio (SNR)
  • Searching for periodic box-shaped dips in light curves
  • SKILL.md covers Overview, Installation, Basic Usage and Using autopower vs power, plus 12 more sections
  • Calls pip

What it does

Box Least Squares is an agent skill from benchflow-ai/skillsbench. Box Least Squares (BLS) periodogram for detecting transiting exoplanets and eclipsing binaries. Use when searching for periodic box-shaped dips in light curves. Alternative to Transit Least Squares, available in astropy.timeseries. Based on Kovács et al. (2002).

Its SKILL.md is about 2.6k 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 Research & Science, covering Physical and earth sciences. The repository describes itself as: SkillsBench evaluates how well skills work and how effective agents are at using them. The licence is Apache-2.0.

When your agent uses it

  • Searching for periodic box-shaped dips in light curves
  • Tasks that involve Physical and earth sciences

Example prompts

  • “/box-least-squares”

Requirements

  • Python 3

Workflow steps

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

  1. Log Likelihood (default)
  2. Signal-to-Noise Ratio (SNR)

What it can do on your machine

Read from SKILL.md and the folder at commit 9a1f4dd. 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

    Shell commands in SKILL.md call:

    • pip

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

  • Network

    Links to these hosts (documentation or services it may open):

    • docs.astropy.org
    • arxiv.org
    • lightkurve.github.io
    • github.com

    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

Box Least Squares loads about 2.6k tokens when it runs. Until then it costs about 70 tokens; SKILL.md has 713 words of instructions outside code blocks.

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

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 benchflow-ai/skillsbench at commit 9a1f4dd, republished under its Apache-2.0 licence (© benchflow-ai). 713 words, ~2,570 tokens.

Download SKILL.mdSave it as .claude/skills/box-least-squares/SKILL.md (or your agent's skills folder).
name
box-least-squares
description
Box Least Squares (BLS) periodogram for detecting transiting exoplanets and eclipsing binaries. Use when searching for periodic box-shaped dips in light curves. Alternative to Transit Least Squares, available in astropy.timeseries. Based on Kovács et al. (2002).

Box Least Squares (BLS) Periodogram

The Box Least Squares (BLS) periodogram is a statistical tool for detecting transiting exoplanets and eclipsing binaries in photometric time series data. BLS models a transit as a periodic upside-down top hat (box shape) and finds the period, duration, depth, and reference time that best fit the data.

Overview

BLS is built into Astropy and provides an alternative to Transit Least Squares (TLS). Both search for transits, but with different implementations and performance characteristics.

Key parameters BLS searches for:

  • Period (orbital period)
  • Duration (transit duration)
  • Depth (how much flux drops during transit)
  • Reference time (mid-transit time of first transit)

Installation

BLS is part of Astropy:

bash
pip install astropy

Basic Usage

python
import numpy as np
import astropy.units as u
from astropy.timeseries import BoxLeastSquares

# Prepare data
# time, flux, and flux_err should be numpy arrays or Quantities
t = time * u.day  # Add units if not already present
y = flux
dy = flux_err  # Optional but recommended

# Create BLS object
model = BoxLeastSquares(t, y, dy=dy)

# Automatic period search with specified duration
duration = 0.2 * u.day  # Expected transit duration
periodogram = model.autopower(duration)

# Extract results
best_period = periodogram.period[np.argmax(periodogram.power)]
print(f"Best period: {best_period:.5f}")

Using autopower vs power

autopower: Automatic Period Grid

Recommended for initial searches. Automatically determines appropriate period grid:

python
# Specify duration (or multiple durations)
duration = 0.2 * u.day
periodogram = model.autopower(duration)

# Or search multiple durations
durations = [0.1, 0.15, 0.2, 0.25] * u.day
periodogram = model.autopower(durations)
power: Custom Period Grid

For more control over the search:

python
# Define custom period grid
periods = np.linspace(2.0, 10.0, 1000) * u.day
duration = 0.2 * u.day

periodogram = model.power(periods, duration)

Warning: Period grid quality matters! Too coarse and you'll miss the true period.

Objective Functions

BLS supports two objective functions:

1. Log Likelihood (default)

Maximizes the statistical likelihood of the model fit:

python
periodogram = model.autopower(0.2 * u.day, objective='likelihood')
2. Signal-to-Noise Ratio (SNR)

Uses the SNR with which the transit depth is measured:

python
periodogram = model.autopower(0.2 * u.day, objective='snr')

The SNR objective can improve reliability in the presence of correlated noise.

Complete Example

python
import numpy as np
import matplotlib.pyplot as plt
import astropy.units as u
from astropy.timeseries import BoxLeastSquares

# Load and prepare data
data = np.loadtxt('light_curve.txt')
time = data[:, 0] * u.day
flux = data[:, 1]
flux_err = data[:, 3]

# Create BLS model
model = BoxLeastSquares(time, flux, dy=flux_err)

# Run BLS with automatic period grid
# Try multiple durations to find best fit
durations = np.linspace(0.05, 0.3, 10) * u.day
periodogram = model.autopower(durations, objective='likelihood')

# Find peak
max_power_idx = np.argmax(periodogram.power)
best_period = periodogram.period[max_power_idx]
best_duration = periodogram.duration[max_power_idx]
best_t0 = periodogram.transit_time[max_power_idx]
max_power = periodogram.power[max_power_idx]

print(f"Period: {best_period:.5f}")
print(f"Duration: {best_duration:.5f}")
print(f"T0: {best_t0:.5f}")
print(f"Power: {max_power:.2f}")

# Plot periodogram
import matplotlib.pyplot as plt
plt.plot(periodogram.period, periodogram.power)
plt.xlabel('Period [days]')
plt.ylabel('BLS Power')
plt.show()

Peak Statistics for Validation

Use compute_stats() to calculate detailed statistics about a candidate transit:

python
# Get statistics for the best period
stats = model.compute_stats(
    periodogram.period[max_power_idx],
    periodogram.duration[max_power_idx],
    periodogram.transit_time[max_power_idx]
)

# Key statistics for validation
print(f"Depth: {stats['depth']:.6f}")
print(f"Depth uncertainty: {stats['depth_err']:.6f}")
print(f"SNR: {stats['depth_snr']:.2f}")
print(f"Odd/Even mismatch: {stats['depth_odd'] - stats['depth_even']:.6f}")
print(f"Number of transits: {stats['transit_count']}")

# Check for false positives
if abs(stats['depth_odd'] - stats['depth_even']) > 3 * stats['depth_err']:
    print("Warning: Significant odd-even mismatch - may not be planetary")

Validation criteria:

  • High depth SNR (>7): Strong signal
  • Low odd-even mismatch: Consistent transit depth
  • Multiple transits observed: More reliable
  • Reasonable duration: Not too long or too short for orbit

Period Grid Sensitivity

The BLS periodogram is sensitive to period grid spacing. The autoperiod() method provides a conservative grid:

python
# Get automatic period grid
periods = model.autoperiod(durations, minimum_period=1*u.day, maximum_period=10*u.day)
print(f"Period grid has {len(periods)} points")

# Use this grid with power()
periodogram = model.power(periods, durations)

Tips:

  • Use autopower() for initial searches
  • Use finer grids around promising candidates
  • Period grid quality matters more for BLS than for Lomb-Scargle

Comparing BLS Results

To compare multiple peaks:

python
# Find top 5 peaks
sorted_idx = np.argsort(periodogram.power)[::-1]
top_5 = sorted_idx[:5]

print("Top 5 candidates:")
for i, idx in enumerate(top_5):
    period = periodogram.period[idx]
    power = periodogram.power[idx]
    duration = periodogram.duration[idx]

    stats = model.compute_stats(period, duration, periodogram.transit_time[idx])

    print(f"\n{i+1}. Period: {period:.5f}")
    print(f"   Power: {power:.2f}")
    print(f"   Duration: {duration:.5f}")
    print(f"   SNR: {stats['depth_snr']:.2f}")
    print(f"   Transits: {stats['transit_count']}")

Phase-Folded Light Curve

After finding a candidate, phase-fold to visualize the transit:

python
# Fold the light curve at the best period
phase = ((time.value - best_t0.value) % best_period.value) / best_period.value

# Plot to verify transit shape
import matplotlib.pyplot as plt
plt.plot(phase, flux, '.')
plt.xlabel('Phase')
plt.ylabel('Flux')
plt.show()

BLS vs Transit Least Squares (TLS)

Both methods search for transits, but differ in implementation:

Box Least Squares (BLS)

Pros:

  • Built into Astropy (no extra install)
  • Fast for targeted searches
  • Good statistical framework
  • compute_stats() provides detailed validation

Cons:

  • Simpler transit model (box shape)
  • Requires careful period grid setup
  • May be less sensitive to grazing transits
Transit Least Squares (TLS)

Pros:

  • More sophisticated transit models
  • Generally more sensitive
  • Better handles grazing transits
  • Automatic period grid is more robust

Cons:

  • Requires separate package
  • Slower for very long time series
  • Less control over transit shape

Recommendation: Try both! TLS is often more sensitive, but BLS is faster and built-in.

Show full SKILL.md (305 more words)Show less

Integration with Preprocessing

BLS works best with preprocessed data. Consider this pipeline:

  1. Quality filtering: Remove flagged data points
  2. Outlier removal: Clean obvious artifacts
  3. Detrending: Remove stellar variability (rotation, trends)
  4. BLS search: Run period search on cleaned data
  5. Validation: Use compute_stats() to check candidate quality
Key Considerations
  • Preprocessing should preserve transit shapes (use gentle methods like flatten())
  • Don't over-process - too aggressive cleaning removes real signals
  • BLS needs reasonable period and duration ranges
  • Always validate with multiple metrics (power, SNR, odd-even)

Common Issues

Issue: No clear peak

Causes:

  • Transits too shallow
  • Wrong duration range
  • Period outside search range
  • Over-aggressive preprocessing

Solutions:

  • Try wider duration range
  • Extend period search range
  • Use less aggressive flatten() window
  • Check raw data for transits
Issue: Period is 2× or 0.5× expected

Causes:

  • Missing alternating transits
  • Data gaps
  • Period aliasing

Solutions:

  • Check both periods manually
  • Examine odd-even statistics
  • Look at phase-folded plots for both periods
Issue: High odd-even mismatch

Cause:

  • Not a planetary transit
  • Eclipsing binary
  • Instrumental artifact

Solution:

  • Check stats['depth_odd'] vs stats['depth_even']
  • May not be a transiting planet

Dependencies

bash
pip install astropy numpy matplotlib
# Optional: lightkurve for preprocessing
pip install lightkurve

References

Official Documentation
Key Papers
  • Kovács, Zucker, & Mazeh (2002): Original BLS paper - A&A 391, 369
  • Hartman & Bakos (2016): VARTOOLS implementation - A&C 17, 1

When to Use BLS

Use BLS when:

  • You want a fast, built-in solution
  • You need detailed validation statistics (compute_stats)
  • Working within the Astropy ecosystem
  • You want fine control over period grid

Use TLS when:

  • Maximum sensitivity is critical
  • Dealing with grazing or partial transits
  • Want automatic robust period grid
  • Prefer more sophisticated transit models

Use Lomb-Scargle when:

  • Searching for general periodic signals (not specifically transits)
  • Detecting stellar rotation, pulsation
  • Initial exploration of periodicity

For exoplanet detection, both BLS and TLS are valid choices. Try both and compare results!

© benchflow-ai, Apache-2.0. 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 tasks/exoplanet-detection-period/environment/skills/box-least-squares of benchflow-ai/skillsbench.

Open the folder on GitHubat commit 9a1f4dd

Compare with similar skills

Box Least Squares 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.

Box Least Squares compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Box Least Squares this skillbenchflow-ai/skillsbench1.8k—~2.6kAutomated safety check: PassApache-2.0
DP-GEN Simplify Workflowjinzhezenggroup/computational-chemistry-agent-skills148—~2.7kAutomated safety check: PassLGPL-3.0-or-later
OpenpivK-Dense-AI/scientific-agent-skills48k1 repos~4.8kAutomated safety check: NotesBSD-3-Clause
Journal Of Climatebrycewang-stanford/Awesome-Journal-Skills1.2k—~1.8kAutomated safety check: PassMIT
Kidd Script Writinginfometa/workbuddyskills348—~1.3kAutomated safety check: PassNone
AstropyzLanqing/codex-claude-academic-skills4.7k13 repos~2.9kAutomated safety check: PassBSD-3-Clause

Similar skills

  • DP-GEN Simplify Workflow

    jinzhezenggroup/computational-chemistry-agent-skills

    Prepares, validates and runs DP-GEN simplify jobs that thin out repeated or redundant DeepMD datasets, generating param.json and machine.json for local or scheduler runs.

    148 GitHub stars~2.7k tokensUpdated yesterday
    Research & ScienceAuto-check passed
  • Openpiv

    K-Dense-AI/scientific-agent-skills

    Performs Particle Image Velocimetry (PIV) analysis with OpenPIV.

    48k GitHub starsUsed in 1 repo~4.8k tokens
    Research & ScienceAuto-check: notes
  • Journal Of Climate

    brycewang-stanford/Awesome-Journal-Skills

    A skill your agent uses when targeting Journal of Climate or deciding whether a climate-dynamics or climate-variability manuscript fits this venue.

    1.2k GitHub stars~1.8k tokensUpdated 13 days ago
    Research & ScienceAuto-check passed
  • Kidd Script Writing

    infometa/workbuddyskills

    Creates deep-analysis short video scripts in "吟游诗人基德" (Minstrel Kidd) style.

    348 GitHub stars~1.3k tokensUpdated today
    Research & ScienceAuto-check passed
  • Astropy

    zLanqing/codex-claude-academic-skills

    Comprehensive Python library for astronomy and astrophysics.

    4.7k GitHub starsUsed in 13 repos~2.9k tokens
    Research & ScienceAuto-check passed
  • Pymatgen

    zLanqing/codex-claude-academic-skills

    Materials science toolkit. An agent skill from zLanqing/codex-claude-academic-skills.

    4.7k GitHub starsUsed in 11 repos~5k tokens
    Research & ScienceAuto-check passed

More from benchflow-ai/skillsbench

All 189 skills in this repo
  • Lean4 Memories

    benchflow-ai/skillsbench

    This skill should be used when working on Lean 4 formalization projects to maintain persistent memory of successful proof patterns, failed approaches, project conventions, and user preferences…

    1.8k GitHub stars~3.2k tokensUpdated 2 mo ago
    Auto-check passed
  • Senior Data Engineer

    benchflow-ai/skillsbench

    World-class data engineering skill for building scalable data pipelines, ETL/ELT systems, real-time streaming, and data infrastructure.

    1.8k GitHub stars~5.9k tokensUpdated 2 mo ago
    Auto-check passed
  • Ac Branch Pi Model

    benchflow-ai/skillsbench

    AC branch pi-model power flow equations (P/Q and |S|) with transformer tap ratio and phase shift, matching acopf-math-model.md and MATPOWER branch fields.

    1.8k GitHub stars~1.1k tokensUpdated 2 mo ago
    Auto-check passed
  • Civ6lib

    benchflow-ai/skillsbench

    Civilization 6 district mechanics library. An agent skill from benchflow-ai/skillsbench.

    1.8k GitHub stars~1.7k tokensUpdated 2 mo ago
    Auto-check passed
  • D3 Visualization

    benchflow-ai/skillsbench

    Build deterministic, verifiable data visualizations with D3.js (v6).

    1.8k GitHub stars~1.5k tokensUpdated 2 mo ago
    Auto-check passed
  • Dc Power Flow

    benchflow-ai/skillsbench

    DC power flow analysis for power systems. An agent skill from benchflow-ai/skillsbench.

    1.8k GitHub stars~717 tokensUpdated 2 mo ago
    Auto-check passed

Questions about Box Least Squares

What does Box Least Squares do?

Box Least Squares (BLS) periodogram for detecting transiting exoplanets and eclipsing binaries. Box Least Squares is an agent skill from benchflow-ai/skillsbench. Box Least Squares (BLS) periodogram for detecting transiting exoplanets and eclipsing binaries.

When should I use Box Least Squares?

Box Least Squares fits situations like: searching for periodic box-shaped dips in light curves; tasks that involve Physical and earth sciences.

How do I install Box Least Squares in Claude Code?

Run `npx skills add benchflow-ai/skillsbench --skill box-least-squares -a claude-code`. Or copy the skill folder (tasks/exoplanet-detection-period/environment/skills/box-least-squares in benchflow-ai/skillsbench) into .claude/skills/box-least-squares in your project. Claude Code loads it when a task matches its description.

How do I install Box Least Squares in Codex?

Run `npx skills add benchflow-ai/skillsbench --skill box-least-squares -a codex`. Or copy the skill folder (tasks/exoplanet-detection-period/environment/skills/box-least-squares in benchflow-ai/skillsbench) into .agents/skills/box-least-squares in your project. Codex loads it when a task matches its description.

Can I use Box Least Squares 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 benchflow-ai/skillsbench --skill box-least-squares -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/box-least-squares, .gemini/skills/box-least-squares, .github/skills/box-least-squares and .opencode/skills/box-least-squares in your project.

What does Box Least Squares need to run?

Going by SKILL.md and its folder, Box Least Squares needs the command-line tools its instructions call (pip). Our summary lists: Python 3.

Does Box Least Squares access the network?

SKILL.md names 4 domains. As links in the text: docs.astropy.org, arxiv.org, lightkurve.github.io and github.com. This is read from the text; nothing was executed.

Is Box Least Squares 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 Box Least Squares use?

Box Least Squares is published under the Apache-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Box Least Squares use?

About 2.6k tokens (SKILL.md is roughly 10k 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 Box Least Squares?

Skills that share tags, products or a category with Box Least Squares: DP-GEN Simplify Workflow (jinzhezenggroup/computational-chemistry-agent-skills, 148 stars), Openpiv (K-Dense-AI/scientific-agent-skills, 48k stars), Journal Of Climate (brycewang-stanford/Awesome-Journal-Skills, 1.2k stars) and Kidd Script Writing (infometa/workbuddyskills, 348 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Box Least Squares?

benchflow-ai (a GitHub organization) maintains it in benchflow-ai/skillsbench, which has 1,835 GitHub stars. The repository holds 189 skills in this directory. The repository was last updated on July 23, 2026.

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