See what a rewrite changed about what was promised

Paste a text on the left and the version it was rewritten into on the right. The page lists the obligation words, conditions, dates and amounts that moved — and nothing else. It is not a line diff, and it does not judge whether the rewrite reads better.

What this does not do

  • It is not a general diff. Spelling, punctuation, grammar, order and phrasing are outside the four lists, so a heavily reworded paragraph can come back as no changes matched.
  • It does not understand meaning. It matches closed word lists, so a gentler wording that shifts the promise without using a listed word produces no row at all.
  • It does not open, read, upload, sync or store your text. You paste it; the page sends it nowhere.
  • It does not decide which version is right, who is owed what, or whether a date is real. It reports candidates and you mark each one.
  • It does not score, grade, rank or recommend either version.
Instrument

Two texts, four lists

The left box holds the text as it stands, the right box holds the rewrite. Press Compare to list what moved between them.

The version you are comparing against.

The version you are checking.

Example values are invented and labelled as fictional.

Nothing compared yet.

Paste both texts and press Compare. The list of changes appears here.

Change list

What moved between the two texts

Counts only: no score, no percentage and no verdict on the rewrite.

No comparison yet.

The six fields travel with the CSV and the Markdown: Position, Original snippet, Revised snippet, Change type, Status and Notes. Each row waits at Not checked, because finding a change is not the same as agreeing to it. Unassigned marks a row nobody has taken on yet: it records who owns the row, not whether the change is acceptable. Set Pass when the change was intended and the text can go out as written, and Fail when it was not intended or the earlier promise has to be put back. Add a row when you spot a change the lists cannot name, and write it in your own words.

Export

Take the list with you

The CSV uses the same six column names in the same order as the row fields above.

Nothing exported yet.

How to read a change row

Each row names the sentence on the left, the sentence on the right, the value that moved, one of six change types, and a state you set. The six types are the only six.

Why "review" becoming "deliver" is not a row here

A rewrite that turns "we will review the deck" into "we will deliver the deck" changes what the reader is entitled to expect, and neither "review" nor "deliver" is in any of the four lists. The ladder does not move and no date or amount changed, so this page reports nothing for that sentence. The gap is printed here rather than hidden: catch that kind of swap by hand and add a row for it, or use a line-by-line diff when the wording itself is what you need to see.

Why "may" becoming "will" changes what the reader does

Someone reading "we may extend to 12 seats" plans around an extension that might never come; the same person reading "we will extend to 12 seats" starts booking the work. The two sentences share almost every word and the consequence is not the same, because the second one is something a reader can hold the writer to. A condition disappearing does the same work in reverse: "if the budget allows" was the way out of the sentence, and removing it removes the way out.

Press Compare again and the list is rebuilt from the two texts, so export what you have marked before you re-compare. Nothing is stored between visits.

The lists this page runs on

Four closed lists are the whole rule set. A change that is not in one of them is not reported, which is why the lists are printed in full here instead of being described.

Obligation levels

Each sentence is reduced to the strongest obligation word it contains, and that word decides its level. Moving up the ladder is reported as strengthened; moving down is reported as weakened.

  1. 1 · Speculative — may, might, could, possibly, perhaps, maybe, potentially
  2. 2 · Intended — can, should, aim to, aims to, plan to, plans to, intend to, intends to, hope to, hopes to, expect to, expects to, target, targets, try to, tries to, looking to
  3. 3 · Committed — will, shall, going to, agree to, agrees to, agreed to, committed to, commits to, commit to, guarantee, guarantees
  4. 4 · Obligated — must, required to, requires, mandatory, obliged to, contractually

Conditions

A condition that disappears strengthens what is left; a condition that appears weakens it.

if approved · if the pilot is approved · if it is approved · if this is approved · subject to approval · subject to sign-off · pending approval · pending sign-off · if the budget allows · assuming · provided that · if the client agrees · if all goes well · contingent on · on condition that · if we can

Dates, deadlines and periods

The wording "by", "before" or "no later than" followed by a date is read as a deadline, and a dated deadline reads as a commitment even when the sentence carries no obligation word: "send it by Friday" is not a suggestion.

ISO date (2026-09-14) · Slash date (14/09 or 14/09/2026) · Day then month (3 June or 3 June 2026) · Month then day (June 3 or June 3, 2026) · Weekday (Friday or Fri) · Counted period (within 5 working days) · Relative period (next week) · End or start of a period (end of quarter) · Quarter (Q3) · Short deadline (EOD, EOW, COB)

Amounts, currencies and units

Symbol currency (£4,200 or $1,500) · Currency code first (GBP 4,200) · Currency code last (4,200 GBP) · Percentage (12% or 12 percent) · Number with a unit (3 revisions, 5 seats) · Hedged quantity (up to 3, approximately 10) · File size (12 GB)

A bare number with no currency and no unit — "phase 2", "the second draft" — is deliberately out of scope, so it is never reported as an amount change. Letter case is ignored when the lists are matched, so "Friday" and "friday" are one token, while the row always shows the text the way you pasted it.

Where it stops

Where your text goes

Everything happens in this browser tab. The two texts are read by the script on this page and compared there; they are not uploaded, not sent to a server, not written to a cookie or to browser storage, and not logged. There is no file upload, no account and no form submission on this page.

The CSV and the Markdown are built in the tab as well. The download is created by your own browser, and the Markdown is handed to your clipboard only when you press the copy button. Closing the tab discards the texts and the list; if you want a record, export or print before you leave.

Guides and other tools

Other tools: preflight checks before a file leaves your desk, the action register, the claim ledger, and the tools index for the whole set.

Method & next step

The four lists printed above are the entire method. ToolVerity keeps no private list of extra words, and no part of this page reaches the network: the comparison, the counts and both exports run in your browser. State words are fixed across this site: Pass — checked and it holds; Fail — checked and it does not hold; Not checked — not checked yet; Unassigned — nobody has taken the row on yet. Pass, Fail and Not checked are the three verdicts on a row; Unassigned records who owns it, not whether it holds. On this page a row is one detected change, so "holds" means you read the change and accepted it. No score, percentage, grade or ranking is produced anywhere. Sentences are paired by shared words, and the paired sentences are then compared token by token against the four lists.

How we check pages · Next guide: rewrite an email without changing what you promised

Questions

Is this a text diff?

No. A line diff shows every change including commas and spacing. This page ignores all of that on purpose and reports only what its four lists can name, so a paragraph rewritten in different words can come back as "No changes matched". Use a line diff when the wording itself is what you need to read.

Why does every row start at Not checked?

Because the page can only say that a value moved, not whether the move is acceptable. It found the change; deciding whether the rewrite may go out stays with you. A row marked Fail asks for a note, so the reason is in the export rather than only in your head. Unassigned is the fourth word in the same list: it marks a row nobody has taken on yet, so the count shows work that has not been picked up.

What happens to a change the lists cannot see?

It is not reported, and the page will tell you no changes matched even though the promise moved. That is the same gap as "review" becoming "deliver": add a row yourself and write the change in the Notes field, so the record is complete even where the lists are blind.

Runs entirely in your browser. Nothing you type or paste is sent anywhere.