Skip to content

Add nyt-watch beat skill#844

Open
biwasxyz wants to merge 2 commits into
mainfrom
beat/nyt-watch
Open

Add nyt-watch beat skill#844
biwasxyz wants to merge 2 commits into
mainfrom
beat/nyt-watch

Conversation

@biwasxyz

Copy link
Copy Markdown
Contributor

Adds a new beat skill file: public/skills/beats/nyt-watch.md.

What this is

A structured media-analysis beat targeting NYT articles. Each signal follows a four-part body template: claim-check vs primary source, material omission, framing/loaded-language, evidence. Mirrors the existing beat-skill structure (Scope / Sources / Vocabulary / Framing / Example).

Scope of this PR

  • Skill markdown only. No schema, route, or code changes.
  • The four-field report is a convention inside the signal body — the existing POST /api/signals shape (headline, body, sources[], tags[]) already supports it.

Not included (separate follow-ups)

  • Creating the beat row (POST /api/beats, BIP-322 auth) — a data/ops step, not code.
  • Article ingestion / paywall handling — the one real engineering unknown.
  • Any Legion governance wiring — out of scope; beats live entirely in agent-news.

Draft pending decision on beat scope/branding (neutral media-analysis vs NYT-targeted).

@cloudflare-workers-and-pages

cloudflare-workers-and-pages Bot commented Jun 21, 2026

Copy link
Copy Markdown

Deploying with  Cloudflare Workers  Cloudflare Workers

The latest updates on your project. Learn more about integrating Git with Workers.

Status Name Latest Commit Updated (UTC)
✅ Deployment successful!
View logs
agent-news 37ace65 Jun 21 2026, 01:26 PM

@github-actions

github-actions Bot commented Jun 21, 2026

Copy link
Copy Markdown
Contributor

Preview deployed: https://agent-news-staging.hosting-962.workers.dev

This preview uses sample data — beats, signals, and streaks are seeded automatically.

@biwasxyz
biwasxyz marked this pull request as ready for review June 21, 2026 12:05

@arc0btc arc0btc left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Adds the nyt-watch beat skill — a structured media-analysis beat targeting NYT articles with claim-check, omission, framing, and evidence sections.

What works well:

  • The four-part signal body template is exactly the right level of rigidity — it forces evidence before filing and separates fact (claim-check) from interpretation (framing/omission). Hard to misuse.
  • Vocabulary guide with explicit avoids (lie, propaganda, hoax) is excellent practice — keeps the beat credible over time.
  • "Signals are BIP-322 signed and inscribed — treat every claim as something you are putting your name on permanently" is the right framing.
  • set -euo pipefail in the script, required-var guard ${OWNER_ADDR:?}, and the two-step 300s window are all correct. The sign-then-send flow matches the BIP-322 auth pattern in src/services/auth.ts.

[suggestion] Safer JSON construction in create-nyt-beat.sh (scripts/create-nyt-beat.sh:42-49)

The current pattern interpolates OWNER_ADDR directly into the curl -d string via shell string concatenation:

-d '{ ... "created_by": "'""'" }'

Bitcoin bech32 addresses are [0-9a-z]+ so this is safe in practice, but the pattern is brittle — a mixed-case legacy address or any stray quote breaks the JSON silently. Using jq or a printf-built payload is more robust:

payload=
curl -sS -X POST "${BASE}/api/beats"   -H "Content-Type: application/json"   -H "X-BTC-Address: ${OWNER_ADDR}"   -H "X-BTC-Signature: ${SIG}"   -H "X-BTC-Timestamp: ${TS}"   -d "${payload}"

[question] PR body mentions "Draft pending decision on beat scope/branding (neutral media-analysis vs NYT-targeted)" — is that decision made? The beat as written is explicitly NYT-targeted (name, slug, scope). If it's still open, marking this as a GitHub Draft PR would signal it more clearly.

[nit] color: "#000000" is fine for bootstrap — just noting it's hardcoded pure black if the platform ever wants a distinguishing color per beat.

Operational context: We run POST /api/beats path via the two-step BIP-322 flow on other beats. The auth window (< 300s) is enforced server-side — the script handles it correctly by anchoring the timestamp in step 1 and reusing it in step 2.

Approving — the skill document is solid and the script is functional. The suggestion above is a resilience improvement, not a blocker.

@arc0btc arc0btc left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Adds the nyt-watch beat skill — a structured media-analysis beat targeting NYT articles with claim-check, omission, framing, and evidence sections.

What works well:

  • The four-part signal body template is exactly the right level of rigidity — it forces evidence before filing and separates fact (claim-check) from interpretation (framing/omission). Hard to misuse.
  • Vocabulary guide with explicit avoids (lie, propaganda, hoax) is excellent practice — keeps the beat credible over time.
  • "Signals are BIP-322 signed and inscribed — treat every claim as something you are putting your name on permanently" is the right framing.
  • set -euo pipefail in the script, required-var guard ${OWNER_ADDR:?}, and the two-step 300s window are all correct. The sign-then-send flow matches the BIP-322 auth pattern in src/services/auth.ts.

[suggestion] Safer JSON construction in create-nyt-beat.sh (scripts/create-nyt-beat.sh:42-49)

The current pattern interpolates OWNER_ADDR directly into the curl -d string via shell concatenation:

-d '{ ... "created_by": "'"${OWNER_ADDR}"'" }'

Bitcoin bech32 addresses are [0-9a-z]+ so this is safe in practice, but the pattern is brittle — a mixed-case legacy address or a stray quote breaks the JSON silently. Using jq to construct the payload is more robust:

payload=$(jq -n \
  --arg slug "nyt-watch" \
  --arg name "NYT Watch" \
  --arg description "Structured, primary-source-backed analysis of New York Times articles: claim-checks, material omissions, and framing. Every signal links a primary source." \
  --arg color "#000000" \
  --arg created_by "$OWNER_ADDR" \
  '{slug: $slug, name: $name, description: $description, color: $color, created_by: $created_by}')
curl -sS -X POST "${BASE}/api/beats" \
  -H "Content-Type: application/json" \
  -H "X-BTC-Address: ${OWNER_ADDR}" \
  -H "X-BTC-Signature: ${SIG}" \
  -H "X-BTC-Timestamp: ${TS}" \
  -d "${payload}"

[question] PR body mentions "Draft pending decision on beat scope/branding (neutral media-analysis vs NYT-targeted)" — is that decision made? The beat as written is explicitly NYT-targeted (name, slug, scope). If it's still open, marking this as a GitHub Draft PR would signal that more clearly.

[nit] color: "#000000" is fine for bootstrap — just noting it's hardcoded pure black if the platform ever wants a distinguishing color per beat.

Operational context: We run POST /api/beats via the two-step BIP-322 flow on other beats. The auth window (< 300s) is enforced server-side — the script handles it correctly by anchoring the timestamp in step 1 and reusing it in step 2.

Approving — the skill document is solid and the script is functional. The suggestion above is a resilience improvement, not a blocker.

@secret-mars secret-mars left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Substantive on the scope question you flagged. My read: the methodology here (claim vs primary source, material omission, framing/loaded-language, corrections tracking) is outlet-neutral and travels well. Constraining the beat to NYT specifically creates three friction points:

  1. Selection-bias optics — even with the disciplined Vocabulary/Avoid list explicitly ruling out intent-attribution, an outlet-specific beat reads as adversarial-by-default. Any single article's analysis becomes evidence-of-position rather than evidence-of-methodology.

  2. Missing-comparison structure — the Framing section works best when you can quote a neutral equivalent from a contemporaneous source. But if BBC/WaPo/Reuters cover the same primary source with different framing, that's the same signal shape — and there's nowhere to file it. You either exclude it (loses evidence) or create nyt-watch precedent for wsj-watch / reuters-watch / etc. (beat proliferation).

  3. Corrections-page anchor is real but not dispositive — NYT's public corrections page is a cited advantage in the Scope. But AP has one, WSJ has one, Reuters has one; the pattern generalizes.

Suggested reframe: media-claim-audit or press-primary-source-check — same 4-part body template, same vocabulary discipline, same Framing/Example structure, but the outlet is a field in each signal rather than the beat identity. Signals then get filterable by outlet without the beat itself carrying the adversarial framing.

Counter-consideration I don't want to dismiss: NYT-specific might attract more focused filings vs. a general media beat which could pull low-effort " mildly wrong about " filings. If the tighter frame is protective against that, keeping nyt-watch as v0 and generalizing later once the signal pattern proves out is a valid other path.

Ship blocker level: none. Both scopes work. This is scope-choice input, not a blocker on the skill file quality (which reads clean — the Avoid list is disciplined, the four-part body template is well-defined, the two-step sign-flow in the script is the right shape for a POST /api/beats bootstrap).

The one nit if you keep it NYT-specific: consider explicitly excluding NYT Op-Ed section in Scope > Does Not Cover, since some pieces there (e.g., long-form guest essays with factual claims) are ambiguous vs. "Opinion/editorial with no checkable factual claim."

@secret-mars secret-mars left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Substantive on the scope question you flagged. My read: the methodology here (claim vs primary source, material omission, framing/loaded-language, corrections tracking) is outlet-neutral and travels well. Constraining the beat to NYT specifically creates three friction points:

  1. Selection-bias optics — even with the disciplined Vocabulary/Avoid list explicitly ruling out intent-attribution, an outlet-specific beat reads as adversarial-by-default. Any single article's analysis becomes evidence-of-position rather than evidence-of-methodology.

  2. Missing-comparison structure — the Framing section works best when you can quote a neutral equivalent from a contemporaneous source. But if BBC/WaPo/Reuters cover the same primary source with different framing, that's the same signal shape — and there's nowhere to file it. You either exclude it (loses evidence) or create nyt-watch precedent for wsj-watch / reuters-watch / etc. (beat proliferation).

  3. Corrections-page anchor is real but not dispositive — NYT's public corrections page is a cited advantage in the Scope. But AP has one, WSJ has one, Reuters has one; the pattern generalizes.

Suggested reframe: media-claim-audit or press-primary-source-check — same 4-part body template, same vocabulary discipline, same Framing/Example structure, but the outlet is a field in each signal rather than the beat identity. Signals then get filterable by outlet without the beat itself carrying the adversarial framing.

Counter-consideration I don't want to dismiss: NYT-specific might attract more focused filings vs. a general media beat which could pull low-effort "outlet-X mildly wrong about topic-Y" filings. If the tighter frame is protective against that, keeping nyt-watch as v0 and generalizing later once the signal pattern proves out is a valid other path.

Ship blocker level: none. Both scopes work. This is scope-choice input, not a blocker on the skill file quality (which reads clean — the Avoid list is disciplined, the four-part body template is well-defined, the two-step sign-flow in the script is the right shape for a POST /api/beats bootstrap).

The one nit if you keep it NYT-specific: consider explicitly excluding NYT Op-Ed section in Scope > Does Not Cover, since some pieces there (e.g., long-form guest essays with factual claims) are ambiguous vs. "Opinion/editorial with no checkable factual claim."

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants