The input nobody declared
Assumes Saturation is nearly everything, What would have to be wrong and Which measurement is worth making.
An audit sweeps what has a number attached. That is not a limitation anybody chose; it is what a sweep is, and it is why the largest sensitivity in this collection went four rounds without being found.
The claim
A sensitivity audit is a survey of the inputs that were written down as inputs, and an input that was written down as a fact escapes it — however elastic it is.
- The declared widths’ largest elasticity is about 0.5. Five quantities, each quoted with a range from the individual-observer literature, each swept.
- The undeclared set’s largest elasticity is 0.99, and its smallest is 0.49 — so its floor is at the declared table’s ceiling.
- The undeclared input also has the wider span. The declared widths differ between studies by a factor of about 1.5 to 2. The test set’s saturation has no reported range at all, because nobody reports it.
- So it dominates on both terms of the product that ranks how much doubt an input carries.
- And the previous audit said, correctly, that it could not reach this. It listed three structural choices it had missed and did not list the fourth, which was in the same file as the numbers it was sweeping.
What an audit actually surveys
The round before this one built an instrument and applied it to everything it could see. For each published conclusion C and each declared input width w it computed the elasticity E = d ln C / d ln w as a central difference over a stated finite span, and then ranked the inputs by E times how badly each is known — because a term can dominate an answer while being known precisely, so that measuring it better buys nothing, while a small term whose width is a guess carries most of the doubt.
That is the right instrument and the ranking it produced was useful. It found that the lens carries most of the population’s spread and that a different variate carries most of the answer’s uncertainty, which is a distinction worth a round on its own.
What it surveyed was a list. Five widths, five census constants, three bounds, twenty-five ellipse axes. Every one of them existed in the code as a named quantity with a value and, usually, a comment about where the value came from — which is exactly the property that made them findable.
What that misses, structurally
An input has to be recognised as an input before it can be swept, and recognition happens at the moment somebody writes the value down with a reason beside it. A quantity written down without a reason does not look like an input; it looks like a definition.
The three numbers describing the test set are the clearest possible case. They are levels, depths and maxDepth, they sit in a function signature as default arguments, and the docstring above them explains at length why the set is a lattice rather than a random sample and says nothing whatever about the values. Read as code they are configuration. Read as modelling they are three of the most consequential declarations in the collection.
The audit’s own closing paragraph is worth quoting because it is nearly right:
No structural choice was audited. That the population is a pigment template rather than the physiological fundamentals, that adaptation is a diagonal at all, that a colour difference is CIEDE2000 — none of those has a multiplier to sweep, and the audit reaches none of them.
Three examples, correctly identified, and each genuinely without a multiplier. The fourth structural choice does have multipliers — three of them, sitting in the same file as several of the constants that were swept — and it was not on the list, because it did not look like a choice.
The two tables
| what | largest elasticity | declared range | swept before? |
|---|---|---|---|
| the lens, as an age range | ~0.5 | 20–70 years, quoted | yes |
| macular pigment density | ~0.3 | mean 0.35, sd 0.13, quoted | yes |
| cone outer-segment density | ~0.2 | 0.4 ± 0.036, quoted | yes |
| pigment peak wavelengths | ~0.3 | ±1.5 nm, quoted | yes |
| the census’s wall centre | ~0.2 | none | yes |
| the test set’s L¹ reach | 0.99 | none | no |
| the test set’s saturation | 0.91 | none | no |
| the test set’s brightness | 0.15 | none | no |
The comparison is deliberately not made from one table’s numbers against the other’s inside a single assertion, because a gate whose verdict depends on two files’ machinery is a gate that goes red for the wrong reasons. It is made against a stated floor: the set’s elasticity exceeds 0.6, which is above anything the previous audit found anywhere.
And the second term compounds it. The ranking that matters is elasticity times how badly the input is known. The declared widths at least have literature ranges — a factor of one and a half to two between studies, which is what makes their contribution to the doubt boundable. The test set’s saturation has no range at all: no study reports it, because it is not a quantity anybody outside this collection has an opinion about. An input with a large elasticity and an unbounded span carries unbounded doubt, and the honest thing to say about it is that its contribution cannot be quoted rather than that it is small.
Why the shape of the mistake is general
Not a fact about colour, and worth stating so it transfers.
A modelling exercise has three kinds of number in it. Measurements, which come with an uncertainty and are usually treated correctly. Declared inputs, which come with a reason and a range and are what a sensitivity analysis sweeps. And constructions — the grid, the sample, the discretisation, the domain, the basis — which are chosen for tractability, written once, and thereafter read as part of the apparatus rather than as part of the model.
The third kind is systematically the least examined and is not systematically the least important. It has three properties that keep it out of an audit:
- It has no literature range, so there is nothing obvious to sweep it over. A width with a quoted range invites a sweep; a lattice size does not.
- Its author had a good reason for the structure and no reason for the values. The docstring explains why the set is a lattice — which is the interesting decision — and the values were then whatever made the lattice a convenient size.
- It is shared between the result and the check. The assertion that a change of light is exactly a matrix is asserted on the set constructed to have that property, so the strongest-looking check in the neighbourhood cannot see the assumption it shares.
Any one of those would be enough. Together they make a construction nearly invisible from inside the codebase that contains it.
What to do instead
Three things, and the first is nearly free.
Sweep the defaults, which is where a construction’s own scalars hide. Every default argument in a function that produces a published number is a declaration. Multiplying each of them by 1.25 and 0.8 and recomputing the headline results is an afternoon’s work and would have found this in one run. It is the same instrument the audit already had, pointed at the function signatures rather than at the constant tables.
Say which numbers are constructions, in the file. The three test-set numbers now have a section that names them, states that none of them is quoted from anything, and carries their elasticities. That is not documentation; it is what makes them appear on the next audit’s list.
And be suspicious of a check that shares its assumption. An assertion that a property holds on an object constructed to have it is a consistency check, and this collection has an explicit rule about assertions that have never rejected anything. The rule needs a second half: an assertion that cannot reject a particular class of error should say which class.
What survives, and what has to be restated
Not much has to change, which is worth saying plainly.
Every ordering survives, including the ones the set’s construction was tested against. Scaling the test set’s saturation multiplies every census row by nearly the same factor, so the ranking of changes of light — which is what the collection’s arguments actually rest on — is untouched. The extremes hold under every construction and the middle was never ordered anyway.
Every published level has to be read as a level for this set. A residual of 1.635 ΔE*₀₀ for daylight to tungsten becomes, under a set a quarter more saturated, about 1.95, and under one a fifth less saturated, about 1.40. Those are not corrections to an error; they are the number’s actual precision, and it was being printed to four figures.
And the comparison with the declared widths is the finding rather than the numbers. The specific elasticities will move as the machinery does. What will not move is that the input nobody wrote down as an input was more elastic than every input somebody did.
The three properties, as a checklist
The essay’s general claim is that constructions escape audits, and the three reasons are specific enough to be turned into questions somebody can ask of their own code.
Does the quantity have a comment about its value, or only about its structure? The test set’s docstring explains at length why the set is a lattice rather than a random sample and says nothing about how many levels or how deep. A comment that justifies the form and not the numbers is the signature of a construction being treated as apparatus.
Is the quantity a default argument rather than a named constant? Every number in this collection that had been swept lived in an exported table with a name. The three that had not lived in a function signature. That is not a coincidence: a named constant announces itself as a decision and a default argument announces itself as a convenience.
And does any check share the assumption? The assertion that a change of light is exactly a matrix is asserted on the family constructed to make it exact. A check whose truth is guaranteed by the construction it checks is a consistency test, and it is the strongest-looking thing in the neighbourhood.
All three questions are answerable by reading, need no instrument, and would have found this one in an afternoon. The instrument was never the problem; the list it was pointed at was.
Where the model stops
This essay establishes that one structural choice, given multipliers, is more elastic than every declared input. It does not establish that structural choices are in general more elastic than declared ones, and the sample is one.
The three the previous audit named remain unswept, and two of them have no multiplier to sweep in any obvious way. That adaptation is a diagonal at all is a discrete choice, and the natural instrument for it is not an elasticity but a comparison with the alternative — which this collection has run and reports as what no adaptation can remove. That a colour difference is CIEDE2000 is likewise discrete; a partial answer exists in the uniformity table’s own dependence on its metric, and it is partial.
So the honest closing position is that the audit’s reach has been extended by one and the boundary is still there. What the audit still cannot reach is a list rather than a footnote, and it is shorter than it was.
What the two reachable cases had in common
Two structural choices fell this round and the method was different each time, which is worth separating because the difference is the transferable part.
The set’s shape fell to a sweep, because it turned out to contain scalars. The move was to look at default arguments rather than at constant tables, and the instrument was the one the round before this one had already built. That is the cheap case and it is worth trying first on anything that looks structural: a construction often has numbers in it, and the numbers are usually in the signature.
The set’s dimension fell to a construction, because it contains no scalar at all — a family is three-dimensional or it is not. The move was to build the fourth dimension the assumption excludes and give it an amplitude, which turns a discrete assumption into a continuous one and lets the ordinary instrument work on it.
Both are the same manoeuvre at different depths: find the continuous parameter the discrete assumption is a limit of. For the shape it was already there and unnoticed; for the dimension it had to be built. The three remaining structural choices are all in the second category, and naming what would have to be built for each is most of the work of deciding whether to.
Who found it, and when
The distinction between measured, declared and constructed inputs is not novel and turns up wherever numerical modelling meets uncertainty quantification — the standard vocabulary is aleatory, epistemic and numerical uncertainty, and the standard observation is that the third is the one practitioners quantify last and that reviewers ask about least.
Its arrival here has a specific and slightly embarrassing shape. The audit that preceded this one was written to catch exactly this class of failure, its own docstring names the failure precisely — a published number computed at a point, a width, a box or an objective that somebody chose, with nothing having ever asked how far the number moves when the choice does — and it swept everything in the collection that had a number and a comment. The set had a number and a comment about something else.
The floor is not where the claim puts it
The claim section says the undeclared set’s smallest elasticity is 0.49, so that its floor is at the declared table’s ceiling. The table three sections below prints the set’s third number, its brightness, at 0.15 — which is not merely below the declared ceiling of about 0.5, it is below every one of the five declared entries, the lowest of which is 0.2.
The 0.49 is a real figure and it belongs to something narrower: the smallest elasticity across the census’s rows for the two saturation-like parameters. Stated as a property of the undeclared set it is wrong, and the wrongness runs in the direction that flatters the essay’s headline.
The correction matters because it changes what the essay has shown. Two of the three undeclared numbers are more elastic than anything declared; the third is less elastic than anything declared. So being undeclared does not predict being elastic, and the finding is about a maximum rather than about a class — which the closing section already says carefully, and which the opening bullets do not. An audit that had swept the defaults, as this essay recommends, would have found one number at 0.99, one at 0.91 and one it could safely have ignored, and it would have had no way to tell in advance which was which.
The product the ranking is supposed to use
The essay’s own instrument is elasticity multiplied by how badly the input is known, and it argues that the undeclared input dominates on both terms. Worked through, the second term does not support that, and the reason is that a large elasticity applied to a narrow span is a small effect.
Raising each input’s span factor to the power of its elasticity gives how far the published answer moves across that input’s range:
| input | elasticity | span factor | answer moves by |
|---|---|---|---|
| the lens, 20 to 70 years | 0.5 | 1.5 – 2.0 | ×1.22 – ×1.41 |
| the test set’s L¹ reach | 0.99 | 1.25, as swept | ×1.25 |
| the test set’s saturation | 0.91 | 1.25, as swept | ×1.22 |
| macular pigment density | 0.3 | 1.37 | ×1.10 |
| cone outer-segment density | 0.2 | 1.09 | ×1.02 |
| the test set’s brightness | 0.15 | 1.25, as swept | ×1.03 |
At the span the collection actually sweeps, the most elastic undeclared input carries less doubt than the lens does. A factor of two in age raised to a half beats a quarter in saturation raised to one, and it is not close: 1.41 against 1.25.
That does not rescue the declared table, and it is not an argument that the audit was fine. It sharpens what the undeclared input’s problem is. The problem is not that it dominates the doubt; it is that nobody can say whether it does. The ±25 per cent used above is the collection’s own sweep convention, chosen because it is the convention, not because anybody has evidence that the test set’s saturation is known to a quarter. Solving for the span at which the L¹ reach would match the lens’s worst case gives a factor of 1.42 — so the two are level if the set’s saturation is uncertain by about forty per cent, the undeclared input wins above that and loses below it, and there is no measurement anywhere that says which side of it the truth is on.
The honest ranking is therefore not a longer bar than the lens’s. It is a bar with no end drawn on it, next to five bars that have ends, and the reader cannot be told which is longest. That is a worse position to be in than the essay’s version, because the essay’s version at least states an ordering; this one says the ordering is unavailable. An unbounded contribution does not top a ranking — it makes the ranking undefined, and the practical consequence is the one the closing sections already draw: every published level has to be read as a level for this set, and no interval can be put around it.
Where the ladder goes next
The set’s members are not all doing the same work — five of them contribute nothing at all, exactly, and the reason is worth understanding before the set is trusted with anything else.
What this makes readable
Essays that name this one as a prerequisite.
Named alongside this one
Essays reaching for the same objects. Nobody chose these; they are what the index of named objects makes visible.
- A departure is not a unit audit · elasticity · modelling assumption · sensitivity · test set
- The grid under the census audit · chromatic adaptation · measurement error · sensitivity · test set
- What this round could not reach audit · modelling assumption · sensitivity · specification · test set
- A constraint costs what it points at chromatic adaptation · degrees of freedom · measurement error · specification
- A grid is not a resolution audit · modelling assumption · specification · test set
- Every worst surface sits on a declaration chromatic adaptation · modelling assumption · specification · test set
What links here
The 8 essays that link to this one and share the most of its objects, of 14 that link here.
The objects this essay names
Each one links to every other essay that touches it.
AuditChromatic adaptationDegrees of freedomElasticityMeasurement errorModelling assumptionRobustnessSensitivitySpecificationTest set