Assesses a URL's Graceful Boundaries conformance level through direct
HTTP inspection, then provides a concrete implementation plan for
reaching the next level. The output is an actionable document with
code examples the user can implement immediately. No special tooling
or dependencies required — the skill works with any HTTP client.
Follow these phases in order. Each phase builds on the previous one.
Fetch the limits discovery endpoint directly. Try both standard paths:
GET <url>/api/limits
GET <url>/.well-known/limits
Use curl, fetch, or any HTTP client available in the current environment.
No special tooling is required.
If either path returns a JSON response, record:
service fieldlimits objecttype, maxRequests, windowSeconds, description)
conformance field is present (self-declared level)Cache-Control header with s-maxagechangelog or feed URLs are present (v1.1 change discovery)resource-dedup entries include returnsCached: true (v1.1)If neither path returns a valid response, the service has no discovery
endpoint and cannot be Level 2 or above.
Optional accelerator: If the graceful-boundaries repo is cloned
locally, the automated checker provides a structured report:
node evals/check.js <url> --json
This is a convenience, not a requirement. The skill works entirely
through direct HTTP inspection.
If the limits endpoint documents specific API endpoints, fetch one of
them and check for proactive headers on the success response:
RateLimit: limit=N, remaining=N, reset=NRateLimit-Policy: N;w=NThese headers indicate Level 4 conformance.
Do NOT attempt to trigger 429s. That would require hammering the
service and is not appropriate for an audit. Level 1 and Level 3
conformance cannot be verified without observing an actual refusal
response — note these as unverifiable and explain why.
Map findings to the conformance levels defined in spec.md:
| Level | How to verify |
|---|---|
| --- | --- |
| N/A | Site has no API or agentic surface |
| 0 | Service exists but no limits endpoint, no structured responses |
| 1 | Cannot verify without a 429 response (note as unverifiable) |
| 2 | Limits endpoint exists and is well-formed |
| 3 | Cannot verify without a 429 response (note as unverifiable) |
| 4 | Level 2 confirmed + proactive headers present on success responses |
If the service self-declares a conformance level via the conformance
field, compare declared vs. validated. Flag any discrepancy.
Report the assessment as:
For each level above the current confirmed level, list exactly what is
missing. Reference specific sections of spec.md:
To reach Level 1 (spec sections 2 and 6):
error, detail, and why? (v1.1: why is MUST for all error classes)
error, detail, limit, retryAfterSeconds, why)?
error use a stable machine-parseable string (snake_case)?detail include a specific retry time in human-readable form?why explain the purpose, not restate the error?retryAfterSeconds a non-negative integer?Retry-After header? tag or a ? (v1.1)
To reach Level 2 (spec section 1):
/api/limits or /.well-known/limits?limits object?changelog or feed URLs for change discovery? (v1.1, optional but recommended)To reach Level 3 (spec sections 3 and 5):
cachedResultUrl, alternativeEndpoint, upgradeUrl, humanUrl, cached)
use cached > try alternative > upgrade > wait > human handoff?
resource-dedup limits: does the service return cached results as a200 instead of a 429? If so, does the discovery endpoint include
returnsCached: true so agents skip retry logic? (v1.1)
To reach Level 4 (spec section 4):
RateLimit headers present on success responses?limit, remaining, reset?RateLimit-Policy header present?N;w=N?Provide concrete, copy-pasteable code for each gap. Use the service's
actual domain and endpoints in examples.
Limits discovery endpoint skeleton:
{
"service": "<service name>",
"description": "<what the service does>",
"conformance": "level-2",
"changelog": "https://<domain>/api/changelog.json",
"feed": "https://<domain>/feed.json",
"limits": {
"<endpoint-key>": {
"endpoint": "<path>",
"method": "<HTTP method>",
"limits": [
{
"type": "ip-rate",
"maxRequests": 100,
"windowSeconds": 3600,
"description": "100 requests per IP per hour."
},
{
"type": "resource-dedup",
"maxRequests": 1,
"windowSeconds": 86400,
"returnsCached": true,
"description": "One operation per resource per day. Repeat requests return the cached result."
}
]
}
}
}
Structured refusal body:
{
"error": "rate_limit_exceeded",
"detail": "You have exceeded the limit of 100 requests per hour. Try again in <N> seconds.",
"limit": "100 requests per IP per hour",
"retryAfterSeconds": 1234,
"why": "<one sentence explaining why this limit exists — not just restating the error>"
}
Constructive guidance fields (add to the refusal body):
{
"cachedResultUrl": "/api/result?id=<resource>",
"alternativeEndpoint": "/api/<alternative>",
"upgradeUrl": "https://<domain>/pricing",
"humanUrl": "https://<domain>/contact"
}
Proactive headers (add to success responses):
RateLimit: limit=100, remaining=99, reset=3600
RateLimit-Policy: 100;w=3600
Reference security considerations where relevant:
why must describe the category of protection, not the mechanismexpected must use positive descriptionsOutput a structured markdown document:
# Graceful Boundaries Assessment: <domain>
## Summary
- Confirmed level: <N>
- Declared level: <N or "not declared">
- Likely level: <N>
## What was checked
- Limits endpoint: <path> — <found/not found>
- Proactive headers: <present/absent>
- Refusal format: <not verifiable without triggering a 429>
## Gaps to next level
<prioritized list with spec section references>
## Implementation plan
<concrete code examples using the service's actual domain>
## Security notes
<relevant SC-* considerations>
overall AI discoverability, not rate limit conformance specifically)
共 2 个版本