The Terleckas Script

A Farewell Script  ·  Zenfulfillment Engineering

The Terleckas Script

Architect of ZenOS  ·  62 Tokens  ·  No Bluffs

Some engineers ship features. Some quietly remove the reasons anyone had to open the production database at eleven at night. Jonas did both, for four years, without ever once being the loudest person in the room.

SEP 2022 — AUG 2026  //  PROJECTS: ALKT · IT

62Tokens Drawn
56Resolved
4Years
1Epic, End to End
27Median Days
0Fires Started

The Good Team

Townsfolk

Twelve characters he played, all at once, across four years. Each ability is a real thing that is running in production right now.

The Forwarder

You start knowing nothing about inbound transport. By dusk there is a Freight Forwarder role, transport fields, a pickup workflow and a price negotiation — and a stranger can log into ZenOS and move your pallets.

IT-1010 · IT-1011 · IT-1012 · IT-1014 · IT-1015 · IT-1070

The Claims Clerk

Each time DHL rejects a reimbursement because the totals do not add up, you may rebuild the PDF. Eventually DHL runs out of reasons.

ALKT-547 · ALKT-548 · IT-926 · IT-996 · IT-997

The Gatekeeper

Suppliers see only their own purchase orders. Before you, every supplier saw everyone’s. Nobody had noticed.

ALKT-386 · ALKT-394 · ALKT-513

The Batch Warden

Each night, inventory that arrived under a blocked batch number and believed itself free is blocked again — this time in Storelogix, where it actually counts.

ALKT-507

The Returns Keeper

Each night, returns that were announced but never shipped leave the Grimoire. Returns that arrive without a label are finally seen.

ALKT-433 · ALKT-534 · ALKT-569 · IT-934

The Translator

Warehouse workers in Aschaffenburg read German. Warehouse workers in Szczecin read Polish. This required considerably more than a dictionary.

ALKT-528 · ALKT-532

The Cartographer

You know where every Packstation, Paketshop and Postfiliale stands, and you tell DHL and Hermes in real time. You also worked out that a Postfiliale never needed a Postnummer to begin with.

ALKT-471 · ALKT-474 · ALKT-479 · ALKT-533

The Surgeon

Orders may now change fulfillment centre without anybody opening a production database at 23:00 and pasting in a list of UUIDs. Operations has not stopped thanking you.

ALKT-361

The Envoy

External return providers, partners and safety-stock consumers may speak to ZenOS through an actual endpoint instead of an email and a hope.

IT-855 · IT-1547 · ALKT-563 · ALKT-571

The Alchemist

You choose what ZenOS whispers to Azza: reserve the stock or don’t, send the bundle configuration, mark digital products inactive, leave the warehouse SKU unprefixed.

ALKT-495 · ALKT-499 · ALKT-502 · ALKT-406

The Storekeeper

A refund may be taken as store credit. The money never leaves the shop, the customer gets a bonus, and the merchant sends you a very nice message.

ALKT-568

The Chronicler

Every export gains the thing it was missing — the ZF number, the shipping date, and the carrier’s own words about where the parcel actually is.

ALKT-427 · ALKT-506 · ALKT-560 · ALKT-500

Also on the Good Team, Technically

Outsiders

Every script needs characters whose ability is mildly inconvenient for everyone, including themselves.

The Investigator

You start knowing the answer. Six of your tickets produced no code whatsoever — only the truth, which turned out to be the expensive part.

ALKT-386 · ALKT-464 · ALKT-528 · ALKT-604 · IT-997

The Sub-task

You are eleven of the sixty-two. You did the work. Nobody will count you.

ALKT-331 · ALKT-333 · ALKT-460 · ALKT-471 · +7

The Regression Test

Created 10 January 2025. Status: To Do. Some evils cannot be defeated, only outlived — and you have outlived it.

ALKT-196

Removed From the Bag

Minions & Demons

The evils that lived inside ZenOS before he got to them. All six are dead. None of them are coming back.

The Manual Edit

Each night, an engineer opens the production database and moves orders between fulfillment centres by hand, following a four-step procedure written down in a ticket.

Minion · slain

ALKT-361

The Loose PO

You are visible to every supplier who logs in, regardless of whose purchase order you happen to be.

Minion · slain

ALKT-394

The ZF Prefix

You assume every purchase order starts with “ZF”, and that no other merchant on earth ever had the same idea.

Minion · slain

IT-962

The Phantom Return

You were announced. You were never shipped. You will sit in “Incoming” forever, and there are thousands of you.

Minion · slain

ALKT-433

The Rejected Claim

Each day DHL reads the Order Overview PDF, observes that the total does not equal the sum of its parts, and declines to pay.

Demon · slain

ALKT-548

GoRamp

You were integrated, never finished, then quietly reimplemented somewhere else. You lingered in the codebase anyway. Removed in a single day, without ceremony.

Demon · slain

IT-1493

The Almanac

What He Actually Built

Sixty-two tickets is a number, and numbers are the least interesting thing about this. They are also only the tail of it: Jonas joined in September 2022, and the ALKT and IT boards only start carrying his name in January 2025. Eleven of the sixty-two are sub-tasks of his own stories. Six produced no code at all — only an answer, which was usually the expensive part. What the number hides is that three of the systems ZenOS runs on today did not meaningfully exist before he picked them up.

I. The Freight Forwarder, from nothing

In June 2026 ZenOS had no concept of a freight forwarder. By mid-August it had a role, transport fields on every warehouse receiving, a pickup task workflow, automated notifications to external forwarders, a price confirm-and-reject negotiation, and a Partner API that exposes all of it. He owned the epic IT-1010 and every one of its six children. That is not “worked on a feature” — that is an entire external actor introduced into the inbound process, designed and shipped end to end, by one person, in ten weeks.

II. The returns thread, start to finish

Returns runs through his whole time on ZenOS like a spine. Phantom returns that were announced but never shipped, cluttering merchants’ overviews forever — gone. Returns that arrived without a label and were therefore invisible — now visible. Return reasons displayed in English to a warehouse worker in Szczecin — now in Polish, and in German in Aschaffenburg. C-grade items being booked back as A-stock because Storelogix pre-selected nothing — now pre-selected correctly. Store credit as a refund option, so the money stays in the shop. External return providers with a real API endpoint instead of a spreadsheet.

No single one of those is a headline. Together they are the reason the returns side of ZenOS is something merchants tolerate rather than complain about.

III. Making DHL pay up

The most quietly valuable thing in the list. DHL was rejecting reimbursement claims because the Order Overview PDF attached to Carrier Investigation emails didn’t reconcile — discounts weren’t included, so the total never matched the sum of the line items. Jonas worked out why the PDFs were frequently missing altogether, then rebuilt the price calculation so the numbers hold up to a claims adjuster. Then he added the customer number and the trigger type, and went back to document how the automatic trigger logic actually works so it could be improved.

If someone pulls the DHL rejection rate from before and after ALKT-548, that number is his single strongest line — and nobody has thought to look for it yet.

IV. On the “always high quality” part

The evidence is not in the features. It is in what he did when nobody asked. He replaced a fragile ZF-prefix string check with proper warehouse-site resolution before it broke. He folded the last orphan email into the shared builder instead of leaving the duplication. He killed an N+1 feature-fetch loop. He deleted a dead GoRamp integration rather than letting it rot. He replaced a documented, multi-step, hand-written production SQL procedure for moving orders between fulfillment centres with a button.

And when he handed over the unfinished return-matching work, he left spec.md, discovery.md and idea.md in the repository, with decision records and a written warning about which subtask is a safety prerequisite. Most people leave a Slack message.

Still in the Bag

The Night Order

Six tokens remain. Whoever picks them up should read this in order — the first one genuinely matters.

  1. I

    Re-anchor the deadline windows · IT-1599

    His own ticket calls this “a hard prerequisite for safety rather than for function.” Automatic feedback generation decides restock-or-dispose on the merchant’s behalf once a return is old enough — and under Return Adoption, “old enough” starts measuring from the wrong moment. Do this before enabling Return Adoption for anyone.

  2. II

    Score every match candidate · IT-1600, IT-1598

    Return matching is currently unaccountable: a single candidate is accepted without ever being scored. Specs and decision records are in the repo under .scratch/IT-1262/.

  3. III

    Upgrade the Lambda runtimes · IT-925

    node16 and python3.9 are not getting younger. In progress since February.

  4. IV

    Find a way to announce holidays · IT-1566

    Opened four days ago. Step one: restore the BambooHR notifications. Step two: ask other teams what they use. Step three, apparently, is somebody else’s problem now.

  5. V

    The WMS regression tests · ALKT-196

    Created 10 January 2025. Status: To Do. Nineteen months. This one is not a handover item, it is a family heirloom.

Sourced From GitHub · alaiko-tech

The Chronicle

His public profile shows nothing — zero repos, zero followers. Everything below came from the private org he actually shipped into, four years of it, pulled straight from the log.

1,640Pull Requests
1,527Merged
43Repositories
336,628Net Lines
1.4hMedian Time to Merge
0Weekend Commits
Ten thousand and three lines in one pull request — filter picklines with tag — merged clean. And of the 1,640 he opened, every single one landed Monday through Friday. Not one, in four years, on a weekend.

Behind the Storyteller’s Screen

The Grimoire

The Script records what the town saw. The Grimoire is what was kept behind the screen — the git history of the backend monorepo’s twenty-five repositories, read back line by line. Four years of evidence, sorted by how much trouble it caused.

2,564Non-Merge Commits
826Adjustments
57TODOs Written
0TODOs Surviving
Storyteller’s Note

If you read one entry, read the Demon. On 17 December 2025 he opened a branch called ALKT-X_Change-nothing-remove-useless-todo, merged it as PR #4682, and shipped a commit titled “ALKT-X change nothing.”

The diff was one deleted line. The line was his own //TODO shopid?, written five weeks earlier. He did not answer the question. He removed the question.

Townsfolk

Harmless. Load-bearing. The habits you only notice once someone plots them.

The Adjustment

826 of 2,564 non-merge commit subjects · 121 of 830 branch names

560 adjust        128 adjustments
 87 adjusting     49 adjustment
  2 adjusted

One commit in three is an adjustment. His third commit ever, 1 July 2022 at 06:31, was “Adjust spacing in wording.” The verb arrived before the ticket numbers did and never left. Six commits are the complete sentence Adjust.

The Weekend That Never Came

2,564 commits, plotted by day and hour

Mon 477   Sat 0
Tue 514   Sun 0
Wed 578
Thu 511   after 19:00 … 5 commits, ever
Fri 484   before 08:00 … 3

Four years, zero weekend commits. Five commits after seven in the evening across the entire tenure — and one of those five is titled “Change nothing.” A man with boundaries.

The Merch Table

apps/wms-platform/src/Inventory/DataFixtures/AbstractProductFixture.php:129, 196, 264

$product3->setTitle('NFQ t-shirt');
$product5->setTitle('NFQ backpack');
$product31->setTitle('NFQ backpack');
// and 'NFQ cap', in the transformer tests

Every warehouse fixture in wms-platform has been stocking the same three items of company merch since 2023. They are still there. Somewhere in the test suite, a t-shirt, a backpack and a cap are picked, packed and returned several thousand times a day.

The Placeholder

139 commits carrying a ticket ID that does not exist

94 AL-X        9 APS-X
23 ALKT-X      5 AS-X
 8 ALKT-PIP

The convention is ALKT-NNN. When there was no NNN, there was X. Branch names include X-change-pagination-count and X-removed-items-test-fix, where even the prefix gave up.

The Whatnot Specification

wms-platform · wms-regression-tests, 2023–2024

// TODO: log and what not
// TODO: handle - error and what not
// TODO : return here box and whatnot
// TODO : adjust scanning, wait for box and whatnot
// TODO;

Four separate TODOs where the requirement is literally “and whatnot”. And one, in WebAppManager.php, that is a TODO terminated by a semicolon and nothing else — a task so undefined it needed punctuation instead of a description.

The Return That Never Came

apps/wms-platform/src/Inventory/Handler/ImportGoodsReceiptEnvelopeHandler.php · 4 May 2023

// will comeback to this. todo

He did not come back to this. The file no longer exists.

The Reverting Day

apps/wms-regression-tests · 11 September 2023

Reverting.
Reverting.
Reverting.
Reverting.
Reverting picking.
Reverting picking.
AL-X Reverting picking changes after rechange.

Not a revert. A rechange. Then a revert of the rechange. The word does not appear anywhere else in four years of history.

The Login

apps/wms-regression-tests/tests/Unit/RegressionTests/PickingTest.php · 18 Oct 2022

'username' => 'jonas.terleckas@nfq.lt',

For a while, the regression suite logged into the warehouse as him. Every night, in CI, Jonas picked the order. It was later parameterised, which is the correct engineering decision and a small loss to the mythology.

Outsiders

Typos that outlived their author. Several are load-bearing. One is multilingual.

Groupped

apps/wms-platform/tests/Picklist/Functional/Api/Action/GetPicklistLinesGrouppedAndOrderedForScanInTest.php — and its Tenant2 twin

branch  AL-4950_Picklist-item-groupping-for-scan-in
commit  AL-4950 Item groupping for scan-in.
commit  AL-4950 Groupped scan-in lines.

Two double-p’d filenames, committed 6 January 2023, still in the repository today. The rest of the codebase spells it Grouped — BinItemGroupedDTO, createQueryBuilderByBinIdGrouped. The typo held the line in exactly one directory for three and a half years.

uuid_missmatch, in six languages

apps/wms-platform/translations/Picklist/ · messages.{de,en,lt,pl,ru,ua}.yaml · 24 Jul 2024

en: uuid_missmatch: 'Access Denied. Picklist might have
    been taken over by someone else'
de: uuid_missmatch: 'Zugriff verweigert. …'
lt: uuid_missmatch: 'Prieiga uždrausta. …'
pl, ru, ua — same key

One misspelling, seven occurrences, six languages. Every warehouse operator in Germany, Lithuania, Poland, Russia and Ukraine has been served a message keyed on missmatch. Commit message: “Custom assignment uuid missmatch message.” Consistent, at least.

Dublicate

Test method, two branch names, one commit subject

public function testAddNewBarcodesWithDublicates(): void
branch  AL-4610_Fix-product-dublicates
branch  AS-1812_Break-dublicate-lines
commit  AS-1812 Break dublicate lines.

Two years apart, same letter missing. NewItemsWithBarcodesImporterTest.php:92 is still green and still misspelled.

Manually Submited quantity

apps/wms-regression-tests/src/RegressionTests/Manager/WebAppManager.php:971

$this->logger->log('Manually Submited quantity');

Live today. Also on the shelf: the branch Adjust-Pip-pixi-stock-change-request-username-lenght, the branch ALKT-221_Adjust-SendWebhoodHandler, and the variable $messageShippingOrderPackageInvoicealreadyCreated.

Temporaly

2022 → 2026 · a four-year adverb

2022-12-05  AL-4683 Temporaly disable barcode update messages.
2025-01-13  Temporaly add memory.
2026-08-12  IT-1493 adjust phpstan temporaly added part.

Also fielded across the years: “Adjsutments.” and “Tes fix deploy.” And the last commit of his career, 27 August 2026, 11:27: “IT-1599 remove raw sql formtest.” Four years, and the final subject line still had a typo in it. Perfect landing.

Minions

Code that works, and would rather you didn’t look at how.

The Self-Documenting Column

apps/wms-platform/src/Picklist/Repository/PicklistLineRepository.php · on master 6 → 20 Jan 2023

SUM(picklist_line.requiredQuantity) as aggregatedRequired,
SUM(picklist_line.scannedQuantity)  as aggregatedScanned,
SUM(picklist_line.manuallyScannedQuantity) as
  aggregatedScannedQuantityThatIHAveToChangeToScanInQuantity,

A 57-character DQL alias that is not a name — it is a note to self, escaped into the type system, complete with a stray capital A in IHAve. It shipped to master and sat in production queries for fourteen days.

And then he did it. Commit 68abee1c, 20 January 2023: the alias is gone and the column is scanInQuantity. The identifier made a promise and the man kept it. This is, genuinely, the most Jonas artefact in the repository.

The Shouty TODO

Same file, four days later · 10 Jan 2023

// TODO: intro scanin scan and sort by it
// TODO: adjust tests, add cases
// TODO !!! AND SUM IS NOT YET PICKED !!!group b

Three TODOs stacked on one query builder, the last one shouting in capitals and trailing off mid-thought into group b. The commit that added it also replaced a bare // TODO: — a colon with nothing after it — so this counts as an improvement.

The Sleeping Suite

apps/wms-regression-tests · 42 sleep() calls, 94 seconds, all his

WebAppManager.php   16 sleeps
GoodsReceiptTest    6
PickerIsThePacker   7
…and, at line 1000:
// for animation to complete
sleep(2);

The end-to-end suite is held together by ninety-four seconds of hoping. One of them is documented, and its justification is a CSS transition.

The Plus Button

WebAppManager.php:955 · executeManualPickScript()

$selectedQuantity = 0;
while ($requiredQuantity > $selectedQuantity) {
    $this->logger->log('Clicking +');
    $this->webAppManagerClient->clickItem(PLUS_BUTTON);
    sleep(2);
    $selectedQuantity++;
}

To pick ten units, the test clicks + ten times and waits two seconds after each one. Twenty seconds, plus logging, to enter the number 10. There is a quantity input on that modal.

The Eleven Divs

apps/wms-regression-tests/src/RegressionTests/PageObject.php:241 · 65 of the file’s 86 locators are his

PIP_DROPDOWN_FIRST_SELECTION_LOCATOR =
  '//*[@id="app"]/div[1]/div[4]/div/div/div[1]/div/div/ul/li'

RETURNS_MODAL_NEXT_BUTTON_LOCATOR =
  '//*[@id="modal_root"]/div[2]/div/div/div[4]/button[2]'

Eleven levels of positional XPath, anchored to nothing but the shape of the DOM on the day it was written. Any frontend developer adding a wrapper div breaks the warehouse.

This is not hypothetical: 102 of his commits mention a selector or a locator. Nine are titled “Selector adjustments.” Seven are “Adjust selector.” Six, “Adjusting selectors.” Five, “Adjusting locators.”

The File That Was Excused

PageObject.php:22 — line 22 of 243

// phpcs:ignoreFile
final class PageObject
{

The coding standard is non-negotiable across the monorepo. Except here, where the very first statement after the namespace declaration is a note excusing the entire file from having to comply.

The Critical Public Key

branch JWT-debug · apps/wms-platform/common/src/Infrastructure/Security/WmsAuthenticator.php · 4–6 Sep 2023

public function doAuthenticate(Request $request): Passport
{
    $this->logger->critical("Debug JWT: \n" . $this->publicKey);

    return parent::doAuthenticate($request);
}

Every single authentication, dumping the key into the log at critical. When the log did not appear, the fix was to escalate the severity from error to critical and try again. Two days later it was reverted three times in seven minutes, across two repositories.

In his defence, and it is a real defence: it was the public key, and the branch never reached master.

WebAppManager

1,154 lines · 58 methods · one class · 2,325 lines of it written by him

selectApp()              scanItem()         completeDelivery()
selectStockMoveApp()     scanInItem()       completePicking()
selectBoxRange()         scanString()       completeScanIn()
selectPickingGroup()     scanGoodsReceipt() completePickToBox()
selectPicklist()         pickToBoxScanBox() completeBinRelocate()
…and 43 more

The largest hand-written file he touched, and the beating heart of the regression suite. Every warehouse workflow the company has, driven through one object. It is not good architecture. It has also been catching real bugs for four years, which is more than can be said for a lot of good architecture.

The Demon

There is only one, and it has a doctrine.

Change Nothing

apps/platform · 8636a18ce6 · PR #4682 · 17 December 2025, 10:57

branch   ALKT-X_Change-nothing-remove-useless-todo
subject  ALKT-X change nothing.
stat     1 file changed, 0 insertions(+), 1 deletion(-)

--- a/src/Customer/Handler/CompleteReportHandler.php
+++ b/src/Customer/Handler/CompleteReportHandler.php
                 'reportType' => $report->getType(),
             ],
             null,
-            //TODO shopid?
         ),

He wrote //TODO shopid? on 13 November 2025. Thirty-four days later he opened a branch, opened a pull request, got it reviewed, and merged a change whose entire content was the removal of his own question.

This is not an isolated incident. It is a method. The same month, in apps/order, he wrote // TODO: shopId? maybe not for this notification on 12 November — and deleted it on 14 November under the commit “ALKT-382 Remove todo.” Two days. He didn’t decide about the shopId. He decided about the TODO.

Change Nothing, Twice More

wms-regression-tests 974c2e7, 18 Dec 2024 · wms-platform 37e0f65c, 28 Jan 2025

974c2e7 — "Change nothing." — 1 insertion(+)
 STOCK_MOVE_NEXT_BUTTON_LOCATOR = '…';
+····
 RETURNS_MODAL_NEXT_BUTTON_LOCATOR = '…';

37e0f65c — "Change nothing." — 2 deletions(-)
-  // this up() migration is auto-generated, please modify it
-  // this down() migration is auto-generated, please modify it

The first is a single empty line — with trailing whitespace — added to force a CI run. The second deletes two comments Doctrine generates. Both are titled “Change nothing.” and both are, unimpeachably, accurate commit messages.

The migration one landed at 19:46. In all of 2025 it is the only commit he made after seven in the evening. He stayed late, once, to change nothing.

18 December 2024

apps/wms-regression-tests · one deploy pipeline · 10:45 → 16:03

  1. Temp fix deployment.
  2. Temp fix deployment.
  3. Revert “Temp fix deployment.”
  4. Testing yaml.
  5. Revert “Testing yaml.”
  6. Fix deployment.
  7. Change nothing.
  8. Tes fix deploy.
  9. Adjust deployment.
  10. Workflow changes.
  11. Test.
  12. Test.
  13. Fallback.

Five hours and eighteen minutes. Thirteen commits. It opens with a temporary fix, passes through a revert, a typo, an adjustment and a commit that changes nothing, and ends — as these days always end — with “Fallback.”

His busiest day of the entire year, and not one line of product code was written.

Fifty-Seven Questions, No Survivors

Every TODO he ever wrote, vs. the tree as it stands today

TODOs authored, 2022–2026 ......... 57
Still present in the codebase ..... 0

Among the fallen: // TODO: Implement process() method. (the PhpStorm stub, shipped as-is), // TODO: test locally, // TODO: test on dev myself, // TODO: tbd, // TODO, // TODO:, and // TODO;.

Not one is left. Some were done. Most were deleted. He leaves behind a codebase with no unanswered questions in it, because he removed the questions.

Four years. Twenty-five repositories. Not one Saturday.

What the Grimoire adds to the Script is only this: he is leaving the Groupped filenames, the six-language missmatch, ninety-four seconds of sleep(), and eleven levels of XPath standing between this company and knowing whether its warehouse still works.

Somebody is going to have to adjust that.

Assembled from git history across 25 repositories of the alaiko backend monorepo.
All commits, filenames, line numbers and diffs quoted verbatim. Nothing has been embellished; it did not need to be.

Good has won. Good is, regrettably, also leaving.

The Storyteller has checked, and there is no clause in the rules that lets us keep a player who has already picked up his token and put on his coat.

Thank you, Jonas — for the freight forwarders, for the Polish return reasons, for making DHL pay their invoices, and for every single time you fixed the thing next to the thing you were asked to fix.

Ships Well · Documents Better

Bonus Token

One More Line to Clear

Four years of clearing them four at a time. Here is one for the road.

Tetris  ·  For Jonas

Game Over No shame. The board always wins eventually.

Next

Score
0
Lines
0
Level
1

← → move
↑ rotate
↓ soft drop
space hard drop
P pause