Rizqey Labs ← rizqey.com
Deep dive · September 2026

Papers: we built the paperwork checker before the client's workflow arrived

Papers reads the documents on a shipment, says which paper does not match, and names who to ask. I shipped the first version on a standard freight workflow, from research, because the client's own workflow was not in yet. The shipments on the site are samples.

11Handovers
24Fields checked
~7 sA check, was ~50 s
1Timeout
25 Sepresearch PDF out 2AI readers, two makers 9documents 18reads 10 of 10tests 12:46amupgrade to the client
01 · The product

What it is

Papers is for the people who move a shipment's paperwork at a freight forwarder. A forwarder books the ship and the trucks and prepares the papers. It does not own the ship.

A shipment changes hands about eleven times between a factory and a buyer. The papers have to agree: container number, seal, weight, package count, the companies. Papers reads each document twice, with two separate AI readers from two different makers. It passes only when they agree and nothing needs a person's judgement. If one paper disagrees, it stops and names that paper, the handover, and who to ask. It does not file with customs, release cargo, change a booking, or decide the goods code, the origin, the value, or a permit. A pass means the papers agree. The screen does not treat that as customs clearance.

Read twice

two separate AI readers from two different makers

Agree?

container number, seal, weight, package count, the companies

Pass

only when they agree and nothing needs a person's judgement

Or stop

names that paper, the handover, and who to ask

The three shipments you can actually run are made up. So are the extra files sitting on the list at earlier steps. Those extra files are labelled sample data. They are not a live check.

papers.rizqey.com
The Papers Shipments list: sample files with route, shipper, consignee, arrival date, handover number out of 11, and a PASS, STOP or Not checked yet label
Fig 1. The Shipments list: files marked PASS, STOP or "Not checked yet", each at its handover out of 11. All sample data. Captured 28 Sep 2026 from the live site, before the 8:34pm version. The three Pannonia Coffee files, JKT/26/01421 to 01423, are the runnable samples.

Next ↓Why it exists

02 · The brief

Why it exists

On 24 September I took a 37-minute call with a logistics client. The notes of that call say they wanted the documents checked at every handover, so the goods could get through the port and the trucking companies. Their operational workflow would follow. I promised a day of research, then a first version within a week. On the call I set the clock in my own words: best case two days, latest one week.

37 mincall, 24 Sep 1 dayof research 1 weekto a first version 2 daysbest case

I did not know the business. When I asked for a plain explanation, this is what I said:

His questionFaris1 line
What WOULD that operational workflow usually be for a logistics company? He mentioned freight forwarding and stuff. I have no idea what any of that is.

That research is why the first version has the shape it has. The write-up put a normal Europe-to-Malaysia shipment into eleven handovers, from the order and the truck at the factory through the bill of lading (the shipping line's receipt), Malaysian customs, and the proof the buyer got the goods. Some checks are exact. A container number matches or it does not. Some are a person's call: the goods code, the origin, the value, a damaged box, a bad seal, a sanction, a permit. The rule I kept is short. Pass only when the documents are there, the two reads agree, the exact checks pass, and nothing needs a person. Otherwise stop, and name the field.

Two things in that research kept the demo honest. Hungary has no seaport, so the samples go by road to Koper, then by ship to Port Klang. And the samples are neutral: packaged coffee and fictional companies. If a route or a goods type looks restricted, Papers stops and asks a person before it reads anything.

Hungary

no seaport

Koper

by road

Port Klang

by ship

The sample route. Packaged coffee, fictional companies.

The client called the research a good start on the evening of 25 September. The next step was their real workflow. On 26 September it still had not arrived. Claude had told the build to wait. I said that was wrong. The research was the shape. Their workflow, when it comes, replaces a data file.

Next ↓The best runs, 25 to 28 September

03 · Five runs

The best runs

0125 Sep 2026

25 September: the research, then a checker that could already fail a file

34,000characters of research 16page PDF ~50 sa check Apassed Bstopped

Automation includes: Manus ↓, Cursor ↓, NightShift ↓ · checked by Claude Code ↓

What I asked for was the one-day paperwork research, and a first version of the checker inside the week I had promised on the call.

Manus wrote the research, 34,000 characters, overnight. Claude turned the sendable part into a 16-page PDF and it went out on 25 September as the first deliverable. Overnight, Cursor also built the checker: invoice, packing list, bill of lading, road note, certificate of origin, customs declaration, two readers, pass only if they agree on every field. When that note landed, Claude had not run it. Cursor's own note said sample A passed and sample B stopped on the container number. Later that morning, Claude ran both from outside.

The result: sample A passed. Sample B stopped. The packing list, the road note, and the customs declaration said container MSCU4829173. The bill of lading said MSCU4829174. The stop named the bill of lading as the odd paper. About 50 seconds a check. The checker was up. The client had not been sent the link yet.

Sample B, 25 Sep.

Checked from outsideClaude1 line
[25 Sep 2026, 9:02am] CLAUDE: … paperwork agent. Live at [the host's default address]. I ran both samples myself: A passes; B stops on the container number, naming the bill of lading as the odd one out. Two different providers read each document. About 50 seconds per check.
0226 Sep 2026 · morning to 1:16pm

26 September, morning: the version I was about to send timed out

40–100 sone reader 60 sthe host's cut 7–8 son the laptop 4live runs

Automation includes: Claude Code ↓

The ask was to name it papers.rizqey.com and send the client the demo. Claude tested the live demo first. Shipment A took about a minute to pass. Shipment B crashed. The mismatch was right, MSCU4829174 against MSCU4829173, but one reader took 40 to 100 seconds and the documents were read one after another, up against the host's 60-second cut.

01
One reader, 40 to 100 s
100 s
02
The host's cut
60 s
03
After the swap, laptop
7–8 s

Seconds, 26 Sep. Widths to scale.

Claude swapped in two fast models, still two makers, with a time limit and one retry. A failed read stops the check. It does not guess a pass. On the laptop, twice: 7 to 8 seconds, A passes, B stops on the container. I said yes. Four live runs:

Four live runsClaude1 line
[26 Sep 2026, 1:16pm] CLAUDE: I CHECKED on the live site, 4 runs: Shipment A passes in 7 seconds, Shipment B stops on the container number (MSCU4829174 on the bill of lading against MSCU4829173 on the other papers) in 6 to 7 seconds, every time. … Before: about a minute, and B crashed.

papers.rizqey.com did not exist yet. This was still the two-sample demo, on the host's default address.

0326 Sep 2026 · 3:19pm to evening

26 September, later the same day: build it from the research, and name the right person

11handovers in a data file 3coffee shipments 7.1–8.7 sreal readers 6 → 9tests ~7 slive, papers.rizqey.com

Automation includes: Head Dev ↓ · checked by Claude Code ↓

I did not want to wait. The Head Dev, Claude in the cloud, got the build: eleven handovers in a data file, checks across the whole chain, three phone screens, three fictional coffee shipments. One clean, one container digit off on the bill of lading, one weight off. Finished at 3:19pm, six tests. It had no key for a real model, and it said so. The real reads were Claude's, on the laptop.

Claude ran them. All three right, about 50 seconds each. Nine documents, two readers, eighteen reads, one after another. The Head Dev sent the reads out together. Claude ran the real readers again: clean pass in 7.7 seconds, container stop in 8.7, weight stop in 7.1. Eight tests passed.

The phone pictures had a worse problem. The bill of lading was the odd paper, and the stop blamed the factory and told you to ask the trucker. That is the first stage a container number appears, not the stage the wrong paper belongs to. The person to ask is the shipper or the forwarder, at the handover with the shipping line.

The wrong deskClaude1 line
[26 Sep 2026, 3:31pm] CLAUDE: When one paper is the odd one out, the stop names the wrong stage and the wrong person to ask. It blames the factory step when the bill of lading is the wrong paper.

The Head Dev fixed it from the workflow file. No special case in the code. If there is no clear majority, it says so and names every stage. Claude ran it again. The container stop says stage 5 and asks the shipper or the forwarder. The weight stop says stage 2 and asks the carrier or the haulier, because the odd paper is the road note, the CMR, the standard European truck form. The clean file still passed. Nine tests. 7 to 10 seconds each.

before

Blamed the factory

told you to ask the trucker

stage 5

Container stop

asks the shipper or the forwarder

stage 2

Weight stop

asks the carrier or the haulier

After the fixClaude2 lines
[26 Sep 2026, 4:05pm] CLAUDE: Bill-of-lading stop: it now names stage 5 and asks the shipper or forwarder.
Weight stop: it names stage 2 and asks the carrier or haulier.

I said yes to the address. Claude put this version on https://papers.rizqey.com. Three live samples, all right, about 7 seconds each. The old demo stayed up for a rollback. The link went to the client that evening.

0427 Sep 2026 · to 12:46am, 28 Sep

27 September: three buttons, then a spreadsheet that fell off the phone

3sample buttons 15files, cut off on a phone 10 of 10tests 11:13pmphone version live 12:46amto the client

Automation includes: Head Dev ↓, Cursor ↓ · checked by Claude Code ↓

By the next day the live site still presented the job as three sample buttons. The eleven handovers were hidden in the data file. I said so.

His messageFaris1 line
[27 Sep 2026] FARIS: Looks like some clown suit. Looks like someone who has no idea how existing pre-AI logistics SaaS looks and works. … a typical logistics workflow has 11 steps and here you show me 3 stupid buttons.

The Head Dev rebuilt the desk around the eleven handovers, after reading freight software and YC logistics companies from 2024 on. The file page is the handovers, the document checklist, and a comparison grid. A stop can be marked resolved, with a note, or it can draft a request for the corrected paper. The draft is copied. Nothing is sent. The three runnable samples kept their outcomes. I said yes. Live that evening: clean pass in 7.6 seconds, wrong container in 6.7, wrong weight in 6.7.

I opened it on my phone. The home screen was a bare table. "Check All, 15 files." The file numbers and the consignee column were cut off at the edges. No header. No sign of what to do next. Claude had checked that the answers were right, and had not looked at the phone. That was the part I had already said to get right.

His messageFaris1 line
[27 Sep 2026] FARIS: wtf this shit looks so broken. I thought I told u to research Logistics YC Startups and figure out the UIUX?

The Head Dev and Cursor each rebuilt the phone screens, after studying YC logistics startups from 2024 on. Claude checked the batches on YC's own directory: Forge (Winter 2024), Cartage (Summer 2024), Pax (Summer 2024), Lighthouz AI (Summer 2024), Trava (Winter 2025), chrt (Spring 2025), Markit (Fall 2025), Lunavo (Fall 2025). Both left the checker alone. Ten of ten tests. The three samples still passed, stopped on the container, and stopped on the weight.

Claude picked Cursor's. Bottom tabs, larger type, one main action, and a stopped file shows the two values side by side with the wrong one marked. The Head Dev's version was right and read like a web page: smaller type, no bottom tabs.

papers.rizqey.com
A stopped sample file on the Papers desk: STOP at handover 9 of 11, the seal number on the delivery order, HUP44199, against HUP44190 on the other papers, with Mark resolved and Request corrected document buttons
Fig 2. A stopped sample file: the two seal numbers side by side, the delivery order's value marked, and the Mark resolved and Request corrected document buttons.
The same stopped file on a phone, with the two seal numbers side by side and tabs along the bottom
Fig 3. The same stop on a phone, with bottom tabs.

Both captured 28 Sep 2026 from the live site, before the 8:34pm version. Sample data.

The phone version went live at 11:13pm on 27 September. Claude checked it from outside just after midnight: the phone-width page fits, nothing runs off the side, clean pass 7.7 seconds, wrong container 6.7, wrong weight 5.7. Ten of ten tests. The upgrade went to the client at 12:46am.

0528 Sep 2026 · 12:31pm to 8:34pm

28 September: the rivals show the paper. Papers does not.

3 msa stored sample ~7 sa real check 3:51pmGrok's polish 5:58pmGrok on the gap 8:34pmpaper view live

Automation includes: Cursor ↓, Head Dev ↓, Grok ↓ · checked by Claude Code ↓

I was still not satisfied. The desk looked like an internal admin page. I said Skell, a separate product, and Papers do not look like products that can beat the YC companies already doing this job.

His messageFaris4 lines
[28 Sep 2026, 12:31pm] FARIS: I'm not satisfied with how Skell and Papers look.
…
They DO NOT look like products that can defeat their rivals.
They DO NOT look like they can defeat their YC Startup incumbents.

Cursor and the Head Dev both started. Cursor's draft stopped on an error: file numbers wrapping, a label on the next column, a sidebar that ended halfway down. The Head Dev's was the better of the two. It did not go live. That round waited for me to see it.

The gap showed up in the rivals' own demos. No free accounts, so Claude watched the walk-throughs. Lighthouz (YC Summer 2024) takes one messy PDF, sorts it ("Bill of lading, page 3"), and opens the scan beside the read. CommodityAI (YC Winter 2024) previews the paper on the shipment. Papers shows two numbers as text. A stored sample also said the check took 3 milliseconds, against a real check of about 7 seconds.

Where Papers is behindClaude1 line
[28 Sep 2026, 6:03pm] CLAUDE: Where Papers is behind: Papers never shows a paper. It only shows two numbers as text.

Grok, on the laptop, polished the Head Dev's build from 3:51pm, and Claude checked that round. At 5:58pm Grok started on the gap: the paper beside the read, both papers on a stop, a PDF sorted into documents, a believable time, desktop and phone. At the last note it was still building, and Claude had not checked it yet. The public page was still the phone desk from the night before. A version with the paper view went live at 8:34pm, after the last note.

Papers · paper view
Work in progress: a STOP at handover 5 of 11, with the packing list and the bill of lading shown side by side as papers, and the container number boxed in red on both
Fig 4. A container stop with the packing list and the bill of lading side by side, the container number boxed on both.

Captured 28 Sep 2026, before it went live at 8:34pm. Sample data.

Next ↓What worked

04 · The numbers

What worked

The research PDF went out on 25 September, inside the two-day best case, and the client called it a good start that evening. The check went from about 50 seconds, and one timeout, to roughly 7 seconds. Single figures in the notes run from 5.7 to 8.7. One round was 7 to 10 seconds a check. The three outcomes never flipped: pass, stop on the container number, stop on the weight.

01
About 50 s a check
50 s
02
One timeout, the host's cut
60 s
03
Highest single figure
8.7 s
04
Lowest single figure
5.7 s

Seconds per check. Widths to scale; a full bar is the host's 60-second cut.

Timed runClean passContainerWeight
25 Sep~50 s~50 s–
26 Sep, live, 1:16pm7 s6–7 s–
26 Sep, real readers7.7 s8.7 s7.1 s
27 Sep, evening7.6 s6.7 s6.7 s
28 Sep, after midnight7.7 s6.7 s5.7 s

Timed runs from this entry. Pass, container stop, weight stop, each time.

Twenty-four fields, checked across the whole chain. Nine documents, eighteen reads, eleven handovers. Tests went from six, to eight, to nine, to ten of ten on the public version. A pass still lists the judgements a person has not made.

6tests 8tests 9tests 10 of 10on the public version

The upgrade reached the client at 12:46am on 28 September.

Next ↓What broke

05 · Failures

What broke

crashed

The demo, morning of 26 September

The demo the client would have opened on the morning of 26 September crashed. One reader, 40 to 100 seconds, reads queued, shipment B dead at the 60-second cut. Claude caught it by running the live site first. Cost: no link that morning.

wrong desk

The factory-and-trucker stop

The factory-and-trucker stop was a right field on the wrong desk. A logistics person would have noticed. Caught off the phone pictures that afternoon, fixed before the new address, re-run on the real readers.

shipped

The 15-file table

The 15-file table was actually shipped, cut off on a phone, after I had said the phone had to be right. Claude had signed off on the three answers. I caught the screen.

unsaved

The 25 September checker

The 25 September checker was never saved to GitHub. Laptop folder only. Later versions are in the repo.

to 8:34pm

The hidden paper, and 3 milliseconds

Until 8:34pm on 28 September, the live site hid the paper and printed 3 milliseconds on a stored sample. Cursor's 28 September draft died mid-build with wrapping numbers, an overlapping label, and a half-height sidebar. Grok's repair was still being built at the last note.

waited

Part of the afternoon of 26 September

For part of the afternoon of 26 September the build also sat waiting, because "wait for the client's workflow" had been treated as the plan. The research was the plan. Same-day recovery. Still a miss.

Next ↓What we learned

06 · Rules

What we learned

1
Build before the client's workflow arrives, and keep that workflow in a data file. Waiting on 26 September was the wrong instruction. Their handovers replace the file. The checker stays.
From: run 03, and the wait, 26 Sep
2
Name the odd paper's own stage and its person. The factory-and-trucker line was a correct container number pinned on the wrong desk.
From: run 03, 26 Sep
3
A failed read says nothing was checked. No guessed pass. The timeout is why, with a time limit and one retry.
From: run 02, 26 Sep
4
Run the live site, on a phone, before the link goes out. Notes that only checked the answers missed the slow pass, the crash, and the cut-off table.
From: runs 02 and 04
5
Put the eleven handovers on the file. Three buttons hid the job a forwarder actually does.
From: run 04, 27 Sep
6
Show the paper beside the read, and print a time a person would believe. "3 ms" beside a 7-second check looks made up. Lighthouz already opens the scan.
From: run 05, 28 Sep
7
A pass means the papers agree. Customs clearance, safety, and the open judgements stay with a person. That was the research rule on day one.
From: the research
8
If the route or the goods look restricted, stop and ask a person. Check the geography before building a sample on it. Hungary has no seaport, so the sample shipments go by road to Koper first.
From: the sample route

Next ↓Where it stands

07 · Now

Where it stands

https://papers.rizqey.com loads. I checked it again at 8:49pm on 28 September. A new version went live at 8:34pm that evening, after the last note above. Two layout fixes went live at about 10:25pm the same night. It is still Papers, import desk, search by file number, container number, or bill of lading number. It now takes a PDF or a text file, shows a drawn copy of each paper next to what was read from it, and puts the two papers side by side on a stop. The 3-millisecond sample time is gone. Sample rows are marked "Sample data. Not a live check." The three runnable samples are still the coffee files. I ran one of the three samples on it from outside: the wrong container number stopped on the bill of lading in 8.7 seconds on desktop and 7.4 on a phone. The client's own workflow has not arrived yet.

Papers · paper view
Work in progress: a drawn bill of lading page on the left and, on the right, the fields read from it, such as the bill of lading number, shipper, consignee, container number and gross weight
Fig 5. Captured 28 Sep 2026, before it went live that evening: a drawn bill of lading page beside the fields read from it. Sample data.

Loads

checked again at 8:49pm, 28 Sep

Paper view

live at 8:34pm, 28 Sep

One live check

container stop, 8.7 s

The client's workflow

not arrived yet

Next is that file, swapped into the workflow data, and the real scan on screen instead of a drawn paper.

Automation includes: Claude Code on the laptop, the Head Dev (Claude in the cloud), Cursor, Manus, Grok on the laptop, and NightShift (the overnight run into 25 September).

Claude Code

On the laptop. The checks from outside.

In this entry · runs 01 to 05

Head Dev

Claude in the cloud

In this entry · runs 03, 04 and 05

Cursor

The first checker, and the phone screens Claude picked

In this entry · runs 01, 04 and 05

Manus

The research, 34,000 characters

In this entry · run 01

Grok

On the laptop: the polish from 3:51pm, the gap from 5:58pm

In this entry · run 05

NightShift

The overnight run into 25 September

In this entry · run 01

Last receipt in this entry · 28 Sep 2026, 6:03pm

[28 Sep 2026, 6:03pm] CLAUDE: Where Papers is behind: Papers never shows a paper. It only shows two numbers as text.

Last updated 28 September 2026