Everything above describes what this system does. This is the other half, and it is here at full size on purpose. If any of it is a blocker for you, it is cheaper for both of us to know now.
×
There is no ingestion path in this build
No connector, no importer, no upload, no scheduled pull. Sixteen route handlers exist under app/api and not one of them accepts a row of your data. Several do take a request body, and every one of those carries a control or a decision (which SKU, what discount depth, who is acting, approve or reject) rather than a measurement: the scenario route re-runs the projection server side instead of storing figures it was handed, and the persona route takes a user id and answers with the persona the session actually resolved to. The only write path into the tenant tables is the seed command, which begins by truncating all twenty-five of them and then generates synthetic history from a fixed seed. Everything on this page is the specification a real load would have to satisfy, not a description of one that exists.
lib/seed/run.ts:65 truncate, package.json db:seed
×
No supplier performance measurement
Every lead time originates as a typed constant and is never revised from an outcome. Supplier and transfer lead times do reach the measures through the location table, so a real tenant would load them; the purchase window, though, is supplierLeadTimeDays plus reviewPeriodDays read straight out of the configuration file rather than from your data. What is missing in every case is the feedback: nothing compares an expected arrival against an actual receipt, so there is no OTIF, no fill rate, no lead-time reliability and no supplier scorecard of any kind.
lib/demo/config.ts:353, lib/engine/purchasing.ts:205
×
Safety stock is supplied, not calculated
safety_stock_units arrives as a column on the inventory snapshot and is read back exactly as given. There is no service-level target, no demand-variability calculation, and nothing that would tell you the number you sent is wrong. Every transfer and every purchase respects it faithfully, including when it is wrong.
lib/db/schema.ts:229, lib/engine/purchasing.ts:224
×
The model forecasts sales, not demand
It is fitted on units sold. A day the shelf was empty enters the series as a zero and is learned as a zero, so censored demand is uncorrected and the forecast runs low for exactly the SKUs that stock out most, which are the ones you most want it right about. One partial correction exists, and only inside the purchase calculation: 28 percent of the trailing velocity across the days the shelf was empty is added back as backorders. That is a demo-grade assumption, not an estimator.
lib/forecast/dataset.ts:58, lib/engine/purchasing.ts:192
×
Nothing is ever transmitted
Orders, transfers and owner notifications are prepared, validated server side, audited and recorded. External delivery is simulated: the notify action writes an audit row that says so in as many words. There is no supplier integration, no EDI, no email, and no outbound call of any kind.
lib/actions.ts:5, :209
×
There is no multi-tenancy
One tenant is compiled in. The company name, the currency, the five SKUs with their case packs and MOQs, the ten branches, and the three warehouses with their lead times are all TypeScript constants, and the purchase engine reads them from that file rather than from the database. session_id separates concurrent visitors on one shared dataset. That is a concurrency device, not a tenant boundary, and it must not be sold as one.
lib/demo/config.ts:12, :253, :353, lib/db/schema.ts:13
×
The holiday calendar is 21 hardcoded Malaysian dates
Chinese New Year, Hari Raya Aidilfitri, Hari Raya Haji, Merdeka Day, Malaysia Day, Deepavali and Christmas, for 2024, 2025 and 2026 only. Past the end of 2026 there is no festive signal at all, and no other country’s calendar exists in the codebase. Note the deliberate boundary in that file: the model is given the festival DATES, because a planner knows those a year ahead, and is not given the lift, because learning the lift is its job.
lib/seed/calendar.ts:69, :161
×
The clock advances by rebuilding the dataset, never by ingesting a day
Today is neither pinned to a literal nor taken from the system clock. In production the container entrypoint queries dataset_meta.data_current_to, which the seeder writes as max(txn_date) over daily_sales once every table is loaded, and exports it as DEMO_TODAY before the server process starts, so the app’s today is the dataset’s measured last day rather than an assertion about it. A nightly timer then regenerates the whole dataset to the current Malaysian date and refits the model as part of that seed, which is why the demonstration does not go stale between meetings. What that mechanism is not is incremental: the reseed truncates all twenty-five tables and generates a fresh synthetic history from the same fixed seed, so nothing is appended and no live session survives it. The model is still fitted in exactly three places, the seeder and two command-line scripts, and nothing refits when data lands, because in this build no data lands.
lib/demo/config.ts:178, deploy/entrypoint.sh, deploy/neura57-reseed.timer, lib/seed/run.ts:561, lib/forecast/report.ts:28, lib/forecast/tune.ts:53