Skip to content
Skip to main content
Novel Systems home
Decision log
D-047August 5, 2026

A count of a rendered list is derived from that list, and a guard enforces it

Decided

any sentence stating how many trades or verticals the platform covers interpolates the length of the array it describes. TRADE_PROFILE_COUNT is exported from lib/trade-profiles.ts as TRADE_PROFILES.length and read by the CPQ sandbox heading; the /solutions OG description reads INDUSTRY_VERTICALS.length. A ninth rule in check-claim-consistency.mjs fails the build on a hand-typed count anywhere outside the three registry files and the sample-tenant fixtures.

Affects: lib/trade-profiles.ts, components/CPQSandbox.tsx, app/solutions/page.tsx, lib/company-profile.ts, scripts/check-claim-consistency.mjs

What went wrong. The calculator's heading read "Four trades, one engine", written when the registry held four profiles and left behind when it grew to six. The tab strip that renders straight from TRADE_PROFILES sits three elements below that sentence, and the homepage caption one section up already said six. A reader who counted the tabs disproved the heading without leaving the viewport.

Why a guard rather than only a fix. A count of a visible list is the one figure on a marketing page a reader can check for free, which makes it the worst figure to maintain by hand and the cheapest to derive. The rule paid for itself on its first run by finding two instances I had missed: the /solutions OG description — the one hand-typed count a reader never sees beside the grid that would correct it, because a social preview travels away from the page — and a "three verticals" in body copy where the number was illustrative and deleting it read better than allowing it.

Alternative: allowlist the strings and re-check them at release. Rejected — that is the process that produced "Four trades" in the first place. The seventh profile has to move the heading in the same commit that adds the tab, or it will not move at all.

Related, same commit: the measured operating principle in lib/company-profile.ts was retitled from "Publish the measurement, not just the number" to "Performance figures ship with the conditions they were taken under". The imperative mood was the tell — the old title was the site instructing itself in front of the customer, which is commentary about our own marketing rather than a commitment a procurement reviewer can hold us to. The replacement states what every performance figure on the site carries, checkable against the figures on the page below it.

What would make this wrong: a page that deliberately quotes a historical count ("we launched with four"). That is a claim about the past, it needs a date beside it, and it belongs in the rule's allow list with a comment saying so.