Reports showed no costs and a full margin on a finished job. The figure being read is empty unless somebody fills it in by hand, and it was blind to a second person on the same job.
f2e6edfPRJ-02 · build log
Eight entries, most of them from a single afternoon spent opening the screens that had been changed that day and not looked at since.
Nine surfaces changed on 2026-08-20 and fewer than half had been opened afterwards. Opening them found six defects, two of them introduced the same day. That pass is most of this page, and it is the reason the habit exists: a build that compiles is not a build that works, and the difference is only visible to somebody who goes and looks. The client's own pricing, his pipeline and his product decisions are not here.
Source: docs/VADIM_REQUESTS.md in the sauna-crm repository
LOG-01Dated entries
Reports showed no costs and a full margin on a finished job. The figure being read is empty unless somebody fills it in by hand, and it was blind to a second person on the same job.
f2e6edfThe estimate's payment terms appeared in the shared link and were missing from the downloaded document. One fact, rendered twice, disagreeing.
438ad72The link preview card returned a success code and zero bytes on every real estimate. The renderer refuses an element with more than one child, and two such blocks appear only when there is a customer and rooms, so a made-up id drew a perfect card and a real one drew nothing.
2cad120Prices in the pickers printed with no thousands separator, in the list read aloud to a client. Closing the hole in the money guard that let them through turned up five more places, including a total sent to a phone without cents.
17b4ae8The second sheet of the invoice printed its footer halfway down the page, through the signature line.
3fee8cbThe browser tab named the company twice.
fc18d1aCents settled as a rule, and the forced two-decimal shape removed from the eight files that each carried their own. Proven unchanged for a client, character by character, over a thousand values against the exact expression the documents used to carry.
money.test.tsThe temporary list holding those eight files was removed along with them. It earned its keep by failing the moment the first one was cleaned up.
money.test.tsThree of the eight were only visible on a real document rather than in the application. That is why the check is the rendered sheet and not a passing build.