The statement is ready. Goal: a skeleton appears on Vite, TypeScript (strict), Vitest, ESLint and Prettier with the target make check, and on the page "Split the bill" the user adds participants and expenses and immediately sees who transfers how much to whom.
Tools: package.json with the scripts dev, build, preview, typecheck, lint, test and format; a strict tsconfig; a flat ESLint config that forbids the domain logic to touch the DOM and the interface; Prettier with default settings; a Makefile where make check runs types, linter, tests and build in turn through the package.json scripts and without npx.
The domain logic is pure functions without the DOM. Money: amounts in kopecks as integers, rubles are parsed with string operations without float and shown through Intl. The bill: participants and expenses, adding and removing without changing the source data, a name check (empty, duplicate ignoring case) and a check whether a person takes part in the expenses. The calculation: dividing an amount into shares with the remainder by the kopeck to the first recipients, participant balances and a simple greedy calculation of transfers. Minimization will be done by task 2: it will replace only the transfers file.
The interface is vanilla TypeScript and the DOM, one section each for participants, expenses and the summary. The only mutable variable is the current bill, the forms are built once, only the lists and the summary are redrawn, user text is output only through textContent. The texts of errors and hints are given in the statement, the summary lies in an aria-live area.
The project rules and the harness settings: in the rules the lines about formatting and checks are updated, in the check settings — make check and the path src, then the sync.
Done criteria: make check passes without a network after the dependencies are installed and takes under a minute; the sync repeated changes nothing; formatting does not touch generated files; the linter fails if the logic touches document or the interface; the scenario "Ann pays 900 for three" gives two transfers of 300 rubles; 100 rubles for three are divided into 34, 33 and 33 kopecks; a name with markup is shown literally; all input errors show the needed texts, and the bill does not change. Every module has tests next to the code.
Accepted decisions: no UI framework; jsdom only for the DOM test; prettier is not part of make check; a participant who is in the expenses cannot be removed; names are unique ignoring case; the line of checks in the project rules is edited by hand because the sync does not touch it. Out of scope: minimizing the transfers and explaining the calculation, the "Share" link, the mobile layout, the README and deployment.