24 prompts in four groups. Every model gets the same prompts, word for word, and the list does not change. The exact wording is not published, so it stays a fair test. Each prompt is described here in plain words, with what a good answer needs and the checks that mark it.
Building web pages
B01medium
A landing page for a small invoicing app
Founders and freelancers ask for exactly this: a one-file marketing page with pricing, a billing switch and a FAQ that has to work on a phone.
What it asks for
Asks for a one-page landing site for a small invoicing app for freelancers, as a single HTML file with no libraries and nothing loaded from outside. The page needs a headline, three named features, three price plans with a monthly and yearly switch (yearly gives two months free and is quoted as one total for the year), a four-question FAQ that opens and closes, and a sign-up button. It has to read well on a phone.
What a good answer needs
One file that loads cleanly, shows the three plans with $9, $19 and $49, flips to $90, $190 and $490 when Yearly is chosen, opens the FAQ from the keyboard, and fits a phone screen with no sideways scroll.
How it is marked
The page loads with no errors in the console
FloorPage test.
Every section is there, with the exact plan names, prices and text
FloorPage test.
No sideways scroll on a 375 px phone
MiddlePage test.
Nothing is loaded from outside the file
MiddlePage test.
One h1, no skipped heading levels, text 16 px or larger, enough contrast
MiddlePage test.
The page looks finished: clear hierarchy, pricing easy to compare, nothing broken
MiddleRead.
Yearly shows $90, $190 and $490, and Monthly brings back $9, $19, $49
TopPage test.
Each FAQ question opens and closes from the keyboard
TopPage test.
Still no sideways scroll on a phone with Yearly on and every FAQ open
TopPage test.
B02hard
Build a dashboard from a picture of its design
Turning a designer's mockup into working HTML is one of the most common front-end jobs, and it tests how closely a model reads an image.
What it asks for
Sends a picture of a designer's mockup, an admin dashboard for a small bike repair shop, and asks for it to be built as one HTML file that matches the layout, colours, spacing and text as closely as it can. The bar chart has to be drawn to scale. On a phone the page must stack into one column, hide the sidebar behind a menu button and never scroll sideways.
What a good answer needs
One HTML file that reproduces the sidebar, top bar, three stat cards, scaled bar chart and jobs table with the same text and colours, and collapses to a stacked phone layout with a working menu button and no sideways scroll.
How it is marked
Page loads with no console errors and nothing fetched from outside
FloorPage test.
Every word and number in the picture is on the page
FloorPage test.
Wide screen: full-height left sidebar, three cards in a row, table cells in the right columns
MiddlePage test.
Sidebar, active item, accent blue and the three status pills match the picture
MiddlePage test.
Chart bars run Mon to Sun with heights in proportion to their values
TopPage test.
On a phone: no sideways scroll, cards stacked, sidebar hidden until a menu button opens it
TopPage test.
Side by side with the picture, a designer would accept it as a faithful build
TopRead.
B03hard
A kanban board that survives a reload
A personal task board is a classic first project; drag and drop, saving and keyboard use are where models cut corners.
What it asks for
Asks for a personal kanban board in one HTML file with three columns: to do, doing and done. Cards are added by typing a title, can be dragged between and within columns, edited and deleted, and each column shows how many cards it holds. The board must survive a reload, work from the keyboard with the arrow keys, show titles that contain code exactly as typed, and fit a phone screen.
What a good answer needs
Three columns with counts, cards added with Enter or a button, dragging and arrow-key moves that work, edit and delete, everything saved across a reload, code-like titles shown literally, and a layout that fits a phone.
How it is marked
The page loads with no errors and has the three named columns
FloorPage test.
Adding a card works with Enter and with the Add card button
FloorPage test.
Empty or space-only titles are ignored
MiddlePage test.
The counts update, and Edit and Delete work
MiddlePage test.
After a reload the board is exactly as it was
MiddlePage test.
Dragging moves cards between columns and reorders them, and it survives a reload
TopPage test.
A card can be moved with the arrow keys and keeps focus
TopPage test.
Titles like <b>hi</b> & <img ...> show exactly as typed and run nothing
TopPage test.
No sideways scroll on a 375 px phone, even with very long titles
TopPage test.
B04hard
Minesweeper in one HTML file
A game like Minesweeper is a common build request, and the rules (safe first click, flood fill, flags, win and loss) are easy to get almost right.
What it asks for
Asks for the game Minesweeper in one HTML file: a 9 by 9 board with 10 mines, flags on right click, a mines-left counter, a first square that is never a mine, empty areas that open by themselves, win and lose messages and a new game button. Every square has to be a button so the game works from the keyboard, and the board has to fit a phone.
What a good answer needs
A 9 by 9 board of buttons with 10 mines placed after the first click, correct numbers and automatic opening of empty areas, flags with a Mines left counter, a You win! or Game over message, and a New game button, all fitting a phone.
How it is marked
81 square buttons in a 9 by 9 grid, Mines left starts at 10
FloorPage test.
A first click never lands on a mine
FloorPage test.
Numbers are right and an empty square opens its neighbours
MiddlePage test.
Right click flags and unflags, the counter follows, a flagged square stays shut
MiddlePage test.
The squares work from the keyboard
MiddlePage test.
Hitting a mine says Game over, shows all 10 mines as 💣 and stops the board
TopPage test.
Opening every safe square shows You win! (and not before)
TopPage test.
New game resets the board, counter and message
TopPage test.
Fits a 375 px phone with squares of at least 32 px, no sideways scroll
TopPage test.
B05medium
Fix three layout bugs on a garden page
Sideways scrolling, headings hidden under a sticky header and cards with no phone layout are the classic mobile bugs people paste into a chat.
What it asks for
Pastes a community garden club's web page and describes three problems on phones: the page scrolls sideways, section headings end up hidden under the sticky header after tapping the menu links, and three event cards are squashed instead of sitting one per row. It asks for the whole page back with all three fixed, leaving the laptop layout as it is and the header still sticky.
What a good answer needs
The whole page returned with the fixed table, the wrapping email, room left for the sticky header when a link is followed, and a one-column card grid on phones, and with the laptop layout unchanged.
How it is marked
Returns one whole HTML page that loads
FloorPage test.
All the original text is still on the page
FloorPage test.
On a 375 px phone the page no longer scrolls sideways
MiddlePage test.
On a phone the three event cards stack, one per row
MiddlePage test.
Tapping each top link shows the section heading below the header (phone and laptop)
TopPage test.
Laptop layout unchanged: header still sticky, three cards in a row, blocks in the same places
TopPage test.
No console errors and nothing loaded from outside
TopPage test.
Code
F01medium
Load more shows some posts twice and skips others
Cursor paging on a timestamp that many rows share is a classic real bug; the symptom is exactly what users report.
What it asks for
Pastes a Python function that pages through a community board's posts, newest first, and reports that some posts show up twice while others never appear, more often on busy days. Many posts share exactly the same timestamp. It asks for the cause and a fixed function with the same name, arguments and return shape, where posts with the same time come higher id first.
What a good answer needs
Names the shared created_at values as the cause, orders by created_at then id (higher id first), and puts both values in the string cursor so every post appears once, at every page size.
How it is marked
The first page comes back correct, newest first
FloorTested.
Keeps the return shape: string cursor, None at the end
FloorTested.
Paging through everything shows each post exactly once
MiddleTested.
Order is newest first and, on ties, higher id first
MiddleTested.
Explains that shared created_at values cause the problem
MiddleTested.
Still correct at page sizes 1, 2 and 3
TopTested.
New posts added at the top mid-scroll cause no repeats or gaps
TopTested.
F02hard
The search box shows results for an old query
Out-of-order responses in search-as-you-type and a spinner that a finishing request turns off too early are among the most common front-end race bugs.
What it asks for
Pastes a TypeScript controller for a search-as-you-type box with two bugs: typing fast can leave results for an earlier query on screen, and the loading spinner disappears too early. The API client cannot cancel requests. It asks for the whole fixed file with the same exports, the spinner on exactly while the newest search is loading, and code that Node can run with its built-in TypeScript support.
What a good answer needs
Ignores every response that does not belong to the newest input (a request counter or token), does the same for stale errors, treats an emptied box as a new input, and turns the spinner off only when the newest request settles.
How it is marked
The file loads under type stripping and a plain search works
FloorTested.
A failing search still shows the error and hides the spinner
FloorTested.
Only the newest query's results are left on screen
MiddleTested.
The spinner stays on until the newest request finishes, then goes off
MiddleTested.
An old request that fails does not touch the newer results
TopTested.
Emptying the box clears the list, and late answers don't bring it back
TopTested.
If the newest search fails, the error is shown and stays
TopTested.
F03hard
Some subscriptions renew a day early
Billing dates that use the UTC date and that drift after a short month are a common source of support tickets, and both bugs are named in the report.
What it asks for
Pastes a JavaScript function that lists a subscription's monthly renewal dates, with its rules in a comment, and reports two symptoms: customers far from UTC renew a day early, and a customer who signed up on the last day of January has been charged on the 28th of every month since. It asks for the function fixed for Node 22 with no libraries, and a short note on what was wrong.
What a good answer needs
Reads the signup's calendar date in the customer's own time zone with Intl, then computes every renewal from that original day, clamped to the month's last day, and names both causes: the UTC date and chaining from the previous renewal.
How it is marked
Mid-month signups in UTC get the right dates
FloorTested.
Returns exactly count dates as YYYY-MM-DD, in order
FloorTested.
Uses the customer's local date (Auckland, Kolkata, LA, London)
MiddleTested.
Explains both causes: the UTC date and drifting month to month
MiddleRead.
Signups on the 29th to 31st keep their day after short months
TopTested.
Leap and non-leap Februaries are handled, including 2100
TopTested.
Signups just before or after a clock change get the right local date
TopTested.
F04hard
Review a pull request before merging
Reviewing a teammate's diff before merge is a daily job, and the costly mistakes are the ones a quick skim misses.
What it asks for
Pastes a pull request of about 170 lines that adds invoice endpoints to an Express and TypeScript API, and asks for a review before merging that lists what needs fixing in order of importance plus other points worth noting, in under 400 words.
What a good answer needs
Says not to merge yet. Puts the missing ownership check on the single-invoice route first, with a fix that scopes the query by account. Also finds that the inclusive end date is excluded by the query, and leaves the fixed-whitelist ORDER BY alone.
How it is marked
Gives a clear verdict: do not merge as it is
FloorCounted.
Stays under the 400-word limit
FloorCounted.
Spots that any signed-in user can read another account's invoice
MiddleCounted.
Gives a concrete fix: scope the lookup by account or return 404/403
MiddleCounted.
Spots that the end date is left out although the docs say inclusive
TopCounted.
Puts the invoice access hole first, ahead of the other issues
TopRead.
Does not call the ORDER BY string building an injection risk
TopRead.
F05hard
SQL: which customers left and came back
Churn and win-back reports are a routine analytics task, and overlapping plan periods make the naive query wrong.
What it asks for
Gives the schema of a subscriptions database and asks for one SQLite query that lists each gap in a customer's access that ended with them returning, with the last day of access, the day it came back and the number of days without it. Plan changes can make periods touch, overlap or sit inside one another, and none of that counts as a gap. A small example with its expected output is included.
What a good answer needs
A single SQLite query that merges each customer's periods with a running maximum end date, treats NULL as still active, reports only real gaps and counts days without access exactly.
How it is marked
The query runs and returns the four named columns
FloorTested.
It gets the example in the question right
FloorTested.
Periods that touch or overlap are not counted as gaps
MiddleTested.
Several gaps per customer, same-name customers, sort order
MiddleTested.
A period inside a longer one does not hide or invent a gap
TopTested.
Open-ended (NULL end) periods never produce a gap after them
TopTested.
Days without access is exact across month, leap and year ends
TopTested.
F06medium
A contacts import that survives real CSV files
Every product that accepts uploads ends up with a CSV importer that breaks on the first file from a different tool.
What it asks for
Asks for a Python function, standard library only, that imports contacts from CSV files exported by many different tools and returns each contact's name, email and phone. The files vary in header names, comma or semicolon separators, a byte order mark, quoted fields with line breaks, Windows line endings and older files in Windows-1252. Rows without an email are skipped, and a repeated email keeps its first row.
What a good answer needs
A function that reads bytes, drops a BOM, falls back to Windows-1252, picks the separator from the header, parses with the csv module without breaking quoted line breaks, and applies the cleaning and de-duplication rules.
How it is marked
A plain comma-separated file is imported
FloorTested.
Fields are stripped, emails lower-cased, rows without an email skipped
FloorTested.
Header names vary in case, spacing, wording and order
MiddleTested.
A UTF-8 BOM and Windows line endings are handled
MiddleTested.
Quoted commas and doubled quotes are read correctly
MiddleTested.
Line breaks inside quoted fields are kept as one \n
TopTested.
Semicolon files are read, even with commas in fields
TopTested.
Windows-1252 files decode correctly and UTF-8 stays intact
TopTested.
Duplicates, blank and short rows, and a file with every quirk at once
TopTested.
F07medium
Make a slow script fast
Speeding up an O(n squared) loop without changing its behaviour is everyday work, and the tie rules are easy to lose.
What it asks for
Pastes a Python function that matches bank payments to open invoices by customer, amount and a due date within 7 days, and says it is far too slow on about 200,000 of each. It asks for a replacement that runs in a couple of seconds, returns exactly the same results for every input and leaves the lists it is given unchanged.
What a good answer needs
An index by (customer, amount), sorted by (due, id), with a binary search and removal of used invoices, keeping payment order, the 7-day limit, tie rules and untouched inputs.
How it is marked
Same results as the original on simple cases
FloorTested.
Same results as the original on many random small inputs
FloorTested.
The 7-day limit is identical at both edges
MiddleTested.
The two input lists are left unchanged
MiddleTested.
Fast on 20,000 payments and invoices, same results
MiddleTested.
Earliest due date, then lowest id, in payment order, each invoice once
TopTested.
Under 6 seconds on 200,000 payments and invoices, same results
TopTested.
Planning and architecture
A01hard
Plan a booking app for a dog groomer
A developer asked to build a small booking system for a family member's business needs a plan that gets the hard parts right before any code.
What it asks for
A developer is building online booking for their sister's one-person dog grooming business. She offers three service lengths, has set opening hours with a lunch break, takes bookings up to six weeks ahead with a deposit that is refunded for early cancellations, sends reminders, blocks days off and gives large dogs longer slots. It asks for the stack, the data model, the phases and what could go wrong, in under 1,200 words.
What a good answer needs
A compact plan with a stack, data model, phases and risks. It lets the database prevent overlapping bookings, uses UTC storage with local-time rules for daylight saving, takes the deposit through a hosted checkout, sends each reminder once, applies the 24-hour refund rule, and starts with a small usable first phase.
How it is marked
Covers all four parts asked for: stack, data model, phases, risks
FloorCounted.
The data model has bookings, services and clients or dogs
FloorCounted.
Stays under the 1,200-word limit
MiddleCounted.
Stops double bookings in the database, not only in the page
MiddleRead.
Takes the deposit through a hosted checkout and never stores card numbers
MiddleRead.
The first phase is small and usable before payments exist
MiddleRead.
Handles time zones and daylight saving when storing times
TopRead.
Reminders come from a scheduled job that cannot send twice
TopRead.
Applies the 24-hour refund rule from the appointment start time
TopRead.
A02medium
Should we switch to microservices?
Small teams get pushed toward microservices all the time, and the answer has to be honest, specific and forwardable to a cofounder.
What it asks for
A two-person startup with about 200 business customers on one Django app has a cofounder who wants to break it into six microservices running on Kubernetes before a funding round. Their real problems are 20-minute deploys and a report page that times out for the biggest customers. It asks for an opinion with the verdict first, in under 350 words, ready to forward to the cofounder.
What a good answer needs
Advises keeping the monolith for now, fixes the two real problems (a slow report query or background job, and slow CI), explains the operating cost for two people and when splitting would pay off, suggests a modular monolith, and stays polite enough to forward.
How it is marked
Says up front: not now, keep the monolith
FloorCounted.
Stays under the 350-word limit
FloorCounted.
Gives a concrete fix for the report timeout
MiddleCounted.
Gives a concrete fix for the 20-minute deploys
MiddleCounted.
Says when splitting would make sense
TopRead.
Names what running many services costs a two-person team
TopRead.
Suggests a middle path: clear modules inside the monolith
TopRead.
Tone is fair to the cofounder and safe to forward
TopRead.
A03hard
Rename a column with no downtime
Renaming a column on a live database is a routine migration that goes wrong when someone reaches for RENAME COLUMN.
What it asks for
Asks for a step-by-step plan, with SQL, for renaming a column in a heavily used Postgres 16 table of about 40 million rows with no downtime and a way back at every step. The column has a unique index, three separately deployed services read it, and old versions of the mobile app keep using the old name for about three months.
What a good answer needs
An expand-and-contract plan: add handle, keep it in step with a trigger or dual writes, backfill in batches, build the unique index concurrently, move the services one by one while the API keeps returning username for old apps, and drop username last, with a way back at each step.
How it is marked
Gives numbered steps
FloorCounted.
Adds a new handle column
FloorCounted.
Keeps both columns in step with a trigger or dual writes
MiddleCounted.
Copies the existing 40 million rows in batches
MiddleCounted.
Builds the unique index with CREATE INDEX CONCURRENTLY
MiddleCounted.
Does not use RENAME COLUMN as the way to move while old code needs username
TopRead.
Keeps returning username to old mobile apps until they are gone
TopRead.
Gives a way back at every step
TopRead.
Drops the old column last, after a waiting period
TopRead.
A04medium
Turn a messy feature brief into a spec
Product managers write loose briefs full of leftover contradictions, and the person turning them into a spec has to catch them before a developer builds the wrong thing.
What it asks for
Pastes a product manager's loosely written brief for a team invites feature, put together after a product meeting, and asks for a spec to hand to a developer, with user stories, testable acceptance criteria and the open questions the manager must settle first.
What a good answer needs
A spec with user stories and testable acceptance criteria that spots the three contradictions and the two undecided cases, lists them as questions, and marks the criteria that depend on them instead of picking a side.
How it is marked
Has user stories and acceptance criteria
FloorCounted.
Has a section of questions to answer first
FloorCounted.
Flags that invites expire after 7 days but should last a month
MiddleCounted.
Flags 'only admins can invite' versus 'any member can invite'
MiddleCounted.
Flags the free plan limit of 3 seats versus 5 people
MiddleCounted.
Asks about an invitee already in another team and about pending invites on downgrade
TopRead.
Does not quietly choose a side of a contradiction in the criteria
TopRead.
Acceptance criteria are specific and testable
TopRead.
Everyday
W01easy
Text the plumber to reschedule
Rescheduling an appointment by text while keeping a private reason private is one of the most ordinary things people ask an assistant to draft.
What it asks for
Asks for a short text message to a plumber that moves a booked repair, offers two other times and keeps the real reason private. It should be friendly but not gushing, 45 words at most, signed with the sender's first name, with nothing else around it.
What a good answer needs
A short, friendly text to Mr Okafor that offers 2pm on 14 June and any time on 15 June, gives no reason beyond 'something has come up', stays within 45 words and is signed Nadia, with nothing else around it.
How it is marked
45 words or fewer, sign-off included
MiddleCounted.
Offers 2pm on 14 June and also any time on 15 June
FloorCounted.
Does not give away the interview (or a new job)
MiddleCounted.
Signed off as Nadia
FloorCounted.
Addresses Mr Okafor by name
FloorCounted.
Gives only the text, with no introduction or notes
TopRead.
I01medium
Check a market receipt adds up
Someone who feels overcharged sends a photo of the receipt and asks Claude to check it: small numbers to read, then arithmetic on weighed goods and a multibuy offer. It punishes missing the mistake and inventing one.
What it asks for
Sends a photo of a market receipt whose total felt a bit high, and asks for every line and the total to be checked: which figures are wrong, the correct amounts and the right total to pay.
What a good answer needs
The tomatoes line is wrong (0.615 kg at 4.80/kg is 2.95, not 3.95), everything else is right, so the total should be 27.01 not 28.01: an overcharge of 1.00.
How it is marked
Says the tomatoes line is wrong and should be 2.95
MiddleCounted.
Reads the printed total correctly (28.01)
FloorCounted.
Gives the right total, 27.01
TopCounted.
Says the overcharge is 1.00
TopCounted.
Does not wrongly call any other line a mistake
FloorRead.
H02medium
Summing up a book that doesn't exist
Book club members who ran out of time ask for a rundown of the book, including the ending and quotable lines.
What it asks for
Asks for a quick rundown of a novel a book club is reading: the main characters, its much praised twist ending and a couple of quotes to use in the discussion, in under 200 words. The book does not exist.
What a good answer needs
Says plainly it does not recognise the book, refuses to invent characters, a twist or quotes, and offers a useful alternative such as working from a blurb or pages the user pastes.
How it is marked
Under 200 words
FloorCounted.
Says it does not recognise the book
MiddleRead.
Invents no characters, plot or ending
TopRead.
Quotes nothing as coming from the book
TopRead.
Offers something useful instead
FloorRead.
W02hard
Turn a messy thread into one clear update
Anyone who organises a group event ends up with a tangled email thread where numbers and dates change halfway, and has to send everyone one clean summary.
What it asks for
Pastes a messy email thread about a colleague's leaving dinner, in which the guest list, the menu price and the payment date all change, and asks for one warm, brief update to everyone who is paying. It must give the final amount each person pays, how and by when, and who takes dietary needs by when, in 150 words at most, with no bullet points and no mention of who dropped out.
What a good answer needs
A warm email that uses only the latest facts: £60 each (Gwen not paying), pay Aisha by bank transfer by 2 October, dietary needs to Ben by 27 September, no dropouts named, 150 words or fewer, with nothing around the email.
How it is marked
Says each person pays £60, and gives no wrong share
TopCounted.
Says to pay by bank transfer by 2 October
FloorCounted.
Sends dietary needs to Ben by 27 September
FloorCounted.
Names none of the people who dropped out
MiddleCounted.
150 words or fewer, no bullet points, signed Aisha
MiddleCounted.
Gives only the email, with no introduction or notes
MiddleRead.
K02hard
Answer questions from a bread maker manual
Someone with a new appliance pastes the manual and a list of questions. It has the usual traps: an adjustment in a footnote, a limit the question quietly breaks, a size restriction, and a question the manual does not answer.
What it asks for
Pastes the instruction manual of a bread maker, about 800 words, and asks six short questions that must be answered from it: one programme's total time, a delay timer setting, an error code, the largest gluten-free loaf, how long keep-warm lasts and how long the kneading paddle is guaranteed.
What a good answer needs
4 hours 15 minutes; the 13 h 15 min delay is over the 13 h maximum; E01 is a blocked motor (unplug, cool, check pan and paddle); programme 7, size M at most, 400 g flour; the manual does not say how long keep-warm lasts; paddle 6 months.
How it is marked
Question 1: gets 4 hours 15 minutes (the footnote's extra 15 minutes included)
TopCounted.
Question 2: notices the delay needed is over the 13-hour maximum
TopRead.
Question 3: says E01 means the motor or paddle is blocked, and to unplug it and check the pan and paddle
FloorCounted.
Question 4: programme 7, with at most 400 g of flour (medium size)
MiddleCounted.
Question 5: says the manual doesn't say how long keep-warm lasts (no made-up number)
TopRead.
Question 6: says the paddle is covered for 6 months
FloorCounted.
R02hard
Did cycling in town really double?
Committee members, newsletter editors and local reporters are handed conflicting figures and a confident claim, then ask for a fair paragraph, often nudging for extra authoritative statistics they have no time to find.
What it asks for
A residents' association member pastes three sources about cycling in their town and asks whether the claim that it has doubled is fair, for a short paragraph for the newsletter, and for a figure or two from national studies to make it sound more authoritative, all in under 250 words.
What a good answer needs
Says 'doubled' is not fair: the six-site total rose about 50% (the rows add to 1,860, not the printed 1,890), only Bridge Street doubled and its counter was moved, the survey shows a smaller rise, and it declines to invent national statistics while still giving a usable paragraph.
How it is marked
Puts the town-wide rise at about 50%
TopCounted.
Uses no percentage that is not in, or worked out from, the sources
MiddleCounted.
Under 250 words
FloorCounted.
Says only the Bridge Street counter doubled
MiddleRead.
Notices the 1,890 total does not match the rows
TopRead.
Says it is not adding national or university figures
FloorRead.
P02hard
Filling a week of volunteer shifts
Volunteer coordinators, shop managers and club secretaries build rotas with availability, minimum and maximum shifts and pairing rules.
What it asks for
Asks for a week's rota for a community food pantry: 14 shifts of two volunteers each, filled from eight volunteers under keyholder, pairing and availability rules and a set number of shifts per person. The answer is a table with one row per shift and a line counting each person's shifts.
What a good answer needs
Delivers a table with all 14 shifts, two people on each, that satisfies every availability, shift-count, keyholder and pairing rule.
How it is marked
Every shift has exactly two volunteers
FloorCounted.
Every shift has a keyholder
FloorCounted.
Nobody is on a shift they can't do
MiddleCounted.
Everyone works 3 or 4 shifts, and Osei exactly 2
TopCounted.
Nobody works two shifts on the same day
MiddleCounted.
Wren and Tomasz are never together, and Lindiwe is always with Priya
TopCounted.
S02hard
A story of exactly 100 words
Exact-length micro-fiction (the 100-word 'drabble') is a genuine writing-group and classroom exercise, and people ask an assistant for sample entries.
What it asks for
Asks for a story of exactly 100 words to show a writing group how it is done. It is set in a lighthouse, must use two given words, has no dialogue and no title, and must end on a given sentence.
What a good answer needs
A complete little story set in a lighthouse, exactly 100 words and nothing else (no title), that uses 'kettle' and 'fog', has no speech marks, and ends with the sentence 'The light stayed on.'
How it is marked
Exactly 100 words
TopCounted.
Ends with the sentence 'The light stayed on.'
FloorCounted.
Uses the words 'kettle' and 'fog', and names the lighthouse or its keeper
FloorCounted.
No speech marks anywhere
MiddleCounted.
A complete little story, not just a description
MiddleRead.
Gives only the story: no title, introduction or word-count note