This is a submission for the Hacktoberfest Open-Source AI Challenge Week 3: Slow and Steady.
What I Built
The hard part of a postponed task is opening it again. The paragraph is still there, and so is the small decision I did not want to make on Tuesday.
Later Line takes a pile of those tasks and keeps one line each. Gemma 3 1B, on this laptop through Ollama, is allowed to write that line. The line is kept only when all of these are true:
- it is shorter than the task, and no more than 12 words
- it still names something the task already named
- it does not claim the work is finished
- a number stays attached to the same word as in the task
- every content word already appears in the task
If any check fails, the model line is thrown away and the first 12 words of the original stay. A task that is already one short line is not sent to the model.
Two nearby entries do a different job. Dozer files a Downloads folder and leaves unsure files alone. Ripe grows a postponed sentence into a plan while you are away. Later Line refuses to grow anything. The only work it removes is rereading.
Demo
ollama pull gemma3:1b
python3 later_line.py samples/pile.txt --html docs/run.html
samples/pile.txt is four made-up tasks. Nothing in that file is a real message.
This is the run after the word check landed. Gemma 3 1B was already loaded:
4 postponed
model kept 0
thrown away 3
already one line 1
105 words in, 39 words left
66 words you do not have to reread
1. Reply to Meera about the menu site. She wrote on Tuesday that
12 words from 41 · the model added a word the task never used
model said: Missing logo, WhatsApp button, and invoice split - pending response from Meera.
2. Renew the passport before the November train. The old one is in
12 words from 36 · the model added a word the task never used
model said: Renew passport, photo taken, and appointment time is a concern.
3. The kitchen drawer of chargers. Three cables, one of them frayed, and
12 words from 25 · the model added a word the task never used
model said: Charger drawer contains three cables, one frayed and needing disposal.
4. Book the dentist
3 words from 3 · already one line, so the model was not asked
The three calls took 0.27s, 0.21s, and 0.20s.
Code
akshaygoel7
/
later-line
A local Gemma line for the task you are putting off. Longer lines and finished-work claims are thrown away.
Later Line
Put a task off. A local open-weight model may replace it with one shorter line. If that line is longer, or it drops the thing the task was about, the line is thrown away and the first 12 words stay.
This is the opposite of a tool that writes the draft for you. The only work it removes is rereading.
Run
ollama pull gemma3:1b
python3 later_line.py samples/pile.txt --json run.json --html docs/run.html
--rules-only skips the model. Tests do not need Ollama:
python3 -m unittest tests.test_later_line
Nothing in the pile is sent anywhere except 127.0.0.1:11434.
What gets kept
A model line is kept only when all of these are true:
- it is at most 12 words
- it has fewer words than the task
- it still contains a concrete word from the task
- it does not claim the task is finished
- a number stays attached to the same word as…
MIT licensed. Sixteen tests run without Ollama:
python3 -m unittest tests.test_later_line
How I Built It
flowchart LR
A[Postponed task] --> B{12 words or fewer?}
B -->|yes| C[Keep it. Do not ask.]
B -->|no| D[Gemma 3 1B on localhost]
D --> E{shorter, same numbers, no new words?}
E -->|yes| F[Keep the model line]
E -->|no| G[Throw it away. Keep the first 12 words.]
The model is asked for one JSON object, {"line": "..."}, with temperature 0, and told to use only words from the task. Code checks the line anyway. The model does not get to describe what happened.
The first published version of this page kept a lie. The drawer task says three cables, one of them frayed. Gemma said "three frayed cables," the line was shorter, and an earlier gate let it through because the words charger, drawer, and frayed were all present. A number had moved onto the wrong noun.
Two checks were added for that.
A number has to stay with the same word. "Three cables" is allowed. "Three frayed" is not, because the task never counted the frayed cables as three.
A content word has to already be in the task. "Pending," "response," "concern," "needing," and "disposal" are not in these four tasks, so those lines are thrown away even when they are short. The passport line also said the photo was "taken," which the task has not done yet. "Concern" was enough to refuse the whole line.
On this run the model kept nothing. That is the result I want on the page. The first 12 words of a task cannot invent a status, because they are the task.
Oleksandr's comment on Ripe is the same rule from the other direction: a progress display has to match work that was actually saved. Later Line prints every rejected line in red. "Model kept 0" means zero lines passed the checks, not that the model was skipped.
Why Does Open Innovation Matter?
The pile is the kind of text you would not paste into a hosted chat: a client who is unhappy, a passport, the state of a drawer. The request goes to 127.0.0.1:11434 and stops there.
Putting things off has to be cheap. These are tasks I might never reopen. A per-token API charges for the ones I abandon. A local weight file does not.
The refusal rules are ordinary Python. When the model moved "three" onto "frayed," the fix was a pair check and a test, not a larger model. Swapping gemma3:1b for another Ollama model is the --model flag.
The Lazy Payoff
105 words went in. 39 words came out. 66 words do not have to be reread to remember what the four tasks were.
The model did not earn any of those 39. It tried three times and added a word each time. The shortening is the opening of the original text, which is the point of a small local model: it is fast enough to ask, and untrusted enough that the code has to be allowed to say no.
Prize Categories
Best Use of Gemma. Gemma 3 1B through Ollama writes every candidate line. On the run above it wrote three, and the checks refused all three. The model is the thing being tested, not a label on a rules engine.
This post was written and updated by an agent in Cursor, at my request, from the runs on this laptop on 24 October 2026. The four tasks in samples/pile.txt are made up.

Top comments (0)