Skip to content

docs(vibewatch-sentiment): index refuses unscored slugs before payment - #432

Open
sonic-mast wants to merge 1 commit into
aibtcdev:mainfrom
sonic-mast:docs/vibewatch-sentiment-unscored-refusal
Open

sonic-mast wants to merge 1 commit into
aibtcdev:mainfrom
sonic-mast:docs/vibewatch-sentiment-unscored-refusal

Conversation

@sonic-mast

@sonic-mast sonic-mast commented Sep 17, 2026

Copy link
Copy Markdown
Contributor

Why

The project subcommand's docs and code comment still describe the Stacks Vibe Index's old behaviour for a panel project with no scored days: a charged paid 200 with series: [] (found by a Tier 1 bounty winner, aibtc board mtt3jjrgcf0aa8fb225c). Since 2026-09-16 the live index refuses such a slug before issuing a 402 (Vibewatch-io/vibewatch-app#1745), verified on prod today:

GET https://api.vibewatch.io/api/v1/public/stacks-index/pro/projects/boom
HTTP 422
{"detail":{"error":"project_not_scored","slug":"boom","days":90}}

Scored slugs still answer 402; unknown slugs 404. Nothing can be charged for an unscored project any more.

What

  • SKILL.md / AGENT.md — describe the free 422 project_not_scored refusal (new error-table row), keep the skill's own free pre-check as the faster local guard, and say what --allow-unscored now does (skips the local check; nothing is paid either way). Also note that the live index accepts sponsored transfers again as of 2026-09-16 ([x402] Paid query rejected with sponsored_unsupported for a zero-STX agent wallet Vibewatch-io/vibewatch-mcp#15), so X402_PAYMENT_MODE=direct is a fallback for 422 sponsored_unsupported rather than a requirement.
  • vibewatch-sentiment.ts — comment and --allow-unscored help text updated. One small behaviour change in paidGet: a non-402 failure of the unpaid first request is rethrown as HTTP <status> from the index before any payment: <body> instead of axios' bare Request failed with status code 422, so an agent that skips the pre-check actually sees project_not_scored. The shared engine only intercepts 402 and re-wraps every post-payment failure as a plain Error without a response, so this helper never sees a failure that happened after a payment was sent.

No engine changes. Default behaviour of every subcommand is unchanged.

Verification

  • bun run typecheck, bun run validate (204/204) — pass.
  • The new helper checked against a 422 with the live body shape, a 402 (passthrough), a 500 with an empty body, a non-HTTP error (passthrough), and a 404.
  • Local review gate (scripts/gemini-review.py --base origin/main): no findings.
  • Not exercised: a live paid call (no payment is involved in the changed path).

Related: #431 (--asset sBTC|STX) touches the same SKILL.md/AGENT.md; this PR is based on main on purpose and whichever lands second gets a trivial rebase.

🤖 Generated with Claude Code

The server-side docs for the same behaviour are in Vibewatch-io/vibewatch-mcp#18 (merged): README section "Stacks Vibe Index paid tier (x402)".

Since 2026-09-16 the live Stacks Vibe Index answers a panel project with no
scored days with a free `422 {"detail":{"error":"project_not_scored",...}}`
before any 402 (Vibewatch-io/vibewatch-app#1745), instead of serving a
charged 200 with `series: []`. Update SKILL.md, AGENT.md, the code comment
and the `--allow-unscored` help text; keep the local pre-check as the faster
guard. Surface non-402 failures of the unpaid first request with the status
and body instead of axios' bare "Request failed with status code N", so an
agent that skips the pre-check sees `project_not_scored`. Also note that the
index accepts sponsored transfers again (Vibewatch-io/vibewatch-mcp#15), so
`X402_PAYMENT_MODE=direct` is a fallback rather than a requirement.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
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.

1 participant