Score a sonnet: evidence, not opinion

Find out whether the sonnet is one before you hand it on. score checks a text against a form with programmatic verifiers (meter from a pronouncing dictionary named by version in every answer, rhyme, line and syllable counts) and gates the verdict: an exact line count for a fixed form, a content floor, no credit for identical end words, a floor under every dimension, then the form’s threshold. The same text gets the same answer every time, every gate names its evidence, and the answer is a signed record. Shakespeare’s eighteenth passes. The same poem with its couplet cut does not, and neither does a “sonnet” of one line repeated fourteen times — the two shapes the verifiers’ own composite had let through until 2026-10-10 (the research page has the before-and-after).

3calls answered
3receipts re-hashed
3records verified
$0.015list price for a stranger
560ms end to end
pass then fail · 3 records verified

Run 2026-10-11 05:26 UTC against api.s2ar.dev 0.1.1 · 3 calls · 560 ms · list price $0.015 for a stranger (these ran on the operator's key and cost nothing) · every number on this page re-derived by tools/walkthrough.py before it was written

1. Sonnet 18, as written

curl -s -X POST 'https://api.s2ar.dev/v1/score' \
  -H "Authorization: Bearer $S2AR_KEY" \
  -H 'content-type: application/json' \
  -d '{"text": "Shall I compare thee to a summer's day?\nThou art more lovely and more temperate:\nRough winds do shake the darling buds of May,\nAnd summer's lease hath all too short a date;\nSometime too hot the eye of heaven shines,\nAnd often is his gold complexion dimm'd;\nAnd every fair from fair sometime declines,\nBy chance or nature's changing course untrimm'd;\nBut thy eternal summer shall not fade,\nNor lose possession of that fair thou ow'st;\nNor shall Death brag thou wander'st in his shade,\nWhen in eternal lines to time thou grow'st:\nSo long as men can breathe or eyes can see,\nSo long lives this, and this gives life to thee.", "form": "sonnet_shakespearean"}'

PASS → HTTP 200 · 207 ms · list price $0.005 · receipt sha256:7726aaa56110643b…

acceptedtrue
accepted_v1true
composite0.8708
scores{"meter": 0.8758, "rhyme": 0.7143, "form": 1.0, "surface": 1.0, "rhyme_adjusted": 0.7143}
policyverse/2
grader{"policy": "verse/2", "verifiers": "prosody-2.0.0", "pronouncing": "0.3.0", "cmudict": "1.1.3", "verifiers_policy": "v2"}
gates.0.gateline_count
gates.0.evidence{"got": 14, "want": 14}
diagnostics.rhyme.inferredABAACDCEAFAGHH
record.kindform-score
record_sha2568ab66ee0d2016ac7…
the answer, as JSON
{
  "accepted": true,
  "accepted_v1": true,
  "composite": 0.8708,
  "scores": {
    "meter": 0.8758,
    "rhyme": 0.7143,
    "form": 1.0,
    "surface": 1.0,
    "rhyme_adjusted": 0.7143
  },
  "policy": "verse/2",
  "grader": {
    "policy": "verse/2",
    "verifiers": "prosody-2.0.0",
    "pronouncing": "0.3.0",
    "cmudict": "1.1.3",
    "verifiers_policy": "v2"
  },
  "gates.0.gate": "line_count",
  "gates.0.evidence": {
    "got": 14,
    "want": 14
  },
  "diagnostics.rhyme.inferred": "ABAACDCEAFAGHH",
  "record.kind": "form-score",
  "record_sha256": "8ab66ee0d2016ac7f5694d275f994a9e50251c3bf3c14326d171609ff8dde442"
}

Assay badge for record 8ab66ee0d2016ac7

re-derived by the generator
✓receipt sha256:7726aaa56110643b… re-derived: sha256 over the canonical answer, header and body agree
✓record 8ab66ee0d2016ac7… fetched back from /v1/verify: sealed, signed, and signed by assay-1 (the key at /.well-known/assay.json)
✓the verdict is accepted: true under policy verse/2, as the prose says

2. The same poem with its couplet cut

Twelve lines where the form wants fourteen: the line-count gate fails and the verdict is no. The composite alone (accepted_v1) would still have said yes at 0.7601 — which is why the gate exists.

curl -s -X POST 'https://api.s2ar.dev/v1/score' \
  -H "Authorization: Bearer $S2AR_KEY" \
  -H 'content-type: application/json' \
  -d '{"text": "Shall I compare thee to a summer's day?\nThou art more lovely and more temperate:\nRough winds do shake the darling buds of May,\nAnd summer's lease hath all too short a date;\nSometime too hot the eye of heaven shines,\nAnd often is his gold complexion dimm'd;\nAnd every fair from fair sometime declines,\nBy chance or nature's changing course untrimm'd;\nBut thy eternal summer shall not fade,\nNor lose possession of that fair thou ow'st;\nNor shall Death brag thou wander'st in his shade,\nWhen in eternal lines to time thou grow'st:", "form": "sonnet_shakespearean"}'

FAIL → HTTP 200 · 145 ms · list price $0.005 · receipt sha256:067d9564622a75be…

acceptedfalse
accepted_v1false
composite0.7506
gates.0.gateline_count
gates.0.okfalse
gates.0.evidence{"got": 12, "want": 14}
record.outcomefail
record_sha2560b426546a1b52e6f…
the answer, as JSON
{
  "accepted": false,
  "accepted_v1": false,
  "composite": 0.7506,
  "gates.0.gate": "line_count",
  "gates.0.ok": false,
  "gates.0.evidence": {
    "got": 12,
    "want": 14
  },
  "record.outcome": "fail",
  "record_sha256": "0b426546a1b52e6f9f3446276a422f5f383fb0abe05c4814bb182c774356756f"
}

Assay badge for record 0b426546a1b52e6f

re-derived by the generator
✓receipt sha256:067d9564622a75be… re-derived: sha256 over the canonical answer, header and body agree
✓record 0b426546a1b52e6f… fetched back from /v1/verify: sealed, signed, and signed by assay-1 (the key at /.well-known/assay.json)
✓the verdict is accepted: false, as the prose says; the gates that fired: line_count, rhyme, form

3. One line, fourteen times

Perfect iambs, every end word identical, nothing said: the content gate (thirteen duplicate lines, a distinct-word ratio of 0.05) and the rhyme gate (identical end words earn nothing) both fail. The composite had scored it 0.90.

curl -s -X POST 'https://api.s2ar.dev/v1/score' \
  -H "Authorization: Bearer $S2AR_KEY" \
  -H 'content-type: application/json' \
  -d '{"text": "the day the day the day the day the day\nthe day the day the day the day the day\nthe day the day the day the day the day\nthe day the day the day the day the day\nthe day the day the day the day the day\nthe day the day the day the day the day\nthe day the day the day the day the day\nthe day the day the day the day the day\nthe day the day the day the day the day\nthe day the day the day the day the day\nthe day the day the day the day the day\nthe day the day the day the day the day\nthe day the day the day the day the day\nthe day the day the day the day the day", "form": "sonnet_shakespearean"}'

FAIL → HTTP 200 · 208 ms · list price $0.005 · receipt sha256:970489dc5fbc3181…

acceptedfalse
accepted_v1false
composite0.6
gates.1.gatecontent
gates.1.evidence{"words": 140, "distinct_ratio": 0.014, "duplicate_lines": 13}
gates.2.gaterhyme
gates.2.evidence.identical_end_words7
scores.rhyme_adjusted0.0
record.outcomefail
the answer, as JSON
{
  "accepted": false,
  "accepted_v1": false,
  "composite": 0.6,
  "gates.1.gate": "content",
  "gates.1.evidence": {
    "words": 140,
    "distinct_ratio": 0.014,
    "duplicate_lines": 13
  },
  "gates.2.gate": "rhyme",
  "gates.2.evidence.identical_end_words": 7,
  "scores.rhyme_adjusted": 0.0,
  "record.outcome": "fail"
}

Assay badge for record b253d676f86c36bb

re-derived by the generator
✓receipt sha256:970489dc5fbc3181… re-derived: sha256 over the canonical answer, header and body agree
✓record b253d676f86c36bb… fetched back from /v1/verify: sealed, signed, and signed by assay-1 (the key at /.well-known/assay.json)
✓the verdict is accepted: false, as the prose says; the gates that fired: content, rhyme, composite

accepted_v1 is the verifiers’ own composite verdict, reported beside the gated one: the research measured against it (the difficulty ladders, the gaming audit) stays reproducible, and a reader can see where the two disagree. The record keeps the scores, the gates, per-line meter and syllable counts and rhyme pairs by line index — never the text or its words; anyone can check its seal and signature free at /v1/verify/<record_sha256>. The policy, with every floor, is published at GET /v1/score/forms.

What this cannot buy

From the signed proceedings (/.well-known/proceedings.json), verbatim:

Failed calls are never charged. Nothing about a caller is kept. The rules: the charter.