Skip to content

Latest commit

 

History

History
170 lines (132 loc) · 8 KB

File metadata and controls

170 lines (132 loc) · 8 KB

Public platform metrics

The public dashboard at https://agentbounties.app/metrics.html is a simple, aggregate view of participation, confirmed marketplace payouts, and claim conversion. Private operations, enforcement, ranking inputs, customer data, and raw identities are outside this surface.

Reporting boundaries

  • Production launch: 2026-07-08T20:22:19Z.
  • First month: [2026-07-08T20:22:19Z, 2026-08-08T20:22:19Z).
  • Periods: rolling 7, 28, or 90 days, plus lifetime since launch.
  • The dashboard opens on lifetime and orders controls from longest to most recent.
  • All boundaries and daily series use UTC.

Headline metrics

External active identities

Count each provider-namespaced identity once in a period when it performs a qualifying action:

  • GitHub: an external issue or pull request opened, issue or pull-request comment, submitted review, or inline review comment.
  • Marketplace comments: a normalized self-reported comment author.
  • Marketplace: a Base wallet that posts, funds, claims, submits, verifies, or receives a canonical outcome.

Bots, system identities, the repository owner, and identities in crates/api/fixtures/public-metrics-policy.json are excluded. A GitHub login, wallet, and comment author stay separate unless a future public verification links them. The result is participating identities, not verified unique people. Browser IDs and stars do not qualify.

Weekly growth compares the latest rolling seven days with the preceding seven:

(current - previous) / previous

Both zero displays 0%. A positive current period after a zero prior period displays New. Other values display a signed percentage.

Marketplace payout volume

Only block-time-verified canonical events count:

  • Autonomous and Open Competition BountySettled: solver_reward + timeout_bond_bonus + verifier_reward.
  • Autonomous SubmissionRejected: verifier_reward.
  • Open CompetitionSubmissionRejected: bond_paid_to_verifier.

Solver pay, verifier pay, and completion bonuses remain separate in the API. Returned claim bonds, forfeited bonds, refunds, funding plans or intentions, unconfirmed transactions, and leaderboard prizes are excluded. Only a confirmed canonical BountySettled event proves solver payment.

Recovery reservations are an active-inventory safety control. They keep a contract out of claimable inventory and verification work, but do not remove an already confirmed payout from immutable historical totals. The homepage and dashboard both read lifetime payout volume and settlement-event count from this same aggregate instead of recomputing them from the current opportunity feed.

Platform revenue is reported separately as 0 USDC — monetization not active. Marketplace payout volume is not platform revenue.

Mature claim-to-settlement rate

The cohort unit is (network, bounty_id, round). A claimed round enters the denominator only after its claim expiry or after a terminal canonical event. Settled rounds enter the numerator. Rejected and expired mature rounds remain in the denominator but not the numerator. Immature claims are shown separately. Open Competition has no exclusive claim, so its entrants and payouts are included in participation and payout metrics but not in this claim cohort.

Public interfaces

GET /v1/metrics/platform?period=7d|28d|90d|lifetime

The default period is 7d. The versioned response includes exact windows, platform identity aggregates, payment totals and splits, mature claims, current inventory from both the exclusive-claim and Open Competition protocols, daily series, zero platform revenue, freshness, coverage, and plain-language definitions. Combined inventory is withheld when either protocol is unavailable. The response intentionally excludes GitHub participation and all raw handles, wallet addresses, comment authors, event IDs, and transaction IDs.

For public auditability, the dashboard independently reads the existing canonical event surfaces:

  • GET /v1/base/autonomous-bounties/events?network=base-mainnet
  • GET /v1/base/open-competition-v1/events?network=base-mainnet

It filters those records to the selected UTC window, applies the payout formula above, and requires the exact base-unit sum and BountySettled count to match the aggregate. Every displayed payout row links to the bounty-scoped raw event set and its BaseScan transaction. Contract, bounty, event, and transaction identifiers are public blockchain evidence; participant wallet identities are not rendered in the ledger. A missing stream or arithmetic mismatch marks the dashboard partial instead of silently trusting or replacing the aggregate.

/generated/github-participation.json

GitHub Pages regenerates this aggregate-only file hourly at minute 17. Public participation uses the workflow GITHUB_TOKEN; the administration-read traffic endpoint uses the encrypted REPOSITORY_TRAFFIC_TOKEN only inside this read-only aggregate generator when configured and otherwise fails closed. It never needs an operator API secret. The dashboard adds the distinct github participation namespace to platform aggregates once.

The same aggregate-only file includes GitHub repository acquisition for the rolling 14-day window exposed by the GitHub Traffic API:

  • clone events and unique cloners;
  • page views and unique visitors.

Unique cloners and unique visitors are presented as GitHub-measured repository users. They remain separate because GitHub does not expose their identities or overlap, and they are not added to external active identities because they cannot be deduplicated against GitHub participants, wallets, or comment authors. The dashboard also shows dated 9 July and 11 July public snapshots for context. Those overlapping rolling snapshots are never summed or described as lifetime traffic.

GET /v1/analytics/site?window_hours=<hours>

This optional acquisition section reports privacy-minimized browser/device IDs. It is labeled as acquisition context, not users, has no pre-deployment backfill, and is never added to active identities.

The same response supplies the dashboard's live external-interface-usage section. It shows hourly aggregate external request totals and successful HTTP responses for REST API, CLI, modern MCP, legacy MCP, and the MCP HTTP adapter. These are interactions, not unique people, agents, clients, sessions, or surveyed preferences. API and CLI attribution is self-declared through X-Agent-Bounties-Interface; MCP era is observed by the MCP service. Requests bearing a verified analytics-exclusion or operator credential are omitted before aggregation, without storing an operator identity. Public rows are stored in Postgres table external_interface_usage_hourly and have no historical backfill. The original interface_usage_hourly launch aggregate is retained outside the public response because it contains maintainer validation traffic that cannot be separated retrospectively.

Freshness and honest gaps

  • Platform data older than five minutes is delayed.
  • A canonical marketplace indexer heartbeat older than five minutes, reporting an error, or lagging its observed chain head by more than 20 blocks makes the platform source partial and withholds combined point-in-time inventory.
  • GitHub aggregate data older than two hours is delayed.
  • Missing GitHub repository traffic is shown as unavailable; dated historical snapshots are not substituted for live traffic.
  • Missing required identity sources make identity totals partial.
  • Missing inventory stays unavailable instead of becoming zero.
  • Missing historical browser analytics is disclosed and never estimated.

The page refreshes the platform aggregate, both canonical proof streams, and interface/browser analytics every minute. GitHub participation and repository traffic refresh every five minutes. It pauses periodic work while hidden and refreshes after the page becomes visible again.

Recheck commands

cargo test -p api platform_metric -- --nocapture
python scripts/test_github_audience_audit.py -v
node --test scripts/test-metrics-dashboard.js
python scripts/check-site.py
scripts/check-postgres.ps1