---
name: ai-release-calendar
description: Query AI product release calendars, daily shipping briefs, and monthly market analysis with source-backed evidence.
---

# AI Release Calendar

Use this skill when the user asks about AI product releases, product changelogs,
shipping velocity, AI Release Daily, AI Release Monthly, or market trends across
AI products.

## API Base

Use the deployed service by default:

```text
https://x-1.dev
```

If the user is working on a local checkout, use their local origin instead.

## Routes

### daily route

Use this route when the user asks about today, recent days, daily reports,
latest updates, or "今天/最近/过去几天有什么更新".

```text
GET /api/daily/latest?locale=<locale>&limit=<n>
GET /api/releases?from=<YYYY-MM-DD>&to=<YYYY-MM-DD>&product=<slug>&locale=<locale>
```

### monthly route

Use this route when the user asks for the monthly magazine, monthly review,
market trends, rankings, strategic analysis, or "月报/趋势/这个月怎么看".

```text
GET /api/monthly/latest?locale=<locale>
```

### product route

Use this route when the user asks about one product or asks to compare products.

```text
GET /api/products?locale=<locale>
GET /api/releases?product=<slug>&month=<YYYY-MM>&locale=<locale>
```

Use product `one_liner`, `description`, and `why_track` from `/api/products`
to explain what each product is before listing its release facts.

### evidence route

Use release objects returned by `/api/releases` as the evidence layer. Every
release claim should include its `source_url` when available.

## Answer shape

Start answers with one concise orientation sentence:

> AI Release Calendar tracks public AI product shipping signals and turns them
> into source-backed daily briefs, product changelogs, and monthly market reads.

For daily answers:

- Use `total_release_count` and `total_product_count` for "how many shipped".
- If `is_truncated` is true, say you are showing `displayed_release_count` of
  `total_release_count` releases, not that the day only had the displayed items.
- Keep the orientation sentence short, then list the concrete updates.

## Language

Set `locale` from the user's language:

- Chinese requests: `zh-CN`
- Otherwise: `en`

If the API returns English source content for a non-English request, translate
the answer naturally. Preserve product names, release dates, technical terms,
and every `source_url`.

## Rules

- Do not invent releases.
- Separate facts from interpretation.
- Cite `source_url` for product release claims.
- If the API has no data, say that plainly.
- Use the monthly route for analysis and the daily route for freshness.
- Do not expose internal raw source snapshots; use public release facts and
  source links.

## Maintainer workflow

When refreshing source data, cache provider responses locally before deriving
public summaries:

- Store TikHub tweet detail JSON under `data/source-archive/tikhub/tweets/`.
- Store X CLI exports under `data/source-archive/x-cli/`.
- Do not commit raw archive JSON files.
- Use the local archive on repeat runs to reduce API cost and make enrichment
  reproducible.
- Backfill historical data in batches using `TIKHUB_MONTH`, `TIKHUB_FROM`,
  `TIKHUB_TO`, `TIKHUB_LIMIT`, and `TIKHUB_ORDER`; do not run unbounded source
  refreshes.

### Daily update commands

Use these commands for date-window maintenance:

```bash
# 0) Pull date-window candidates from twitter-cli and save raw exports.
npm run release:fetch:xcli -- --from 2026-04-21 --to 2026-04-22 --mode search

# Optional: limit to specific high-signal accounts to avoid timeout storms.
npm run release:fetch:xcli -- \
  --from 2026-04-21 --to 2026-04-22 --mode search \
  --handles openaidevs,openai,claudeai,cursor_ai,vercel,v0,googledeepmind,genspark_ai,replit

# Stable mode (recommended): official accounts only + retries + fallback.
npm run release:fetch:xcli -- \
  --from 2026-04-22 --to 2026-04-22 \
  --mode search \
  --official-only 1 \
  --retries 2 \
  --retry-backoff-ms 1500 \
  --per-timeout-ms 25000 \
  --sleep-ms 600

# 1) Build candidate increments from local TikHub archive cache.
npm run release:candidates:archive -- --from 2026-04-21 --to 2026-04-22

# 2) Review/edit generated JSON, then apply + seed Neon.
npm run release:update -- \
  --from 2026-04-21 \
  --to 2026-04-22 \
  --input data/source-archive/selected-releases-2026-04-21-to-2026-04-22.json

# 3) Optional: enrich source excerpts for the same date window (requires TIKHUB_API_KEY).
npm run release:update -- --from 2026-04-21 --to 2026-04-22 --enrich --input <selected.json>
```
