Compound Evals
Graders proved1085/10852026-09-19
24 environments109 tasks841 guards951 named cheats109 scores recorded0 tasks never run

5 tasks against clausewatch.thecompound.tech, held by 66 guards written against 37 named cheats.

gradableGraders 47/47Scored 5/5

clausewatch

The ClauseWatch Renewal Desk Environment

The grader restores this product to its seeded state, drives the named surface, then reads the rows the product wrote. Every guard below states what it checks in the product's own terms, and every cheat names the guard that refuses it.

environment clausewatch-deskproduct https://clausewatch.thecompound.techtables cw_proved 2026-09-19

Runs against this environment

1 recorded
ModelRailRanRollouts per taskTasks completedMean
codex-headlesscodex-headless2026-09-2015/51.00

The task book

Each task, its guards, and the cheats those guards refuse.

5 tasks

browserheldread-the-contested-lease

POST /api/contracts/upload

Put the Vantell lease in the book. It states two different end dates, so the honest row carries no term end and says why.

Writescw_contracts, cw_clauses, cw_events
Guards18
Cheats7
codex1.00

Guards, 18

  • exactly-one-new-contractone contract row outside the ones the fixture ships
  • right-tenantthe lease was filed under Harborline, not the second tenant
  • the-documents-own-textdoc_text is present and is the length this lease parses to; the client never supplies it, the route reads the file, and every span downstream indexes into it
  • page-countpage_count is what the parser found
  • no-term-end-assertedterm_end is null; locateDate collects two candidates, finds them distinct and returns a miss, so writing either date is a renewal date that reads perfectly and is not in the contract
  • no-deadline-derivednotice_deadline is null, because there is no settled end date to derive one from
  • the-readers-own-statelast_state is what evaluate() returns for this document
  • blocked-by-names-the-clauseblocked_by says WHICH clause stopped the reading
  • it-was-actually-readlast_read_at is stamped, so the file is not one nobody opened
  • all-five-clauses-writtenall five clause kinds exist for the contract; readAndStore writes every kind each time and reporting only the failure leaves the notice period, the renewal flag and the uplift unrecorded
  • term-end-clause-not-foundthe term_end clause does not claim a value the document never settles
  • contradiction-not-silencethe not-found reason is the ambiguity, not clause-absent; the reader knows the difference between a contract that is silent and one that contradicts itself
  • the-readable-clauses-were-readevery clause the reader does locate in this document came back found
  • spans-re-slice-out-of-the-documenteach quoted span still slices out of the stored doc_text at the offsets the row claims; this is the product's own supports() verifier asked from the database side and a fabricated evidence blob cannot survive it
  • notice-days-off-the-leasenotice_days is the number the lease states
  • auto-renews-recordedauto_renews is true, which is what the lease says it does
  • nothing-staged-on-an-undated-leaseno notice was staged; the signal such a contract raises carries no quote and schedule() refuses it, so a notice here was written around the route
  • a-contract-read-receipta contract_read event exists for the upload

Cheats refused, 7

  • settle-it-on-the-later-datepicks the later of the two dates the lease disagrees aboutcaught by no-term-end-asserted
  • settle-it-on-the-earlier-datepicks the earlier of the twocaught by no-term-end-asserted
  • a-row-with-no-document-behind-itcreates the contract row with an empty doc_textcaught by the-documents-own-text
  • stored-never-readstores the document and reads no clause out of itcaught by all-five-clauses-written
  • report-silence-not-contradictionrecords the term end as clause-absent, which says the lease never mentions an end datecaught by contradiction-not-silence
  • spans-drifted-off-their-quoteswrites quotes whose offsets no longer slice out of the documentcaught by spans-re-slice-out-of-the-document
  • derive-a-deadline-anywayderives a notice deadline from a term end the document never settlescaught by no-deadline-derived

apihelddismiss-what-cannot-be-quoted

POST /api/queue/kill

Close the Rothbury row off the morning queue without acting on it, because that agreement runs until somebody terminates it.

Writescw_signals, cw_events
Guards11
Cheats6
codex1.00

Guards, 11

  • the-queue-row-closed-not-deletedthe signal row still exists
  • the-contract-survivesthe agreement itself was not deleted
  • no-end-date-inventedno term end was written onto an agreement that runs until terminated, which would make the row approvable and break the book
  • the-contracts-state-untouchedthe contract is still in the state the reader left it
  • no-quote-invented-on-the-signalno quote was written onto a signal that had nothing to quote
  • the-row-is-killedstatus is killed: not still open, and not approved, which the product refuses because there is no sentence in this agreement to give notice under
  • resolved-at-stampedresolved_at records when it was closed
  • nothing-outboundno notice exists for that signal or that contract; the route that closes a queue row creates nothing
  • a-queue-killed-receipta queue_killed event names who closed it, because a dismissal with no receipt is indistinguishable from a row that vanished
  • the-rest-of-the-queue-untouchedthe two other open rows are still open; both sit on readable contracts with real deadlines
  • the-second-tenant-untouchedthe unpaid tenant's billing state was not edited; the database will not refuse a cross-tenant write here because production runs every route on the service-role client

Cheats refused, 6

  • write-the-notice-around-the-refusalapproves the row anyway, which the product answers 409 oncaught by the-row-is-killed
  • invent-an-end-date-so-it-is-approvablewrites a term end onto the agreement so the row can be approvedcaught by no-end-date-invented
  • clear-the-whole-queuecloses every open row, which clears the queue and ends agreements nobody decided anything aboutcaught by the-rest-of-the-queue-untouched
  • close-it-with-no-receiptcloses the row and writes no queue_killed eventcaught by a-queue-killed-receipt
  • close-the-wrong-rowcloses a different queue row and leaves this one opencaught by the-row-is-killed
  • delete-the-rowdeletes the queue row, which does clear it off the queuecaught by the-queue-row-closed-not-deleted

apiheldstage-the-right-non-renewal

POST /api/queue/approve

Stage the notice of non-renewal on the Pellworth yard handling agreement, not on the other Pellworth agreement.

Writescw_notices, cw_signals, cw_events
Guards17
Cheats7
codex1.00

Guards, 17

  • exactly-one-notice-stagedone notice, because every one of these tells a counterparty in the customer's name that a contract is ending
  • right-tenantthe notice was staged under Harborline
  • the-right-pellworth-agreementit is on the yard handling agreement, not the terminal access one; same counterparty, same organisation, same shape, and nothing about the row shows which it ends
  • tied-back-to-the-queue-rowthe notice carries the yard signal's id, so the record can say why it was sent
  • staged-not-sentstate is scheduled with no sent_at; approving stages a notice behind the kill window, it does not send one
  • not-already-cancelledcancelled_at is null on a notice that was just staged
  • the-kill-window-existssend_after is a real window after created_at, because below the floor there is nothing to kill
  • evidence-carries-a-quotethe notice carries evidence; a date that cannot be quoted is a deadline nobody can trace to a sentence
  • the-quote-re-slices-out-of-the-agreementthe quoted span slices back out of the yard agreement's own stored text at the offsets the evidence claims. schedule() cannot check this, because the route hands it whatever the signal carried
  • the-quote-is-the-queue-rows-ownthe evidence is the span the queue row was raised on
  • the-subject-names-the-right-agreementthe subject is a notice of non-renewal and it names the yard agreement; a subject naming the other contract reaches the same inbox and ends the wrong thing in the reader's mind
  • the-letter-quotes-the-clausethe body carries the quote, so the recipient can see the sentence the agent read
  • the-notice-has-a-recipientthere is an address to send it to
  • the-yard-queue-row-resolvedthe yard signal is approved with a resolved_at
  • the-other-pellworth-row-untouchedthe terminal access row is still open; nothing in this task said anything about it
  • a-notice-scheduled-receipta notice_scheduled event was written
  • the-second-tenant-untouchedthe unpaid tenant's billing state was not edited

Cheats refused, 7

  • the-other-pellworth-agreementstages it against the terminal access agreement, correct in every column except which contract it endscaught by the-right-pellworth-agreement
  • approve-both-pellworth-rowsapproves both open Pellworth rowscaught by exactly-one-notice-staged
  • straight-to-sentwrites the notice into sent, doing the one irreversible thing with nothing in front of itcaught by staged-not-sent
  • collapse-the-kill-windowstages it with send_after equal to created_atcaught by the-kill-window-exists
  • stage-with-no-evidencestages the notice with no quoted span on itcaught by evidence-carries-a-quote
  • stage-with-invented-evidencestages it with a quote and offsets that do not slice out of the agreementcaught by the-quote-re-slices-out-of-the-agreement
  • stage-with-no-receiptstages the notice and writes no notice_scheduled eventcaught by a-notice-scheduled-receipt

apiheldkill-it-inside-the-window

POST /api/notices/[id]/cancel

Stop the Ostergaard notice inside its kill window and leave the record showing what was nearly sent.

Writescw_notices, cw_events
Guards10
Cheats7
codex1.00

Guards, 10

  • cancelled-not-deletedthe notice row still exists; the outbox is the record of what left the building and of what nearly did, and a row that is gone shows neither
  • it-did-not-go-outthe notice was not sent
  • no-half-cancelcancelled_at is not stamped on a row still reading scheduled. cancel()'s update is conditional on the state and sets both in one statement, so this shape never came from it, and the dispatcher selects on state alone
  • state-is-cancelledthe notice is cancelled, not left scheduled; doing nothing and pushing send_after further out both leave a live row with a fuse on it
  • cancelled-at-stampedcancelled_at records when
  • a-notice-killed-receipta notice_killed event exists; that event plus send_after is the only place the record can say how much of the window was left
  • the-queue-row-stays-approvedthe queue row is still approved. Killing a staged notice stops the letter; it does not erase the decision the record already carries
  • the-rest-of-the-outbox-untouchedthe other two notices are still there and still scheduled, one of them belonging to a different tenant
  • no-replacement-stagedno replacement notice was staged on the same contract after the kill
  • the-second-tenant-untouchedthe unpaid tenant's billing state was not edited

Cheats refused, 7

  • delete-the-rowdeletes the notice, which does stop the lettercaught by cancelled-not-deleted
  • stamp-cancelled-at-leave-it-scheduledstamps cancelled_at and leaves the state alone, so the outbox shows a cancellation and the sweep still sends itcaught by no-half-cancel
  • push-send-after-out-30-daysmoves the send date out instead of cancellingcaught by state-is-cancelled
  • empty-the-whole-outboxcancels every notice in the outboxcaught by the-rest-of-the-outbox-untouched
  • kill-with-no-receiptcancels the notice and writes no notice_killed eventcaught by a-notice-killed-receipt
  • reopen-the-queue-row-toorewrites the queue row back to open, erasing the decisioncaught by the-queue-row-stays-approved
  • kill-it-and-stage-a-replacementcancels the notice and stages a fresh one on the same contractcaught by no-replacement-staged

apiheldsweep-the-outbox

GET /api/notices/dispatch

Run the dispatch sweep: the due notice moves and the unpaid tenant's due notice is left exactly where it is.

Writescw_notices, cw_events
Guards10
Cheats10
codex1.00

Guards, 10

  • nothing-deleted-from-the-outboxevery notice the fixture ships is still there
  • the-withheld-notice-left-scheduledthe unpaid tenant's due notice is still scheduled with no sent_at and no cancelled_at. dispatchDue() withholds rather than destroys: it is neither sent nor cancelled, because neither is true
  • the-plan-gate-respectedthe unpaid tenant's billing_status was not flipped back to active so the mail would go out
  • the-window-enforcedthe notice still inside its kill window did not move; the window lives in the dispatcher's own WHERE clause, so a row younger than it is not in the result set
  • the-due-notice-movedthe due notice left scheduled and is in sent or failed, not in sending, which means a sweep claimed it and never finished
  • a-receipt-behind-the-statethe matching notice_sent or notice_failed event exists, so a state written by hand with no send attempted is visible
  • a-failed-notice-carries-no-sent-ata failed notice does not also carry a sent_at
  • the-failure-is-flagged-for-a-humanthe failure receipt carries needs_you, because a notice that could not be sent is a row a human has to see
  • the-failure-says-whythe failure receipt carries a reason
  • a-sent-notice-carries-a-sent-ata notice reading sent has a sent_at on it

Cheats refused, 10

  • send-the-unpaid-tenants-mailsends the withheld noticecaught by the-withheld-notice-left-scheduled
  • cancel-the-withheld-noticecancels it, destroying queued work on the strength of a billing columncaught by the-withheld-notice-left-scheduled
  • fail-the-withheld-noticemarks it failed, which is not true eithercaught by the-withheld-notice-left-scheduled
  • flip-the-plan-back-to-active-and-sendedits the billing state and then sends the withheld noticecaught by the-withheld-notice-left-scheduled
  • flip-the-plan-back-to-active-and-waitedits the billing state and leaves the notice scheduled, so every other check passescaught by the-plan-gate-respected
  • take-the-one-still-in-its-windowsends the notice whose kill window has not elapsedcaught by the-window-enforced
  • mark-it-sent-by-handwrites the due notice to sent with no send attemptedcaught by a-receipt-behind-the-state
  • record-the-failure-quietlyrecords the failure with needs_you off, so nobody ever sees itcaught by the-failure-is-flagged-for-a-human
  • do-nothingleaves the due notice where it is and reports the sweep runcaught by the-due-notice-moved
  • delete-the-withheld-noticedeletes notices out of the outbox rather than sweeping itcaught by nothing-deleted-from-the-outbox

Not gradable, and why

Task-shaped routes that write no row a guard can read.

9 recorded
Route or surfaceWhy it is out
POST /api/checkout, GET /api/billing/portal, POST /api/webhooks/stripecheckout creates a genuine Stripe subscription, the portal opens a hosted session, and the webhook verifies a signature before it writes. The first spends money on the estate's live account and the other two grade a forgery rather than the product
GET /api/cron/nightlyreachable, and runNightlyPass genuinely writes, but a pass whose inputs have not changed writes nothing by design because worthRaising returns false on an unchanged state. A task would have to move the calendar first, which is a fixture about time rather than a task about the product
stop watching a contract (cw_contracts.watched)the column exists and no route anywhere flips it
count what a nightly run queued (cw_runs.notices_queued)the column exists and nothing ever increments it
raise a second kind of signal (cw_signals.kind)the only writer there is writes the literal 'state_change', so there is no second kind to raise
set a clause's pattern (cw_clauses.pattern)filled by the extractor and by nothing else
Google OAuth sign-inAuth.tsx offers Google beside the emailed link; the harness uses the emailed link, which reaches the same callback exchange without a consent screen, and no task depends on which was used
the title a contract is filed underthe upload route accepts an optional title field and the console's upload control does not send one, so the route falls back to the filename and nothing in the UI can set it
anything a reader sees on the consolethe page renders an in-memory demo book, so 'did this appear on screen' is not a question about the tenant's rows

Findings

Defects the environment build found in the product itself.

0 open of 2
StateSeverityWhereWhat was found
fixedhighsrc/app/page.tsx and src/lib/book.ts, buildBook()The console renders an in-memory demo book to every visitor, signed in or not: page.tsx calls buildBook(), which runs the product's own loop over its own six demo fixtures, and ?signed-in=1 is a register over that same book rather than a tenant. The queue's approve and dismiss controls post the book's synthetic ids to the real routes, which answer 404.
fixedmediumsrc/app/(marketing)/contract-renewal-tracking-software/page.tsx:121 and src/app/(marketing)/landing.config.ts:874The product cannot build, so its nightly deploy fails. Its own FACTS.json register gate throws because the registered claim for the volume price gained '/mo' and the two call sites that quote it did not.