Every verdict reads its pass and fail flags, grades and classes from the values it holds (#949)
A result no longer stores a verdict beside the readings it came from. Sixty-two result classes used to keep the flag, grade or class their function had worked out (`passes`, `complies`, `qualified`, the `*_met` and `*_ok` flags, the advisories, the per-band classes of the IEC 61260-1, IEC 61672-1 and IEC 61043 verdicts, the ISO 9614-2 grade, the ISO/PAS 1996-3 category, the IEC TS 61400-11-2 block status and the rest), so a result built by hand or rewritten with `dataclasses.replace` could hold readings that fail and a flag that says they pass. Each of them is now a read-only property, read from the values the result keeps and the limit the standard prints, and so is any figure that only fed it, such as the rounded level of an RD 1367/2007 period or the acceptance region of a trend test.
The same argument for the geometry that had two units on one name (#755)
* The same argument for the geometry that had two units on one name
#752 put the unit in the name where a pressure, a temperature or a
humidity could be read two ways. Measured over the imported API, four
geometric quantities were in the same state, and one of them was two
different dimensions.
diameter was metres in twenty public parameters and millimetres in one,
cnossos_rail.wheel_transfer, where CNOSSOS-EU Table G-3b tabulates 920,
840 and 680. angles was degrees in ten and radians in four while angle
was radians in eleven, so the plural and the singular of one word
disagreed. period was a lattice pitch in metres in the slit and
metadiffuser panels and a repetition time in seconds in the synchronous
average. gradient was a road slope in per cent in CNOSSOS-EU and a
vertical sound-speed gradient in s^-1 in refraction and sound speed.
They become diameter_m and diameter_mm, angle_rad, angles_rad and
angles_deg, period_m and period_s, road_slope_percent and gradient_per_s.
periods, a count of repetitions sitting beside a period that is a length,
becomes repetitions; the two places where it really means evaluation
periods keep the word and are in the guard's exemptions with the reason.
GaussianPulse.width is a half-width in seconds and the perfectly matched
layer of the same module measures its own width in cells. It says
half_width_s now.
No value changes: the conformance report is the same 995 checks with the
same numbers. The guard grows a second tuple, matched against the whole
name, and says in its own comment that the seventy-five compound names
are a second pass rather than an exemption: WestonRegimeBoundaries has
critical_angle in radians one screen above a function that takes it in
degrees. Against main the guard reports 71; here none.
* Re-render the three clips the renamed scenes drew
A flag is written by name everywhere, and the clip gate learns which changes cannot move a frame (#760)
#759 closed the flags a caller could reach. This closes the rest, so ruff's
FBT family is selected outright instead of documented as absent: 202
signatures take the star, and the 296 calls that passed a bare True name the
parameter.
Every one of the 156 call sites the change forced was named rather than left
positional. Two of them no static gate sees: _cached_weighting_sos and
_cached_weighting_filter are lru_cache'd, so mypy reads the call through
_lru_cache_wrapper and checks nothing, and only the suite found them.
The one place a keyword-only parameter is not a rewrite: Callable[[...], R]
cannot say that a parameter is keyword-only. ColumnsBuilder in
_report/_insulation_fiche.py and a new LeftCellBuilder in
_report/ansi_s12_2.py become protocols, which say what the alias could not.
FBT003 came down to ax.grid(True, alpha=0.3) in 295 of its 296 sites.
matplotlib declares that parameter visible, so the sites say visible=True and
a test pins the name, because a matplotlib release that moved it would
otherwise surface as a wall of unrelated red. The one that was left is
np.bool_(True) in a test, a cast rather than a flag; it is np.True_ now.
The clips are not re-rendered, and none of them needed to be.
animation_fingerprint already normalises away what cannot move a frame, the
docstrings, the import order, the TYPE_CHECKING blocks, with the reason on
each. Where the keyword-only star sits is the same kind of thing: it decides
how a caller may write the call, not what the function computes. With that
normalisation the 43 fingerprints are identical either side of the signature
sweep, measured, not assumed. The manifest is re-stamped because the
fingerprint itself changed, and the stamp records the same clips it always
described.
scripts/check_public_flags.py goes: ruff now says the same thing on every
definition, and a guard that cannot fire is noise.
A Spanish figure writes its decimal comma on every panel it draws, and two guards keep it that way (#777)
Every helper that writes text takes a language and defaults to English, so a call that forgets to pass it on raises nothing and puts an English decimal point into a Spanish figure. The plotting modules, the figure generators and the fiches now hand the caller's language to every helper that takes one, and localize_axes is called once per axes a plot builds rather than once per figure: a twin axis, a colorbar and the z of a 3-D panel each carry a formatter of their own, and each was shipping in English beside a panel already in Spanish. What decides whether an axis is localised is its formatter and not its scale, so a log axis of distances still writing its own numbers is reached and a pinned frequency axis is left to format_frequency_axis. A zoom inset and a contour colorbar, which the save-time pass of the figure generators cannot reach, are localised where they are built. The band column of the room criterion sheet and of the whole sound-power fiche family is written in the sheet's language too.
scripts/check_language_forwarding.py fails on any call to a helper that takes a language, made from anywhere a language is in scope, that does not pass it on. It reads module and class bodies as well as functions, follows a helper through a local alias and a functools.partial, names the shapes it cannot reach, keys an exemption by its line so one approved call cannot cover another, and reports a method name only some of whose namesakes take the language, which silently switched the untyped-receiver check off.
scripts/check_figure_decimal_point.py reads the committed Spanish figures and fails on a tick label that is a number with a point in it, whichever pass was meant to write the comma. It found six figures, regenerated here. Both run from the Makefile and in CI.
Every catalogue row has one shape and says what its source claims for each cell (#862)
* Every published catalogue cell is pinned to its last digit
The 1982 rows of the 23 published catalogues are dumped once, every float by
its repr, into tests/data/published_catalogues/baseline.json. A test takes
that baseline through every change listed in tests/catalogue_fingerprint.py
and asserts that the result is, field for field, what the library builds
today. The page generator's check sees the numbers only as the site prints
them; this sees the last digit of a float and a hedge moved from one field to
another, so a change to how a row is built has to say what it moved.
* Every catalogue row has one shape and says what its source claims
The rows of every published catalogue share one base, and phonometry.io now
publishes it: CatalogueRow, BandedRow, CatalogueError and CATALOGUE_BASES.
A row gains basis, what the source claims a value is (measured, declared,
calculated, estimated or extended), read through basis_of. The estimate had
two spellings, SolidMaterial.estimated with is_estimate and
OrthotropicWood.estimated with is_estimated; both are gone, and the 35 cells
Hopkins Table A2 and Rossing Table 15.5 mark as estimates hold "estimated"
in basis.
A value the page prints in another unit is no longer derived: the 116 cells
of Ver & Beranek Table 14.1 in degrees Fahrenheit and psi and the nine of
Long Table 7.1 in sabins keep the printed figure and unit in converted. A
cell the page leaves blank and prints on another row (Ver & Beranek Table
8.7, ASHRAE Table 30, Harris Chapter 32) names that row in carried.
is_derived now answers only for what the library computes. The published
catalogues page marks converted and carried cells as such, with the printed
figure on a converted one, and a test walks every hedged cell of every
catalogue to hold the page to it.
OrthotropicWood and PlateauMaterial take their fields by name only, and no
row class is slotted, because on Python 3.13 a slotted dataclass cannot call
super() without arguments from its own methods. No published value changes:
the fingerprint lists the 54 rows the move touched and nothing else moved.
* A catalogue cell no longer claims a unit or a derivation its page does not print
Long prints the six figures of his musician with no unit. The row now says
so in its note and why they are read as sabins, and `converted` is described
everywhere as the page's figure and its unit rather than as what the page
prints; the published catalogues page words its tooltip the same way. A
figure a packaged table prints with another SI prefix, such as the
megapascals of Rossing Table 15.5, keeps no `converted` entry, and the
docstring says so.
`carried` covers a value the page gives by reference to another row, which
includes the three Harris rows that print "Parecido al anterior" and no row
number, not only a cell left blank under a block. The two ASHRAE rows that
carry a diameter down no longer call it a derivation in their notes, and the
damping paragraph of the catalogues page no longer says converted cells are
marked as worked out.
The fingerprint compares every row as the text the baseline holds, so a
float served as an integer, or a flag served as a number, is a change. The
page generator refuses a cell whose hedges it cannot show, two on one value
or an estimate, a conversion or a carried value on an interval, a list or a
word, instead of publishing it with one of them missing; the test walks
every hedge of every published row to hold it to that.
The older unreleased notes that still named `is_estimated`, the `estimated`
field and cells marked derived now name `basis`, `basis_of` and `converted`.
The scripts and tests that import `CatalogueRow` take it from
`phonometry.io`, and the Spanish pages spell the sabin one way.
* An approximate interval keeps its tilde on the catalogue page
The porosity Cox Table 6.5 prints for granular vermiculite is an interval with
a tilde, and the page showed the bare interval. The range and bound kinds have
no mark of their own, so the tilde now goes into the cell text.
The fingerprint's migration test also requires every field outside the hedges
the step moves to stay equal, basis_of names all five bases, the baseline's
README states the terms that cover it, and the test that probed the
interpreter for the slotted super() failure is gone: Python 3.13.15 carries
the fix and 3.13.5 does not, so it tested the Python patch release, not the
library.
* A list of readings printed with a tilde keeps it on the catalogue page
Like an interval, a cell holding several readings has no mark of its own for
a tilde, so it goes into the text. The generator now refuses an approximate
hedge only on a printed word, which has nowhere to show it. No published cell
changes.
* A catalogue row refuses a basis outside the five words
The catalogue page and every reader of basis_of act on measured, declared,
calculated, estimated and extended only, so a row built with any other word,
such as a misspelt estimate, now raises CatalogueError instead of reaching
the page as a printed number.
Six places where the clause and the code had parted, from a microphone standing under its own clearance to an area that is not one number (ISO 10847, ISO 11820, ISO 11821, EN 16487) (#785)
* Six places where the clause and the code had parted, from a microphone standing under its own clearance to an area that is not one number (ISO 10847, ISO 11820, ISO 11821, EN 16487)
The reference microphone of ISO 10847 could stand lower than 7.2.2 allows.
The clause puts it at least 1,5 m above the top edge of the barrier with
"shall", and its NOTE lets a close source raise it until it looks 10 degrees
over the top; the height returned was the NOTE's alone whenever the source was
nearer than 15 m, which for a 3 m barrier 5 m away is 4,34 m against the 4,5 m
the clause asks for, and past 80 degrees a negative height. It is the higher of
the two now, and where no height reaches the 10 degrees the clearance holds and
a warning says why. The test and the conformance row had both pinned the short
geometry as correct.
ISO 11820 caps its energy subtraction at 3 dB, and Table 1 prints what that
3 dB is: the correction at a 3 dB margin, which the subtraction writes
unrounded as 3,0206 dB. The cap is judged on the margin of the two energy means
now, so the two routes the clause offers agree at the boundary they share and a
printed 3,0 dB pair is no longer decided by floating point. The window that
keeps such a pair out of the cap is the one the module declares and nothing
wider: the comparison names a relative tolerance of zero, as every other
closeness test in the package does, so the constant sets the tolerance it
documents instead of three times it. ISO 11821 7.4 c) reports the attenuation
of a screen to the nearest whole decibel, which the result now gives with
rounded() and rounded_a_weighted() as the barrier, enclosure and cabin results
already did.
The two loss functions of ISO 11820 took their areas as single numbers, where
the area of a diffuse room is a quarter of its absorption and moves with the
reverberation time band by band. They take each area and the field correction
as one value or one per band, and the two fields of the result are arrays of
one value per band even when single values went in. The thesis oracle that had
to be driven one band at a time is one call per table.
check_ceiling_specimen judged three of the limits clause 4 of EN 16487 prints
and published the rest as constants nothing applied. It judges the support
units of 4.1.1.2.3.6 and, given one value per measurement, the 50 % of 4.2.2;
the verdict carries both, and a type E depth other than 200 mm passes with a
warning that no longer calls the arrangement outside the test code. And
room_to_room_transmission gains receiver_distance_m, the direct field the
partition radiates into the receiving room, from Equations (7-71) and (7-72) of
Barron (2003), whose Example 7-6 a new conformance row holds; Norton's Equation
(4.101) is its far limit and stays the default.
The unit guard then read the new humidity_ok as a humidity without its unit: a
parameter typed bool holds a verdict and no number of the quantity it names, so
it is outside the rule. The printed tables the tests and the conformance rows
of these standards both read were transcribed twice, once on each side; they
are transcribed once now, in tests/reference_data, with the document, the folio
and the PDF page of each, and the report regenerates value for value.
The guides say all of it in both languages, with the mirrors, the curated API
table and the errata entry for the 6,2 dB of ISO 14257 Equation (4), which
stays as printed and is now stated where it is spent.
* Two receiver-correction rows a single band could satisfy, and a denominator with two spellings (ISO 10847, ISO 11820)
Both ISO 10847 receiver-correction rows read the largest shift across the three bands, so a correction that reached one band and left the other two alone would still have printed the 6 dB of the pressure doubling and passed. They now read the largest absolute departure from 6 dB, which is a statement about every band, and the 6 dB is written into the expected column as prose so the row still says what it is checking.
The Ver and Beranek absorption row said it was checking a quarter of the printed Sabine absorption area. It multiplies the quarter back up and compares the full printed 10,7 m2, so the row described a different quantity from the one it evaluates.
`receiving_absorption` is the denominator of the reverberant term, and the two books write that term over two different quantities: Norton over S2 alpha2 and Barron over the room constant R2. The module prose, the function docstring and the guide all say so, but the parameter line said only the first, and the parameter tables of the reference pages print that line on its own, away from the paragraph that explains it. It now names both, with the link to `room_constant` beside the one to `equivalent_absorption_area`.
The normalisation cell of the API table printed `spectrum_distribution_value(values, PINK_NOISE_WEIGHTS_DB values)`, two arguments juxtaposed with no accessor between them. The second argument is a sequence of the six weights, so it is `list(PINK_NOISE_WEIGHTS_DB.values())`.
* The background of Annex B case A goes with the label that carries it, not with the coordinates beside it (ISO 11690-3)
Table B.5 prints the 50 dB of background against the workstation it calls W1, and the entry already registered that the labels of that table are the half it gets right: Figure B.1 puts W1 beside machine M2, and that is where the levels of Table B.6 come back. The background was being heard in the far corner instead, which is where the other label belongs.
It is worth 0,004 dB, both readings round to the tenth Table B.6 prints, and no verdict moves. What changes is the second decimal of the two recomputed levels the entry quotes, 82,09 dB and 80,27 dB becoming 82,10 dB and 80,26 dB, and the entry now says where the background sits and what the other reading would cost.
The two counts in the Annex B check labels were written out by hand while the cells they describe were counted in the code beside them, so a row added or removed would have left the prose saying six and twelve. They come from the cells now.
* The Eq. (4) offset row judges every claim it prints, not only the first (ISO 14257)
The row publishes three findings about the fourteen Annex C values: the sum of the Table 1 weights puts none of them outside their rounding, the printed 6,2 dB puts nine outside, and every departure the printed constant gives is high. Its verdict only counted the first. The other two were computed and printed beside it and never judged, so the row would have gone on passing the day the printed constant agreed with the annex, while still saying it does not.
All three are judged now, with a fourth the description also claims, that none of the high cells reaches a second unit of the tenth. The nine is recorded as the finding it is rather than derived, and the fourteen comes from the cells. Made to fail both ways before committing: with the recorded count set as if the constant agreed with the annex, and with the printed departures pushed low.
In the release note, "both use one the angle governs now" becomes "both now use the height the angle governs".
* The two Annex B distances in the ISO 11690-3 entry are the ones the coordinates give
The entry said the position Table B.5 calls W2 is one metre from machine M2 and the one it calls W1 eleven metres from the nearer machine. From the printed coordinates they are 1,17 m and 11,42 m: W2 stands a metre away in plan but 0,6 m higher than the machine. Both now read 1,2 m and 11,4 m, in English and in Spanish. The argument does not change, since the near position is still the quieter one the table claims.
* The generated artefacts are regenerated on top of the measurement diagrams
Moving the layer onto main kept llms-full.txt, the materials absorbers bundle and the conformance artefact as this layer had written them, which dropped what the diagram stack added to the suspended ceilings guide and the ISO 4866 re-citation. Regenerated from the tree, they carry both.
A flag is written by name everywhere, and the clip gate learns which changes cannot move a frame (#760)
#759 closed the flags a caller could reach. This closes the rest, so ruff's
FBT family is selected outright instead of documented as absent: 202
signatures take the star, and the 296 calls that passed a bare True name the
parameter.
Every one of the 156 call sites the change forced was named rather than left
positional. Two of them no static gate sees: _cached_weighting_sos and
_cached_weighting_filter are lru_cache'd, so mypy reads the call through
_lru_cache_wrapper and checks nothing, and only the suite found them.
The one place a keyword-only parameter is not a rewrite: Callable[[...], R]
cannot say that a parameter is keyword-only. ColumnsBuilder in
_report/_insulation_fiche.py and a new LeftCellBuilder in
_report/ansi_s12_2.py become protocols, which say what the alias could not.
FBT003 came down to ax.grid(True, alpha=0.3) in 295 of its 296 sites.
matplotlib declares that parameter visible, so the sites say visible=True and
a test pins the name, because a matplotlib release that moved it would
otherwise surface as a wall of unrelated red. The one that was left is
np.bool_(True) in a test, a cast rather than a flag; it is np.True_ now.
The clips are not re-rendered, and none of them needed to be.
animation_fingerprint already normalises away what cannot move a frame, the
docstrings, the import order, the TYPE_CHECKING blocks, with the reason on
each. Where the keyword-only star sits is the same kind of thing: it decides
how a caller may write the call, not what the function computes. With that
normalisation the 43 fingerprints are identical either side of the signature
sweep, measured, not assumed. The manifest is re-stamped because the
fingerprint itself changed, and the stamp records the same clips it always
described.
scripts/check_public_flags.py goes: ruff now says the same thing on every
definition, and a guard that cannot fire is noise.
The same argument for the geometry that had two units on one name (#755)
* The same argument for the geometry that had two units on one name
#752 put the unit in the name where a pressure, a temperature or a
humidity could be read two ways. Measured over the imported API, four
geometric quantities were in the same state, and one of them was two
different dimensions.
diameter was metres in twenty public parameters and millimetres in one,
cnossos_rail.wheel_transfer, where CNOSSOS-EU Table G-3b tabulates 920,
840 and 680. angles was degrees in ten and radians in four while angle
was radians in eleven, so the plural and the singular of one word
disagreed. period was a lattice pitch in metres in the slit and
metadiffuser panels and a repetition time in seconds in the synchronous
average. gradient was a road slope in per cent in CNOSSOS-EU and a
vertical sound-speed gradient in s^-1 in refraction and sound speed.
They become diameter_m and diameter_mm, angle_rad, angles_rad and
angles_deg, period_m and period_s, road_slope_percent and gradient_per_s.
periods, a count of repetitions sitting beside a period that is a length,
becomes repetitions; the two places where it really means evaluation
periods keep the word and are in the guard's exemptions with the reason.
GaussianPulse.width is a half-width in seconds and the perfectly matched
layer of the same module measures its own width in cells. It says
half_width_s now.
No value changes: the conformance report is the same 995 checks with the
same numbers. The guard grows a second tuple, matched against the whole
name, and says in its own comment that the seventy-five compound names
are a second pass rather than an exemption: WestonRegimeBoundaries has
critical_angle in radians one screen above a function that takes it in
degrees. Against main the guard reports 71; here none.
* Re-render the three clips the renamed scenes drew
The same argument for the geometry that had two units on one name (#755)
* The same argument for the geometry that had two units on one name
#752 put the unit in the name where a pressure, a temperature or a
humidity could be read two ways. Measured over the imported API, four
geometric quantities were in the same state, and one of them was two
different dimensions.
diameter was metres in twenty public parameters and millimetres in one,
cnossos_rail.wheel_transfer, where CNOSSOS-EU Table G-3b tabulates 920,
840 and 680. angles was degrees in ten and radians in four while angle
was radians in eleven, so the plural and the singular of one word
disagreed. period was a lattice pitch in metres in the slit and
metadiffuser panels and a repetition time in seconds in the synchronous
average. gradient was a road slope in per cent in CNOSSOS-EU and a
vertical sound-speed gradient in s^-1 in refraction and sound speed.
They become diameter_m and diameter_mm, angle_rad, angles_rad and
angles_deg, period_m and period_s, road_slope_percent and gradient_per_s.
periods, a count of repetitions sitting beside a period that is a length,
becomes repetitions; the two places where it really means evaluation
periods keep the word and are in the guard's exemptions with the reason.
GaussianPulse.width is a half-width in seconds and the perfectly matched
layer of the same module measures its own width in cells. It says
half_width_s now.
No value changes: the conformance report is the same 995 checks with the
same numbers. The guard grows a second tuple, matched against the whole
name, and says in its own comment that the seventy-five compound names
are a second pass rather than an exemption: WestonRegimeBoundaries has
critical_angle in radians one screen above a function that takes it in
degrees. Against main the guard reports 71; here none.
* Re-render the three clips the renamed scenes drew
The unit goes in the name, where the caller writes the number (#752)
* The unit goes in the name, where the caller writes the number
A static pressure of 101 325 and a static pressure of 101.325 are both
legitimate values in this tree: the ISO 3740 family prints kilopascals,
IEC 61094-2 and ISO 15186-3 Annex A print pascals. Nothing separates them
by magnitude, because either reading is a real duty somewhere else, and
the result of the mix-up is still a float.
146 public parameters take their unit as a suffix. No value changes:
every function keeps the unit it already documented, so no oracle, no
printed figure and no conformance row moves.
temperature -> temperature_c across 39 callables, with temperature1_c,
temperature2_c, temperatures_c and temperature_celsius folded into the
same spelling; GasStream.inlet_temperature, which IEC 60534-8-3 states in
kelvin, becomes inlet_temperature_k. relative_humidity and the ISO 354
humidity both become relative_humidity_percent. The ambient pressure of
the propagation and aircraft chains becomes atmospheric_pressure_kpa, the
name air_density_astm and air_density_iso10534 already used; the ISO 3740
family takes static_pressure_kpa and the pascals of ISO 15186-3 Annex A,
ISO 9053-2 and ISO 7235 take static_pressure_pa, matching fluids.air.
Every other member of the family takes _pa.
Acoustic pressure keeps its bare name: a waveform is always in pascals
and a Signal carries its own calibration, so a suffix would restate the
type rather than resolve an ambiguity.
scripts/check_parameter_units.py holds the rule from here on. It walks
the imported package, not the source tree, because ReportMetadata is
published from the root and defined in a private module. Against main it
reports 154 offenders; here it reports none.
* Regenerate the API reference and the llms artifacts after the rewrap
* Pin the renamed argument in the four refusals nothing was reading
Answer the audit: three defects in the code, one class of invisible byte, and sixteen claims the page does not support (#705)
* Grade the run, refuse the control character, ask only for what is used
Three things the audit found in the code.
industrial_machine_zone wrapped a function that has always taken an array and then applied the most-restrictive rule of 5.2.3 by comparing the two gradings as text. With an array in, that text was the array's repr, so a year of monthly readings came back as one eighteen-character string. The rule is applied to zone indices now and the letters looked up at the end, and a new figure draws what the array is for: twelve readings walking from zone A into zone D, with the month Criterion II sees before Criterion I does.
A form feed had reached the change-of-section docstring, and in a raw string that is exactly the backslash and the f of the command after it, so the published formula lost its fraction. check_control_characters.py refuses the whole class over the tracked text corpus, with an escape hatch for the two files that are copies of somebody else's and a ratchet on it.
section_change_loss demanded a rectangular duct's largest side whatever the ratio, and for a sudden reduction threw it away: Figure 26 prints no effect in the frequency column there, so no limit frequency and no dimension enter the answer. It is asked for now only where it is used. A round duct's diameter and its area are one fact stated twice, and a contradictory pair silently moved the limit frequency by a decade instead of being refused.
* Say what the printed page says, in both languages
Ten statements across the guides, the register and the module comments that the printed page does not support.
Clause numbers: the measurement band of ISO 10816-3 is stated in an unnumbered Annex A, which has no A.1; the 50 MW cap on group 1 is in the title of Table A.1 and not in clause 4.2; VDI 2081's duct attenuation uses Tables 5 and 7, Table 8 being the sound reduction index of building components; the spectral parameter and the blade-frequency allowance are printed in Section 4.3.4, not 4.3.3; and the Table C.1 ladder steps by 1,6, which is R5 and not R10.
Numbers: the fan caption said eight decibels between a radial machine and an axial one where its own figure prints 94 and 106; the ISO/TR 17534-3 cases are 194,16 m apart in ground projection, not 195; and the register holds five VDI 2081 defects, not four, the fifth being the cross-reference that sends a reader to Section 7.3.2 for coefficients printed in 7.2.3.2.
Descriptions: the Section 6.4 mistranslation is about whether a junction's reduction depends on frequency at all, not about which way a duct's attenuation runs with it; and the note about the three L_WSM values sitting inside their stated tolerance holds for two of the three, assembly T being inside the English tolerance and outside the normative German one.
The ISO/TR 17534-3 errata entry gets its Status line back in both languages, taken by the two VDI entries inserted above it. And one term, one word, on the Spanish pages: margen for the tolerance band and referencia for the established baseline, each of which the same page had been saying two ways.
* Name the parameter this signature has when it refuses a rating
gear_housing_velocity_limit passed the rating through to allowable_velocity, so a bad one surfaced under the delegate's 'constant_velocity_mm_s': a keyword the caller cannot see and no pytest.raises(match=) against this API can match. Validated locally now, the way its sibling already was.
* Carry the restored errata line into the pages the register feeds
* Count the letters the figure actually draws
* Let the section-change rows describe a duct that exists
The nine Figure 26 abscissae were checked through a round duct given both an area and a 0,4 m diameter that does not follow from it, which the consistency check now refuses. The diameter comes from the area, which is what keeps the 63 Hz octave below the limit frequency at every ratio the chart is drawn over.
* Write the fixture bytes the test means, on Windows too
path.write_text translates a newline into a carriage return and a newline on Windows, so a fixture written to carry one control character carried two there and the two tests that fix a position failed on both Windows runners. newline='' turns the translation off.
* Name a file the same way on every platform
The reports and the keys of the escape hatch were built with str() on a path, which gives backslashes on Windows and matches no key written with forward slashes. Both exempt files were therefore reported there and their entries called stale in the same run, which is what the Windows job caught. Named through as_posix() now, and the test that held the hatch against the tree asks what it can answer anywhere: that every entry names a file the scan reads.
* Take the corrections into the figure and the printed outputs
The quality-assurance figure still drew the 195 m the pages had stopped saying; it is 194,16 m in both languages now. The propagation snippet printed 96 and -1 at 8 kHz where it returns 95,8 and -0,8. The trend snippet imported numpy and used a name it never imported. And the Spanish errata bullet called Section 7.3 sound attenuation, where it is the airborne sound insulation of a building component.
* Attribute each claim to the clause that carries it
Section 7.6 of Blatt 1 is the vibration isolation the page called a different guideline. Equation (35) is written on the cross-section ratio, not on the flow, which is why split_loss takes areas. The three gear ratings are named under Table 5 and defined in Annex A; Table 1 gives their units and nothing else. The CNOSSOS cross-references still pointed at section 3, which is the quality-assurance section now, and the comparison they mean is in section 4. And the chapters the successors added were credited to a 2019 revision on a page that says twice the successors are the 2022 editions.
* Keep the 2019 revision, which is a real edition
The refuters were right: VDI 2081 Blatt 1:2019-03 exists, sits between the held 2001-07 and the 2022-04 successor, and is the revision that added the air-handling-unit and outdoor-propagation chapters. The sentence was correct and only its second half needed the Section 7.6 fix. The changelog also counted nine Spanish figures where this branch repoints eight, the ninth having travelled with the gear-unit work; it says which now.
* Read the corpus the gate says it reads, and let a lost Status be heard
The control-character gate named the text suffixes and read those, so it never opened twenty-nine tracked files, seven of which carry the very character it exists for: the CNOSSOS extracts are CRLF as the workbook and the Official Journal produced them. It names the binary suffixes now and reads everything else, 1807 files instead of 1778, and its scope test asks something that can fail: that nothing it skips is text.
The errata gate recognised a record by its Status bullet, so a record that lost one was not reported, it was dropped, and its page citation and ratio claims stopped being checked with it. That is exactly how the ISO/TR 17534-3 line went missing this morning. A record is recognised by its Location now and a missing Status is an error; the sweep found one more, the ISO 3747 E.4.2.3 entry, in both registers. The Spanish register is read too, and has to hold the same records as the English one.
* Answer the review: what Criterion II reads, and the cap that can be refused
Criterion II does not read the zone, it reads the change from the established baseline, and a machine can be well inside zone B and still owe an investigation, which the caption under the figure already said and the paragraph above it did not. The Spanish 'al margen del propio documento' reads as 'apart from the document'; it is 'dentro del margen'. And section_change_loss refuses a cap that is not positive, which its raises clause did not say.
* Recognise a record by either bullet, not only by its Location
Keying recognition on the Location alone made the gate's own fixtures invisible: they carry an Evidence and a Status and no Location, which is the shape a test probe wants. Either bullet marks a record now, so a section missing one is reported rather than dropped, whichever one it is.
Close the chain in the room the air arrives in (#696)
VDI 2081 Blatt 1 ends where every duct calculation ends, at the level in the
room, and it writes that step in the equivalent absorption area A rather than
in the room constant R. The library already carried the relation twice, in
room.steady_state_spl and in noise_control.room_effect, and both were written
in R alone.
The two are not the same number. R = A/(1 - alpha_bar), so they part company as
the room gets deader: at alpha_bar = 0,3 the room constant is already a seventh
larger than the absorption area. Both are areas in square metres and both are
positive, which makes substituting one for the other a silent mistake, so each
gets its own argument and exactly one may be given. critical_distance follows,
and written in A with the hemispherical Q = 2 it is the rH = 0,2 sqrt(A) that
Section 6.7.3 prints for where the reverberant field of a ventilation opening
begins.
The directivity may now vary across the bands, because a diffuser is more
directional the shorter the wavelength and the guideline reads Q off a chart
against frequency.
New sabine_absorption_area, the familiar Sabine relation read from the time to
the area rather than the other way about, which is the direction a room survey
delivers. Its constant follows the speed of sound: 0,161 at 343 m/s, and the
0,163 of Equation (37), the same expression at 339 m/s.
Every range guard these measures go through is vacuously true over nothing:
np.any over an empty array is false and np.all is true. So an empty absorption
area passed validation and came back as an empty level spectrum, which reads as
a room with no bands rather than as the mistake it is. The size is checked
before the range, and four entry points are pinned against it.
Element 20 of the worked example now comes out of the library, its eight room
attenuations exact and its two sums inside a tenth: five conformance rows and
nineteen tests.
Figure 30, the chart the directivity comes from, is left alone. It is Q against
the product of frequency and the square root of the outlet area, for two
radiation angles and four positions in the room, and the copy in hand does not
resolve it better than about a tenth of what it carries. Reading it off by eye
and shipping the curve would be a table nothing could check, so Q stays an
input, which is what a caller does with a diffuser's own data.
Two errata. The symbol list under Equation (36) sends the reader to Equation
(36) for the absorption area that equation takes as an input; it is defined by
Equation (37) or (39). And the English column of the reverberation-radius
sentence calls a halbkugelfoermig propagation spherical, where the printed 0,2
is the hemispherical constant and the spherical one would be 0,141.
Six places where the clause and the code had parted, from a microphone standing under its own clearance to an area that is not one number (ISO 10847, ISO 11820, ISO 11821, EN 16487) (#785)
* Six places where the clause and the code had parted, from a microphone standing under its own clearance to an area that is not one number (ISO 10847, ISO 11820, ISO 11821, EN 16487)
The reference microphone of ISO 10847 could stand lower than 7.2.2 allows.
The clause puts it at least 1,5 m above the top edge of the barrier with
"shall", and its NOTE lets a close source raise it until it looks 10 degrees
over the top; the height returned was the NOTE's alone whenever the source was
nearer than 15 m, which for a 3 m barrier 5 m away is 4,34 m against the 4,5 m
the clause asks for, and past 80 degrees a negative height. It is the higher of
the two now, and where no height reaches the 10 degrees the clearance holds and
a warning says why. The test and the conformance row had both pinned the short
geometry as correct.
ISO 11820 caps its energy subtraction at 3 dB, and Table 1 prints what that
3 dB is: the correction at a 3 dB margin, which the subtraction writes
unrounded as 3,0206 dB. The cap is judged on the margin of the two energy means
now, so the two routes the clause offers agree at the boundary they share and a
printed 3,0 dB pair is no longer decided by floating point. The window that
keeps such a pair out of the cap is the one the module declares and nothing
wider: the comparison names a relative tolerance of zero, as every other
closeness test in the package does, so the constant sets the tolerance it
documents instead of three times it. ISO 11821 7.4 c) reports the attenuation
of a screen to the nearest whole decibel, which the result now gives with
rounded() and rounded_a_weighted() as the barrier, enclosure and cabin results
already did.
The two loss functions of ISO 11820 took their areas as single numbers, where
the area of a diffuse room is a quarter of its absorption and moves with the
reverberation time band by band. They take each area and the field correction
as one value or one per band, and the two fields of the result are arrays of
one value per band even when single values went in. The thesis oracle that had
to be driven one band at a time is one call per table.
check_ceiling_specimen judged three of the limits clause 4 of EN 16487 prints
and published the rest as constants nothing applied. It judges the support
units of 4.1.1.2.3.6 and, given one value per measurement, the 50 % of 4.2.2;
the verdict carries both, and a type E depth other than 200 mm passes with a
warning that no longer calls the arrangement outside the test code. And
room_to_room_transmission gains receiver_distance_m, the direct field the
partition radiates into the receiving room, from Equations (7-71) and (7-72) of
Barron (2003), whose Example 7-6 a new conformance row holds; Norton's Equation
(4.101) is its far limit and stays the default.
The unit guard then read the new humidity_ok as a humidity without its unit: a
parameter typed bool holds a verdict and no number of the quantity it names, so
it is outside the rule. The printed tables the tests and the conformance rows
of these standards both read were transcribed twice, once on each side; they
are transcribed once now, in tests/reference_data, with the document, the folio
and the PDF page of each, and the report regenerates value for value.
The guides say all of it in both languages, with the mirrors, the curated API
table and the errata entry for the 6,2 dB of ISO 14257 Equation (4), which
stays as printed and is now stated where it is spent.
* Two receiver-correction rows a single band could satisfy, and a denominator with two spellings (ISO 10847, ISO 11820)
Both ISO 10847 receiver-correction rows read the largest shift across the three bands, so a correction that reached one band and left the other two alone would still have printed the 6 dB of the pressure doubling and passed. They now read the largest absolute departure from 6 dB, which is a statement about every band, and the 6 dB is written into the expected column as prose so the row still says what it is checking.
The Ver and Beranek absorption row said it was checking a quarter of the printed Sabine absorption area. It multiplies the quarter back up and compares the full printed 10,7 m2, so the row described a different quantity from the one it evaluates.
`receiving_absorption` is the denominator of the reverberant term, and the two books write that term over two different quantities: Norton over S2 alpha2 and Barron over the room constant R2. The module prose, the function docstring and the guide all say so, but the parameter line said only the first, and the parameter tables of the reference pages print that line on its own, away from the paragraph that explains it. It now names both, with the link to `room_constant` beside the one to `equivalent_absorption_area`.
The normalisation cell of the API table printed `spectrum_distribution_value(values, PINK_NOISE_WEIGHTS_DB values)`, two arguments juxtaposed with no accessor between them. The second argument is a sequence of the six weights, so it is `list(PINK_NOISE_WEIGHTS_DB.values())`.
* The background of Annex B case A goes with the label that carries it, not with the coordinates beside it (ISO 11690-3)
Table B.5 prints the 50 dB of background against the workstation it calls W1, and the entry already registered that the labels of that table are the half it gets right: Figure B.1 puts W1 beside machine M2, and that is where the levels of Table B.6 come back. The background was being heard in the far corner instead, which is where the other label belongs.
It is worth 0,004 dB, both readings round to the tenth Table B.6 prints, and no verdict moves. What changes is the second decimal of the two recomputed levels the entry quotes, 82,09 dB and 80,27 dB becoming 82,10 dB and 80,26 dB, and the entry now says where the background sits and what the other reading would cost.
The two counts in the Annex B check labels were written out by hand while the cells they describe were counted in the code beside them, so a row added or removed would have left the prose saying six and twelve. They come from the cells now.
* The Eq. (4) offset row judges every claim it prints, not only the first (ISO 14257)
The row publishes three findings about the fourteen Annex C values: the sum of the Table 1 weights puts none of them outside their rounding, the printed 6,2 dB puts nine outside, and every departure the printed constant gives is high. Its verdict only counted the first. The other two were computed and printed beside it and never judged, so the row would have gone on passing the day the printed constant agreed with the annex, while still saying it does not.
All three are judged now, with a fourth the description also claims, that none of the high cells reaches a second unit of the tenth. The nine is recorded as the finding it is rather than derived, and the fourteen comes from the cells. Made to fail both ways before committing: with the recorded count set as if the constant agreed with the annex, and with the printed departures pushed low.
In the release note, "both use one the angle governs now" becomes "both now use the height the angle governs".
* The two Annex B distances in the ISO 11690-3 entry are the ones the coordinates give
The entry said the position Table B.5 calls W2 is one metre from machine M2 and the one it calls W1 eleven metres from the nearer machine. From the printed coordinates they are 1,17 m and 11,42 m: W2 stands a metre away in plan but 0,6 m higher than the machine. Both now read 1,2 m and 11,4 m, in English and in Spanish. The argument does not change, since the near position is still the quieter one the table claims.
* The generated artefacts are regenerated on top of the measurement diagrams
Moving the layer onto main kept llms-full.txt, the materials absorbers bundle and the conformance artefact as this layer had written them, which dropped what the diagram stack added to the suspended ceilings guide and the ISO 4866 re-citation. Regenerated from the tree, they carry both.
A Spanish figure writes its decimal comma on every panel it draws, and two guards keep it that way (#777)
Every helper that writes text takes a language and defaults to English, so a call that forgets to pass it on raises nothing and puts an English decimal point into a Spanish figure. The plotting modules, the figure generators and the fiches now hand the caller's language to every helper that takes one, and localize_axes is called once per axes a plot builds rather than once per figure: a twin axis, a colorbar and the z of a 3-D panel each carry a formatter of their own, and each was shipping in English beside a panel already in Spanish. What decides whether an axis is localised is its formatter and not its scale, so a log axis of distances still writing its own numbers is reached and a pinned frequency axis is left to format_frequency_axis. A zoom inset and a contour colorbar, which the save-time pass of the figure generators cannot reach, are localised where they are built. The band column of the room criterion sheet and of the whole sound-power fiche family is written in the sheet's language too.
scripts/check_language_forwarding.py fails on any call to a helper that takes a language, made from anywhere a language is in scope, that does not pass it on. It reads module and class bodies as well as functions, follows a helper through a local alias and a functools.partial, names the shapes it cannot reach, keys an exemption by its line so one approved call cannot cover another, and reports a method name only some of whose namesakes take the language, which silently switched the untyped-receiver check off.
scripts/check_figure_decimal_point.py reads the committed Spanish figures and fails on a tick label that is a number with a point in it, whichever pass was meant to write the comma. It found six figures, regenerated here. Both run from the Makefile and in CI.
Six places where the clause and the code had parted, from a microphone standing under its own clearance to an area that is not one number (ISO 10847, ISO 11820, ISO 11821, EN 16487) (#785)
* Six places where the clause and the code had parted, from a microphone standing under its own clearance to an area that is not one number (ISO 10847, ISO 11820, ISO 11821, EN 16487)
The reference microphone of ISO 10847 could stand lower than 7.2.2 allows.
The clause puts it at least 1,5 m above the top edge of the barrier with
"shall", and its NOTE lets a close source raise it until it looks 10 degrees
over the top; the height returned was the NOTE's alone whenever the source was
nearer than 15 m, which for a 3 m barrier 5 m away is 4,34 m against the 4,5 m
the clause asks for, and past 80 degrees a negative height. It is the higher of
the two now, and where no height reaches the 10 degrees the clearance holds and
a warning says why. The test and the conformance row had both pinned the short
geometry as correct.
ISO 11820 caps its energy subtraction at 3 dB, and Table 1 prints what that
3 dB is: the correction at a 3 dB margin, which the subtraction writes
unrounded as 3,0206 dB. The cap is judged on the margin of the two energy means
now, so the two routes the clause offers agree at the boundary they share and a
printed 3,0 dB pair is no longer decided by floating point. The window that
keeps such a pair out of the cap is the one the module declares and nothing
wider: the comparison names a relative tolerance of zero, as every other
closeness test in the package does, so the constant sets the tolerance it
documents instead of three times it. ISO 11821 7.4 c) reports the attenuation
of a screen to the nearest whole decibel, which the result now gives with
rounded() and rounded_a_weighted() as the barrier, enclosure and cabin results
already did.
The two loss functions of ISO 11820 took their areas as single numbers, where
the area of a diffuse room is a quarter of its absorption and moves with the
reverberation time band by band. They take each area and the field correction
as one value or one per band, and the two fields of the result are arrays of
one value per band even when single values went in. The thesis oracle that had
to be driven one band at a time is one call per table.
check_ceiling_specimen judged three of the limits clause 4 of EN 16487 prints
and published the rest as constants nothing applied. It judges the support
units of 4.1.1.2.3.6 and, given one value per measurement, the 50 % of 4.2.2;
the verdict carries both, and a type E depth other than 200 mm passes with a
warning that no longer calls the arrangement outside the test code. And
room_to_room_transmission gains receiver_distance_m, the direct field the
partition radiates into the receiving room, from Equations (7-71) and (7-72) of
Barron (2003), whose Example 7-6 a new conformance row holds; Norton's Equation
(4.101) is its far limit and stays the default.
The unit guard then read the new humidity_ok as a humidity without its unit: a
parameter typed bool holds a verdict and no number of the quantity it names, so
it is outside the rule. The printed tables the tests and the conformance rows
of these standards both read were transcribed twice, once on each side; they
are transcribed once now, in tests/reference_data, with the document, the folio
and the PDF page of each, and the report regenerates value for value.
The guides say all of it in both languages, with the mirrors, the curated API
table and the errata entry for the 6,2 dB of ISO 14257 Equation (4), which
stays as printed and is now stated where it is spent.
* Two receiver-correction rows a single band could satisfy, and a denominator with two spellings (ISO 10847, ISO 11820)
Both ISO 10847 receiver-correction rows read the largest shift across the three bands, so a correction that reached one band and left the other two alone would still have printed the 6 dB of the pressure doubling and passed. They now read the largest absolute departure from 6 dB, which is a statement about every band, and the 6 dB is written into the expected column as prose so the row still says what it is checking.
The Ver and Beranek absorption row said it was checking a quarter of the printed Sabine absorption area. It multiplies the quarter back up and compares the full printed 10,7 m2, so the row described a different quantity from the one it evaluates.
`receiving_absorption` is the denominator of the reverberant term, and the two books write that term over two different quantities: Norton over S2 alpha2 and Barron over the room constant R2. The module prose, the function docstring and the guide all say so, but the parameter line said only the first, and the parameter tables of the reference pages print that line on its own, away from the paragraph that explains it. It now names both, with the link to `room_constant` beside the one to `equivalent_absorption_area`.
The normalisation cell of the API table printed `spectrum_distribution_value(values, PINK_NOISE_WEIGHTS_DB values)`, two arguments juxtaposed with no accessor between them. The second argument is a sequence of the six weights, so it is `list(PINK_NOISE_WEIGHTS_DB.values())`.
* The background of Annex B case A goes with the label that carries it, not with the coordinates beside it (ISO 11690-3)
Table B.5 prints the 50 dB of background against the workstation it calls W1, and the entry already registered that the labels of that table are the half it gets right: Figure B.1 puts W1 beside machine M2, and that is where the levels of Table B.6 come back. The background was being heard in the far corner instead, which is where the other label belongs.
It is worth 0,004 dB, both readings round to the tenth Table B.6 prints, and no verdict moves. What changes is the second decimal of the two recomputed levels the entry quotes, 82,09 dB and 80,27 dB becoming 82,10 dB and 80,26 dB, and the entry now says where the background sits and what the other reading would cost.
The two counts in the Annex B check labels were written out by hand while the cells they describe were counted in the code beside them, so a row added or removed would have left the prose saying six and twelve. They come from the cells now.
* The Eq. (4) offset row judges every claim it prints, not only the first (ISO 14257)
The row publishes three findings about the fourteen Annex C values: the sum of the Table 1 weights puts none of them outside their rounding, the printed 6,2 dB puts nine outside, and every departure the printed constant gives is high. Its verdict only counted the first. The other two were computed and printed beside it and never judged, so the row would have gone on passing the day the printed constant agreed with the annex, while still saying it does not.
All three are judged now, with a fourth the description also claims, that none of the high cells reaches a second unit of the tenth. The nine is recorded as the finding it is rather than derived, and the fourteen comes from the cells. Made to fail both ways before committing: with the recorded count set as if the constant agreed with the annex, and with the printed departures pushed low.
In the release note, "both use one the angle governs now" becomes "both now use the height the angle governs".
* The two Annex B distances in the ISO 11690-3 entry are the ones the coordinates give
The entry said the position Table B.5 calls W2 is one metre from machine M2 and the one it calls W1 eleven metres from the nearer machine. From the printed coordinates they are 1,17 m and 11,42 m: W2 stands a metre away in plan but 0,6 m higher than the machine. Both now read 1,2 m and 11,4 m, in English and in Spanish. The argument does not change, since the near position is still the quieter one the table claims.
* The generated artefacts are regenerated on top of the measurement diagrams
Moving the layer onto main kept llms-full.txt, the materials absorbers bundle and the conformance artefact as this layer had written them, which dropped what the diagram stack added to the suspended ceilings guide and the ISO 4866 re-citation. Regenerated from the tree, they carry both.
Six places where the clause and the code had parted, from a microphone standing under its own clearance to an area that is not one number (ISO 10847, ISO 11820, ISO 11821, EN 16487) (#785)
* Six places where the clause and the code had parted, from a microphone standing under its own clearance to an area that is not one number (ISO 10847, ISO 11820, ISO 11821, EN 16487)
The reference microphone of ISO 10847 could stand lower than 7.2.2 allows.
The clause puts it at least 1,5 m above the top edge of the barrier with
"shall", and its NOTE lets a close source raise it until it looks 10 degrees
over the top; the height returned was the NOTE's alone whenever the source was
nearer than 15 m, which for a 3 m barrier 5 m away is 4,34 m against the 4,5 m
the clause asks for, and past 80 degrees a negative height. It is the higher of
the two now, and where no height reaches the 10 degrees the clearance holds and
a warning says why. The test and the conformance row had both pinned the short
geometry as correct.
ISO 11820 caps its energy subtraction at 3 dB, and Table 1 prints what that
3 dB is: the correction at a 3 dB margin, which the subtraction writes
unrounded as 3,0206 dB. The cap is judged on the margin of the two energy means
now, so the two routes the clause offers agree at the boundary they share and a
printed 3,0 dB pair is no longer decided by floating point. The window that
keeps such a pair out of the cap is the one the module declares and nothing
wider: the comparison names a relative tolerance of zero, as every other
closeness test in the package does, so the constant sets the tolerance it
documents instead of three times it. ISO 11821 7.4 c) reports the attenuation
of a screen to the nearest whole decibel, which the result now gives with
rounded() and rounded_a_weighted() as the barrier, enclosure and cabin results
already did.
The two loss functions of ISO 11820 took their areas as single numbers, where
the area of a diffuse room is a quarter of its absorption and moves with the
reverberation time band by band. They take each area and the field correction
as one value or one per band, and the two fields of the result are arrays of
one value per band even when single values went in. The thesis oracle that had
to be driven one band at a time is one call per table.
check_ceiling_specimen judged three of the limits clause 4 of EN 16487 prints
and published the rest as constants nothing applied. It judges the support
units of 4.1.1.2.3.6 and, given one value per measurement, the 50 % of 4.2.2;
the verdict carries both, and a type E depth other than 200 mm passes with a
warning that no longer calls the arrangement outside the test code. And
room_to_room_transmission gains receiver_distance_m, the direct field the
partition radiates into the receiving room, from Equations (7-71) and (7-72) of
Barron (2003), whose Example 7-6 a new conformance row holds; Norton's Equation
(4.101) is its far limit and stays the default.
The unit guard then read the new humidity_ok as a humidity without its unit: a
parameter typed bool holds a verdict and no number of the quantity it names, so
it is outside the rule. The printed tables the tests and the conformance rows
of these standards both read were transcribed twice, once on each side; they
are transcribed once now, in tests/reference_data, with the document, the folio
and the PDF page of each, and the report regenerates value for value.
The guides say all of it in both languages, with the mirrors, the curated API
table and the errata entry for the 6,2 dB of ISO 14257 Equation (4), which
stays as printed and is now stated where it is spent.
* Two receiver-correction rows a single band could satisfy, and a denominator with two spellings (ISO 10847, ISO 11820)
Both ISO 10847 receiver-correction rows read the largest shift across the three bands, so a correction that reached one band and left the other two alone would still have printed the 6 dB of the pressure doubling and passed. They now read the largest absolute departure from 6 dB, which is a statement about every band, and the 6 dB is written into the expected column as prose so the row still says what it is checking.
The Ver and Beranek absorption row said it was checking a quarter of the printed Sabine absorption area. It multiplies the quarter back up and compares the full printed 10,7 m2, so the row described a different quantity from the one it evaluates.
`receiving_absorption` is the denominator of the reverberant term, and the two books write that term over two different quantities: Norton over S2 alpha2 and Barron over the room constant R2. The module prose, the function docstring and the guide all say so, but the parameter line said only the first, and the parameter tables of the reference pages print that line on its own, away from the paragraph that explains it. It now names both, with the link to `room_constant` beside the one to `equivalent_absorption_area`.
The normalisation cell of the API table printed `spectrum_distribution_value(values, PINK_NOISE_WEIGHTS_DB values)`, two arguments juxtaposed with no accessor between them. The second argument is a sequence of the six weights, so it is `list(PINK_NOISE_WEIGHTS_DB.values())`.
* The background of Annex B case A goes with the label that carries it, not with the coordinates beside it (ISO 11690-3)
Table B.5 prints the 50 dB of background against the workstation it calls W1, and the entry already registered that the labels of that table are the half it gets right: Figure B.1 puts W1 beside machine M2, and that is where the levels of Table B.6 come back. The background was being heard in the far corner instead, which is where the other label belongs.
It is worth 0,004 dB, both readings round to the tenth Table B.6 prints, and no verdict moves. What changes is the second decimal of the two recomputed levels the entry quotes, 82,09 dB and 80,27 dB becoming 82,10 dB and 80,26 dB, and the entry now says where the background sits and what the other reading would cost.
The two counts in the Annex B check labels were written out by hand while the cells they describe were counted in the code beside them, so a row added or removed would have left the prose saying six and twelve. They come from the cells now.
* The Eq. (4) offset row judges every claim it prints, not only the first (ISO 14257)
The row publishes three findings about the fourteen Annex C values: the sum of the Table 1 weights puts none of them outside their rounding, the printed 6,2 dB puts nine outside, and every departure the printed constant gives is high. Its verdict only counted the first. The other two were computed and printed beside it and never judged, so the row would have gone on passing the day the printed constant agreed with the annex, while still saying it does not.
All three are judged now, with a fourth the description also claims, that none of the high cells reaches a second unit of the tenth. The nine is recorded as the finding it is rather than derived, and the fourteen comes from the cells. Made to fail both ways before committing: with the recorded count set as if the constant agreed with the annex, and with the printed departures pushed low.
In the release note, "both use one the angle governs now" becomes "both now use the height the angle governs".
* The two Annex B distances in the ISO 11690-3 entry are the ones the coordinates give
The entry said the position Table B.5 calls W2 is one metre from machine M2 and the one it calls W1 eleven metres from the nearer machine. From the printed coordinates they are 1,17 m and 11,42 m: W2 stands a metre away in plan but 0,6 m higher than the machine. Both now read 1,2 m and 11,4 m, in English and in Spanish. The argument does not change, since the near position is still the quieter one the table claims.
* The generated artefacts are regenerated on top of the measurement diagrams
Moving the layer onto main kept llms-full.txt, the materials absorbers bundle and the conformance artefact as this layer had written them, which dropped what the diagram stack added to the suspended ceilings guide and the ISO 4866 re-citation. Regenerated from the tree, they carry both.
Results keep their own copy of the arrays they were given (#939)
np.asarray hands back the very array it is given when that array is already
float64, and so does every validation helper built on it, so a result built
from such an array kept the caller's array, or a view of it: changing that
array afterwards changed a result already computed, and nothing raised. Every
array a function or a method of the library keeps from its arguments is now a
read-only copy of its own, through the private helper read_only_copy, and the
objects that keep arrays to hand out later (SilencerChain, AnpDatabase,
FDTD2D, ElasticFDTD2D, window_metrics) do the same; a Signal keeps a writeable
copy of its samples. The values do not move. scripts/check_array_aliasing.py
(make array-aliasing and a CI job of its own) follows each parameter of every
function of the package to the places an array is kept and fails on one kept
without a copy of its own.