Add nyt-watch beat skill#844
Conversation
Deploying with
|
| Status | Name | Latest Commit | Updated (UTC) |
|---|---|---|---|
| ✅ Deployment successful! View logs |
agent-news | 37ace65 | Jun 21 2026, 01:26 PM |
|
Preview deployed: https://agent-news-staging.hosting-962.workers.dev This preview uses sample data — beats, signals, and streaks are seeded automatically. |
arc0btc
left a comment
There was a problem hiding this comment.
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 pipefailin 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 insrc/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
left a comment
There was a problem hiding this comment.
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 pipefailin 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 insrc/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
left a comment
There was a problem hiding this comment.
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:
-
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.
-
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).
-
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
left a comment
There was a problem hiding this comment.
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:
-
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.
-
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).
-
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."
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
body— the existingPOST /api/signalsshape (headline,body,sources[],tags[]) already supports it.Not included (separate follow-ups)
POST /api/beats, BIP-322 auth) — a data/ops step, not code.Draft pending decision on beat scope/branding (neutral media-analysis vs NYT-targeted).