soilKey 0.9.403

soilKey 0.9.402 (2026-11-11)

Undecided first levels are named; granular structure and the vertic A

soilKey 0.9.401 (2026-11-10)

Preparing the CRAN submission

No classification changes; every profile keys as in 0.9.400.

soilKey 0.9.400 (2026-11-10)

Faster classifiers, with the same results

The classifiers do less repeated work; no name, code, qualifier, trace, evidence, warning or other part of a result changes.

All in R/memo.R, except the perturbation. coverage_report() follows a memoised diagnostic to its .<name>_uncached() computation, so the coverage it reports is unchanged.

The results were compared before and after, the whole result object of each classification (with its trace, evidence, warnings and messages) serialised: 29,738 results, 0 differences: the 44 canonical profiles under every key (with the WRB specifiers and the USDA and SiBCS families, 880), every example of every key (1,252), classify_with_uncertainty() on five profiles under three systems (15), the 974 ISIS reference profiles under the 17 keys (16,558) and 649 AfSP profiles under the 17 keys (11,033). The memo has its own tests (test-v09400-memo.R): a pedon modified after a classification, or whose declared notation changes, is classified as a new one.

CPU time per profile (this Mac, the same load for both):

0.9.399 0.9.400
WRB 2022, the 31 canonical WRB profiles 0.118 s 0.052 s
USDA, the same 0.468 s 0.036 s
SiBCS, the same 0.088 s 0.027 s
classify_with_uncertainty(), Ferralsol, n = 10 24.7 s 13.9 s
the 17 keys on the 974 ISIS profiles (first version of the memo) 3,216 s 1,943 s
the test suite as CRAN runs it (sum over the tests) 51.4 s 43.1 s

The national keys gain less: their own readers do most of their work.

soilKey 0.9.399 (2026-11-10)

The AfSP loader reads drainage, parent material and landform; two old regular expressions fixed

load_afsp_pedons() now reads the site fields of AfSP by the words of its dictionary (AfSP012Qry_DictioClassValues.dbf, when it is in afsp_dir; without it ParMat and LndForm are not read):

Two regular expressions that read the parent material are fixed:

The 926 example and canonical profiles of the package (the 31 canonical WRB profiles, the examples of every national key and the 503 FAO examples) keep their names under KA5, SCSJ and NZSC.

Measured on AfSP (offline; the 1149 profiles of 0.9.397: all 649 South African profiles with a WRB 2006 group and 500 others from 31 countries, seed 397), 0.9.397 against 0.9.399, names changed per key. The field that drives each change was found by removing the drainage, the parent material or the landform from the new profiles one at a time; the landform drives none.

Key Names changed Of them South African What drives it
WRB 2022 2 0 parent material (the Fluvic qualifier)
SiBCS 34 21 drainage (23 to Gleissolos, 9 gleissolicos)
USDA 0 0
FAO 1988 51 4 parent material (the lists of groups left undecided)
FAO 1974 64 15 drainage 33, parent material 22, the two together 9
CPCS 1967 7 0 parent material (5 to alluvial or volcanic apport soils)
RP 2008 26 5 drainage 24, parent material 2
CSSC 0 0
ASC 39 8 drainage: 22 to Hydrosols, 17 Podosols (13 aquic or semiaquic, 4 aeric)
NZSC 4 3 parent material 3, drainage 1
SCSJ 2017 27 1 parent material (23 to Fluvic soils or Andosols)
CSCJ 2011 24 1 parent material (19 to Lowland soils or Andosols)
CST 2001 45 26 drainage 43 (26 Gleyosols no longer read so), parent material 2
Russia 2008 2 0 parent material
KA5 1 1 drainage
HSCS 2024 17 0 parent material
ZA 1991 0 0

Agreement with the AfSP labels at the level of the reference group (major soil group for FAO; the AfSP label codes read by the unit and group codes of the edition), the same 1149 profiles, Wilson 95 % intervals:

Key Labels Agree before Agree after Decided before Decided after Agree among decided, before after
WRB 2022 RSG vs WRB06rg 1149 333, 29.0 % (26.4-31.7) 333, 29.0 % (26.4-31.7) 1149 1149 29.0 % 29.0 %
FAO 1988 group vs FAO88 1145 210, 18.3 % (16.2-20.7) 210, 18.3 % (16.2-20.7) 477 (41.7 %) 477 (41.7 %) 44.0 % (39.6-48.5) 44.0 % (39.6-48.5)
FAO 1974 group vs FAO74 404 102, 25.2 % (21.3-29.7) 102, 25.2 % (21.3-29.7) 239 (59.2 %) 240 (59.4 %) 42.7 % (36.6-49.0) 42.5 % (36.4-48.8)

No WRB reference group changes. The FAO 1988 grouping changes on 2 profiles (labelled Vertisols and Cambisols: Fluvisols to Regosols), the FAO 1974 grouping on 3 (unlabelled: Fluvisols to Regosols; labelled Podzols: none to Cambisols; labelled Cambisols: Fluvisols to Regosols); none agrees before or after.

soilKey 0.9.398 (2026-11-10)

soilKey Pro: the national systems added since 0.9.337 in the app

The systems added since the last published app (Germany KA5, South Africa 1991, China CST 2001, the FAO-Unesco legends of 1988 and 1974) were already offered on the Classify and Pedon tabs; four gaps are closed.

Every classification is unchanged.

soilKey 0.9.397 (2026-11-10)

South African classification 1991: the vertic A without a plasticity index, and the AfSP loader reads mottles, clay mineralogy and stickiness

Three confusions of the AfSP benchmark of 0.9.394 were examined and decided by Hugo (2026-11-10). The decisions are recorded in inst/rules/za1991/readings.yaml.

load_afsp_pedons() now reads: Mottling into mottles_present; ClyMinera into clay_mineralogy (montmorillonitic and SM as smectite, kaolinitic, illitic, vermiculitic, interstratified; chloritic, sesquioxidic, allophane, KA/IL and gibbsite have no clay_mineralogy word and are read as not recorded, with a provenance note); and Sticknss into stickiness (sticky as moderately sticky). Each code read goes to the provenance. ClyMinera is an estimate (a dominant clay mineral given to the layer), not a measurement: it is recorded with the provenance inferred_prior (confidence 0.5), so the evidence grade of a result on such a profile drops to C, as for the other estimated values; the names are not changed by it (383 of the 1149 profiles below carry it). The site fields Drain, ParMat and LndForm are not read in this version. inst/schemas/horizon-attributes.yaml, inst/schemas/pedon-schema.json and inst/ATTRIBUTES.md carry the new attribute.

Measured on AfSP (offline; 1149 profiles: all 649 South African profiles with a WRB 2006 group and 500 others from 31 countries, sampled with seed 397), classified with the 17 keys before and after: names change only in three keys.

Key Names changed Of them South African Cause
FAO 1974 9 8 clay mineralogy (Chromic Cambisols and Orthic Solonchaks to Orthic Luvisols 2 each, Haplic to Luvic Phaeozems 2, Chromic to Eutric Cambisols 1, Eutric Cambisols to Orthic Luvisols 1, an undecided profile to Eutric Nitosols 1)
RP 2008 12 7 clay mineralogy (fersialsol insature to non rattache 8, to brunisol dystrique or eutrique 3; non rattache to brunisol dystrique 1)
ZA 1991 13 6 B1s 9, mottles present 4

WRB 2022, SiBCS, USDA, FAO 1988, CPCS, CSSC, ASC, NZSC, SCSJ, CSCJ, CST, the Russian, KA5 and HSCS keys give the same names. Recorded as an estimate, the clay mineralogy changes the same names (the FAO 1974 Luvisols included): the provenance lowers the evidence grade, it does not change a test. The soft carbonate horizon and the rule on plinthite with mottles present change no name on these profiles. The AfSP benchmark row of the suite (benchmark_afsp() on load_afsp_sample()) reads a snapshot built by the loader of v0.9.77, so the loader change does not reach it.

The AfSP run of the South African benchmark (641 scored) with the profiles of the new loader:

soilKey 0.9.396 (2026-11-10)

FAO-Unesco legend: the WoSIS benchmark

A second offline benchmark of the FAO-Unesco legends, inst/benchmarks/fao_wosis.R, compares both editions with the FAO-Unesco names of ISRIC’s WoSIS profiles (fields faoMajorGroup, faoSoilUnit, faoPublicationYear): a label of 1974 with classify_fao(edition = "1974"), a label of the year 1997 (ISRIC’s reprint of the Revised Legend, read as fao1988, Hugo’s decision Q1) with classify_fao(). Like the ISIS benchmark it downloads nothing: it reads a cache folder saved by the user (listing.rds, the profile records; raw/<profileId>.rds, the layers of each profile; optionally manifest.csv) from its first argument, the option soilKey.wosis_fao_cache, SOILKEY_WOSIS_FAO_CACHE or the user cache folder. Run with no cache found it says so and exits cleanly; a cache path given explicitly that does not exist stops with an error. WoSIS data are not shipped; the report cites them as ISRIC asks (wosis_citation(), Batjes, Calisto and de Sousa 2024) with the date of the download.

The layers of the cache are read exactly as the live reader reads them: the conversion step of read_wosis_layers_graphql() (depth order, the shift of an organic surface to 0 cm, units, provenance, the most restrictive licence of the layers) is now an internal function, .wosis_layers_to_horizons(), which the live reader calls after its download. The live path is unchanged: on synthetic replies and on 300 saved profiles its output is byte-identical before and after.

How the labels are scored (Hugo’s decisions of 2026-11-10). A label “ ” is read by .fao_match_label() in the edition of its year, exact names only; a label of another year is counted and not scored. A unit that is no unit of its edition (the national adaptations: “Chromic Regosol” of 1974, “Plinthic Calcisol” of 1997) is scored at grouping level only and listed as an unmatched unit (Q3). WoSIS codes every Kastanozem of 1974 “KS” and every Solonchak “SC”, the codes of 1988, under names that are valid 1974 names: they are read by name as K and Z and scored with the rest of 1974. Profiles of the dataset WD-ISIS are left out, since the ISIS benchmark scores them (Q7). All licences are scored, with the figures on the CC BY profiles beside them (Q4). The Legend of 1974 is also given for Mexico and for the rest. The headline gives four figures together (Q6): agreement over all labels (a fall-through counts as a disagreement), coverage (soilKey names a grouping), agreement among the covered labels, and “not contradicted”: the grouping agrees, or the label’s grouping is one soilKey left undecided, the candidates of a fall-through or a grouping tested before a provisional class. Beside it, a shuffled-label baseline (the same rate with the labels permuted within the subset, 200 permutations, fixed seed, the caller’s random numbers untouched), and the agreement among firm classifications (covered and not provisional).

The sample was drawn proportionally with a minimum of one profile per stratum (edition x country x group code), which over-represents the small strata: in 1988 the 996 strata that owe their one profile to the minimum make 33 % of the sample but 12 % of the profiles with layers. The benchmark reads the design back from the cache and weighs each profile N_h / n_h; the weighted figures are the headline, with Wilson intervals on Kish’s effective sample size (an approximation), and the unweighted figures beside them.

The run of 2026-11-10 on 6,000 WoSIS profiles with layers, 3,000 per edition (38,695 profiles carry an FAO-Unesco label, 33,203 with layers; no profile of the sample had more than 40 layers), read with the 15 properties of soilKey’s WoSIS map that the keys use (pH KCl, P retention and the 1500 kPa water content added to the first download; no profile of the sample has the last); 139 WD-ISIS profiles left out, 5,861 scored. Weighted (unweighted in brackets):

Most disagreements are fall-throughs: WoSIS serves no base saturation, Munsell colour, Fe and Al fractions or gypsum, often no horizon designation and no carbonate, so most tests stay undecided as Hugo’s rule asks and the soil names its candidates (the Gypsisols are a candidate in 2,300 of the 2,629 revised fall-throughs). But where soilKey names a grouping it is more often wrong than right: 196 of the 296 covered revised labels and 471 of the 765 covered labels of 1974 disagree. In 1988 the wrong ones are mostly Cambisols for Vertisols (24), Chernozems (20), Phaeozems (16), Calcisols and Fluvisols (12 each), and Regosols for Leptosols (11); in 1974 Regosols for Rendzinas (55), Phaeozems (46) and Lithosols (43), Phaeozems for Rendzinas (41), and Luvisols for Xerosols (35) and Acrisols (29). Almost all covered classifications are provisional (a grouping tested before them was left undecided); among the firm ones the revised groupings agree for about 60 %, while 1974 has too few (13) to say. Every classification is unchanged.

soilKey 0.9.395 (2026-11-10)

The declared notation decides how the older designations are read

Since 0.9.240, 0.9.250 and 0.9.256 the WRB, SiBCS, FAO-Unesco and Chinese diagnostics read the older notation of the horizon designations (in use until about 1990: the A2 is the eluvial horizon, the E of today; the B3 the transition to the C, the BC of today; the “(B)” the B incipiente, the Bi of today) when a profile shows a mark of it (a B followed by a number, an A or a C followed by two figures, a “(B)”, “ir” in a B, “pl” in a B or C). The reading took no account of a notation declared in site$designation_system, so a profile declared in the FAO notation of 2006, which writes “B1, B2, B3” for three parts of a B, had its A2 read as E and its B3 as BC, and “(Bw)R” read as “BiwR”. Found while building the FAO-Unesco module.

As Hugo decided (Q1 to Q9, 2026-11-10), a declared notation now decides before the marks (.desg_declared_notation(), R/utils-wrb-ch3-v09220.R):

The site reaches every reader as an explicit argument: .desg_master(), .desg_old_notation() and .h_master() take site, and so do the helpers that received only the horizons (the FAO readers of the master, the solum, the buried horizons, the rock structure and the texture, the WRB plough, subsurface, cemented and secondary carbonate and gypsum readers, the SiBCS readers of the B in the first 100 cm, the abrupt textural change, the histic and organic layers and the textural ratio, the Chinese horizon kind). The readers that read one designation at a time now read it with the notation of its whole profile: the cemented layers of the WRB qualifiers (each part of “Bt/Cr” read with the parts of the profile) and the plough designation of the Brunic qualifier.

The NSD reader (read_nsd_pedons()) now declares designation_system = "nz_legacy" (it declared "nzsc"): the National Soils Database surveys are written in the New Zealand notation, many of them in its older form (A11, A12, B21, B22, B3 beside Bw). Every reader that compares the notation reads nz_legacy (or “NZ legacy”, compared as a key) as it read nzsc: the NZSC, SCSJ, CSSC, ASC and FAO 1988 notation tests, the frozen-layer pattern and the CPCS, which reads the f of a New Zealand B as iron, not frozen. The older-notation reading is judged from each profile’s own marks. The ASC key also reads asc with an edition (asc3, asc2021) as its notation. The ISIS reader keeps fao2006 (Q6). inst/schemas/site-attributes.yaml lists the values the code compares (fao, fao2006, wrb and its editions, usda, sibcs, fao1977, usda1951, ssm1951, usda1962, br_pre1988, nz_legacy) and inst/ATTRIBUTES.md is regenerated.

Measured on 2026-11-10, before and after:

soilKey 0.9.394 (2026-11-10)

South African classification 1991: four readings after the AfSP benchmark

Four readings examined on the AfSP benchmark of 0.9.393 and decided by Hugo (2026-11-10). They are recorded in inst/rules/za1991/readings.yaml; the 73 form examples, the 404 family examples and the special cases (555 runs) keep their names and provisional status.

The AfSP run of 2026-11-10 (641 scored), with all four readings:

soilKey 0.9.393 (2026-11-10)

South African classification 1991: the AfSP benchmark

A new script, inst/benchmarks/za1991_afsp.R, compares classify_za1991() with the local classification of the South African profiles of the Africa Soil Profiles database (AfSP 1.2, ISRIC; field LocalCls of AfSP012Qry_Profiles.dbf). The script is offline: it reads the AfSP DBF files from the directory given as its first argument, the option soilKey.afsp_dir or the environment variable SOILKEY_AFSP_DIR, stops (from R) or exits cleanly (as a script) when there is none, and downloads nothing. AfSP is CC BY-NC; no profile or label of it is shipped with soilKey, and the tests use synthetic labels and profiles only. Every classification is unchanged.

The labels are read by a new internal reader, .za_match_label() in R/za-benchmark.R, as Hugo decided (2026-11-10):

The run of 2026-11-10 on AfSP 1.2: 659 South African profiles, 646 labelled, all 646 read (4 by the listed misspellings), 641 scored (5 labelled profiles have no WRB 2006 group and are not built by load_afsp_pedons()). 624 are binomials of 1977, 13 labels of 1991 and 4 forms named alone; 108 of the binomials were surveyed in 1991 or later, and all 13 labels in the 1991 shape come from surveys before 1991 (converted to the 1991 system later, by the compilers).

The main loss is the profiles that stop: most AfSP descriptions do not record what the key needs to separate the forms (the matrix colour of the lower B, cutans, slickensides, signs of wetness). Among the decided disagreements, the most frequent are a humic A where the label has an orthic A (Hutton to Inanda 8, Clovelly to Magwa 6, Griffin to Kranskop 6), Oakleaf read as Hutton (6), Bonheim keyed as Inhoek (5; in 4 of them Bonheim, tested before, was left undecided), and a thin, carbon-poor A on hard rock read as a truncated profile, Mispah to Clovelly (5).

soilKey 0.9.392 (2026-11-09)

FAO-Unesco legend: the ISIS benchmark

Twelfth and last part of the FAO-Unesco soil legend. A new script, inst/benchmarks/fao_isis.R, compares both editions with the FAO-Unesco names ISRIC gave its reference profiles (ISIS, field faoClassifications): the label of 1974 with classify_fao(edition = "1974"), the label of the Revised Legend (stored under the year of the ISRIC reprint, 1997) with classify_fao(). As Hugo decided (Q27), it is offline and does not change the ISIS reader: it reads a saved cache of ISIS profiles from its first argument, the option soilKey.isis_cache, SOILKEY_ISIS_CACHE or the user cache folder, downloads nothing, and run as a script with no cache found says so and exits cleanly. ISIS data are not shipped. WoSIS is left for later, with Hugo’s go.

The labels are read by a new internal reader, .fao_match_label() in R/fao-benchmark.R: the edition from the publication year (1974 to fao1974; 1988, 1990 and 1997 to fao1988), the group word singular or plural, the 1974 Nitosols and the 1988 Nitisols read in the other edition too (flagged), ISRIC’s third-level subunit (“Ferri-”, “Orthi-”) cut off and reported apart (the legend defines no third level, so it is never scored), the words after the group matched to the phases of the edition, exact names only; a variants list, empty today, is tried only on a label that is not read. Every one of the 1,515 labels of the cache of 2026-10-29 (803 of 1974, 712 revised, on 814 profiles) is read as it stands, with its grouping and unit; 593 revised labels carry a subunit, 212 labels a phase.

The run of 2026-11-09 on that cache, before Hugo’s decisions below (13 labels on 7 profiles with no horizons in the record are not scored):

The fall-throughs are the main loss: most profiles that stop do so because a measurement the key needs is not in the record, most often the gypsum content (the Gypsisols are a candidate in 271 of the 353 revised fall-throughs; the gypsiric and gypsic tests of the Regosols, Fluvisols and Arenosols of 1974 likewise), the pyrophosphate and oxalate Al and Fe of the spodic B, the clay skins and the electrical conductivity. Following Hugo’s rule, a measurement not recorded leaves its test undecided and the soil names its candidates instead of a guess. The weak spots the plan expected show in the confusion tables: Vertisols keyed as Cambisols (13 of the 1974 labels, 17 of the revised ones), Andosols as Cambisols (20 and 15), and Ferralsols as Acrisols or Cambisols (24 and 20). The report gives the agreement by edition and level with Wilson intervals, the provisional, stand-in and fall-through counts, the candidates left undecided, the phases and the confusion of the groupings. soilKey’s readings of this part (the edition from the publication year, the reading of labels, what counts in the benchmark, and that a phase soilKey finds but a label omits is reported, not counted as an error) are in inst/rules/fao1988/readings.yaml and data-raw/fao_readings.yaml, confirmed by Hugo (2026-11-10); the vignette on cross-system classification gains a section on the two editions. Every classification is unchanged (the fixtures of the other systems byte-identical).

Fixed on the review (2026-11-10). The firm agreement counts only the labels soilKey classifies (it counted the fall-throughs as firm), and the provisional and stand-in columns of the agreement table say so; a profile that could not be run no longer drops an element of the results list. The crosswalk of 0.9.391: the Lithosols, Rendzinas and Rankers as units are renamed (p. 117 prints “formerly”), the Vertisols and Histosols groups the same (no group comment on pp. 118 and 126), the Calcic Cambisols split, the Dystric Podzoluvisols amended (the gleyic comment runs onto their row, p. 123), the Rhodic Nitisols new with no comment printed (bracketed, and an alternative of the Eutric and Dystric Nitosols), the Luvic Calcisols an alternative of the Calcic Luvisols (keyed before the Luvisols, p. 119); a condition may be given per target, so a Eutric Fluvisol of 1988 shows only the fluvic clause of the Gleysols of 1974, and a 1988 unit shows the alternatives that name its unit, else those of the group rows (a Calcaric Cambisol no longer shows the Haplic Xerosols). Hugo confirmed these readings (2026-11-10). The tests read the benchmark script from the installed package (so they run under R CMD check), run it end to end on a small synthetic cache, and check the edition line on constructed results instead of classifying every example.

Decided by Hugo (2026-11-10), on the causes the benchmark showed. The ISIS reader reads the profile’s large cracking and, without a cracking record, gilgai as cracks of 1 cm or more (the lower limit of the medium surface cracks, 1-2 cm, of the FAO field guidelines’ classes that ISIS’s own cracksSurface uses); small cracking stays 0.5 cm, since a small crack may be a fine one. With neither gypsum nor an ECe recorded, an upper bound of the ECe below 2 dS/m (the reader derives it from the EC 1:2.5) reads as no gypsum, flagged, the rule already used for an ECe below 2; this serves the gypsic horizon of both editions. Andic properties with Alox + 1/2 Feox of 2 % or more and a bulk density of 0.9 or less and no P retention measured are undecided, not absent; the rule that undecided andic properties are absent unless volcanic material is recorded applies only when fewer criteria are met (the amorphous complex of 1974 has no such rule and was not changed). The oxic B of 1974 keeps Q13: clay films recorded as few still count as evidence of illuviation, a known cause of Ferralsols keyed as Acrisols or Luvisols in the benchmark. The other consumers of the ISIS reader are unchanged: the CST 2001 and KA5 ISIS benchmarks give the same scores before and after, and on the 38 ISIS profiles whose cracks change, the WRB and USDA results of benchmark_isis() are the same (both ask 0.5 cm). No result of make_fao_example() changes, and every other classification is unchanged (the fixtures of the other systems byte-identical).

The benchmark after these decisions, same cache:

soilKey 0.9.391 (2026-11-09)

FAO-Unesco legend: the crosswalk between the 1974 and 1988 editions

Eleventh part of the FAO-Unesco soil legend. inst/rules/fao1988/crosswalk.yaml holds the correspondence of Appendix 4 of the Revised Legend (“Main changes in the revised legend”, pp. 113-126) between the 26 major soil groups and 106 soil units of the Legend of 1974 and the 28 major soil groupings and 153 soil units of 1988. Every 1974 group and unit has one row: the 1988 class or classes it goes to, or none where it is deleted, with its relation (same name, renamed, amended, renamed and amended, merged, split, deleted), the printed page and the comment of the appendix in soilKey’s words. The 1988 classes with no 1974 class are listed as new: the 6 new groupings beside the Leptosols, which take the Lithosols, Rendzinas and Rankers, and 59 units. Appendix 4 prints only the 1988 names; the 1974 class of each row is read from the 1974 list by its name or by the “formerly” the appendix prints. Codes only: the names are read from the rule files of each edition.

As Hugo decided (Q8), the three changes the appendix does not flag are added in brackets: Calcaric Gleysols (Gc) to Calcic Gleysols (GLk) is a change of definition, the Plinthic Luvisols (Lp) are deleted with no 1988 row, and the Thionic Histosols (HSt) are new. Where a group comment of the appendix sends part of a 1974 group elsewhere, soilKey adds bracketed alternatives with their condition: the Luvisol units to the Lixisols and the Acrisol units to the Alisols by the CEC of the argic B, the Calcic Cambisols to the Calcisols or Gypsisols, the Calcic Kastanozems to the Gypsic Kastanozems, the plinthic units to the Plinthosols, and the units of the deleted Xerosols and Yermosols by their names. One-to-many rows stay one-to-many (Pellic and Chromic Vertisols to the four Vertisol units, Eutric and Dystric Histosols to the Folic, Terric and Fibric ones).

fao_crosswalk() (exported) returns the table, one row per 1974 class, or with from = "1988" the 1974 classes behind a 1988 code. print() of a result of either edition, the HTML and PDF reports and the Pro app add one line with the other edition: a Lixisol of 1988 is new in 1988, some Orthic, Chromic, Calcic and Vertic Luvisols of 1974 when their argic B has a CEC below 24 cmol(+)/kg clay; an Orthic Luvisol of 1974 is a Haplic Luvisol of 1988 (renamed and amended, p. 122), or a Haplic Lixisol. The line is a note: the table never classifies, each edition is keyed by its own text, and every classification is unchanged (the fixtures of the other systems byte-identical; no FAO result changes, the line is computed when printed). soilKey’s readings of this part (the 1974 side of each row, two comments printed between rows, the alternatives read from the group comments, the targets of the Xerosol and Yermosol units, two slips of the layout on pp. 115 and 124) are in inst/rules/fao1988/readings.yaml and data-raw/fao_readings.yaml. Decided by Hugo (2026-11-10): all of them are confirmed as proposed.

soilKey 0.9.390 (2026-11-09)

FAO-Unesco legend: the phases of 1974

Tenth part of the FAO-Unesco soil legend, the fourth of the Legend of 1974. classify_fao(edition = "1974") now gives the 12 phases of pp. 5-7 in $phases, beside the soil unit: stony, lithic, petric, petrocalcic, petrogypsic, petroferric, phreatic, fragipan, duripan, saline, sodic and cerrado (the list of p. 5 prints “stony lithic” without a comma: two phases). Phases subdivide the units by what matters for the use of the land and are not diagnostic for the units (p. 5), so the unit, the group and the key trace are exactly those of 0.9.389. Each phase is three-valued, in the same form as the phases of 1988: status is present, absent, undecided, or not shown where the text excludes the unit, with criterion, the page, the criterion in soilKey’s words, the fallbacks used and what would decide an undecided phase. Two more rows give the classes of the map symbol (pp. 4-5): the texture class of the upper 30 cm with the classes of 1974 (1 coarse, below 18 % clay and above 65 % sand; 2 medium; 3 fine, above 35 % clay) and the slope class (a up to 8 %, b to 30 %, c above 30 %). The phases, their pages, criteria, numbers and Portuguese names are in inst/rules/fao1974/phases.yaml, read by R/fao-phases.R.

The numbers are the printed ones. Lithic: continuous coherent hard rock within 50 cm. Petric: 40 % or more coarse fragments by volume, oxidic concretions, hardened plinthite or ironstone included, 25 cm thick, the top within 100 cm, not continuously cemented. Petrocalcic and petrogypsic: the cemented calcic or gypsic horizon of Soil Taxonomy, or a pan recorded as calcrete or gypcrete, the top within 100 cm. Petroferric, fragipan and duripan: the upper level within 100 cm, read by the readers of the same phases of 1988. Phreatic: a water table between 3 and 5 m. Saline: an ECe above 4 mmhos/cm in some horizon within 100 cm. Sodic: more than 6 % exchangeable sodium within 100 cm. Stony: the record of fragments or outcrops that make mechanised equipment impracticable (rudic_recorded, the same condition as the rudic phase of 1988). Cerrado: the vegetation recorded at the site. The “not shown for” rules are applied as printed: no lithic phase for the Lithosols, no saline phase for the Solonchaks, no sodic phase for the Solonetz; when such a group is only a candidate, a phase whose criterion is met is undecided.

Hugo’s decisions of 2026-11-08 are applied: the phases are a separate list per edition, three-valued, with the “not shown for” rules, and the cerrado phase is read from the recorded vegetation (Q25); the texture and slope classes of the map symbol are given when the data allow (Q3); the field-only phases (stony, cerrado) are absent when not recorded, with no substitute threshold (default 16); the pans of Soil Taxonomy read soilKey’s USDA predicates, the WRB horizons only as stand-ins, flagged (default 17). soilKey’s readings of this part (the stony phase on the rudic record, the petric phase as the skeletic reader at 100 cm, the petrocalcic and petrogypsic horizons of the shared reader, the 3 to 5 m of the phreatic phase with both ends included and no morphology test, no unit-level exclusion) are in inst/rules/fao1974/readings.yaml and data-raw/fao_readings.yaml for his word. print() and the HTML and PDF reports show the phases of 1974 as they show those of 1988. The reader of the “not shown for” rules takes the length of the group code (two letters in 1988, one in 1974); every result of 1988, its phases included, is unchanged, and every other classification is unchanged (the fixtures of the other systems byte-identical).

Decided by Hugo on the review (2026-11-10). The stony phase is read on the rudic record (rudic_recorded), as proposed.

soilKey 0.9.389 (2026-11-09)

FAO-Unesco legend: the 26 major soil groups and 106 units of 1974

Ninth part of the FAO-Unesco soil legend, the third of the Legend of 1974 (Soil Map of the World, Vol. I, Unesco Paris). The legend of 1974 is now registered as fao1974 (aliases fao74, fao_unesco_1974; experimental and opt-in; order 17 in the registry, namespace fao74). classify_fao(pedon, edition = "1974") keys it, and classify_fao1974() is its thin wrapper in the registry, as Hugo decided (Q1); fao stays the Revised Legend (Q2). The key of pp. 43-53 is read in its own order, not that of the list of pp. 12-13: Histosols, Lithosols, Vertisols, Fluvisols, Solonchaks, Gleysols, Andosols, Arenosols, Regosols, Rankers, Rendzinas, Podzols, Ferralsols, Planosols, Solonetz, Greyzems, Chernozems, Kastanozems, Phaeozems, Podzoluvisols, Xerosols, Yermosols, Nitosols, Acrisols, Luvisols and Cambisols. Under its group a soil keys to the first of the 106 soil units whose gate passes, the last unit of each group being the key’s “Other …” residual (Orthic, Eutric, Haplic, Chromic, Vitric or Cambic as printed); the Lithosols, Rankers and Rendzinas are single units, so their result has one level. The groups are in inst/rules/fao1974/key.yaml, the units in inst/rules/fao1974/units/, each with its code and name as printed, soilKey’s Portuguese gloss, its page and its gate in soilKey’s words.

The gates read the diagnostic horizons (0.9.387) and properties (0.9.388) of 1974. A new file, R/key-fao74.R, holds the predicates that combine them where a gate reads more than one in one place, or reads a window, a B or a record the diagnostics do not read: the H horizon of the Histosols, the rock within 10 cm of the Lithosols, the clay mixed over 20 cm, cracks and gilgai of the Vertisols, “no diagnostic horizons other than”, the material of the Andosols to 35 cm, the coarse texture, albic material and B features of the Arenosols, the thickness of the umbric A of the Rankers and Humic Cambisols, the calcareous material under the mollic A of the Rendzinas, the uppermost diagnostic B, the albic E over a slowly permeable horizon of the Planosols, the chroma of the mollic A to 15 cm, the 125, 90 or 75 cm of the calcic and gypsic horizons by texture, the shallower of a calcic and a gypsic horizon of the Xerosols and Yermosols, the tongues or nodules of the Podzoluvisols, the clay distribution of the Nitosols, and the unit gates of the windows, the B horizons, the Podzols, the Ferralsols and the Planosols. No predicate of 1988 is redefined; the shared readers run on the 1974 context.

Hugo’s decisions of 2026-11-08 are applied: the key governs where the definitions differ (Q6: a mollic A with bleached coatings and hydromorphic properties keys as a Mollic Gleysol, the Acrisols read the base saturation in some part of the B, the Mollic and Humic Andosols ask no smeary consistence, the Nitosols do not exclude an albic E); there is no residual group after the Cambisols (Q5): a soil that no gate takes is [Not classified in the FAO-Unesco Legend (1974)], and one with gates undecided names them as candidates; a diagnostic with no depth in the key is read within 125 cm (Q10); the regime of the Xerosols and Yermosols is the one recorded, and the shallower of a calcic and a gypsic horizon decides (Q26); calcareous between 20 and 50 cm is an alternative of the Calcic Cambisols (default 15). Where the 1974 text repeats a rule Hugo decided for 1988 (the uppermost diagnostic B decides at the key, the Kastanozems as the exact complement of the Chernozems, the thin H horizon over rock, the Rendzic calcareous rock, volcanic glass not recorded as none, the B of the unit gates, the colours of a red, yellow or brown B, the slowly permeable horizon), the same reading is used and recorded for his word. soilKey’s readings of this part (among them: “coarse texture” as the coarse class of p. 5 to 100 cm, albic material from the surface to 50 cm, the B characteristics of the Arenosols as the features their units name, the single-unit groups with one level) are in inst/rules/fao1974/readings.yaml and data-raw/fao_readings.yaml.

make_fao_example(code, edition = "1974") gives one synthetic profile per group (26, each keying to its own group without an undecided gate) and per unit (106, each keying to its own unit), with near misses that cross one printed number: 26 at group level (a rock at 11 cm, a calcic horizon at 91 cm in a medium texture, a base saturation of 45 % in the lower B) and 52 for the unit gates with a printed number (permafrost at 201 cm, a pH of 5.5 between 20 and 50 cm, 1.64 me per 100 g clay for the Acric Ferralsols, a base saturation of 50 % in the B to 100 cm for the Humic Ferralsols, a sandy loam to 100 cm for the Ochric Andosols). The edition pairs of plan section 11 are tested: a Lixisol of 1988 is an Orthic Luvisol of 1974, a Calcisol a Calcic Cambisol or, in an aridic regime, a Calcic Xerosol, gleyic properties at 70 cm make a Gleyic Luvisol of 1988 and an Orthic Luvisol of 1974, and a Nitisol of 1988 with a mollic A is a Luvic Phaeozem of 1974. The app lists the Legend of 1974 among the national systems with the 26 examples; the i18n catalogues name the system and its edition in English and Portuguese. The thresholds table is shipped as inst/rules/fao1974/thresholds.yaml with a new unit_key block, and the list of the 26 groups and 106 units as data-raw/fao1974_units.csv. Every result of 1988 is unchanged (the 296 examples of make_fao_example(), with their phases and traces), and every other classification is unchanged (the fixtures of the other systems byte-identical).

The review (2026-11-09) fixed these defects: the lime waiver of the mollic A of 1974 (more than 40 % finely divided lime waives the limits of the dry value, 74 p. 24) now waives its dry contrast with the C too, so a light calcareous A over a chalky C is a Rendzina; the Humic Ferralsols and Ochric Andosols have near misses; and the tests build a cambic B over an argillic B (a Cambisol, not a Luvisol) and a Vertisol whose clay mixed over 20 cm passes where 18 cm would fail.

Decided by Hugo on the review (2026-11-10). The albic E and albic material of 1974 ask a chroma below 2.5 at the middle values (a moist value of 4 or 5, a dry value of 5 or 6; 3 over a red parent material), the limit the 5YR clause of p. 27 presupposes, flagged; the reading “as printed” of 0.9.387 and 0.9.388 is superseded. In 1974 an E with none of the kinds p. 27 names below it (a spodic, argillic or natric B, a fragipan, an impervious layer) is albic material, not an albic E, so a white sand keys to the Albic Arenosols and a wet A / Eg / Cg to the Gleysols whatever the letter of the E; 1988 is unchanged. The coarse texture of the Arenosols is read to 100 cm or to the rock where it is shallower. The Nitosols lack the ferric properties as printed, the CEC by NH4Cl below 24 me per 100 g clay included, flagged. “At less than” is strict for the Thionic Fluvisols (125 cm) and for the Gypsic and Calcic Xerosols and Yermosols (125, 90 or 75 cm); their examples sit at 124 and 89 cm, the near misses at 125 and 90. An aridic regime not recorded stays undecided, so a soil keyed after the Xerosols and Yermosols is provisional until the regime is recorded. The uppermost B decides at the key only, as in 1988: the Luvic units accept any argillic B. soilKey’s other readings of this part are accepted (the single-unit groups with one level, albic material from the surface to 50 cm, the Kastanozems as the complement of the Chernozems, the uppermost B at the key, the slowly permeable horizon of the Planosols, the vitric material of the Andosols). The lime waiver of the mollic A, which waives the limits of the dry value, now waives the dry contrast with the C in 1988 too (the same words, p. 26): a correction to 0.9.382, which applies to the umbric A as well; none of the 296 examples of 1988 changes.

soilKey 0.9.388 (2026-11-09)

FAO-Unesco legend: the diagnostic properties of 1974

Eighth part of the FAO-Unesco soil legend, the second of the Legend of 1974. R/diagnostics-fao74.R now also reads the diagnostic properties of pp. 27-32 and the terms the 1974 key uses without a definition section, as 28 internal predicates returning a DiagnosticResult that passes, fails or stays undecided, with the layers, the per-layer answers, what would decide it, the fallbacks used and any stand-in: abrupt_textural_change_fao74(), albic_material_fao74(), aridic_regime_fao74(), amorphous_complex_fao74(), ferralic_properties_fao74(), ferric_properties_fao74(), gilgai_fao74(), high_om_b_fao74() (with kind = "acrisol"), high_salinity_fao74(), hydromorphic_properties_fao74(), interfingering_fao74(), permafrost_fao74(), plinthite_fao74(), slickensides_fao74(), smeary_fao74(), soft_powdery_lime_fao74(), sulfidic_materials_fao74(), takyric_features_fao74(), thin_iron_pan_fao74(), tonguing_fao74(), vertic_properties_fao74(), weatherable_minerals_fao74(), recent_alluvial_deposits_fao74(), calcareous_fao74(), bleached_coatings_fao74(), heavy_clay_fao74(), exchangeable_sodium_fao74() and acric_cec_fao74(). A property with no printed depth is read within 125 cm (Q10). Nothing is registered or classified yet.

The numbers are the printed ones. The abrupt textural change sits at the base of an A or E and asks the clay to double within 8 cm, or, from 20 % clay, 20 points more with double the clay somewhere in the horizon below. The exchange complex dominated by amorphous material asks a bulk density below 0.85 and one of its other marks (Q20). The ferralic and ferric properties read a CEC by NH4Cl below 24 me per 100 g clay in the cambic B, right below the A or in the argillic B. The B of high organic matter asks 1.35 % organic matter over 100 cm (1.5 % in the upper B of the Acrisols). High salinity is an ECe above 15 within 125, 90 or 75 cm by the texture of the upper 30 cm, or above 4 within 25 cm at a pH above 8.5. The hydromorphic properties are the test of the text (Q22): groundwater reaching the surface with its capillary fringe, a histic H, neutral or bluish hues, or the colours of reduction in five branches for soils with a spodic B, a mollic A, an argillic B under the plough layer, an oxic B, and other soils, within 50 cm or the depth the caller gives. The recent alluvial deposits ask 0.35 % organic matter to 125 cm, an irregular decrease, stratification or sulfidic materials. Sulfidic materials ask 0.75 % sulfur and no jarosite; vertic properties ask cracks of 1 cm within 50 cm of the top of the B. The Acric CEC is 1.5 me per 100 g clay or less, the sodium of the Solodic Planosols more than 6 %, and the heavy clay 60 % clay (soilKey’s number, flagged).

Where Appendix 4 of 1988 calls a property unchanged (interfingering, permafrost, plinthite, slickensides, smeary consistence, soft powdery lime, tonguing, weatherable minerals), the reader of 1988 runs on the 1974 context, where the argillic and cambic B are those of 1974; calcareous and soft powdery lime read the numbers of 1988, flagged (Q23). Those 1988 readers were moved into named functions with no change: every _fao88 result is the same. Where the 1974 answer stays undecided, a USDA reader of soilKey stands in, then a WRB one, marked as a stand-in (the amorphous complex, high salinity, the hydromorphic properties, sulfidic materials, takyric features). soilKey’s readings of this part (among them: the 8 cm of the abrupt change as an abrupt or clear boundary, the albic colours as printed, the branches of the hydromorphic test, sulfidic materials absent where sulfur is measured nowhere and no marine setting is recorded) are in data-raw/fao_readings.yaml for his word. Every classification is unchanged (the fixtures of the other systems and the 1988 examples byte-identical).

Decided by Hugo on the review (2026-11-09). soilKey’s readings of this part are accepted. The ferralic properties read “respectively”: kind = "cambisol" the cambic B, kind = "arenosol" the horizon right below the A. In the hydromorphic properties an undecided spodic, argillic or oxic B is read both ways, as the mollic A already was: a layer is decided where the readings agree, else it stays undecided (the designation fallback is dropped). The sulfidic criterion of the recent alluvial deposits stays absent, flagged, where sulfur is measured nowhere and no marine, tidal or brackish setting is recorded. The review also fixed these defects: in 4.2 the shift to 75 cm when a calcic horizon intervenes belongs to the chroma 1 branch only; a hue nearest to 2.5Y starts at 1.25Y; an iron pan not named thin or placic asks the 40 mm limit; and the 8 cm of the abrupt textural change cites the boundary classes of the 1967 Guidelines.

soilKey 0.9.387 (2026-11-09)

FAO-Unesco legend: the diagnostic horizons of 1974

Seventh part of the FAO-Unesco soil legend, the first of the Legend of 1974 (Soil Map of the World, Vol. I, Unesco Paris). A new file, R/diagnostics-fao74.R, reads the H horizon of the master horizons (p. 21) and the 13 diagnostic horizons of pp. 24-27 as internal predicates, each returning a DiagnosticResult that passes, fails or stays undecided, with the layers, what would decide it, the fallbacks used and any stand-in: h_horizon_fao74(), histic_h_fao74() (with base = "eutric" or "dystric"), mollic_a_fao74(), umbric_a_fao74(), ochric_a_fao74() (with grade = "very_weak" or "weak") and ochric_grade_fao74(), argillic_b_fao74(), natric_b_fao74(), cambic_b_fao74(), spodic_b_fao74(), oxic_b_fao74(), calcic_fao74(), gypsic_fao74(), sulfuric_fao74() and albic_e_fao74(). Depths are read from the soil surface, horizons buried under 50 cm of new material are not diagnostic (p. 32), and a horizon with no printed depth is read within 125 cm (Q10). Nothing is registered or classified yet.

The 1974 text writes organic matter, read as organic carbon x 1.724, flagged (Q11). The H horizon has 20 % organic matter without clay to 30 % at 60 % clay and is saturated; the histic H is more than 20 cm of it, or a thin surface or plough layer that, mixed to 25 cm, holds 14 to 28 % organic matter. The mollic and umbric A ask 1 % organic matter (4 % with the lime waiver) and have no strongly humic waiver of the colour contrast; the umbric A drops the consistence rule where the A never dries and excludes plaggen layers. The ochric A has two grades for the Yermosols and Xerosols: very weak below a line of organic matter in the upper 40 cm that falls from 1 % at a sand/clay ratio of 1 to 0.5 % at 13 (1.2 and 0.6 % in 18 cm over a shallow pan), and weak otherwise. The argillic B asks the clay increase of 3 points, a ratio of 1.2 or 8 points within 30 cm and, unlike the 1988 argic B, evidence of illuviation (clay skins, oriented clay or clay bridges; a Bt designation counts, flagged, Q13), with one tenth of the overlying horizons, 7.5 cm (15 cm in sand) or 15 cm of lamellae, and no texture limit. The natric B adds columnar structure and more than 15 % sodium. The cambic B asks a CEC above 16 me per 100 g clay or weatherable minerals, an alteration (colour, clay, carbonates or the colours of reduction) and a base at 25 cm, with no minimum thickness. The oxic B asks 30 cm, an NH4Cl retention of 10 or an ECEC below 10 and a CEC of 16 me per 100 g clay or less, more than 15 % clay, only traces of primary minerals and rock structure below 5 %. The sulfuric horizon asks jarosite mottles beside a pH below 3.5 (Q18).

Where Appendix 4 of 1988 calls a horizon unchanged (the albic E it calls amended), the readers of 1988 are shared through the edition of the profile context and branch only where the printed text differs (histic H, mollic, umbric and ochric A, spodic B below 12.5 cm and below an Ap, gypsic more than 15 cm, albic E without a chroma limit at the middle values); every _fao88 result is unchanged. Where a 1974 horizon stays undecided, the USDA reader of soilKey stands in, then the WRB one, marked as a stand-in. soilKey’s readings of this part (among them: the saturation of the H horizon, the weak ochric A as every other ochric A, fine clay compared only when recorded, sand and loamy sand as coarser than very fine sand, “traces” of primary minerals as 3 % or less, no thickness for the sulfuric horizon, and the stand-ins) are in data-raw/fao_readings.yaml for his word. Every classification is unchanged (the fixtures of the other systems and the 1988 examples byte-identical).

Decided by Hugo on the review (2026-11-09). soilKey’s readings of this part are accepted. The weak ochric A is every ochric A that is not very weak, and a rock or pan shallower than 18 cm reads the 18 cm limits, flagged. The spodic B is read below the deeper of 12.5 cm and the base of an Ap, and a layer reaching below that depth counts by its part below. The review also fixed these defects: the histic H of 1974 is built from the saturated H horizon (a well-drained O no longer passes), with its thin surface and plough layer paths kept; the swelling 2:1 clays of the argillic B take the evidence of pressure, a third more fine clay or 8 points more fine clay as alternatives; where only the natric exclusion of the argillic B is undecided, the USDA and then the WRB natric horizon decide that exclusion alone, keeping the 1974 layers; a stand-in that passes keeps only its layers within the upper limit and not buried; and a cambic B with a CEC by NH4Cl of 16 or less leaves that criterion undecided.

soilKey 0.9.386 (2026-11-09)

FAO-Unesco legend: the phases of 1988

Sixth part of the FAO-Unesco soil legend (the Revised Legend of 1988, read in the ISRIC reprint of 1997). classify_fao() now gives the 16 phases of chapter VIII (pp. 67-71) in $phases, beside the soil unit: anthraquic, duripan, fragipan, gelundic, gilgai, inundic, lithic, petroferric, phreatic, placic, rudic, salic, skeletic, sodic, takyric and yermic. Phases are features of the land that may limit its use; they cut across the units and never define one (p. 67), so the unit, the grouping and the key trace are exactly those of 0.9.385. Each phase is three-valued: status is present, absent, undecided, or not shown where the text excludes the unit, with criterion (the test alone), the page, the criterion in soilKey’s words, the fallbacks used and, for an undecided phase, the attributes that would decide it. Two more rows give the classes of the map symbol (Appendix 2, p. 107): the texture class of the upper 30 cm (1 coarse, 2 medium, 3 fine, read by the reader of 0.9.381) and the slope class (a up to 8 %, b to 30 %, c above 30 %, from slope_pct). The phases, their pages, criteria, numbers and Portuguese names are in inst/rules/fao1988/phases.yaml, read by a new file, R/fao-phases.R; the numbers are those of the phases block of the thresholds table.

The numbers are the printed ones. Lithic: continuous hard rock within 50 cm (continuous_hard_rock_fao88()). Salic: an ECe above 4 dS/m in a layer within 100 cm. Sodic: more than 6 % exchangeable sodium within 100 cm. Skeletic: 40 % or more coarse fragments by volume, 25 cm thick, the top within 50 cm, not continuously cemented. Inundic: more than 10 days of surface water in the growing period. Phreatic: a water table within 500 cm with no gleyic properties. Anthraquic: stagnic properties within 50 cm under long continued irrigation, read from the site’s flood irrigation, years under rice or a land use naming rice or paddy. Yermic: less than 0.6 % organic carbon in the surface 18 cm mixed (0.20 % when coarser than sandy loam, waived when the salic criterion is met) and one of the six desert features. The duripan, fragipan, petroferric and placic phases are a layer within 100 cm read by soilKey’s USDA predicates (Soil Taxonomy 1975, p. 67), by the kind of pan recorded in the field, or by the designations qm and x in the FAO notation, flagged; the WRB petroduric, fragic and petroplinthic horizons stand in only where the attributes of the USDA predicate are not recorded, flagged. The “not shown for” rules are applied: no salic phase for the Solonchaks and the Salic Fluvisols, no sodic phase for the Solonetz and the Sodic Solonchaks, no phreatic phase for the Fluvisols and Gleysols; when such a unit is only a candidate, a phase whose criterion is met is undecided.

Hugo’s decisions of 2026-11-08 are applied: the phases are a separate list per edition, three-valued, with the “not shown for” rules, and the phreatic phase is a water table within 500 cm without gleyic properties outside the Fluvisols and Gleysols (Q25); the texture and slope classes of the map symbol are given when the data allow (Q3); field-only phases (gelundic, gilgai, rudic, takyric, the desert features) are absent when not recorded, with no substitute threshold (default 16); the four pans of Soil Taxonomy read the USDA predicates, the WRB horizons only as stand-ins, flagged (default 17). The readings of this part are in inst/rules/fao1988/readings.yaml and data-raw/fao_readings.yaml. print() shows the phases present, those undecided, those not shown and the map symbol; the HTML and PDF reports add a section “Phases and map symbol” (English and Portuguese). Every other classification is unchanged (the fixtures of the other systems byte-identical), and the unit and grouping of every example of make_fao_example() (296 profiles, near misses included) are those of 0.9.385.

Decided by Hugo on the review (2026-11-09). soilKey’s readings of this part are accepted, with these changes. A moist rupture resistance of firm or more (the layers of fragipan_usda()) is a sign of a fragipan only, flagged and undecided, unless a second sign holds in the layer: very or extremely firm with a massive structure, or a bulk density of 1.65 g/cm3 or more (the number of soilKey’s WRB fragic horizon; the text has none); a designation with x (E/Bx too) or a recorded fragipan is one by itself. The petroferric phase needs iron: 50 % plinthite or more, a recorded ironstone or ferricrete, or a designation with m and v, c or s; a layer cemented by carbonates, gypsum or silica is not petroferric. The salic phase is not shown for the Salic Fluvisols either (the printed reason of p. 69). Heavy textured, for the takyric phase, is the fine class of the upper 30 cm (p. 107). A layer whose coarse fragments are not recorded is not skeletic, flagged. A rice land use alone makes the irrigation of the anthraquic phase, flagged, unless the site records no irrigation. The lithic phase stays shown for the Leptosols. The review also fixed these defects: the USDA pan layers count only when the predicate passes (a firm layer too thin for a fragipan is none); a NASIS fragipan without its depth is undecided; a recorded “not irrigated” decides before the land use; the yermic carbon that fails is undecided while the salic criterion is, and its blown sand is a sand sheet or cover sand, not a dune, shifting sand or a negation; classify_fao(gapfill = TRUE) gap-fills once, so the key and the phases read the same pedon; a phase left open by a candidate unit names it (major_groups:SC) in missing, with a note; a pan undecided by a short description carries no “absent” flag; the slope class is given for a pedon without horizons; and a phase that fails to read records the error as a flag.

soilKey 0.9.385 (2026-11-09)

FAO-Unesco legend: the 153 soil units of 1988

Fifth part of the FAO-Unesco soil legend (the Revised Legend of 1988, read in the ISRIC reprint of 1997). fao1988 now has its second level, the 153 soil units of the key (chapter X, pp. 75-89), registered as units after the major soil groupings. classify_fao() keys a soil to its grouping and then, under it, to the first unit whose gate passes, in the key’s order, not the order of the lists (which start with the Eutric or Haplic unit): name is the unit as printed (“Chromic Luvisols”), rsg_or_order the grouping, and levels has one row per level with its code, name, page and soilKey’s Portuguese gloss. The last unit of each grouping is the key’s “Other …” residual: Haplic in 17 groupings, Eutric in 9, and the Terric Histosols and Urbic Anthrosols, whose descriptions are shown as information and not tested (default 9). A unit the data leave undecided before the one assigned makes the unit provisional, listed as units:<code> in provisional_because with the grouping still decided. The units are in inst/rules/fao1988/units/, one file per grouping, each with its code, name, gloss, page, gate and a summary of the gate in soilKey’s words; their numbers are in the unit_key block of the thresholds table.

Most unit gates read the diagnostics of 0.9.382 and 0.9.383 directly: permafrost within 200 cm, gleyic properties within 100 cm, stagnic properties within 50 cm, plinthite, calcic and gypsic horizons within 125 cm, a sulfuric horizon or sulfidic material, the mollic, umbric and ochric A, the eutric and dystric histic H, the argic B, calcareous or gypsiferous from 20 to 50 cm, sodic, salic, andic, vertic and ferric properties, tonguing, strongly humic, the petrocalcic and petrogypsic horizons within 100 cm. A new file, R/key-fao-units.R, holds the predicates of the gates that read more than one diagnostic in one place or a record the diagnostics do not read: the drainage and fibres of the Folic and Fibric Histosols, deep cultivation and man-made sediments of the Aric and Cumulic Anthrosols, the rock within 10 cm and the calcareous material under the mollic A of the Lithic and Rendzic Leptosols, the base saturation of a window or of a B, the smeary consistence and texture of the Vitric Andosols, the thick albic E, clay increase, colour below the A and cambic alteration of the Arenosols, the ignition, Fe/C ratio and thin albic E of the Podzols, the plinthite horizon of the Dystric Plinthosols, the geric and ferralic properties inside a B, the rubbed colours of the Rhodic, Xanthic and Chromic units, and the slowly permeable horizon of the Dystric Planosols.

Hugo’s decisions of 2026-11-08 are applied: the key governs where chapter VI differs (Q6), the two passages in italics of this part are applied as printed (soft powdery lime in the Calcic Solonetz, p. 83; “in at least some part of the B” in the Humic Cambisols, p. 89; Q4), and the Gypsiric Regosols keep the key’s name with Gypsic Regosols, the name of the lists, as an alias (Q7). Every name of the final list resolves to exactly one unit. make_fao_example(code) now takes a unit code too: 153 synthetic profiles, each keying to its own unit without an undecided grouping or unit before it, and 87 near misses, one for each unit gate with a printed number, each crossing that number (a rock at 11 cm, a calcic horizon at 126 cm, a base saturation of 50 % from 20 to 50 cm, a rubbed chroma of 4 at 7.5YR) and keying to another unit. The i18n catalogues name the level in English and Portuguese (“Soil unit”, “Unidade de solo”); the app keeps its 28 examples, one per grouping. The grouping of the 56 examples of 0.9.384 is unchanged, and every other classification is unchanged (the fixtures of the other systems byte-identical).

Decided by Hugo on the review (2026-11-09). soilKey’s readings of this part are accepted, with these changes. The fimic A itself (fimic_a_fao88()) now needs a sign of manuring: citric P2O5 above 250 mg/kg, a manuring term (plaggen, hortic, manure, compost, midden, kitchen garden) in the layer origin, anthropic material, designation or the site’s land use, or the WRB plaggic or hortic horizon, always tried; artefacts neither make nor exclude it, so fills, wastes and man-made sediments stay Anthrosols and key to the Cumulic or Urbic units, and the unit-level guard of the first draft is gone. A Rhodic B whose dry value is not recorded is undecided. A smeary consistence not recorded leaves the Vitric Andosols undecided unless the texture is coarser than silt loam. A calcareous rock under the mollic A (CaCO3 measured, or limestone, chalk, marble or dolomite recorded) makes a Rendzic Leptosol. The colour of a red, yellow or brown B is read in every layer of it. The Fibric Histosols are very poorly drained or recorded undrained, not artificially drained; a drainage range that spans the limit, or no drainage record, leaves the Folic and Fibric units undecided. The other readings are accepted as proposed: a depth missing from a unit gate is read within 125 cm, “fibre content dominant” is the fibric material of Soil Taxonomy, the Cumulic sediments are sandy loam or finer, silt loam or finer excludes loam, the Luvic Arenosols compare a layer with any layer above it, the carbon enrichment of a Podzol B is the h of its designation, the plinthite horizon is the upper run of the gate, “the B” is the upper diagnostic B of the grouping’s kind, and the slowly permeable horizon is the layer below the E with the adjoining layers of its master horizon. The review also fixed these defects: one vocabulary of the anthropic record now serves the Anthrosols gate, the fimic A and the Cumulic unit (plain “irrigation sediment”, “irragric”, “terric”, a raised surface or a positive silting test alone were not read; “mine” is read as a word, not inside “mineral”); a drainage range is read by both ends, with the codes VP, P, W and Portuguese terms; an undecided B above a sure one decides where their answers differ; free iron and carbon both 0 fail the Ferric Podzols; and the Gelic Leptosols have a near miss at 201 cm on a deep Leptosol with less than 20 % fine earth (87 near misses).

soilKey 0.9.384 (2026-11-09)

FAO-Unesco legend: the 28 major soil groupings of 1988

Fourth part of the FAO-Unesco soil legend (the Revised Legend of 1988, read in the ISRIC reprint of 1997). The legend is now registered as fao1988 (aliases fao, fao88, revised_legend; experimental and opt-in; order 16 in the registry, namespace fao88), with one level for now, the major soil groupings. classify_fao(pedon, edition = "1988") is the user function of the module and classify_fao1988() its thin wrapper in the registry, as Hugo decided (Q1); edition = "1974" stops with a message until the Legend of 1974 is keyed in a later part. The key of chapter X (pp. 75-89) is read in its own order, not that of the lists: Histosols, Anthrosols, Leptosols, Vertisols, Fluvisols, Solonchaks, Gleysols, Andosols, Arenosols, Regosols, Podzols, Plinthosols, Ferralsols, Planosols, Solonetz, Greyzems, Chernozems, Kastanozems, Phaeozems, Podzoluvisols, Gypsisols, Calcisols, Nitisols, Alisols, Acrisols, Luvisols, Lixisols and Cambisols. The gates read the 16 diagnostic horizons (0.9.382) and the 27 diagnostic properties (0.9.383); R/key-fao.R adds the predicates that combine them where a gate reads more than one in one place: the organic layers of the Histosols, the record of a profound human modification, the rock, highly calcareous or cemented layer or the fine earth of the Leptosols, the clay, cracks and slickensides of the Vertisols, “no diagnostic horizons other than”, the coarse texture and coarse fragments of the Arenosols, the plinthite under an albic E or a stagnic horizon, the E over a slowly permeable horizon, the chroma of the mollic A to 15 cm, the uncoated grains of the Greyzems, the base saturation to 125 cm, the tongues or nodules of the Podzoluvisols, the clay distribution and boundaries of the Nitisols, and the CEC and base saturation of the argic B.

The tests are three-valued: an undecided gate before the one that passes makes the result provisional. The key governs where the descriptions of chapter VI differ (Q6), and the passage in italics of the Regosols gate in the 1997 text (lacking soft powdery lime) is applied as printed (Q4). There is no residual grouping after the Cambisols (Q5): a soil that no gate takes is [Not classified in the FAO-Unesco Revised Legend (1988)], with the 28 failed gates in the warnings, and one that no gate takes while some stay undecided names them as the candidates, in brackets. The names are as printed, with soilKey’s Portuguese gloss in levels$name_pt and the page of the key in levels$page. make_fao_example(code) gives one synthetic profile per grouping (28, each keying to its own grouping without an undecided gate) and, with near_miss = TRUE, the same profile with one printed number of its gate crossed (28, each keying elsewhere). The app lists the Revised Legend among the national systems with the 28 examples; the i18n catalogues name the system, its edition and the level in English and Portuguese. The thresholds table is shipped as inst/rules/fao1988/thresholds.yaml, the readings of the 1988 edition as inst/rules/fao1988/readings.yaml, and the list of the 28 groupings and 153 units as data-raw/fao1988_units.csv. Every other classification is unchanged (the fixtures of the other systems byte-identical).

Decided by Hugo on the review (2026-11-09). soilKey’s readings of this part are accepted, with these changes. The uppermost diagnostic B within 125 cm decides at the key (p. 42): the gate of a grouping defined by an argic, natric, cambic, spodic or ferralic B passes only when its B is the uppermost one, undecided when an undecided B lies above it (upper_b_fao88()), so an argic B over a ferralic B is no Ferralsol and a cambic B over an argic B no Luvisol. The CEC of the argic B is read per layer (ch. VI p. 52): 24 cmol(+)/kg clay or more in every layer for the Alisols and Luvisols, below 24 in at least one for the Acrisols and Lixisols. An organic layer on rock or fragmental material makes a Histosol when more than 20 cm thick (the histic H minimum), and a bulk density not measured is read as 0.1 or more, flagged. The deep path of the Plinthosols needs gleyic or stagnic properties in a horizon above the plinthite within 100 cm (ch. VI p. 60), not in the plinthite itself. The 35 cm of andic properties are measured from the mineral soil surface, flagged when an O or H is skipped. The Kastanozems are the exact complement of the Chernozems: a chroma above 2 in any layer of the upper 15 cm of the A. The boundaries of the Nitisols are tested at the A-to-B transition only. A crack with its depth but not its width leaves the Vertisols undecided. The review also fixed the plinthite runs (read layer by layer), the cracks (width and depth of the same record), the missing attributes of the Planosols trace, the NT example (pressure faces, which the nitic properties read) and the near-miss tests (every gate evaluated directly).

soilKey 0.9.383 (2026-11-09)

FAO-Unesco legend: the diagnostic properties of 1988

Third part of the FAO-Unesco soil legend (the Revised Legend of 1988, read in the ISRIC reprint of 1997). A new file, R/diagnostics-fao88-properties.R, reads the 27 diagnostic properties of chapter V (pp. 34-41) as internal predicates, each returning a DiagnosticResult that passes, fails or stays undecided, with the layers, the per-layer answers, what would decide it and the fallbacks used: abrupt_textural_change_fao88(), andic_properties_fao88(), calcareous_fao88(), calcaric_fao88(), continuous_hard_rock_fao88(), ferralic_properties_fao88(), ferric_properties_fao88(), fluvic_properties_fao88(), geric_properties_fao88(), gleyic_properties_fao88(), stagnic_properties_fao88(), gypsiferous_fao88(), interfingering_fao88(), nitic_properties_fao88(), organic_soil_materials_fao88(), permafrost_fao88(), plinthite_fao88(), salic_properties_fao88(), slickensides_fao88(), smeary_fao88(), sodic_properties_fao88(), soft_powdery_lime_fao88(), strongly_humic_fao88(), sulfidic_materials_fao88(), tonguing_fao88() (albic or Chernozem tongues), vertic_properties_fao88() and weatherable_minerals_fao88(). A property with no depth in the key is read in the layers starting within 125 cm (p. 42); max_top_cm reads “within X cm” and window_cm “throughout X-Y cm”, as the key will ask. Nothing is registered or classified yet.

The numbers are the printed ones. The abrupt textural change doubles the clay below 20 % or adds 20 points from 20 %, over an abrupt or clear boundary. The andic properties read their three items, with the volcanic glass sliding from 30 % at 0.4 % Alox + 1/2 Feox to 5 % at 2.0 %. Calcareous is more than 2 % CaCO3 or strong effervescence, calcaric calcareous throughout 20-50 cm. The ferralic properties ask a CEC below 24 cmol(+)/kg clay or 4 per kg soil in the cambic B or right below the A; the geric properties 1.5 cmol(+)/kg clay of bases and KCl acidity, or a delta pH of +0.1. The salic properties ask an ECe above 15 dS/m within 30 cm, or above 4 at a pH (1:1) above 8.5; the sodic properties 15 % sodium or 50 % sodium and magnesium; the sulfidic materials 0.75 % sulfur with less than three times as much CaCO3 and a pH above 3.5; strongly humic more than 1.4 % organic carbon over 100 cm. The fluvic properties read organic carbon above 0.20 % to 125 cm or irregular with depth, or stratification in a quarter of the soil, on sediments where their origin is recorded. Gleyic properties are two of three signs (reduction, groundwater whose capillary fringe reaches the surface, gley colours in more than 95 % of the matrix); stagnic properties are reduction with the mottling pattern within 50 cm. The ferric properties, soft powdery lime, tonguing, interfingering, nitic and vertic properties, permafrost, plinthite, slickensides and smeary consistence read the field record; what an unrecorded observation means for each (absent or undecided) is listed below and in the readings.

Hugo’s decisions of 2026-11-08 are applied: the colour pattern stands in for a reduction test that is not recorded, flagged, and the chroma increasing with depth supports the stagnic properties without being required (Q21); “many” coarse mottles are 15 % and more than 20 mm (Q22); and the defaults on the abrupt textural change, fluvic, nitic and vertic properties. The andic properties of p. 34 move to this file, and item 7 of the ferralic B reads them as before (absent, flagged, unless volcanic material is recorded). They also decide now whether a mantle of 35 to 50 cm buries the horizons below it (p. 42), which was left undecided in 0.9.382.

Decided by Hugo on the review (2026-11-09). A boundary over less than 5 cm is one recorded abrupt or clear (abrupta, clara), read by one shared reader for the abrupt textural change and item 6 of the argic B; not recorded, it is absent, flagged, in both, and an argic B that fails on it keeps the flag. The abrupt textural change also compares a layer starting less than 5 cm below the upper one, across a thin transitional layer. Without CaCO3, strong effervescence makes a layer calcareous and a water pH below 6.5 makes it not calcareous, flagged (both recorded: undecided, flagged); anything else leaves it undecided. An increase of organic carbon of more than 0.2 points is an irregular decrease for the fluvic properties. The three reduction tests are read as an OR, a negative one alone does not refute, and the gley colour confirms reduction but never refutes it, never in an E. Below a buried horizon only the properties bound to a horizon (ferralic, ferric, nitic, tonguing, interfingering) are removed. The frozen suffix f and the plinthite suffix v are read only in the notation that writes them (z for frozen in the Canadian one); elsewhere they leave the test undecided. Fe-Mn nodules alone, carbonate coatings named without an amount, a sulfur lower bound against CaCO3 and Chernozem tongues without a width are undecided; skeletans not recorded are absent; any recorded slickensides that are not none count. A petrocalcic pan is never continuous hard rock, strongly humic passes when the carbon described already exceeds the 100 cm mean, the Podzol ignition route shows stagnic as well as gleyic properties, and the oxalate iron of the nitic properties is compared as Fe (0.2 % Fe2O3 = 0.14 % Fe). The readings are in data-raw/fao_readings.yaml. Every classification is unchanged (the fixtures of the other systems byte-identical).

soilKey 0.9.382 (2026-11-09)

FAO-Unesco legend: the diagnostic horizons of 1988

Second part of the FAO-Unesco soil legend (the Revised Legend of 1988, read in the ISRIC reprint of 1997). A new file, R/diagnostics-fao88-horizons.R, reads the 16 diagnostic horizons of chapter IV (pp. 25-33) as internal predicates, each returning a DiagnosticResult that passes, fails or stays undecided, with the layers, what would decide it, the fallbacks used and any stand-in: histic_h_fao88() (with base = "eutric" or "dystric"), mollic_a_fao88(), fimic_a_fao88(), umbric_a_fao88(), ochric_a_fao88(), argic_b_fao88(), natric_b_fao88(), cambic_b_fao88(), spodic_b_fao88(), ferralic_b_fao88(), calcic_fao88(), petrocalcic_fao88(), gypsic_fao88(), petrogypsic_fao88(), sulfuric_fao88() and albic_e_fao88(). They build on the readers of 0.9.381: depths from the soil surface, H and O included; horizons buried under 50 cm of new material are not diagnostic; the subsurface horizons have their upper limit within 125 cm (p. 42, argument max_top_cm). Nothing is registered or classified yet.

The numbers are the printed ones. The histic H is more than 20 cm of organic soil material within 40 cm, or a thin surface layer or a plough layer that, mixed to 25 cm, has at least 8 + 8 x clay / 60 % organic carbon. The mollic and umbric A mix their upper 18 cm and ask a moist chroma and value below 3.5, a dry value below 5.5, a value one unit darker than the C (waived when strongly humic), 0.6 % organic carbon (2.5 % with more than 40 % lime), a base saturation of 50 % or more (the umbric A less), and a thickness of 10 cm on rock or a cemented pan, else 18 cm and a third of a solum under 75 cm, or more than 25 cm. The argic B asks sandy loam or finer with 8 % clay, the increase of 3 points, a ratio of 1.2 or 8 points (breaks at 15 and 40 %) within 30 cm with clay skins and 15 cm without, one tenth of the overlying horizons and 7.5 cm (lamellae 15 cm), and without clay skins a coarser horizon of 18 cm above it (5 cm over an abrupt transition); it is not ferralic and not natric. The natric B adds columnar or prismatic structure and more than 15 % exchangeable sodium in its upper 40 cm. The ferralic B asks a CEC of 16 or an ECEC of 12 cmol(+)/kg clay or less, 30 cm, under 10 % weatherable minerals and water-dispersible clay, a silt/clay ratio of 0.2 or less, no andic properties and under 5 % rock structure. The spodic B reads the pyrophosphate chemistry of Soil Taxonomy 1975 with its index of accumulation of 65. The calcic, gypsic and sulfuric horizons ask 15 cm; the petrocalcic and petrogypsic horizons have no minimum thickness.

Hugo’s decisions of 2026-11-08 are applied: a recorded Bt designation counts as the clay-skin observation, flagged, and “few” clay films are 1 % (Q13); the citric P2O5 of the mollic and umbric A decides when measured, else the anthropic layers it targets do, absent if not recorded (Q14); the eutric and dystric histic H by pH (1:5) 5.5, and organic soil materials undecided between the saturated limit and 20 % unless the drainage is recorded (Q15); the ferralic B asks 8 % clay and reads the 20-200 um weatherable minerals, flagged (Q16); without the 1975 spodic chemistry, spodic_horizon_usda() and then the WRB spodic() stand in, flagged (Q17); the sulfuric horizon does not ask for jarosite (Q18). soilKey’s own readings of this part (among them: the mixing of the mollic A, the layers that can hold a B, carbonate and gypsum read as absent from the pH, the HCl reaction or the ECe when not measured, volcanic glass read as none unless volcanic material is recorded, and the albic E read on its moist colour when no dry colour is recorded) are in data-raw/fao_readings.yaml for his word. Every classification is unchanged (the fixtures of the other systems byte-identical).

Decided by Hugo on the review (2026-11-09). soilKey’s readings of this part are accepted, with these changes. The spodic B is ruled out without its chemistry only by free carbonate or a water pH of 7 or more; a designation without h or s no longer rules it out, the older suffix ir counts as an illuvial sign, and the stand-ins now decide only the chemistry and are recorded only when they decide. An albic E without a dry colour takes the moist value + 1 as its dry value, flagged; an undesignated layer is read as albic only below a surface layer and above a B or C. Andic properties left undecided are absent, flagged, unless volcanic material is recorded. The thickness of the mollic A and its solum are both measured from the mineral surface. Moderately well drained leaves the saturation of organic materials undecided. The review also fixed these defects: an A layer straddling 18 cm is now read on its own values; the lime waiver of the mollic A is an alternative to the printed colour, with 2.5 % organic carbon on its branch only, and undecided when CaCO3 is not known; a plough layer may be an Hp or Op; lamellae count only when recorded above 0; argic item 6 is undecided when a clay on the way up is missing; an A no more than a third of an open solum fails; “closer to 2 than to 3” is a chroma below 2.5; the petrocalcic and petrogypsic horizons read their cementing agent (km, ym) from the designation; and the Bt of an E&Bt counts as a clay-skin observation.

soilKey 0.9.381 (2026-11-08)

FAO-Unesco legend: the attributes and the shared readers

First part of the FAO-Unesco soil legend in its two editions, the Revised Legend of 1988 (World Soil Resources Report 60, read in the ISRIC reprint of 1997) and the Legend of 1974 (Soil Map of the World, Vol. I). Both will be one module with an edition switch, registered as two systems in a later part; nothing is registered or classified yet.

New horizon attributes, from the plan’s list as Hugo decided (Q19, 2026-11-08): p2o5_citric_mg_kg, extractable_acidity_ph82_cmol, cec_ph82_cmol, al_dcb_pct, exch_acidity_kcl_cmol, ph_h2o_1to1, ph_h2o_1to5, rock_structure_pct, smeary_consistence, bleached_ped_coatings, ignition_redder, spodic_pellets, skeletans_pct, skeletan_thickness_mm, carbonate_coatings_faces_pct, nodule_size_max_cm, dta_low_endotherm, the rubbed moist colour (munsell_hue_rubbed, munsell_value_rubbed, munsell_chroma_rubbed), pitted_quartz_pct, palygorskite_pct and aeolian_crack_infill. New site attributes: flooding_days_growing_period, rudic_recorded and reference_fao74. Each names the criterion it serves, with its page, and its fallback when not recorded. inst/ATTRIBUTES.md and inst/schemas/pedon-schema.json are regenerated.

A new file, R/fao-readers.R, holds the internal readers the diagnostics of both editions will share, all three-valued, each saying what it read, what would decide it and the fallbacks it used: depths from the literal soil surface, H and O horizons included (Q9); windows read “throughout” or “in some part”, and “within X cm” by the top of the feature; thickness-weighted means and the mixed surface, with the depth below a shallow soil counted as zero where the strongly humic test of 1988 says so; organic matter as organic carbon x 1.724, flagged (Q11); pH at 1:1 and 1:5, the CEC per kg clay by NH4OAc or NH4Cl, the effective CEC of each edition and the base saturation, each flagged where the method differs (Q12); the three texture classes of the map symbol in each edition, the class of the upper 30 cm and the 1974 depth of 125, 90 or 75 cm by that class (Q10), sandy loam or finer and the texture groups of tonguing; the solum, buried horizons under 50 cm of new material (35 cm over an andic mantle in 1988); the clay increase in three bands with its numbers as arguments, equal to the USDA branch of test_clay_increase_argic() on a grid of clay contents, within a vertical distance and undecided across a lithological discontinuity; the hue rank and hue comparisons; the rubbed colour, the moist colour standing in, flagged (Q24); and the fallbacks of smeary consistence, the ignition test, rock structure and palygorskite.

The numbers of both editions, with their pages, are in data-raw/fao_thresholds_1988.yaml and data-raw/fao_thresholds_1974.yaml, and the readings in data-raw/fao_readings.yaml (Hugo’s decisions of 2026-11-08 and 2026-11-09, his word on every reading of this part); the later parts move them to the rule folders. No text of the books is shipped. Every classification is unchanged (the fixtures of the other systems byte-identical). # soilKey 0.9.380 (2026-11-08)

Germany KA5: FAO horizon designations read on the data route

Ninth part of the German soil systematics of the KA5 (Bodenkundliche Kartieranleitung, 5th ed., 2005; system id ka5). A profile that declares the FAO notation in site$designation_system (as isis_profile_to_pedon() does) was read on the data alone: its FAO letters were thrown away, so an E was often read as an Ah, a Bt or a Bw as a loose C, and the class tests of the Ah/C-Böden and the Braunerden stayed undecided. A new file, R/ka5-fao.R, keeps the letters where an FAO letter and a KA5 symbol mean the same (the KA5 prints no correlation of horizon symbols; the pairs are read from the two definitions, KA5 pp. 92-105 and WRB 2022 Annex 3, pp. 225-228). Each FAO designation bounds the KA5 horizons its row may be: an E is an eluvial A (Al, Ael, Ae, Ahe), an A an A that is not eluvial, a Bt a horizon with a Bt part, a Bw one with a Bv part, a Bs or Bh one with a Bs or Bh part, a plain B a B, P or T, a C a C, an R a solid rock (mC), an O an L, Of or Oh; the redox letters open the S and G horizons (g both, by the water regime the KA5 asks; l and r the G). Where a field descriptor is not recorded, a letter states what its definition names: t the clay coatings of the Bt, w the browning of the Bv, p the tillage of the Ap, k the secondary carbonate, g and l redox mottling present with its share open. Measured data come first and decide against a letter: recorded clay films, the clay difference, Munsell colours.

Within the family the order of tests decides three-valued. When the data leave one horizon undecided, it is the letter’s own translation (Bt for Bt, Bv for Bw) and the open question is one the letter answers, the FAO designation reads it, as a KA5 designation would be read; such a row has a lower grade of evidence, listed in provisional_because as horizons:<code>. The letter does not answer whether water is groundwater or perched water (Q13), the organic band of Q10 (H or Aa), or the origin of carbonate measured in a B: those rows stay undecided. A finer horizon the letter does not name (an Axp for an FAO Ap) stays undecided beside it. The letter and the data are in conflict, and the row undecided with a note, when no horizon of the family holds on the measured data (an FAO Bt with few clay films, an FAO E not lighter than its Bt), or when a horizon outside the family holds on the measured data first (an FAO C browner than the C below, an FAO Bw with the coatings and clay of a Bt, an FAO Bt with a measured Sd or Go, an FAO A over a measured Ah-Bv); the redox translations the data rule out are dropped from the candidates. Numbered sub-horizons with the same defining letter are one horizon (Bt1/Btg2, Bw1/Bwg2): each Bt sub-horizon must show the clay enrichment on its own clay against the eluvial horizon above, a Bw1 is compared with the horizon under the Bw, an E looks for its Bt under its sub-horizons and an EB. The A1, A2 and B3 of the 1977 numbering get no FAO reading. Rows with no designation, profiles that do not declare the FAO notation and profiles in the KA5 notation are read as before. Hugo confirmed the readings (readings.yaml); the reading of the 1977 numbering is soilKey’s, for him to confirm.

On the ISIS profiles from Germany (inst/benchmarks/ka5_isis.R, which now also counts a level as provisional when a horizon rests on a lower grade of evidence): class 2 of 16 (12.5 %, 3.5-36.0) becomes 4 of 16 (25.0 %, 10.2-49.5) and type 1 of 15 (6.7 %, 1.2-29.8) becomes 3 of 15 (20.0 %, 7.0-45.2); one class and one type are firm, the rest provisional. Profiles that stop at the division fall from 13 to 9 of the 16 labelled; DE007 (Parabraunerde) and DE011 (Braunerde) now key to their type. DE002 (a Pseudogley in its label) keys as a Normparabraunerde, its S class now closed by the measured rust; DE009 (Rosterde) as a Normbraunerde. The nine that still stop do so on what the data do not say: groundwater or perched water (DE003, DE006, DE019), bioturbation for an Axh (DE013, DE014, Q17), the origin of the carbonate measured in the Bt (DE015, DE016), a clay difference under the Bt minimum (DE012), the Bg of DE008. One expectation of test-v09361-ka5-data-key.R changes: an FAO Ap in a profile declared fao2006 is now read Ap, not Ah. Every other KA5 test and every classification of the other systems is unchanged (byte-identical).

Decided by Hugo on the review (2026-11-08 and 2026-11-09). soilKey’s readings of this part are accepted, with these choices: rock is an R designation, or 90 % bedrock or more with a hard rupture resistance recorded (bedrock alone is not rock); free iron below 0.5 % reads as not turning redder on ignition, 0.5 % or more leaves the test undecided; the texture of the upper 30 cm under an organic surface starts at the first mineral horizon, flagged; the strongly humic mean of a soil shallower than 50 cm over rock is divided by 100 cm, flagged; and a horizon without a designation between the last A, E or B and the first C leaves the solum undecided. A window is read only where the depths fill it: a gap or a layer without depths leaves it undecided, overlapping layers are flagged, and “within X cm” fails only when the description goes below X or reaches rock at X. A vector answer with an undecided element now names what would decide it, buried horizons are read after a figure (Bt2b), a rock layer has full rock structure, and a base saturation computed over another CEC method carries both flags.

soilKey 0.9.379 (2026-11-08)

Germany KA5: older German names and an offline benchmark on the ISIS profiles from Germany

Eighth part of the German soil systematics of the KA5 (Bodenkundliche Kartieranleitung, 5th ed., 2005; system id ka5). A new file, inst/rules/ka5/legacy_names.yaml, maps older German soil names to KA5 codes, for benchmarks only: the second names of the DBG systematics of 1998 (Schwarzerde, Kalkschwarzerde, Braunauenboden, Auenregosol, Tiefumbruchboden and others), Haftnässepseudogley (the KA5’s own word for the Haftpseudogley, p. 313), the older names the KA5 prints beside its own (Rosterde, Borowina, Latosole, the Marschen subtypes such as Typische Kalkmarsch), and Chernozem. Every row names its source and page and resolves to a class, type or subtype of the key. A name the KA5 prints under two types (Typische Seemarsch, Übergangsbrackmarsch) is read at the class M; Amphigley, printed for two classes (pp. 229, 245), is excluded. Three leading modifiers are read: Acker- (the variety v, p. 267), Typischer (the Norm subtype of a type name, pp. 191, 238, 250-253; the KA5’s own exceptions, Typische Kleimarsch and Typische Flussmarsch, are rows of their own) and Primärer (dropped before a Pseudogley only). A name of exactly two type names joined by a hyphen is read with the older names put in; one the key does not print is the type of its last part (p. 191).

A new internal matcher, .ka5_match_label(), reads a label against the names of the key (21 classes, 54 types with a name, 223 subtypes; soilKey’s bracketed codes left out) and the legacy file: exact names only, with case, umlaut spelling, the sharp s and the spacing around a hyphen alike. A name with brackets (but the modifier “(Acker)”), a slash, a comma, a full stop or a digit, two names joined by a space and names of three or more parts are not read. There is no generic tolerance of misspellings; a name not read is NA, never a guess. In a label of several parts the deepest part wins when the others are its ancestors, else their common ancestor. A new script, inst/benchmarks/ka5_isis.R, keys the 24 ISIS profiles from Germany with classify_ka5() and scores them at the class, the type and, where both sides give one, the subtype, with Wilson 95 % intervals. It downloads nothing: it reads the saved ISIS profiles from its first argument, SOILKEY_ISIS_CACHE or tools::R_user_dir("soilKey", "cache")/isis/profiles.rds, and stops if there is none. Its explicit variant list reads two names of the labels with no printed source, flagged: a soil like a Schwarzerde as the class T only (DE008), and a Braunerde of low base content as the type BB with the variety dy noted (DE011). ISIS data are not shipped.

First run (soilKey 0.9.379): all 16 local names are read (one at class level, nine at type level, six at subtype level); 8 profiles have no local name and 6 have no horizons. Class 2 of 16 (12.5 %, 3.5-36.0), type 1 of 15 (6.7 %, 1.2-29.8), subtype 0 of the 1 profile where both sides give one. The low figures come from how far soilKey keys, not from disagreements: on the data route 13 of the 16 labelled profiles stop at the division, the class test of the Ah/C-Böden undecided in 11 of them and that of the Braunerden in 8, because the FAO-style E and Bt horizons are mostly left unread or read as Ah or lC. Only DE001 (Parabraunerde, keyed Normparabraunerde), DE005 (Nassgley, keyed Normgley: the class agrees) and DE004 reach a type. DE004 is a Gley-Podsol in its label and a Luvisol in ISIS’s WRB; soilKey keys it as a Normgley. The label is kept and scored as printed, a disagreement. Hugo’s decisions on the readings of this part are in readings.yaml. Every classification is unchanged (the fixtures of the other systems byte-identical).

soilKey 0.9.378 (2026-11-08)

China CST 2001: an offline benchmark on the ISIS profiles from China

Eighth part of the Chinese Soil Taxonomy (2001, English edition; system id cst2001). A new script, inst/benchmarks/cst2001_isis.R, keys the 51 ISIS reference profiles from China (CN001-CN051) with classify_cst2001() and scores them against the CST name of their local classification. It downloads nothing: it reads a saved list of raw ISIS profiles from its first argument, the environment variable SOILKEY_ISIS_CACHE or tools::R_user_dir("soilKey", "cache")/isis/profiles.rds, and stops if there is none. The markdown report goes where the second argument says; ISIS data are not shipped.

The labels carry the genetic name of the profile (the Genetic Soil Classification of China) beside the CST one. A new internal matcher, .cst_match_label(), finds the CST part and its taxon at any level among the 779 names of the key (14 orders, 39 suborders, 138 groups, 588 subgroups; soilKey’s bracketed residuals left out): exact names only, singular and plural, case and hyphenation alike, and the book’s aliases. There is no generic tolerance of misspellings. The script adds an explicit, documented list of the two known slips of the labels, tried only when no part matches exactly and flagged in the report: Acidi-Undic for Acidi-Udic Cambosols (CN008), and the order name Isohumisols of the 1991 and 1995 proposals, read as Isohumosols (CN049, scored at the order). 50 labels match: 48 at group level, one at subgroup level (CN014, Panic Sali-Orthic Aridosols) and one at order level (CN049); CN043 gives the genetic name only. Each level is scored on the labels that reach it, with a Wilson 95 % interval; a profile keyed to a bracketed residual (CN020, [E2] [Other Ferralosols]) counts as a disagreement and is reported apart.

First run (soilKey 0.9.378): order 26 of 50 (52.0 %, 38.5-65.2), suborder 22 of 49 (44.9 %, 31.9-58.7), group 14 of 49 (28.6 %, 17.8-42.4), the one subgroup label not reached. The Ferralosols agree 7 of 7, the Argosols 6 of 7 and the Primosols 3 of 3; the four Anthrosols and the two Aridosols are missed (keyed as Ferrosols, Argosols, Cambosols or Primosols), three of the five Isohumosols go to the Primosols, three of the seven Ferrosols to the Ferralosols, and the Cambosols agree 5 of 13. Most names are provisional: at the order 46 of the 51 profiles have a class tested before theirs that could not be decided, and 48 at the group (the book’s own provisional marks are not counted). Most of these are the Halosols (H), undecided in 27 of the 46, and the Andosols (D), undecided in 24. The labels were given by ISSAS, probably on the Chinese edition, so the group is the fair target and differences below it are not errors by themselves. The genetic names have no automatic crosswalk to the 2001 system and are not scored; WoSIS was not queried (no national classification field is known in its schema). Every classification is unchanged (the fixtures of the other systems byte-identical).

soilKey 0.9.377 (2026-11-08)

China CST 2001: gley colours in well-drained soils and the fine clay of the argic horizon

Two order-level fixes of the Chinese Soil Taxonomy (2001; system id cst2001), decided by Hugo on 2026-11-08.

Gley colours without a ferrous-iron test or Eh gave the gleyic features provisionally (Q11) in any layer but an E or albic one, so a humus-grey A horizon (10YR 4/2, 4/1, 5/1) of a well-drained profile keyed as Gleyosols. A recorded drainage class of well drained or better, with no saturation regime recorded, now rules the colour-only reading out in every layer without redox features of its own, as it already did for the low chroma of the redoxic features. Moderately well drained does not. Redox features are read per layer: mottles (a mottle recorded as none, absent, nil, - or 0 is none), redox concentrations, nodules, or a g or r suffix of the designation (Bg, Cr). A positive test or rH 19 or less still gives the features in any layer. With no drainage class recorded, such an A stays provisional Gleyosols with the alternative in $candidates. The drainage reader now also takes “excessively well drained” and “somewhat excessively well drained” (the ISIS wordings) as well drained or better, reads hyphens and underscores as spaces (“Well-drained”), and takes the worst class of a range (“well drained to moderately well drained” is not well drained); it serves the saturation regimes, the redoxic features and the Foli- groups too. A mottle recorded as none no longer counts as a redox sign beside a shallow water table, nor as a mottle in item 3 of the redoxic features.

Item 2b of the argic horizon (p. 36) asks more total clay and more fine clay than the eluvial horizon; soilKey read the fine clay only at 60 % clay or more. Now, in the lower bands, the fine clay is compared with the eluvial layers the total clay increases over: if every one with fine clay measured has as much or more, item 2b fails; if the fine clay is not measured in both layers (in one or neither), the total-clay increase passes provisionally. The whole key is then run again with that increase failing, no gate switched off: the first level whose class differs names the fine clay as what would confirm it, even when it was assigned firmly (an argic layer can block an earlier class, the Spodosols for instance), and the class of that run is the alternative (a 1.2 times increase with no clay films: Argosols, provisional, with Cambosols as the alternative). The clay-pan and secondary clayification keep the total clay alone. Clay films and the thin section remain alternatives to the increase, as printed, and the fine-clay ratio a third higher stays a “normally”. The alkalic horizon reads the same items, so it follows the argic horizon; its evidence grade, read on its own items, is unaffected. A block of alternatives in the key (any_of) is now provisional only when every alternative that passed is.

Names are unchanged except the H2.2 example, a well-drained Halosol that was Gleyic on colours alone and is now Typic Aqui-Orthic Halosols. The suborder examples G2, H1, K1 and K2, whose argic or alkalic horizon rests on item 2b, now record their fine clay, so they and the group and subgroup examples built on them (the Alkalic Halosols, the Argi- and Argic Ferrosols, the Argic Aridosols) keep their names, not provisionally. On the 51 ISIS profiles from China no name changes; seven Argosols, Ferrosols and Isohumosols with an argic horizon by the clay increase alone now carry the fine-clay warning and an alternative. Every other classification is unchanged (the fixtures of the other systems byte-identical).

soilKey 0.9.376 (2026-11-07)

China CST 2001: the subgroups of orders H to N

Seventh part of the Chinese Soil Taxonomy (2001, English edition; system id cst2001). classify_cst2001() now keys a pedon of orders H to N (Halosols, Gleyosols, Isohumosols, Ferrosols, Argosols, Cambosols, Primosols) below its group to the 412 subgroups of key 5.2 (pp. 108-180), in the book’s order, in inst/rules/cst2001/subgroups/{H..N}.yaml, with the page, the name as printed (the canonical spelling of Q2, the other printed forms and the singular as aliases), the adjective and soilKey’s Portuguese gloss. Every group of the book now has its subgroups: the 588 names of Appendix 1 each resolve to one row, and the note that the name stops at the group is gone (soilKey’s bracketed residuals keep theirs). J1.2.1, K1.1.1 and M3.5.1 carry the book’s own provisional mark.

New presets in presets.yaml, with their criteria in R/key-cst-subgroups-hn.R: the albic horizon, or a glossic horizon or glossic evidence, anywhere, within a depth, below the mollic epipedon or above the argic horizon; the calcic horizon alone, with soft powdery lime, or with the hypercalcic horizon and the calcipan, with its upper boundary within or between depths; Eutric and pH 7.0 as the converse tests, Leachic as a share of the window, the ferric property throughout the argic horizon or claypan or the B, and Dystric throughout the claypan or the argic horizon; a property in some subhorizon of the B (allitic, alic, ferric, spodic evidence); features in a share of the window (Phosphic) or in every layer of it (Epigleyic); salic evidence with its duration; para-alkalic evidence; gleyic evidence of perched water (Stagnic); a hue in a subhorizon of the upper half of the B (Xanthic of M5.4.4); Permic. Written directly: the kind of the histic epipedon (Fibric, Sapric), the window below the top of the claypan (L1.1.2), the Fe-Mn nodules of an indurated subhorizon (Concretic), cinders over 0-25 cm (Cinderic), carbon over 0-20 cm (Grayic), vertic evidence within 25 cm (Verti-lithic), and the torrential and marine salt profiles of the Halosols (Dilluvic, Marinic). The presets of 0.9.375 and the subgroups of orders A to G are unchanged. A new site attribute, salic_months_per_year, gives the months a year with salic evidence the Parasalic subgroups of M2.2 and M3.3 ask for; not recorded, the evidence observed passes provisionally (Q15).

make_cst2001_example() gives one profile per subgroup of orders H to N, each keying to its own subgroup, not provisionally (588 subgroup examples in all); the suborder and group examples keep their order, suborder and group and now reach a subgroup. Every other classification is unchanged (the fixtures of the other systems byte-identical).

Decided by Hugo on the review (2026-11-08). The nine defects of the review are fixed: shajiang in a run (and the M2.2 group key), a B subhorizon or the whole B measured within 125 cm of the mineral soil surface, the upper half of the B of M5.4.4 capped at 125 cm, Dilluvic with a layer not measured or a description ending above 200 cm, Marinic with the carbonate not measured, and a Lithic contact or a horizon with its upper boundary within a depth (gypsic horizon, salipan, alkalic evidence, argic, sulfuric and plinthic horizons) are undecided when the description stops above the depth asked, not on rock or a contact, as the feature windows already were (the Lithic rows of orders A to G too); phosphic evidence of N4.7.1 reads the mineral soil surface (phosphic_property_cst(datum =)); M1.6.2 takes a calcic horizon starting at 100 cm; Verti-lithic reads a half-open window. Alkalic evidence is now read on its printed items (p. 39): the weakly developed structure of the alkalic horizon and an ESP of 5 or more within 40 cm in a subsurface layer, without the argic items. With a short paddy history the anthrostagnic evidence passes its regime item on the paddy record, and the saturation axis reads the anthrostagnic regime from paddy records only when the history is not recorded or longer than half of the years. The lithologic characters of sandy deposits are read from the mineral soil surface, litter left out. The argillans of a claypan (item 4) qualify the first mineral layer, so a claypan can be exposed (L4.3.1). With these readings every subgroup is reachable and has an example. soilKey’s other readings of this part are accepted, with these choices: Stagnic undecided under a flooded record, Recalcaric undecided when the description ends above 100 cm, Concretic indurated only (indurated or extremely hard) below the base of the albic run, and M5.4.4 a run whose top lies in the upper half of the B. A class assigned on a provisional reading now names what would confirm it (a ferrous-iron test, a deeper description, the extent of the contact, the months with salic evidence, the duration of the cracks).

soilKey 0.9.375 (2026-11-07)

China CST 2001: the subgroups of orders A to G

Sixth part of the Chinese Soil Taxonomy (2001, English edition; system id cst2001). The registry now names the level subgroups, and classify_cst2001() keys a pedon of orders A to G (Histosols, Anthrosols, Spodosols, Andosols, Ferralosols, Vertosols, Aridosols) below its group to the 176 subgroups of key 5.2 (pp. 76-108), in the book’s order, one file per order in inst/rules/cst2001/subgroups/ keyed by group, with the page, the name as printed (the canonical spelling of Q2, the other printed forms and the singular as aliases), the adjective and soilKey’s Portuguese gloss in levels$name_pt. Typic, the residual of each list, passes by default. [A1.3.x] Lithic Hemi-Permagelic Histosols, listed in Appendix 1 but not in the key, is keyed at its Appendix position with the test of A1.2.3 (Q3), and the result notes it. C1.1.1 and D1.1.1 carry the book’s own provisional mark. The groups of orders H to N stop at the group, with a note, until their subgroups follow in the next part.

The same adjective carries different depths, thicknesses and extents in different groups, so each subgroup row calls a preset of the new inst/rules/cst2001/presets.yaml with the numbers printed for it (Lithic, Mottlic, Gleyic, Parasalic, Sodic, Sulfic, Dystric, Eutrophic, Trunic, Xanthic, Dark, Takyric, the cracks of the Aridic and Ustic subgroups …). load_rules() expands the calls into ordinary blocks when the rules are loaded (R/rule-presets.R), so the rule engine does not change; a complex subgroup (Calcari-mottlic, Aridi-trunic, Gypsi-panic, Sodi-takyric) is both of its parts and is keyed before them, as printed. .validate_rules() reports a preset called with an unknown parameter or without a required one. The criteria the subgroup keys define are written in R/key-cst-subgroups.R: a lithic contact within or between depths (with the fragments and plane-extent alternatives of the later orders), a feature in a run of layers, in layers totalling a thickness or anywhere in a window, the Buric and Terric mineral layers and the tier kinds of the Histosols, a lithic contact within the control section, the carbonate pattern of anthro-recalcification, the soluble salts of the Parasalic Siltigi-Orthic Anthrosols, base saturation or pH in a window, base saturation in a share of it, hues in a run, a share or the upper part of the B, the order’s horizon at the surface, the dark mixed surface of the Aridosols and an argic horizon with lime infiltrates. Every test is three-valued as before: an undecided subgroup before the assigned one makes the name provisional, and a subgroup assigned on a provisional reading (gley colours without a test, a window cut by the base of the description) comes with the alternative the key would reach.

make_cst2001_example() takes a subgroup code of orders A to G as well and gives one profile per subgroup (176), each keying to its own subgroup, not provisionally; the suborder and group examples keep their order, suborder and group. The readings of this part, soilKey’s own for Hugo’s word, are in inst/rules/cst2001/readings.yaml. Every other classification is unchanged (the fixtures of the other systems byte-identical).

Decided by Hugo on the review (2026-11-07): a window that runs below the base of the description is undecided there unless the description ends on rock or a contact; the thickness not described joins the upper bound only, so a feature already found above is a firm pass and otherwise the subgroup is undecided and the name provisional (Mottlic, Endogleyic, Gleyic, Sulfic, Parasalic, Sodic, Paracalcic, Paragypsic, Calcic, Shajiang, and the tiers of the Histosols). soilKey’s other readings of this part accepted as proposed. Trunic: a recorded A, AB, AC or E at the mineral soil surface fails before anything else, and the anthropic truncation flag is read only when the first layer has no designation; BA and B/A count as a B; the ferralic horizon is tested on the first layer whatever its designation. Where a subgroup names the gypsic horizon alone (G2.1.7, G2.2.3, G2.2.5) a hypergypsic horizon does not count. The preset expander also expands a preset written directly as a mapping and reports a call with extra keys. New aliases Fe-leachic-Gleyi-Stagnic Anthrosols (p. 83) and Gypsi-Panic Sali-Orthic Aridosols (p. 105). Gypsic evidence left open by an undescribed layer below now names the gypsum to measure.

soilKey 0.9.374 (2026-11-07)

China CST 2001: the groups

Fifth part of the Chinese Soil Taxonomy (2001, English edition; system id cst2001). The registry now names the level groups, and classify_cst2001() keys a pedon below its suborder to the 138 groups of key 5.2 (pp. 75-176), in the book’s order, one file per order in inst/rules/cst2001/groups/ keyed by suborder, with the page, the name as printed (the canonical spelling of Q2, the other printed forms as aliases) and soilKey’s Portuguese gloss in levels$name_pt. Where the book prints no residual, soilKey’s [A1.4] [Other Permagelic Histosols] and [A2.5] [Other Orthic Histosols] close the list (Q4); the result notes that the name stops there, as it now also does for [E2] [Other Ferralosols], which has no groups. C1.1 and C2.1, all the Spodosols, carry the book’s own provisional mark. The groups read the horizons, characteristics and regimes of the earlier parts and the criteria the group keys define, written in R/key-cst-groups.R: the Foli- groups and the kind that predominates in the surface tier of the Histosols, the grey iron-percoleached subhorizon and the iron accumulation of the Stagnic Anthrosols, the hydromorphic cumulic epipedon, the rhodic and xanthic colours of the Ferralosols by the thickness of the window, the udic regime bordering on the perudic one, a calcic horizon starting between 50 and 125 cm, the thickness of the mollic epipedon, an albic horizon above the claypan, folic histic evidence, shajiang, the takyric surface of the Halosols, coral sands within 100 cm, carbonate rocks or coral sands in more than half of the horizons, and a property in some subhorizon of the B or throughout it (allitic, highly weathered, alic, acid). Every test is three-valued as before: an undecided group before the assigned one makes the name provisional, and a group assigned on a provisional reading comes with the alternative the key would reach. A residual group named for a regime that the soil does not have (the Udi- groups; the Aqui-Orthic Halosols, named for the aquic regime) keeps its class, with a note.

make_cst2001_example() takes a group code as well and gives one profile per group (140, the two bracketed residuals included), each keying to its own group, not provisionally; the 39 suborder examples still key to their suborder, now with a group (a few were given the measurements their group asks for, so that it is decided). The readings of this part, soilKey’s own for Hugo’s word, are in inst/rules/cst2001/readings.yaml. Every other classification is unchanged (the fixtures of the other systems byte-identical).

Decided by Hugo on the review (2026-11-07): soilKey’s readings of this part accepted as proposed (J3.1 and M4.2 included). B1.2 reads the grey colour alone (moist chroma 2 or less, as printed), with no test of the iron. The Foli- groups take a well-drained record for the days of saturation only as a stand-in, flagged in the trace and named in a warning. Where a group names the calcic horizon alone (F1.1, F3.2, G1.1, J2.4, L2.2) a hypercalcic horizon does not count. H1.1 reads the depth of the polygonal cracks (cracks_depth_cm, 1-4 cm) first, the crust thickness standing in, flagged. Fixed on the review: the depth below the base of the description is undecided in the colour shares of the Ferralosols and the coral share of M5.2, and a share that passes only on the part described passes provisionally, with the alternative; the thickness of the mollic epipedon (J2.3) is undecided while a layer below it may still belong to it; layer_run_cst() takes grade = "at_least_evidence", so gleyic evidence counts in M4.2.

soilKey 0.9.373 (2026-11-06)

China CST 2001: the registry, the orders and the suborders

Fourth part of the Chinese Soil Taxonomy (2001, English edition). The system is registered as cst2001 (aliases cst, china, chinese; experimental and opt-in; order 15 in the registry, after the German KA5 and South Africa planned at 13 and 14), with the levels orders and suborders for now. classify_cst2001() keys a pedon to the 14 orders of key 5.1 (pp. 72-75) and the 39 suborders of key 5.2, in the book’s order, on the 33 diagnostic horizons (0.9.371), the 25 diagnostic characteristics (0.9.372) and the regimes (0.9.370), plus the criteria the key defines where it uses them (the share of the upper 60 cm with andic property, the organic soil materials of the Histosols, an argic horizon above the spodic one, the base saturation window of the Isohumosols, the claypan with illuviation argillans, the humic spodic subhorizons, the texture of the Vitric Andosols, the crack days of the Ustic Vertosols, the low n value or clay of the Cambosols, irrigation and anthro-silting within 50 cm). Three-valued: an undecided class before the assigned one makes the name provisional; a class assigned on a reading the book leaves open (gley colours without a test, cracks for their duration) carries a warning. soilKey’s residual [E2] [Other Ferralosols] closes the suborders of the Ferralosols, and E1 takes the udic or perudic regime (Q4). Names in English as printed, with soilKey’s Portuguese gloss in levels$name_pt; the book’s own provisional marks are read from book_provisional (none falls on an order or suborder). A residual named for the udic regime reached under another recorded regime keeps its class, with a note. The approximate equivalents of each order in US Soil Taxonomy (1999) and the WRB (1998), Tables 4.2 and 4.3, are a note in the result, the report and the app (inst/rules/cst2001/correlation.yaml; Q1), never a class. The horizon panel of identify_horizons(pedon, "cst2001") is in the trace (phase horizons).

make_cst2001_example() gives one profile per suborder (39, each keying to its own suborder, not provisionally) and, with near_miss = TRUE, fourteen near misses, one per order. The app lists China among the national systems with the 39 examples; data-raw/cst2001_taxa.csv holds the 779 names of Appendix 1 in the canonical spelling of Q2 (with soilKey’s [E2]), the other printed forms as aliases. A recorded drainage class of well drained or better now rules out the saturation regimes of the CST (stagnic, anthrostagnic, aquic, peraquic). The readings of this part are in inst/rules/cst2001/readings.yaml. Every other classification is unchanged (the fixtures of the other systems byte-identical).

Decided by Hugo on the review (2026-11-06): soilKey’s readings of this part accepted, with these changes. The spodic materials by colour alone only directly below an albic horizon or an E layer, elsewhere with a sign (cementation, cracked coatings, Alo + 1/2 Feo 0.50 % with half or less above, ODOE); measured oxalate without a sign gives spodic evidence at most, no data leaves a red B undecided (red Ferralosols, Ferrosols and Argosols no longer key as Spodosols). The base saturation of the Isohumosols below the description is read as saturated under a calcareous lowest horizon, otherwise the window stops at the base of the description and the class is provisional. Runs of gleyic and redoxic features skip rock and organic layers. The permafrost of the Cambosols (M 4), the contacts of the Vertosols (F 2) and the anthroturbic layer (N1) are read from the mineral soil surface (datum = "mineral" of permafrost_layer_cst(), lithic_contact_cst(), paralithic_contact_cst(), anthroturbic_layer_cst()). The anthrostagnic epipedon and the agric horizon on a plain A are ruled out when an item fails, instead of undecided. M 3 keeps the printed clay under 80 g/kg and reads an unmeasured n value under 0.7 in a layer not saturated. The Vitric Andosols take sand, loamy sand and sandy loam only. Histosol item b is literal. A recorded non-volcanic parent material rules out the andic property; pH(H2O) under 5.5 or a perudic regime rules out the salic horizon where salts are not measured; under an aridic regime a crust not recorded leaves the aridic epipedon undecided. A class assigned on a provisional reading (gley colours without a test, Q11) comes with the class the key would reach without it, in candidates (kind “alternative”), a warning, the trace and the printed result, never as the class.

soilKey 0.9.372 (2026-11-06)

China CST 2001: the diagnostic characteristics

Third part of the Chinese Soil Taxonomy (2001, English edition; system id cst2001, registered in a later part). The 25 diagnostic characteristics of the book (pp. 43-64) read on the data (R/diagnostics-cst-properties.R), three-valued, with the layers, the missing attributes and the fallbacks used: organic soil materials with their five kinds (fibric, hemic, sapric, folic, mattic) and the control section and tiers of the Histosols; the seven lithologic characters within 125 cm (lithologic_characters_cst(kind =) and lc_<kind>_cst()); lithic and paralithic contacts; anthro-silting materials; vertic features and vertic evidence; the anthroturbic layer; gleyic features and gleyic evidence (gley colours without a ferrous-iron test or Eh met provisionally, Q11); redoxic features; the permafrost layer; frost-thawic features; the n value; the isohumic property (Rh 0.4 or less, the printed “4” read as 0.4, Q9; the book’s default bulk densities where none was measured, flagged, Q10); the humic, andic, ferric (every layer of the B, Q23), allitic (the Ki of the sulfuric attack flagged, Q16), alic, phosphic, sodic and calcaric properties with their evidences; base saturation (eutric, dystric, eutrophic, dystrophic in a window); sulfidic materials (no number in the book: the WRB number and stand-ins, always with a lower grade). The two regimes are the readers of 0.9.370. Layer characteristics take the grades of the horizons (full, evidence, at least evidence) and join the horizon panel (characteristics, characteristic_evidences, characteristic_stand_ins); the sulfuric horizon now reads the sulfidic materials under its base. Numbers in inst/rules/cst2001/thresholds.yaml with their pages; Hugo’s decisions as applied and soilKey’s own readings of this part, for his word, in inst/rules/cst2001/readings.yaml. Fixtures of the differences from the WRB 2022 (sodic ESP 30, the isohumic ratio, the Chinese gley colours, alic pH(KCl) 4.0, andic of KST 1996, ferric). No new attribute. Every other classification is unchanged (the fixtures of the other systems byte-identical).

Decided by Hugo on the review (2026-11-06): rock layers carry no soil colour; carbonate rocks by rock nouns only, undecided where the rock is not named; the 60 cm Histosol tier needs fibric moss materials; frozen designations read after a discontinuity numeral, and frozen ground not recorded is absent where the description reaches the depth asked (only a frigid or warmer regime rules permafrost out); the scaly structure in an A or B only; provisional gleyic features marked in the panel, and gley colours alone not read in an E or albic layer without redox features or a saturation regime; the allitic fine-earth ratio (the sulfuric Ki) ORed with the clay ratio; redoxic item 3 without a carbon exclusion, false under a well-drained record; northern red earths by a red earth or red clay parent material; the calcaric property on measured CaCO3, else effervescence, else pH under 6.5 non-calcaric; the isohumic depths scaled to the contact; the sulfuric horizon’s lower grade only on the WRB stand-ins; the phosphic pattern with no reversal over 10 %; the sandy carbon as a weighted mean; every purplish layer with fragments under 4 cm.

soilKey 0.9.371 (2026-11-06)

China CST 2001: the diagnostic horizons

Second part of the Chinese Soil Taxonomy (2001, English edition; system id cst2001, registered in a later part). The 33 diagnostic horizons of the book (pp. 20-43), each read layer by layer on the data (R/diagnostics-cst-horizons.R, R/diagnostics-cst-anthropic.R): a grade per layer, full, evidence (the book’s weaker grade, for the 15 horizons that have one), none or undecided; readers <horizon>_cst(pedon, grade = "full" | "evidence" | "at_least_evidence", top_max) for the key, phos_agric_horizon_cst() for the phos-agric kind of the agric horizon and argic_horizon_cst(natro = TRUE) for the natro-argic horizon of the Aridosols. A WRB or USDA diagnostic of soilKey stands in only where a CST descriptor is missing, flagged with a lower grade. .cst_identify() gives the horizon panel (the horizons, evidences, kinds and stand-ins of each layer); identify_horizons(pedon, "cst2001") reaches it once the system is registered. The numbers are in inst/rules/cst2001/thresholds.yaml with their pages; soilKey’s readings of this part, for Hugo’s word, in inst/rules/cst2001/readings.yaml. Fixtures of the differences from the WRB 2022: the argic clay increase (+3 / x1.2 / +8 / fine clay +8), plinthite 10 %, the alkalic horizon at ESP 30 and pH 9.0, the salic horizon on salts or the 1:1 EC. Every other classification is unchanged (the fixtures of the other systems byte-identical).

soilKey 0.9.370 (2026-11-05)

China CST 2001: the attributes, the shared readers and the regimes

First part of the Chinese Soil Taxonomy (2001, English edition; system id cst2001, registered in a later part). New horizon attributes (36, section “Chinese system (CST 2001)”, among them fine_clay_pct, clay_films_thickness_mm, reduced_matrix_pct, ferricyanide_test, eh_mv, p_olsen_mg_kg, ec_1to1_dS_m, shajiang_pct, pyroclastic_fragments_pct) and site attributes (14: aridity_index, aridity_index_max_month, climatic_moisture_regime, udic_perudic_border, mean_summer_soil_temp_C, summer_saturated, cracks_open_days, irrigated and others), each with its fallback. soil_moisture_regime takes stagnic, anthrostagnic and peraquic, which the USDA key reads as aquic; soil_temperature_regime takes permagelic, read by the USDA key as gelic. The shared readers (R/cst-readers.R: units, clay activity, free iron, texture and particle-size classes, hue ranks, the mixed surface, windows and shares, storage with the book’s default bulk densities, the arid region) and the regime readers (R/cst-regimes.R, each regime with its source in the trace) read the numbers of inst/rules/cst2001/thresholds.yaml. The moisture regime is read on two axes, climatic (aridic, ustic, udic, perudic) and saturation (stagnic, anthrostagnic, aquic, peraquic), so a paddy recorded udic is anthrostagnic and a value on one axis says nothing of the other; permafrost within 50 cm gives the permagelic regime ahead of an estimate from the air; Cr is a paralithic contact only with a contact recorded or an FAO, WRB or USDA notation declared (otherwise the redox r of the Chinese field notation); an O horizon without a measured bulk density takes the range 0.1-0.4 Mg/m3, so a storage is a range. Hugo’s decisions of 2026-11-04 and 2026-11-05 are in inst/rules/cst2001/readings.yaml. Every other classification is unchanged (the fixtures of the other systems byte-identical).

soilKey 0.9.365 (2026-11-07)

Germany (KA5, 2005): the varieties and subvarieties

classify_ka5() now keys the fifth and sixth levels of the German systematics (section 5.7.1.4, pp. 263-282), an additive level after the subtype (Hugo’s decision Q1): the 38 variety codes of Tab. 49 by the 22 criteria of Tab. 46, offered where Tab. 50 marks the subtype, plus the six of its note 1 (og, c, z, k, v, ku) everywhere except where the subtype’s own formula writes the feature; the subvarieties as a digit on the letter (s and g flach 2 or tief 4, p schwach 2, mäßig 3 or stark 4; the base-saturation class BS1-BS5 of Tab. 48 on the potential or effective CEC is reported in the trace). Tab. 50 is in inst/rules/ka5/varieties.yaml with its pages, all 223 subtype rows read from the page images (the terrestrial rows of pp. 274-279 for the first time), with the codes, criteria, thresholds, subvariety classes, symbol rules I-VII and the printed examples. Each criterion is read on the horizons, three-valued: on the notation by the symbols written (Aeh, Ahe, Sew, rGo, eGo, zAh, oAh, Bms, Gkso, Cbtv, Ctv, Akh, Ap, the base-saturation marks), on the data by the record (base saturation, colours, organic substance, carbonate, EC, jarosite, cementation, clay films and bands, erosion degree, rewetting, land use); the humus forms only as recorded. A variety the data leave open is not named: it is listed as undecided in trace$varieties and one warning, the result not provisional (p. 263). The result gains rows of level variety (the code with its digit, the word of the name, the gloss, the full symbol in a symbol column), the full name in name (“podsolige pseudovergleyte Normbraunerde”, “(Acker)Gley”) and the symbol in trace$variety$symbol (p2.s2BBn, vGGn); the development depth of Tab. 47 is reported in the trace. The further subtypes of the type that pass join as a combination (Q21; Tab. 46 no. 17, rules II-IV: PP-GG-BB Podsol-Gley-Braunerde, BB-GGe, GGh-GGc (Humus)Kalkgley); the overlays of Tab. 46 no. 18 stay out of the levels and the name, reported in the trace (trace$variety$overlay); r and e stand before the letter they qualify (BB-rGG, r.gLFn, LF-eBB). An Aeh, Ahe, Akh or Aka takes a subtype formula’s plain Ah slot, so a podzolic or cultotrophic topsoil keeps the Norm subtype. make_ka5_example(variety = ...) gives a profile for each of the 38 codes; every printed example of pp. 268-272 reads back to its name from its symbol. The levels above the variety of every KA5 example are unchanged; their names gain the varieties their data carry (the default Bv and Tv colours of the examples are no longer iron-rich or reddish; the podzolic B of the subtype examples keeps its colour, so their data twins key as before, and is read as reddish). New horizon attribute schwertmannite_present (the variety sf). soilKey’s readings are in readings.yaml. Every other classification is unchanged.

Decided by Hugo on the review (2026-11-07): the name carries the varieties, the overlays do not (the decision of 0.9.364 stands); open varieties stay out of provisional_because; rt is read on the type’s own B or T horizon (Bv, Bs, Tv, Bt); a feature the subtype’s formula already writes is not named (an optional (e) counts as written; no note-1 c on the Kalkpaternia, Pararendzina, Rendzina and Kalktschernosem); on the notation route the carbonate data stand in for the prefix e only on rows with no symbol, and a Tschernosem’s carbonate is not geogenic by default; an Ae under an Ahe is stark podsolig; rule IV allows a hydromorphic type last (BB-LL-SS); a rewetting not recorded is absent; the base-saturation class goes to the trace only; a and g on the same deep aGo name a only; no anthropic-truncation stand-in for e; eu, m and dy are open where no horizon outside the C reaches into 2 to < 5 dm, and the O/C soils read their O horizon; the relict r qualifies a g or s only when that one is named, otherwise the type (rMCn); b on the data needs a brown colour; the aG of the variety a lies strictly deeper than 8 dm, and a description ending above it leaves a open; sf accepts schwertmannite.

soilKey 0.9.364 (2026-11-06)

Germany (KA5, 2005): the semiterrestrial, subhydric and Moor subtypes; the overlays

classify_ka5() now keys the subtypes of the semiterrestrial, subhydric and Moore types from the type texts (pp. 238-262): 85 subtypes (A 12, G 40, M 15, Ü 3, I 3, H 4, K 7 and the unit KV-KM; the Nassstrand and the four subhydric types of class J have none), in inst/rules/ka5/subtypes/{A,G,M,UE,I,J,H,K}.yaml, with the order and fallback of Q21: the Auenböden by their aGo at 4 to < 8 dm (Gley-X) or their aG at 8 dm or deeper (the Norm, an aG under the description allowed); the Gley transitions of the terrestrial and Auen types (the Gr typically 8 to 13 dm, not required), the Hang- and Quellen- subtypes by the prefix s or q (on the data by groundwater_source, the slope for the s), the Oxigley by the oxygen-rich groundwater or no Gr in a profile described to 13 dm (Q16), the Moorgley with no Norm subtype; the Marschen, the Strand and the Watt by their tidal prefixes tm, tb, tp; the Niedermoor and Hochmoor by the pH of their peat where measured; the Erd- and Mulmmoore by their suffixes, with the transitional unit KV-KM. Two open subtypes of Q22, in brackets: “[Übergangsmoorgley]” and “[vermulmtes Erdhochmoor]”. The Rohmarsch keeps Q20: a Go-Ah is a Rohmarsch unless the site is embanked or not tidally flooded.

The overlays (Tab. 46 no. 18) are reported in trace$overlay and the warnings, as varieties that change neither the levels nor the name: a mineral cover on a Moor keeps the Moor (Q7), named as substrate only under 2 dm, “flacher Gley über Niedermoor” (GG\HN) at 2 to < 3 dm and “Gley über Niedermoor” (GG/HN) at 3 to < 4 dm, the cover keyed as the mineral soil it would be; a fersiallitic or ferrallitic palaeosol under the soil is named “… über Fersiallit / Ferrallit” (Q19); a buried soil (fossil horizons of a layer II or deeper) is keyed alone from its own top and named by the thickness of the soil above, under 3 dm “flach”, 3 to < 7 dm, the Organomarsch over a Podsol by its own steps (1.5 and 3 dm, p. 254). make_ka5_example(subtype = ...) gives a profile for each of the 85 subtypes and the two open ones, with a data twin (63 key on the data alone); the wet type examples key to their Norm subtype and keep their types. The Paternia gate now leaves a Paternia-Vega (an aM under the ilC) to the Vega, and the Auenböden take an S under an aM anywhere above it (the Pseudogley-Vega). soilKey’s readings are in readings.yaml. Every other classification is unchanged.

soilKey 0.9.363 (2026-11-06)

Germany (KA5, 2005): the subtypes of the 28 terrestrial types

classify_ka5() now keys the subtypes (Subtypen) of the terrestrial types from the type texts (pp. 202-237): 138 subtypes of the 13 terrestrial classes (F 2, O 3, R 27, T 11, D 8, B 10, L 15, P 11, C 6, S 27, X 4, Y 14; the palaeosols VV and VW have none), in inst/rules/ka5/subtypes/, and the registry lists the level subtypes. Each subtype is its printed formula or formulas, matched on the horizons with the sequence engine, its depth windows read from the GOF (the Gley-X subtypes by the first G at 4 to < 8 dm, the Pseudogley-X by the first S, the Podsol-X and X-Podsol by the bottom of the podzol B, the humic and anthropogenic parts by 4 dm …) and its numbers (the base-saturation marks of the Ah/C-Boeden on the subtype scale, the clay band of the Parabraunerde-Braunerde, the Fahlerde’s clay difference in the LF-X subtypes, Cp/Fep, the slope of the Hangpseudogley, the Terra material …), with the limits in thresholds.yaml. Following Hugo’s decisions: inside a type the transitional subtypes come first in printed order, then the deviation subtypes, the Norm subtype last as the fallback, and every subtype that passes is listed in trace$subtypes_passing (Q21); the Treposol has no Norm subtype, and the Rigosol and Treposol take an open subtype for the type still recognisable under the R, written in brackets (“[BB-YY]”, “[Treposol aus Braunerde]”, Q22). A subtype the data leave open makes the result provisional, with the others as candidates; the Fahlerde-X subtypes and the Parabraunerde-Braunerde hold on the designation, provisionally, when their clay is not measured (C13). make_ka5_example(subtype = ...) gives one profile per subtype in the KA5 notation and its data twin (51 of the 138 key on the data alone); the 56 type examples keep their types and key to their Norm subtype. The Pseudogley gate now takes the Scw and Scd of the Kalkpseudogley, and the Ranker gate a thin loose layer over solid rock under 3 dm. The readings are in readings.yaml. Every other classification is unchanged.

soilKey 0.9.362 (2026-11-06)

Germany (KA5, 2005): the registry and the key to the 56 soil types

classify_ka5() keys a profile to the divisions (Abteilungen), classes (Klassen) and types (Typen) of the German soil systematics by Tab. 51 of the Bodenkundliche Kartieranleitung (pp. 283-288): the Moore, the subhydric, semiterrestrial and terrestrial soils, 21 classes and 56 types, read on the horizons of identify_horizons(pedon, "ka5") (the KA5 notation, else the order of tests on the data). The system is registered as ka5 (aliases germany, kartieranleitung, bodensystematik), experimental and opt-in. Following Hugo’s decisions: Tab. 51 with the numbers of the type texts (Q6) and two rules of the figures (Q5), the Moor under a cover of less than 4 dm (Q7), the last symbol carrying the horizon (Q8), the rock of the Ah/C-Boeden (Q15, Q18), a thick Ah without Axh undecided (Q17), the upper soil over a palaeosol (Q19), the Rigosol and Treposol by the record (Q23). A gate the data leave open makes the name provisional; the Fahlerde on its designation without the clay (C13) and the Rigosol without the kind of cultivation are listed as provisional too. The names are as printed (German), with English and Portuguese glosses in the rules; the horizon panel is in trace$horizon_panel, the figures’ consistency flags in trace$figures. make_ka5_example() gives one profile per type in the KA5 notation, its near miss and its data twin (51 of the 56 key on the data alone; the Knick-, Dwog- and Haftnaessemarsch and the palaeosols need the notation). The Pro app offers the 56 examples. The subtypes, overlays and varieties come next. Every other classification is unchanged.

soilKey 0.9.361 (2026-11-06)

Germany (KA5, 2005): the horizons on the data

The KA5 horizons read on the recorded data, used by nothing yet: .ka5_identify() (the identification identify_horizons(pedon, "ka5") will reach once the system is registered) reads every layer by soilKey’s fixed order of tests (Hugo’s decision Q9: F, H and O, Y, R, E, M, G, S, A, B with T and P, C, then the prefixes and suffixes and the transitions Bv-Sw, Sw-Bv, Bv-Go, Go-Bv, Ah-Bv, Ah-Go). Every test is three-valued: an undecided one gives candidates and the attributes that would decide them. A layer written in the KA5 notation keeps its horizon and the data’s reading goes to the evidence. The readers (R/ka5-readers.R): the depth datum GOF (p. 79), organic substance with the 15 to < 17.4 % band (Q10), the Ah minimum with the silt of other fractions (Q11), the Munsell pages (Q12), the area classes and field codes, the carbonate of the rock (Q15), the clay differences of the Bt and the Fahlerde. The numbers are in inst/rules/ka5/thresholds.yaml with their pages; soilKey’s new readings, for Hugo to confirm, in readings.yaml. Every classification is unchanged.

soilKey 0.9.360 (2026-11-05)

Germany (KA5, 2005): the horizon notation and the formulas

The first piece of the German soil systematics of the Bodenkundliche Kartieranleitung, 5th edition (Ad-hoc-AG Boden 2005), used by nothing yet: the notation reader, its catalogue, the formula dialect of the types and subtypes, and the new attributes. Every classification is unchanged (the fixtures of the other systems byte-identical).

soilKey 0.9.359 (2026-11-06)

South Africa 1991: the families

classify_za1991() now keys the second and last level of the South African soil classification of 1991: the 404 families of the 73 forms, by the 19 family criteria. The name follows the identification of the book (Q23): the form, the family code and name, and the USDA texture class of the A when its clay, silt and sand are recorded ("Hutton, Hu1200 Kelvin, sandy loam"; the sand grade with sand_grade). Every other classification is unchanged (the fixtures of the other systems byte-identical).

soilKey 0.9.358 (2026-11-05)

South Africa 1991: the registry and the 73 soil forms

The South African soil classification of 1991 joins the registry as za1991 (aliases za, sat, sat1991, south_africa), experimental and opt-in: classify_za1991() keys a profile to its soil form, make_za1991_example() gives one synthetic profile per form, and identify_horizons(pedon, "za1991") reads every layer as one of the 30 diagnostic horizons and materials. Every other classification is unchanged (the fixtures of the other systems byte-identical).

soilKey 0.9.357 (2026-11-05)

South Africa 1991: the other horizons and materials on the data

The third part of the South African soil classification of 1991: three-valued tests on the recorded data for the other seventeen diagnostic horizons and materials, the position pass and the identification of every layer (R/diagnostics-za-horizons.R). Nothing is classified yet; every other classification is unchanged (the fixtures of the other systems byte-identical).

soilKey 0.9.356 (2026-11-05)

South Africa 1991: the topsoils and the B horizons on the data

The second part of the South African soil classification of 1991: three-valued tests on the recorded data for the five topsoil horizons and the eight apedal and structured B horizons (R/diagnostics-za-horizons.R). Nothing is classified yet; every other classification is unchanged (the fixtures of the other systems byte-identical).

soilKey 0.9.355 (2026-11-05)

South Africa 1991: the diagnostic horizons and their names

The first part of the South African soil classification of 1991 (Soil Classification Working Group, 1991; the “Blue Book”, read from its open pages, SASRI 1999 and van Huyssteen 2020, without the book): the catalogue of its 30 diagnostic horizons and materials, the reader of their names, and the attributes the later parts read. Nothing is classified yet; every other classification is unchanged (the fixtures of the other systems byte-identical).

Readings decided on the review (2026-11-04)

Hugo decided the nine readings of this part with the fixes of its review: soilKey’s two-letter short forms (ot, re, ye …) are not read until checked on a survey sheet; calcrete by its adjective (alone undecided between the soft and the hardpan carbonate horizon); Cr hints at the saprolite, the wet materials, the G horizon and the lithocutanic B; the other six (recognition by name, the gleycutanic B by position, Afrikaans names, words of no diagnostic horizon, the master letter, the declared values) as recommended. inst/rules/za1991/readings.yaml records them with the four decisions of 2026-11-04 this part applies.

soilKey 0.9.354 (2026-11-04)

France: the correspondence tables of the Référentiel pédologique 2008

The annexes of the RP 2008 that correlate it with other systems, and the labels of the RP of 1995, are shipped as data (Hugo’s decision Q1): codes and names as the book prints them, with the page, its doubts (“?”) kept as a flag and its slips noted; no sentence of the book. They are notes for display and benchmarks: no classifier reads them, and every classification is unchanged (the fixtures of all systems byte-identical).

Readings confirmed (2026-11-04)

Hugo confirmed the readings of this release, with the points of its review: all the tables of Annex 5 shipped; the table of Annex 6 as data beside the reader’s copy, FE, OX and F of row B intertropical and BTfe, FSj and the Ha under the A1 flagged as slips; a CPCS result shown the row of the most specific category of its chain; the entries of Annex 7 that name no reference read through their chapter (fersialsols calcaires and saturés as the carbonatés and calciques, luvisols-rédoxisols as the double of any luvisol reference); the brunisols oligo-saturés read as dystriques, the histosols recouverts and the humiferous andosols of 1995 as any reference of their group. Entries of readings.yaml record them.

soilKey 0.9.353 (2026-11-04)

France: the humus forms of the Référentiel pédologique 2008 (Annex 1)

The new humus_form_rp() attaches the épisolum of a profile to a humus form of Annex 1 of the RP 2008 (pp. 327-355), and classify_rp2008() reports it beside the name: the new field $humus_form (one row: the form, its name, type, group, the route, the candidates, the recorded form and any conflict, the qualifiers) and $trace$humus_form (the whole reading). The “à

” part of the name waits for the name builder of a later part, so the name, the levels and the candidates of the references do not change. Every other classification is unchanged (the fixtures of the other systems byte-identical).

Readings confirmed, and the review (2026-11-04)

Hugo confirmed the eight readings of this release (the order of the reading, no O horizon recorded, the continuity of the O horizons, the wet épisolum, the open land, the forms without fine earth, the recorded form, the qualifiers). An independent review then found the key itself right and fourteen defects around it, all fixed: a form is no longer decided when the horizons may also fit no form (a dead end of the key, a gate with no form after an undecided one, a top layer that may be an H), the new no_form_possible saying so; the recorded form no longer stands in for the biological structure of the A inside the key; the wet test reads the layer under the organo-mineral one for a mor only; the forms without fine earth keep every type an undecided OH or an undecided R, D or X leaves possible; the amphimus de pelouse needs an OHzo; the land uses are read as whole words, the present use first (a cleared forest now grazed is grassland); a qualifier that needs a non-carbonated A is undecided while the carbonates are; the continuity of an O of open kind is undecided. Hugo decided its four open points: a continuous OLn gives a mésomull as the key does, with a note on the early-winter eumull (p. 342); only continuous OH horizons count toward the 1 cm of the dysmoder (p. 344); the label of a decided type is the name of the type; woody_fragments_pct stands in for the woody debris, flagged. Twelve entries of readings.yaml record them.

soilKey 0.9.352 (2026-11-04)

France: the Référentiel pédologique 2008 attaches its last 18 references

classify_rp2008() now tests the 110 references of the 34 groups of references (GER): the ninety-two of 0.9.346 to 0.9.351 and the six chapters that close the book, pp. 291-326: régosols (1), salisols et sodisols (7), thalassosols (3), thiosols et sulfatosols (2), veracrisols (1) and vertisols (4), in inst/rules/rp2008/references/<ger>.yaml. They are plugged into the attachment of 0.9.346 as parts 5 to 7 were; their signposts leave key.yaml, which no longer holds any, and no double or precedence waits for a later release. Every other classification is unchanged (the fixtures of the other systems byte-identical).

The review, and the readings confirmed (2026-11-04)

Hugo confirmed the eleven readings of this part as recommended, amended by his decisions on its independent review, and the defects it found are fixed:

soilKey 0.9.351 (2026-11-04)

France: the Référentiel pédologique 2008 attaches 21 more references

classify_rp2008() now tests the 92 references of twenty-eight groups of references (GER): the twenty-one of 0.9.346 to 0.9.349 and the seven chapters that follow in the book, pp. 243-290: pélosols (3), peyrosols (1), phæosols (2), planosols (3), podzosols (8), rankosols (1) and réductisols et rédoxisols (3), in inst/rules/rp2008/references/<ger>.yaml. They are plugged into the attachment of 0.9.346 as parts 5 and 6 were; their signposts leave key.yaml. The 18 references of the other 6 GER (régosols, salisols et sodisols, thalassosols, thiosols et sulfatosols, veracrisols, vertisols) come later. Every other classification is unchanged (the fixtures of the other systems byte-identical).

Readings confirmed, and the review (2026-11-04)

Hugo confirmed the twelve readings of this part, amended by his decisions on its review: the 50 cm of hydromorphic features, the base of the réductisols (and the substrate and water, decision 5), the doubles the book names with the rédoxisols and réductisols, the aerated S of the brunisol-rédoxisol, the doubles of the podzosols named by the GER, no histosol-réductisol (decision 2), the 8 cm of the planosols, the planosols tronqués, the pH and 40 cm of the pélosols, the humus and the post-podzosols, the rankosols (decision 7), the Sh and BTh of the phæosols. Nine entries record the decisions of the review.

soilKey 0.9.350 (2026-11-04)

France: the FE of the ferruginosols on the data

On the data route the FE horizon of the ferruginosols was read as a BT whenever a clay increase over the A let soilKey’s argic() stand in for clay films that were not recorded, so ferruginous tropical profiles described without designations went to the fersialsols or the luvisols. On the notation route nothing changes.

Readings confirmed (2026-11-04)

Hugo confirmed the two readings of this release with the amendments of its review (the BT mark of another notation, the FE within the tolerance, the clay mineralogy before the CEC), and decided the field route of the FS and the clay increase of a BT under an FE; four entries of readings.yaml record them.

soilKey 0.9.349 (2026-11-04)

France: the Référentiel pédologique 2008 attaches 18 more references

classify_rp2008() now tests the 71 references of twenty-one groups of references (GER): the fifteen of 0.9.346 and 0.9.348 and the six chapters that follow in the book, pp. 201-242: histosols (5), leptismectisols (1), lithosols (1), luvisols (6), nitosols (1) and organosols (4), in inst/rules/rp2008/references/<ger>.yaml. They are plugged into the attachment of 0.9.346 (registry, precedence, doubles, rapid key) as part 5 was; their signposts leave key.yaml. The 39 references of the other 13 GER come later. Every other classification is unchanged (the fixtures of the other systems byte-identical).

Readings confirmed, and the review (2026-11-04)

Hugo confirmed the nine readings of this part, amended by his decisions on its review: the lithosol obstacle at 10 cm or less, with one horizon over it; the tropical references before the lithosols only with their horizons under the cuirasse; the index of the lexicon in the middle band and for the derniques; the BT of 5YR or redder or micro-polyhedral, and an h on the E or the BT, barring the luvisols; the tronqués before the typiques; an S over 10 cm under the O barring the organosols; the Sal of the organosols and alocrisols humiques. Six entries record those decisions. An unread mineral designation (ASa, SSa) is no longer read as a possible organic horizon, and an O of undecided kind may be an OHta.

soilKey 0.9.348 (2026-11-03)

France: the Référentiel pédologique 2008 attaches 24 more references

classify_rp2008() now tests the 53 references of fifteen groups of references (GER): the nine of 0.9.346 and the six chapters that follow in the book, pp. 146-200: ferrallitisols et oxydisols (7), ferruginosols (4), fersialsols (4), fluviosols (4), grisols (3) and gypsosols (2), in inst/rules/rp2008/references/<ger>.yaml. They are plugged into the attachment of 0.9.346 (registry, precedence, doubles, rapid key) without changing it; their signposts leave key.yaml. The 57 references of the other 19 GER come later. Every other classification is unchanged (the fixtures of the other systems byte-identical).

Fixed

Readings confirmed (2026-11-03)

Hugo confirmed the eight readings of readings.yaml for this part (the intertropical domain of a profile written in the RP notation with no climate or latitude; F against OX, the hardness and the types; the sequences of the ferruginosols; the A, the FSt, the carbonates and the iron of the fersialsols; the origin, the site and the sequences of the fluviosols; the Aso, Eh, BTh, BThd and the index of the grisols; the crust of the gypsosols; the parent material written last), those of the fersialsols and fluviosols amended by his decisions D1, D2, D3 and R1, and three entries record his decisions D3, R1 and R2.

soilKey 0.9.347 (2026-11-03)

Russia: the species, and the 1977 analogue as a note

The Russian soil classification (Field Guide of 2008) now names its soils down to the species (вид) of chapter 5.1, after the subtypes, and gives the analogue of the type in the USSR classification of 1977 (chapter 6) as a note that never changes the classification (Hugo’s decision Q1). The varieties and ranks of 5.2 and 5.3 are not keyed, and a technogenic surface formation still stops at trunk E.

Hugo’s decisions (2026-11-03)

Fixed after the review (2026-11-03)

soilKey 0.9.346 (2026-11-03)

France: the Référentiel pédologique 2008 attaches its first 29 references

The French Référentiel pédologique 2008 (AFES; Baize and Girard coord.; Éditions Quæ, 2009) enters the registry as rp2008 (namespace rp, aliases rp and referentiel; france, french and fr stay with the CPCS 1967), experimental and opt-in: classify_all() runs it only when asked. classify_rp2008() tests the 29 references of the first nine groups of references (GER): alocrisols (2), andosols (6), anthroposols (5), arénosols (1), brunisols (2), the solums dominated by calcium or magnesium (7: rendosols, calcosols, dolomitosols, rendisols, calcisols, magnésisols, calcarisols), chernosols (3), colluviosols (1) and cryosols (2). Every other classification is unchanged.

Hugo’s decisions read here (2026-11-02)

Hugo’s answers on the readings (2026-11-03)

After the review (2026-11-03)

Hugo’s decisions after the review (2026-11-03)

Hugo’s decisions on the readings of the review (2026-11-03)

soilKey 0.9.345 (2026-11-02)

Russia: the subtypes and the full name

The Russian soil classification (Field Guide of 2008) names its soils down to the subtype (подтип): each division has one list of subtypes in chapter 4, and a soil is named by its type and every subtype of the list that passes, in the order of the list, comma-separated and in the plural as printed: “Подзолистые глееватые, языковатые” (Hugo’s decision Q16).

Hugo’s decisions (2026-11-02 and 2026-11-03)

Nine readings of the subtypes, accepted by Hugo and recorded in readings.yaml as his decisions, as revised after the review of the subtypes: no subtypes for a soil whose type is unassigned; the six single-type sentences; what counts as written in the formula (the horizon that is the feature in full: G, Q, V, ML, S, F, CR; Cca keeps the residual-carbonate subtype out of the solods; an optional (ca) does not; a V or S overlay is v or s); the hosts the lists narrow (h, mr, Th, [e-hf], el of the weakly developed soils on W, hi of the agrozems under PT, ae of CJ on AJ, crm of the cryozems on or over CR, ox, fn and ff of the eluvial soils on their D or EL); a buried soil does not name the soil over it where the formula writes it, and a thin deposit over a buried soil is r or rh; the misprints corrected and the glosses kept; the layered-ochric soils (buried profiles only); the subtypes their division cannot have (pb in CC, CE and CG; agr, ad and pa in the abrazems; s and cs in CK; x in trunk C after the chemozems; the contact-eluviated podzol of p. 67, since the CB list has no el; no v for CH04 with a V on its G; a solonchak under a small deposit loses its division in the key); and the form of the full name. A tenth, of 2026-11-03: where the list has ELg, g is read on the layers other than EL (gleying in EL alone is ELg alone, in BT too both). No reading of the Russian classification waits for confirmation.

The report’s note on the undecided classes now covers the undecided subtypes too, and print() no longer lists the Russian full name and the formula of the type among the qualifiers.

soilKey 0.9.344 (2026-11-02)

Russia: the tests of the genetic features

The Russian soil classification (Field Guide of 2008) gains the tests of its genetic features (признаки, section 3.2 and the subtype lists of chapter 4): one test per feature, shared by every division that lists it, for the subtypes that follow (the 26 lists and the full name come next). Nothing is named yet, so every classification is unchanged.

Hugo’s decisions (2026-11-02)

After the review (2026-11-02)

Hugo’s decisions after the review (2026-11-02)

soilKey 0.9.343 (2026-11-02)

France: the reference horizons of the Référentiel pédologique 2008 on the data

The Référentiel pédologique 2008 has no key to its reference horizons: they are concepts read with the whole sequence (p. XII). This release reads them on the recorded data, layer by layer, for profiles not written in the RP notation, and gives the horizon frame the references will be matched on. Nothing is classified yet, so every classification of the other systems is unchanged; the registry entry and the references follow.

Hugo’s decisions read here (2026-11-02)

soilKey 0.9.342 (2026-11-02)

Russia: the types of trunks A, B and D, and the name of the chemozems

The Russian soil classification (Field Guide of 2008) gains the types of the six divisions of the organogenic, synlithogenic and weakly developed trunks: 58 types, matched as the types of trunk C are (0.9.338, 0.9.339). The chemozems (CU), which have no types, are now named by their pollutants and the soil they were. Every division has its type level; the subtypes follow. Every other classification is unchanged.

Hugo’s decisions (2026-11-02)

After the review (2026-11-02)

Hugo’s decisions after the review (2026-11-02)

soilKey 0.9.341 (2026-11-02)

France: the notation of the Référentiel pédologique 2008

The French Référentiel pédologique 2008 (AFES) writes its reference horizons in a notation of its own (LAch, NaBTg2, II Scag, E&BT, OFrzo) and defines its references by sequences of them. This release adds the reader of that notation, the catalogue of its horizons and marks, and the fields its references will read. Nothing is classified yet, so every classification is unchanged; the horizons on the data, then the registry entry with the references, follow.

Hugo’s decisions (2026-11-02)

After the review (Hugo, 2026-11-02)

soilKey 0.9.340 (2026-11-02)

Attachment: engine pieces for systems that are not keys

This release prepares the French Referentiel pédologique 2008, which is not a key: a soil is attached to one, two or none of its references, simply or imperfectly. It adds the generic pieces that system will use. No system uses them yet, and every other classification is unchanged.

Hugo’s decisions (2026-11-02)

soilKey 0.9.339 (2026-11-02)

Russia: the types of the divisions CK to CT

The Russian soil classification (Field Guide of 2008) gains the types of the ten divisions CK to CT: 111 types, matched as the types of CA to CJ are (0.9.338). Every division of trunk C now has its types but the chemozems (CU), which have none. Every other classification is unchanged.

Hugo’s decisions (2026-11-02)

soilKey 0.9.338 (2026-11-02)

Russia: the types of the divisions CA to CJ

The Russian soil classification (Field Guide of 2008) names its types by the formula of the profile, drawn in chapter 4. This release adds the type level for the ten divisions CA to CJ: 106 types, matched on the diagnostic horizons the divisions read. The other divisions keep the division as the name until their types follow. Every other classification is unchanged.

Hugo’s decisions (2026-11-02)

soilKey 0.9.337 (2026-11-02)

Russia: the registry entry, the trunks and the 27 divisions

The Russian soil classification (Field Guide of 2008) joins the registry as kidpr2008 (aliases kidpr, russia, ru2008), experimental and opt-in: classify_all() does not run it unless asked, so every other classification is unchanged. This release keys the five trunks (key 2.2) and the 27 divisions (key 2.3) on the diagnostic horizons of the profile, from the Russian notation where the profile is written in it, else from the key to horizons on the data (0.9.335-0.9.336); the types and subtypes follow.

Hugo’s decisions (2026-11-02)

After the review (Hugo, 2026-11-02)

soilKey 0.9.336 (2026-11-02)

Russia: the diagnostic horizons on the data

The Russian soil classification (Field Guide of 2008) identifies the diagnostic horizons of a profile by a key of 66 positions (section 2.1). This release runs that key on the recorded data, so that every layer gets its Russian horizon where the profile is not written in the Russian notation, with soilKey’s WRB diagnostics standing in where a field descriptor of the key is missing. Nothing is classified yet, so every classification is unchanged; the registry entry with the trunks and divisions follows.

Hugo’s decisions (2026-11-02)

soilKey 0.9.335 (2026-11-02)

Russia: the notation of the Field Guide of 2008

The Russian soil classification (Field Guide of 2008) writes its horizons in a notation of its own (AY, EL, BEL, BTg, BCAs,cs) and names its types by profile formulas in it. This release adds the reader of that notation, the catalogues of its horizons and features, and the fields its horizon key will read. Nothing is classified yet, so every classification is unchanged; the horizon key on the data, then the registry entry with the trunks and divisions, follow.

Hugo’s decisions (2026-11-02)

soilKey 0.9.334 (2026-11-02)

Russia: the engine for profile formulas

The Russian soil classification (Field Guide of 2008) names its types by profile formulas (“O-EL-BEL-BT-C”) and its subtypes by a list of features per division. This release adds the generic pieces it needs; no system uses them yet, so every classification is unchanged. The Russian notation, horizons, divisions and types follow.

Hugo’s decisions (2026-11-02)

soilKey 0.9.333 (2026-11-01)

France: the 276 subgroups of the CPCS 1967

classify_cpcs1967() now keys a pedon to its subgroup, the fourth and last registry level, subgroups. A subgroup the text names in full stands alone (“Podzols humo-ferrugineux”, “Chernozem modal”); one it names by an adjective follows its group (“Rankers, à mor”, “Sols ferrallitiques moyennement désaturés en (B) typiques, Faiblement appauvri”). name is now the deepest level.

Hugo’s decisions (2026-11-01)

soilKey 0.9.332 (2026-11-01)

France: the 101 groups of the CPCS 1967

classify_cpcs1967() now keys a pedon to its group, a third registry level, groups, for example “Podzols”, “Sols lessivés” or “Sols ferrallitiques fortement désaturés en (B) typiques”. The subgroups follow.

Hugo’s decisions (2026-11-01)

soilKey 0.9.331 (2026-11-01)

France: the 35 sub-classes of the CPCS 1967

classify_cpcs1967() now keys a pedon to its sub-class, a second registry level, subclasses, for example “Sols ferrallitiques fortement désaturés en (B)” or “Sols brunifiés des climats tempérés humides”. The groups and subgroups follow.

Hugo’s decisions (2026-11-01)

soilKey 0.9.330 (2026-11-01)

France: the twelve classes of the French soil classification (CPCS 1967)

classify_cpcs1967() keys a pedon to the twelve classes of the French soil classification of 1967 (Commission de Pédologie et de Cartographie des Sols, Classification des sols), a system of its own beside the other national systems. make_cpcs1967_example() gives one profile per class. The names are French, as the text writes them, in name and levels$name_native. The sub-classes, groups and subgroups follow.

Hugo’s decisions (2026-11-01)

The other systems do not change.

soilKey 0.9.329 (2026-11-01)

Japan: the soil phases of the Comprehensive Soil Classification System of Japan (the CSCJ now complete)

classify_cscj2011() now gives the soil phases of chapter VIII in ClassificationResult$phases, beside the class name, as classify_scsj2017() does. With them, the CSCJ 2011 is complete in soilKey: 10 great groups, 27 groups, 116 subgroups, 381 soil series groups and the phases.

Hugo’s decisions (2026-11-01)

The SCSJ 2017 and the other systems do not change.

soilKey 0.9.328 (2026-11-01)

Japan: the 381 soil series groups of the Comprehensive Soil Classification System of Japan

classify_cscj2011() now keys a pedon down to its soil series group (土壌統群), the CSCJ’s lowest category, for example “fine-textured Reddish Argic Red-Yellow soils” / 細粒質赤色粘土集積赤黄色土.

Hugo’s decisions (2026-11-01)

The SCSJ 2017 and the other systems do not change.

soilKey 0.9.327 (2026-11-01)

Japan: the 116 subgroups of the Comprehensive Soil Classification System of Japan

classify_cscj2011() now keys a pedon to its subgroup (chapter VI), named by its word before the group’s name, for example “Argic Calcaric Dark Red soils” and 粘土集積石灰性暗赤色土.

Hugo’s decisions (2026-11-01)

The SCSJ 2017 and the other systems do not change.

soilKey 0.9.326 (2026-11-01)

Japan: the 27 groups of the Comprehensive Soil Classification System of Japan

classify_cscj2011() now keys a pedon to its group (chapter VI): for example the Fulvic Andosols, the Calcaric, Dystric and Eutric Dark Red soils, and the Brown Lowland soils.

Hugo’s decisions (2026-11-01)

The appendix’s typos “Fuluvic” and “Volcangenous” are written Fulvic and Volcanogenous. The other systems do not change.

soilKey 0.9.325 (2026-11-01)

Japan: the Comprehensive Soil Classification System of Japan, the ten great groups

classify_cscj2011() keys a pedon to the ten great groups of the Comprehensive Soil Classification System of Japan, First Approximation (Obara et al. 2011, NIAES), a system of its own beside the SCSJ 2017. make_cscj2011_example() gives one profile per great group. Names are the English names of the text’s appendix 2, with the Japanese ones in levels$name_native. The 27 groups, 116 subgroups, 381 soil series groups and the phases follow.

Hugo’s decisions (2026-11-01)

The other systems do not change; the SCSJ changes only in its Red-Yellow soils’ count (also on #129).

soilKey 0.9.324 (2026-10-31)

Japan: the soil phases of the Soil Classification System of Japan

classify_scsj2017() now gives the soil phases of chapter V in ClassificationResult$phases, a new field (kind, code, English and Japanese name, basis), which print() lists. The class name is left as it is.

Hugo’s decisions (2026-10-31 and 2026-11-01)

Other systems do not change.

soilKey 0.9.323 (2026-10-31)

Japan: the 120 subgroups of the Soil Classification System of Japan

classify_scsj2017() now keys a pedon to the subgroups of chapter III: 120 under the 26 groups (Haplic, Humic, Cumulic, Brown-humic, Thapto-humic, Thapto-upland, Endofluvic, Aquic, Peaty, Anthraquic, Albic, Epi-gleyed, Thionic, Strong and Mottled, Reddish, Andic, Podzolic, Eutric, Calcaric, Granitic, Para-lithic …). Each is named by its word before the group’s name, in English and in Japanese (levels$name_native; the generic classifier now fills {parent} in the native name too).

The readings are in inst/rules/scsj2017/readings.yaml. Other systems do not change.

soilKey 0.9.322 (2026-10-31)

Japan: the 26 groups of the Soil Classification System of Japan

classify_scsj2017() now keys a pedon past its great group to the 26 groups of chapter III, among them Podzolic, Regosolic, Gleyed, Wet, Non-allophanic and Allophanic Andosols, Fluvic Paddy, Gley, Gray, Brown and Regosolic Fluvic soils, Argic and Cambic Red-Yellow soils, Stagnogley and Pseudogley soils, Magnesian and Calcareous Eutrosols, and Volcanogenous and Sandy Regosols, Lithosols and Terrestrial Regosols. Each has its English and Japanese name.

Hugo’s decisions (2026-10-31)

The readings are in inst/rules/scsj2017/readings.yaml. Other systems do not change.

soilKey 0.9.321 (2026-10-31)

Japan: the great groups of the Soil Classification System of Japan (2017)

A new, experimental and opt-in system: the Soil Classification System of Japan (SCSJ 2017) of the Japanese Society of Pedology, Fifth Committee for Soil Classification and Nomenclature. This release keys the ten great groups of chapter II with the definitions of chapter IV; groups, subgroups and the soil phases follow, then the Comprehensive Soil Classification System of Japan (2011) as a system of its own.

Hugo’s decisions (2026-10-31)

The choices where the text is silent are in inst/rules/scsj2017/readings.yaml. Other systems do not change: the 44 canonical profiles key as before under WRB, SiBCS and USDA, and the Canadian, Australian, New Zealand and Hungarian examples as before.

soilKey 0.9.320 (2026-10-30)

Australia: Queensland’s SALI read from its site reports and its soil chemistry API

Queensland’s Soil and Land Information system (SALI) publishes about 21,000 sites with the surveyors’ ASC label and laboratory data, anonymously and under CC BY 4.0 (State of Queensland). Its morphology exists only in a per-site report (a PDF), so the reader reads the PDF. The data are not shipped with soilKey.

Hugo’s decisions

The readings (the pilot’s, kept)

The run (6,911 sites, 5,600 pedons)

Of the layer’s sites with an ASC order, 18,557 are not in NatSoil already (same project and site, or a NatSoil site within 100 m). They were taken in a fixed random order, in stages of 2,000. The run stopped in the fourth stage, when the report server began refusing requests (after some 14,000, from 2 processes pausing 1 s): 6,911 sites were fetched. Reports over 150 KB (those with embedded site photos) were not downloaded: 1,286 sites (18.6%), unevenly by order (Organosols 82%, Calcarosols 41%, Dermosols 29%, Tenosols 27%; Vertosols 11%, Hydrosols 15%). 25 reports have no morphology table, which leaves 5,600 pedons. Against the surveyors’ labels:

ASC level Profiles compared Agreement Where the key decides
order 5,600 34.8% (36.6% counting a keyed Arenosol for a surveyed Tenosol or Rudosol) 83.3% of 1,017
suborder, where the order agrees 1,854 82.6% 91.8% of 571
great group, where the suborder agrees 1,106 42.8% 73.5% of 340
subgroup, where the great group agrees 446 40.1%

The order agreement stayed within 34% to 35% from the first stage (1,588 pedons) to the last. The Hydrosols (1,377 pedons) agree in 4.9%, mostly keyed as Kandosols: the key confirms a Hydrosol by its drainage, which the reports seldom record (the depth to free water, observed once, is kept but not used). The Ferrosols (156) agree in 11.5%; most of the rest are keyed as Dermosols, as free iron was measured in only 30 of them. The laboratory data come from the API for 5,008 pedons and from the report’s table for 562; 30 have none. The MIR predictions fill 243 values in 30 pedons. A MIR water pH never stands beside a measured CaCl2 pH; two MIR calibrations behind one value occur in 4 pedons (16 values).

A pilot of 200 sites stratified by order (186 pedons) gave 37.6% at the order and 83.3% of 36 where the key decides. For comparison, the Queensland profiles of NatSoil (agencies 301, 302, 304 and 399; 4,412 profiles) give 54.3% at the order, 82.6% of 783 where the key decides. The 44 canonical fixtures are byte-identical under WRB, SiBCS and USDA.

Ferrosols: vertic properties that are not recorded

soilKey 0.9.319 (2026-10-30)

New Zealand: the fluvial features read river deposits and the spelling aluvium

Australia: the agreement on NatSoil, measured again

The Australian key has been measured since 0.9.278 on CSIRO’s NatSoil (benchmark_natsoil(), profiles with the surveyor’s ASC label, CC BY 4.0, not shipped). On 9,700 profiles with the current code no prediction has changed since the last measurement (2026-10-27), at any level:

ASC level Profiles compared Agreement Where the key decides
order 9,700 43.9% (45.8% counting the Arenosols, absent from the older labels, as Tenosols or Rudosols) 74.5% of 1,305
suborder, where the order agrees 3,694 75.9% 95.5% of 694
great group, where the suborder agrees 2,669 32.8% 77.5% of 413
subgroup, where the great group agrees 852 33.3% 25.0% of 20

soilKey 0.9.318 (2026-10-30)

The New Zealand National Soils Database read by Hugo’s readings

NSD reader (read_nsd_pedons())

WRB 2022

soilKey Pro

Agreement on the NSD (94 surveys)

NZSC level 0.9.317 0.9.318
order 43.2% (492/1,139) 43.6% (497/1,139)
group 24.3% (276/1,134) 26.7% (303/1,134)
subgroup 13.8% (154/1,114) 14.7% (164/1,114)

Of the 73 profiles the surveyors call Fluvial Recent Soils, 34 are now keyed as such (9 in 0.9.317). The 44 canonical fixtures are byte-identical under WRB, SiBCS and USDA.

soilKey 0.9.317 (2026-10-30)

The national systems in soilKey Pro, and their agreement measured

soilKey Pro

Canada: designations in the FAO notation (CSSC)

Hungary (HSCS 2024)

New Zealand: the National Soils Database

WRB and USDA

Agreement measured

System Profiles Level 0.9.316 0.9.317
CSSC ISIS Canada, 20 order 8 13
great group 5 9
subgroup 3 4
HSCS ISIS Hungary, 20 type (genetic name via the guide’s section 9) 6 (8 lenient) 7 (9 lenient)
NZSC NSD, 1,139 with a class order (no reader) 43.2%
1,134 group 24.3%
1,114 subgroup 13.8%
USDA NSD, 600 with a class order 38.5%

soilKey 0.9.316 (2026-10-30)

The Hungarian system (HSCS 2024) names its subtypes and varieties

soilKey 0.9.315 (2026-10-30)

The last WRB 2022 and USDA readings of the ISIS triage

WRB 2022

USDA Soil Taxonomy

Results against 0.9.314

panel 0.9.314 0.9.315
FEBR USDA (886) 44.5 50.9
KSSL USDA (497) 38.4 38.8
ISIS USDA (748) 47.5 47.9
ISIS WRB 2022 (481) 61.1 61.3
FEBR WRB (218), WoSIS (130), AfSP (120) 22.0, 16.2, 28.3 unchanged (qualifiers change)
BDsolos, FEBR and Redape SiBCS 57.5, 37.6, 87.1 unchanged

soilKey 0.9.314 (2026-10-29)

WRB 2022 mollic and umbric horizons: criteria 1-3 in every layer

soilKey 0.9.313 (2026-10-29)

ISIS: slickensides and pressure faces are read as absent only where the cutans field is free

soilKey 0.9.312 (2026-10-29)

The AfSP reader reads its structure codes

soilKey 0.9.311 (2026-10-29)

WRB 2022 qualifiers, the argic, nitic, mollic and irragric horizons, and two ISIS reader guards by the text

These are the remaining corrections from the triage of the ISIS profiles where soilKey and ISRIC disagree.

soilKey 0.9.310 (2026-10-29)

WRB 2022 diagnostics by the text: six groups

Found by running soilKey on ISRIC’s World Soil Reference Collection (ISIS). Six investigations sorted the profiles where soilKey and ISRIC disagree. Many came from soilKey readings that did not follow the 2022 text, and those are fixed here, group by group. Each group was measured on the BDsolos, FEBR, KSSL, Redape, AfSP, WoSIS and ISIS panels. The SiBCS and USDA keys keep their readings: where they shared a WRB diagnostic, it now has a separate reading for them.

soilKey 0.9.309 (2026-10-29)

ISRIC’s KE009: four WRB qualifiers and the key to the Oxisols by the texts

Jelle Janssen’s profile KE009 (ISRIC, Kenya) is a Rhodic Ferralsol (Clayic, Epic, Eutric, Humic) and a Rhodic Eutrustox for ISRIC. soilKey gave Rhodic Ferralsol (Clayic, Epic, Ferric, Ochric) and Typic Paleustolls. Each difference was a soilKey reading that did not follow the text. KE009 now gets ISRIC’s names in both systems.

soilKey 0.9.308 (2026-10-29)

soilKey reads ISRIC’s World Soil Reference Collection (ISIS)

Asked for by Jelle Janssen (ISRIC), who had matched the ISIS properties to soilKey’s by hand.

soilKey 0.9.307 (2026-10-29)

A soil temperature regime warmer than gelic rules out permafrost

Found on Jelle Janssen’s profile KE009 (ISRIC, Kenya), which kept the Cryosols open for want of a permafrost temperature.

soilKey 0.9.306 (2026-10-29)

Pro app: the close calls name their classes, and a field for the soil moisture regime

Both reported by Jelle Janssen (ISRIC).

soilKey 0.9.305 (2026-10-29)

The Hungarian diagnostic soil classification: the 15 soil types

classify_hscs2024() keys a profile through the key to the soil types of the Hungarian diagnostic classification (Michéli et al. 2024, A diagnosztikus szemléletű hazai talajosztályozási rendszer, second approximation), from the Láptalaj (peat soil) to the Földeskopár (other soils). Experimental and opt-in, like the other national systems: classify_all(p, systems = "hscs").

Hugo decided seven readings (2026-10-29):

The other choices where the text is silent are in inst/rules/hscs2024/readings.yaml (17 topics).

soilKey 0.9.304 (2026-10-29)

New Zealand Soil Classification: rows of unknown role under the A horizon and in the B

Two places where classify_nzsc4() read a mineral row with no designation one way only now try every reading and keep a verdict only when all agree.

On the 6,351 profiles of the NZSC review set, 6 change: one Argillic Perch-gley Pallic Soil becomes undecided at the Pallic order (its platy row under the A may be A, and then no fine texture lies between the A and 60 cm), and five Sandy Recent Soils become undecided at the sandy group, because a row with no designation runs below 60 cm and an A reaching 60 cm leaves the sandy window empty, which the sandy groups already read as undecided. Profiles with every row designated are unchanged. The readings file inst/rules/nzsc4/readings.yaml gains one topic (81 in all).

soilKey 0.9.303 (2026-10-29)

Pro app: uploads and downloads over the websocket, and a notice when the connection is lost

On soilkeypro.com some uploads and downloads failed with “Not Found”. Shiny moves files by plain HTTP requests to /session/<token>/upload/ and /session/<token>/download/, which only the R process holding the session can answer. Cloud Run keeps a visitor on one instance on a best-effort basis, so while a new instance was starting a request could reach another one. The websocket stays on the instance of the session, so the files now travel over it.

soilKey 0.9.302 (2026-10-29)

New Zealand Soil Classification: the subgroups of the Brown, Anthropic, Recent and Raw Soils

classify_nzsc4() now keys the 20 groups of the Brown, Anthropic, Recent and Raw Soils to their 109 subgroups, following the keys to subgroups of the New Zealand Soil Classification, 4th edition: from the Mottled Allophanic Brown Soils to the Typic Sandy Raw Soils. With this release every group of the 15 orders is keyed to its subgroups (336 subgroups of 70 groups); the Hydrothermal Recent Soils and six groups of Raw Soils have none and keep the group name.

Hugo decided seven readings:

The other readings are in inst/rules/nzsc4/readings.yaml (80 topics).

Two independent reviews were made, and their findings are fixed. The review against the book confirmed every code, position and default, and found the Maori names without their macron, scoria that need not reach 60 cm in the Scoriaceous Tephric Recent Soils, a coarse fill layer of natural gravel, and word lists that matched inside other words. The logic review ran 6,000 random profiles and refilled their missing values; it found no error and no change against 0.9.301, and verdicts decided where a horizon of unknown role leaves them open (the firm horizon and the B above it, the earthy B, the greater part of the B, the thin weathered-B, the subsurface horizons). The fill of the Compacted Fill Anthropic Soils is now the anthropic soil material the order key reads, and only the uppermost buried soil counts. Outside the four orders, rock (R, CR) with no pH is no longer read as possibly acid in the acidic subgroups of 0.9.299, which can only decide an open verdict.

soilKey 0.9.301 (2026-10-29)

New Zealand Soil Classification: the subgroups of the Semiarid, Oxidic, Granular and Pallic Soils

classify_nzsc4() now keys the 17 groups of the Semiarid, Oxidic, Granular and Pallic Soils to their 78 subgroups, following the keys to subgroups of the New Zealand Soil Classification, 4th edition: from the Mottled Aged-argillic Semiarid Soils to the Typic Immature Pallic Soils. Eleven of the 15 orders now reach subgroup level (227 subgroups of 50 groups); the Brown, Anthropic, Recent and Raw Soils follow.

Hugo decided two readings:

The other readings are in inst/rules/nzsc4/readings.yaml (69 topics).

Two independent reviews were made, and their findings are fixed. The review against the book confirmed every code, name and position. The logic review ran 6,000 random profiles and refilled their missing values; it found no error and no change against 0.9.300. The fixes:

soilKey 0.9.300 (2026-10-28)

New Zealand Soil Classification: the subgroups of the Podzol, Allophanic, Pumice and Melanic Soils

classify_nzsc4() now keys the 17 groups of the Podzol, Allophanic, Pumice and Melanic Soils to their 79 subgroups, following the keys to subgroups of the New Zealand Soil Classification, 4th edition: from the Humus-pan Densipan Podzol Soils to the Typic Orthic Melanic Soils. With the Organic, Gley and Ultic Soils of 0.9.299, the subgroups of seven of the 15 orders are keyed (149 subgroups of 33 groups); the other eight orders follow.

Hugo decided seven readings:

The other readings are in inst/rules/nzsc4/readings.yaml (61 topics). The key gives the last Orthic Pumice subgroup (MOT) no name; the chapter’s summary table names it Typic Orthic Pumice Soils.

Two independent reviews were made, and their findings are fixed. The review against the book confirmed every code, name and position, and found eight defects, among them a Bh read only under an eluvial horizon, “within 90 cm” read as “at 90 cm or less” for the ironstone-pans and duripans, and the buried B of the Buried-granular Orthic Allophanic Soils decided while its allophanic status was open. The logic review ran 6,000 random profiles and filled their missing values 185,000 times: it found two walks that never ended on a horizon of no thickness (in two new gates and in the acidic subgroups of 0.9.299), and eleven verdicts decided where the data leave them open, or open where they decide.

Outside the four orders, four readings change; none of the 6,000 random profiles changes order, group, or subgroup of the Organic, Gley and Ultic Soils against 0.9.299:

soilKey 0.9.299 (2026-10-28)

New Zealand Soil Classification: the subgroups of the Organic, Gley and Ultic Soils

classify_nzsc4() now keys the 16 groups of the Organic, Gley and Ultic Soils to their 70 subgroups, following the keys to subgroups of the New Zealand Soil Classification, 4th edition: from the Buried-podzol Litter Organic Soils to the Buried-granular and Typic Yellow Ultic Soils. The name of such a profile is now its subgroup (for example “Peaty Orthic Gley Soils”, “Mottled Yellow Ultic Soils”); the group and the order stay in levels. The subgroups of the other 12 orders follow.

Hugo decided four readings:

The other readings are in inst/rules/nzsc4/readings.yaml. Two subgroup names follow their groups’ spelling: Typic Sulfuric Gley Soils (the text writes “Sulphuric”) and Typic Yellow Ultic Soils (the text writes “Soil”).

Outside the subgroups, two readings change:

Both can only turn an undecided order or group into a decided one.

An independent review against the text of the book found six defects, all fixed: (f) horizons counted in the mottled profile form, which the 4th edition excludes; the window of the organic material measured from its top rather than from the soil surface; a buried podzol written with the buried prefix missed under litter; a B horizon ending above 60 cm left undecided in the Granular Acid Gley Soils; the peat reading above; and coatings of value 5 left open in the Podzolic Yellow Ultic Soils. Recorded dark coatings now make a cutanic horizon without the (h) notation in the Granular Acid Gley Soils.

A second review checked the logic with 12,500 random profiles: no errors, no row-order effects, and every order or group that changes against 0.9.298 goes from undecided to decided through “in some part”. Its findings are fixed: a buried peat under a peaty horizon that is not a topsoil was missed; an undesignated row under the A, nothing described under litter, a window the description does not reach (for sulfidic and saline material), a gap above the clay of the Buried-granular Yellow Ultic Soils and a densipan with no depths were read as absent rather than undecided; one decisive lab value did not settle “less silt than clay”; and a pan could pass as the argillic horizon of the Argillic Orthic Gley Soils. The readings file now has 50 topics.

soilKey 0.9.298 (2026-10-28)

New Zealand Soil Classification: the 77 groups

classify_nzsc4() now keys each of the 15 orders to its groups, following the keys to groups of the New Zealand Soil Classification, 4th edition: 77 groups, from the Litter, Fibric, Mesic and Humic Organic Soils to the Hydric, Gley, Hydrothermal, Cryic, Rocky, Sandy, Fluvial, Tephric and Orthic Raw Soils. The name of a classified profile is now its group (for example “Orthic Brown Soils”, “Fragic Pallic Soils”); the order stays in rsg_or_order and in levels. Subgroups follow.

The groups read diagnostics the order key did not need: sulfuric and tephric soil material, densipans, perch-gley features, redox-mottled horizons, peaty topsoils, slowly permeable layers, nodular horizons and fluvial features. They also read new horizon attributes: packing_degree, ksat_mm_h, penetration_resistance_kpa, redox_segregations_location, sulfate_s_pct, roots_abundance, maori_cultural_layer and coatings_value_moist. On the site they read soil_temp_30cm_C, mean_annual_air_temp_C, surface_water, methane_odour, mechanical_mixing_depth_cm and artificially_drained.

Hugo decided four readings:

The other readings are in inst/rules/nzsc4/readings.yaml, which now has 39 topics.

Two independent reviews checked the groups: one against the text of the book, one for the logic, with 3,600 random profiles. Their findings are fixed, and they changed the order key in three places:

Outside the NZSC, ensure_horizon_schema() now reads “yes” and “no” (and y, n, 1, 0) in logical columns as TRUE and FALSE; before, they became NA. The other systems do not change: the 44 canonical fixtures are identical.

soilKey 0.9.297 (2026-10-28)

The SiBCS family no longer repeats the class, and reads texture from mineral material

Two fixes to the family (5th level) of a SiBCS name, as Hugo decided:

Four family labels of the 44 canonical fixtures change (two Gleissolos, two Organossolos); no class changes, and the fixtures, named without the family, are identical.

soilKey 0.9.296 (2026-10-28)

The SiBCS family label in the words of the book

The family (5th categorical level) of a SiBCS name used to be written with soilKey’s internal codes, as in “Latossolos Vermelhos Eutróficos típicos, muito_argilosa, moderado”. It is now written as the SiBCS (2018, Cap 18) writes it: “…, textura muito argilosa, A moderado”. The textural group or subgroup follows “textura” (“textura média-arenosa”), with the gravel class and “esquelética” after it with no comma and the sand mineralogy in parentheses (“textura argilosa pouco cascalhenta (micácea)”). The surface horizon follows “A” (“A moderado”, “A húmico”), and the histic one reads “horizonte hístico”. In the Organossolos, the underlying material reads “material subjacente argiloso”, and the woodiness reads “muito lenhoso”. Hugo decided three of these readings: “horizonte hístico”, “material subjacente”, and writing the gravel class and “esquelética” together when both apply. The names keep the plural of the key’s classes. The codes in FamilyAttribute$value do not change, and neither does any class: the 44 canonical fixtures, named without the family, are identical. Seen in the name of an ISRIC profile sent by Jelle Janssen.

soilKey 0.9.295 (2026-10-28)

Many profiles from one horizon table

classify_profiles() classifies every profile of a table that has one row per horizon and a column saying which profile each horizon belongs to, as a survey or a database export usually comes. Site properties such as soil_moisture_regime come from a second table (one row per profile) or a list named by profile id. A map renames columns and converts their units on the way in: data.frame(from = "ORGC", to = "oc_pct", factor = 0.1) reads an organic carbon in g/kg as soilKey’s %. The names are checked once for the whole table, so a column that no key reads is named in one warning, not once per profile. The result has one row per profile, in the order of the table, with the class name in each system, the attributes the keys asked for and did not find, and the error of a profile that could not be classified (the others are classified as usual). The full classify_all() results and the pedons ride along as attributes. Asked for by Jelle Janssen (ISRIC), who classifies ISIS profiles this way. No classification changes: the 44 canonical fixtures are identical.

soilKey 0.9.294 (2026-10-28)

A warning for the attributes that no key reads

A horizon column that soilKey does not recognise, or a site property it does not know, used to be kept in the PedonRecord and read by no key without a word, so a misspelt column (organic_carbon_gkg) or a site property given as a horizon column (soil_moisture_regime) went unnoticed. PedonRecord$new() now warns about them when it is called from outside the package, naming each one with the closest recognised name: “organic_carbon_gkg (did you mean oc_pct?)”, “soil_moisture_regime (a site property: site$soil_moisture_regime)”. read_pedon_csv() warns for the file it reads, and now also accepts a spreadsheet whose columns are all aliases (Top, Bottom, Clay, SOC), which it used to refuse. The loaders (BDsolos, FEBR, WoSIS, NatSoil, NPDB, KSSL, LUCAS, AfSP, Redape) and the other constructions inside soilKey keep extra columns on purpose and stay quiet. The warning has the class soilKey_unrecognised_attributes; options(soilKey.warn_unrecognised = FALSE) turns it off. The new unrecognised_attributes() returns the same list as a table, for a pedon or for a horizon table and a site list, so a batch can be checked before it is built. Suggested by Jelle Janssen (ISRIC).

The site properties now have a reference of their own, as the horizon attributes have had since 0.9.266: inst/schemas/site-attributes.yaml, read by the new site_attribute_spec(), gives each recognised property its type, unit, description, the values the keys compare it with and the keys that read it, and inst/ATTRIBUTES.md lists them after the horizon attributes. A test fails when the code reads a site property that the file does not list.

In soilKey Pro, opening a session file keeps the site properties that soilKey recognises beyond the editor’s own fields (soil_moisture_regime, drainage_class, …): they reach the pedon and the classification and are saved again with the session. Until now they were dropped. A notice lists the horizon columns and site properties that no key reads, on opening a session and on uploading a CSV. No classification changes: the 44 canonical fixtures are identical.

soilKey 0.9.293 (2026-10-28)

New Zealand Soil Classification: the 15 orders

A new, experimental and opt-in system: the New Zealand Soil Classification, 4th edition (Manaaki Whenua - Landcare Research 2026), read from its Quarto source of 7 October 2026. classify_nzsc4() keys a pedon to the 15 orders of the Key to Soil Orders (Organic, Gley, Ultic, Podzol, Allophanic, Pumice, Melanic, Semiarid, Oxidic, Granular, Pallic, Brown, Anthropic, Recent and Raw Soils); make_nzsc4_example() gives one example profile per order. Groups and subgroups follow; the Cryic Soils of the appendix are not keyed. classify_all(systems = "nzsc") runs it.

The diagnostics read the New Zealand horizon notation (Bw, Bt, Bg, Bh, Bs, Bo, Bx, Bw(g), the pans Bhm, Bsm, Blm, Bfm, CR, an e prefix for anthropic soil material), moist colours, texture groups, pH, P retention, bulk density, volcanic glass, coarse fragments and their origin, structure and clay coatings, and the New Zealand field tests, as five new horizon attributes: naf_test (reactive aluminium), childs_test, sensitivity_class, fluidity_class and stickiness. From the site: drainage class, parent material (Melanic Soils), human truncation and an overthickened A horizon (the note to the key).

Three readings are Hugo’s decisions: a reductimorphic horizon in a designated profile is read from its notation (g, r, or peat), as pale B horizons of Pallic Soils have low chroma without being reduced; a measured P retention decides allophanic soil material, the field tests standing in only when it is not measured; and a reductimorphic horizon that reaches the base of the B horizon meets the depth condition of the Gley Soils. The other readings are in inst/rules/nzsc4/readings.yaml. WRB, SiBCS, USDA, Canadian and Australian results do not change.

soilKey 0.9.292 (2026-10-27)

Australian classification: the families

classify_asc3(include_family = TRUE) now places a soil in the family classes of its order and writes them after the name, as the book does: “Bleached, Eutrophic, Red Chromosol; thick, non-gravelly, loamy/clayey, deep”. The new classify_asc3_family() returns each criterion as a FamilyAttribute with its code (YY when the data cannot decide the class, ZZ when no class of the order fits); the result keeps them in trace$family, trace$family_label and trace$family_code. classify_all(include_family = TRUE) passes the option on when the Australian key is run. Without the option nothing changes.

The criteria are those of each order page: the thickness of the A1, or of the whole A in the Kurosols, Sodosols and Chromosols and in the Kurosolic, Sodosolic and Chromosolic Hydrosols (the book’s general rule, where the order pages disagree); gravel (2-60 mm) of the surface and A1, the larger of the two estimates; the field texture of the A1 and the most clayey one of the B; soil depth (to rock, a cemented pan or saprolite; otherwise to the C under the B, or the depth described in a soil without a B); and water repellence. The Vertosols use laboratory clay, the Calcarosols the depth of the Bk, the Arenosols and Rudosols the surface soil, the Organosols their organic materials. The Anthroposols and the tidal Hydrosols have none. The classes and the criteria of each order are in inst/rules/asc3/families.yaml, the readings in readings.yaml.

Two horizon attributes: gravel_pct (gravel-sized fragments) and water_repellence. The NatSoil reader fills them, with the coarse fragments of the ground surface and the surveyors’ family codes, and benchmark_natsoil(family = TRUE) compares each criterion. On the NatSoil profiles whose order agrees, the decided classes agree with the surveyors for 85 % of the thicknesses, 87 % of the A1 textures, 97 % of the B textures, 83 % of the depths and 75 % of the gravel classes. The Vertosol clay classes are mostly undecided: only 29 of 291 NatSoil Vertosols have laboratory clay.

No order, suborder, great group or subgroup changes on NatSoil. WRB, SiBCS and USDA results do not change.

soilKey 0.9.291 (2026-10-27)

Australian classification: subgroups of the Rudosolic and Tenosolic Hydrosols

The Hydrosol page points the Rudosolic and Tenosolic great groups of the Redoxic and Oxyaquic Hydrosols to the subgroup lists of the Rudosols and Tenosols. classify_asc3() now keys such a soil, apart from wetness, through the Rudosol or Tenosol suborders, and takes the list of the suborder it keys to: “Basic, Rudosolic, Oxyaquic Hydrosol”. Those lists are the same for every great group of a suborder, so the soil is keyed to the suborder only. Apart from wetness, the Hypersalic Rudosol suborder is read by its salinity alone (its other conditions, no water table and no mottling, are wetness). A suborder with no list (Shelly, Carbic) gives no subgroup. A suborder left undecided before the one assigned makes the subgroup provisional only when it would lead to another list. The Salic Rudosolic and Tenosolic Hydrosols keep the Salic list.

The rules name these great groups under subgroups_from in the Hydrosol subgroup file, with site fields set for the walk only (.apart_from_wetness); load_rules() reads such blocks, the rule validator checks them, and the key walks the other order as the main key would, only as deep as the choice of list needs. The walk shows in the trace as a phase of its own (“suborders, as a Rudosol”).

On 9,700 licensed NatSoil profiles only the five that key to these great groups change: two get a subgroup, two stay undecided for lack of data, and one fits none of the three Rudosol subgroups (exactly half of its soil is strongly acid). Nothing else changes, at any level. WRB, SiBCS and USDA results do not change.

soilKey 0.9.290 (2026-10-26)

Australian classification: carbonate segregations recorded as none

A horizon whose carbonate segregations are recorded as none (0 %), with no effervescence or CaCO3 recorded, was left undecided by the test of “calcareous”, although the same horizon with nothing recorded is read by its pH (a pHw below 7.0 is not calcareous, as free carbonate holds the pH higher). A recorded 0 % of segregations says nothing of the fine-earth carbonate, so the pH rule now applies to it too. Found in the review of 0.9.289.

On 9,700 licensed NatSoil profiles no order or suborder changes, and 32 more orders are decided (1,305, at 74.5 %). 98 great groups change, nearly all to Eutrophic, which needs B and BC horizons that are not calcareous; the great groups that agree with the survey go from 1,076 to 1,140 and the subgroups from 499 to 555. WRB, SiBCS and USDA results do not change.

soilKey 0.9.289 (2026-10-26)

Australian classification: subgroups of the Hydrosols, Arenosols, Rudosols and Tenosols (experimental)

classify_asc3() keys the subgroups of the last four orders, so every order that has great groups now keys its subgroups. WRB, SiBCS and USDA results do not change, nor do the Australian orders, suborders and great groups, nor the subgroups of the ten orders keyed before.

On 9,700 licensed NatSoil profiles, 195 of the 414 profiles of these four orders that reach a subgroup list get a subgroup (75 decided). Only 20 can be compared with the survey (5 agree): most survey labels of these orders use older codes, and many profiles stop at a great group the survey does not give.

soilKey 0.9.288 (2026-10-26)

Australian classification: subgroups of the Vertosols, Calcarosols, Podosols and Organosols (experimental)

classify_asc3() keys the subgroups of the Vertosols, Calcarosols, Podosols and Organosols, one list per order as the order pages give them (43, 12, 15 and 8 subgroups). WRB, SiBCS and USDA results do not change, nor do the Australian orders, suborders and great groups, nor the subgroups of the six orders keyed before.

On 9,700 licensed NatSoil profiles, 424 of the 533 profiles keyed to these four orders with a great group get a subgroup. Of the 347 whose order, suborder and great group agree with the survey and whose survey gives a subgroup of the key, 261 get one and 113 (43 %) the survey’s (Vertosols 100 of 239). Nearly every Vertosol subgroup stays provisional: the Sulfuric subgroup needs the pH of the upper 1.5 m, and the Sulfidic one a sulfide test, rarely recorded (read as absent, a test not done would decide 11 more Vertosols and leave the agreement unchanged).

soilKey 0.9.287 (2026-10-26)

Australian classification: subgroups of the Dermosols, Kandosols and Ferrosols (experimental)

classify_asc3() keys the subgroups of the Dermosols, Kandosols and Ferrosols, one list per order as the order pages give them (33, 29 and 14 subgroups). WRB, SiBCS and USDA results do not change.

On 9,700 licensed NatSoil profiles the orders and great groups do not change. The Chernic test becomes undecided on five profiles, where a suborder was already provisional, and decided on one: a Tenosol whose A1 (17.6 % organic C) may or may not be organic material gives a humose horizon either way, and is now Chernic. Of the 799 profiles keyed to these three orders with a great group, 549 get a subgroup. Of the 278 whose order, suborder and great group agree with the survey and whose survey gives a subgroup of the key, 213 get one and 113 (53 %) the survey’s (Dermosols 32 of 65, Kandosols 80 of 137, Ferrosols 1 of 11). Most of the others stop at Humose-Mottled, which needs organic C in the upper 0.2 m. The Ferrosol disagreements come from one survey whose profiles have 5 to 9 % organic C (combustion, a method the glossary names) at the surface, a humose horizon, but were surveyed Haplic or Acidic.

soilKey 0.9.286 (2026-10-26)

Australian classification: subgroups of the Kurosols, Sodosols and Chromosols (experimental)

classify_asc3() now keys a fourth level, the subgroups, for the Kurosols, Sodosols and Chromosols; the other orders follow. WRB, SiBCS and USDA results do not change, nor do the Australian orders, suborders and great groups, but their names now take the book’s form.

On 9,700 licensed NatSoil profiles the orders, suborders and great groups do not change. Of the 560 profiles keyed to these three orders with a great group, 294 get a subgroup. Of the 173 whose order, suborder and great group agree with the survey and whose survey gives a subgroup of the key, 79 get one and 37 (47 %) the survey’s; most of the others stop at Humose, which needs organic C in the upper 0.2 m, rarely measured. The disagreements checked are survey practice: B horizons of heavy clay with many slickensides and lenticular peds surveyed Haplic rather than Vertic.

soilKey 0.9.285 (2026-10-24)

Australian classification: great groups of the Hydrosols, Arenosols, Rudosols and Tenosols (experimental)

classify_asc3() now keys the great groups of every order that has them (the Anthroposols have none in the text). WRB, SiBCS and USDA results do not change; three Australian orders change on NatSoil, because an AC horizon is now part of the solum (see below).

On 9,700 licensed NatSoil profiles, three orders change, all three now as surveyed (1,273 decided, 74.8 % of them agreeing), and 51 fewer suborders are provisional, from the Sesqui-Nodular reading. Of the 3,536 profiles keyed to these four orders, 398 get a great group; most stop at the suborder, which is itself undecided for many Tenosols, and the Hydrosols wait on the sulfide test. Only 42 can be compared with the survey (order and suborder agreeing, a great group of the key): 21 get the survey’s great group. Most Tenosol labels use the suborder codes of the editions before 2021.

soilKey 0.9.284 (2026-10-24)

Australian classification: great groups of the Vertosols, Calcarosols, Podosols and Organosols (experimental)

classify_asc3() now keys the great groups of four more orders, ten in all. WRB, SiBCS and USDA results do not change, nor do the Australian orders, suborders and the great groups of 0.9.283.

On 9,700 licensed NatSoil profiles, of the 465 of these orders whose order and suborder agree and whose survey gives a great group of the key, 75.5 % get the survey’s great group, and 76.4 % of the 301 decided (the Vertosols: 324 of 418, and 220 of the 281 decided). Several surveys record the crust of a Crusty Vertosol as a thin A11 over a pedal A12, which is read as the text describes it. The Calcarosols and Organosols stay provisional for want of data: the suborder or what lies under the solum for the first, the sulfide test for the second.

soilKey 0.9.283 (2026-10-23)

Australian classification: great groups of the Kurosols, Sodosols, Chromosols, Ferrosols, Dermosols and Kandosols (experimental)

classify_asc3() now keys a third level, the great groups, for the six orders with a B horizon of their own; the name is the great group’s (“Eutrophic Red Chromosol”). The other orders follow. WRB, SiBCS and USDA results do not change, nor do the Australian orders and suborders.

On 9,700 licensed NatSoil profiles, of the 2,160 of these orders whose order and suborder agree and whose survey gives a great group of the key, 21.6 % get the survey’s great group, and 80.6 % of the 98 decided. Most stay provisional for want of laboratory data: exchangeable Ca and Mg (Magnesic, before the base status classes), the bases and clay, mottles (the Mottled Sodosols) and, for the Kandosols, the porosity the Mellic great group asks.

soilKey 0.9.282 (2026-10-23)

Australian classification: the suborders of the Anthroposols, Arenosols, Rudosols and Tenosols (experimental)

classify_asc3() now keys the suborders of all fifteen orders. WRB, SiBCS and USDA results do not change, nor do the Australian orders.

On 9,700 licensed NatSoil profiles the orders are as before (43.9 %, 1,270 decided at 74.8 %). Of the 3,691 profiles of the fifteen orders whose order agrees and whose survey gives a 3rd-edition suborder, 75.9 % get the survey’s suborder, and 95.7 % of the 679 decided. Rudosols: 20 of 61, and the 10 decided agree; Arenosols 1 of 12 and Tenosols 15 of 222, none decided. Most Tenosols stay provisional because the organic C of the upper 0.2 m, the dry colours, the nodules or the origin of a shallow C horizon are not recorded; many surveyed Leptic Tenosols are described below 0.5 m with no rock, and the text does not make them leptic.

soilKey 0.9.281 (2026-10-22)

Australian classification: suborders of the Organosols, Podosols, Hydrosols and Calcarosols (experimental)

classify_asc3() now keys the suborders of eleven of the fifteen orders. The four added here are read from the order pages and the glossary; the suborders of the Anthroposols, Arenosols, Rudosols and Tenosols follow. WRB, SiBCS and USDA results do not change, nor do the Australian orders.

On 9,700 licensed NatSoil profiles the orders are as before (43.9 %, 1,270 decided at 74.8 %). Of the 3,396 profiles of the eleven orders whose order agrees and whose survey gives a 3rd-edition suborder, 81.4 % get the survey’s suborder, and 95.7 % of the 669 decided. For the four orders added here: Organosols 4 of 10 (the 4 decided agree), Podosols 27 of 48 (26 of the 33 decided), Hydrosols 14 of 49 (6 of the 7 decided), Calcarosols 33 of 175 (the 2 decided agree). Most of these stay provisional for want of data in NatSoil: the kind of peat, the contrast of the mottles, the form of the carbonate segregations and laboratory carbonate.

soilKey 0.9.280 (2026-10-22)

Australian classification: the colour suborders (experimental)

classify_asc3() now keys the suborders of seven orders: the Kurosols, Sodosols and Chromosols (the colour of the upper 0.2 m of the B2t), the Ferrosols, Dermosols and Kandosols (the upper 0.5 m of the B2) and the Vertosols (Aquic, then the colour of the upper 0.5 m of the solum). The name is the suborder’s (“Red Chromosol”); rsg_or_order keeps the order. The other suborders follow. WRB, SiBCS and USDA results do not change.

On 9,700 licensed NatSoil profiles: the order agrees for 43.9 % as before, and 1,270 are now decided (was 1,052), 74.8 % in agreement. Of the 3,114 profiles of these seven orders whose order agrees and whose survey gives a suborder, 86.3 % get the survey’s suborder, and 96.6 % of the 623 decided.

soilKey 0.9.279 (2026-10-22)

Australian classification: the field texture first in the textural B (experimental)

The clear or abrupt textural B of classify_asc3() (Kurosols, Sodosols, Chromosols) now reads each horizon by its field texture grade, and by its lab clay only when it has none. The glossary gives the limits in clay “and/or” field texture and notes that where the two disagree the field texture may be the better guide to how the soil behaves; before, lab clay on both sides decided. The reading is in inst/rules/asc3/readings.yaml.

On the 9,700 licensed NatSoil profiles with an ASC order, 255 change order: 104 of them now agree with the surveyors, 56 did before. Agreement goes from 43.4 % to 43.9 % (45.7 % counting the Arenosols as Tenosols or Rudosols), with 1,052 decided at 77.4 % (78.6 %). WRB, SiBCS and USDA results do not change.

soilKey 0.9.278 (2026-10-22)

NatSoil (CSIRO) as a benchmark for the Australian key (experimental)

NatSoil, the national soil site database of CSIRO, can now be read through its public API and used to check classify_asc3() against the orders the surveyors gave. The data are licensed per site, most under CC BY 4.0, and are not shipped: fetch_natsoil() saves them to a folder of your choice. WRB, SiBCS and USDA results do not change.

On 9,700 licensed NatSoil profiles with an ASC order, the order agrees for 43.4 % (45.3 % counting the Arenosols as Tenosols or Rudosols); 1,045 are decided, with 77.8 % agreement (79.1 %); of the 450 decided with the surveyors’ highest confidence, 80.2 % agree (81.8 %).

soilKey 0.9.277 (2026-10-22)

Australian Soil Classification: the 15 orders (experimental)

classify_asc3() keys a pedon to the orders of the Australian Soil Classification, 3rd edition (Isbell and the National Committee on Soil and Terrain 2021), following the online version with its errata. It is the second national system on the registry (soilkey_systems(), alias asc) and, like the Canadian one, runs in classify_all() only when asked. Suborders, great groups, subgroups and families follow in later releases. WRB, SiBCS and USDA results do not change.

Checked against NatSoil (CSIRO, NatSoil v13, CC BY 4.0; the data are not shipped, and a reader will follow): of 9,698 profiles with an order from the surveys, 42.9 % get the same order (44.8 % counting the 2021 Arenosols against the Tenosols and Rudosols of earlier editions). 988 are decided, with no earlier order left open, and 78.6 % of them agree (80.1 %; 82.9 % of the 404 decided with the surveyors’ highest confidence). Most profiles stay provisional for missing data: the drainage class (Hydrosols), the designations (Podosols), the cracks (Vertosols), free iron (Ferrosols), carbonate records (Calcarosols) and exchangeable sodium (Sodosols).

soilKey 0.9.276 (2026-10-21)

Canadian classification: the colour of the Chernozemic great groups (experimental)

The key’s chroma limits for the Chernozemic great groups say “usually”. classify_cssc3() now reads them at two more places, each written down in inst/rules/cssc3/readings.yaml:

The colour means are rounded to the millionth before they meet a limit. On the NPDB scenario of 0.9.275, of the 348 Chernozems decided at the order level, 116 (was 92) get the survey’s great group, 84 of them (was 63) with the great group decided. WRB, SiBCS and USDA results do not change.

soilKey 0.9.275 (2026-10-21)

An NPDB scenario with the dry colour and the soil climate estimated (experimental)

The National Pedon Database of Canada records neither the dry colour of most A horizons nor the soil climate, which the Canadian key reads for the Chernozems (and the Gray Brown Luvisols and some subgroups). An optional scenario now estimates them, each as a range, and benchmark_npdb() classifies a pedon at the ends of its ranges, counting a class as decided only where they all agree. classify_cssc3() itself does not change, and WRB, SiBCS and USDA results do not change.

On the NPDB with the 1961-1990 normals, 295 of the 899 Chernozems that waited for the climate are decided, 292 of them in their own order: agreement on the Chernozems goes from 0 to 24.1 % at the order level. The error of the dry colour seldom decides the limits between the Black, Dark Brown and Brown Chernozems (7.4 % at the great group level). The Gray Brown Luvisols go from 0 to 228 of 265 in agreement (53 decided). On the other orders, agreement goes from 90.6 to 90.1 % at the order level (56 soils of other orders are now decided as Chernozems) and from 71.9 to 74.6 % at the great group level.

soilKey 0.9.274 (2026-10-21)

Canadian classification: three readings raised by the NPDB benchmark (experimental)

classify_cssc3() changes three readings, each written down in inst/rules/cssc3/readings.yaml (now 58 readings). WRB, SiBCS and USDA results do not change.

On the NPDB (Chernozems apart), agreement with the survey goes from 89.8 % to 90.6 % at the order level (90.5 % to 91.5 % when decided), from 70.7 % to 71.8 % at the great group level (82.1 % to 83.9 %) and from 56.3 % to 56.6 % at the subgroup level (71.3 % to 72.3 %). Decided disagreements in which the key puts a surveyed soil in the Gleysolic order fall from 317 to 178 (Luvisols 141 to 72, Brunisols 51 to 29). In turn, 32 surveyed Gleysols are now decided in the Luvisolic order, 30 of them by the Bt rule, mostly Luvic Gleysols whose Btg or Btgj does not have gley colours. Base saturation no longer decides any Chernozem outside its order (11 still fail criterion 6 because Ca is not the dominant cation): 340 Chernozems (was 445) are decided outside the order on other criteria, and 899 (was 794) wait for the soil climate.

soilKey 0.9.273 (2026-10-21)

The National Pedon Database of Canada as a benchmark (experimental)

load_npdb_pedons() reads the pre-packaged CSV files of the National Pedon Database of Canada (NPDB, version 3, Agriculture and Agri-Food Canada, CanSIS; Open Government Licence - Canada; not shipped with soilKey) into pedon records, with the survey’s classification under the Canadian System of Soil Classification as the reference, and benchmark_npdb() compares classify_cssc3() with it at the order, great group and subgroup levels.

The reader cleans what the files hold:

The NPDB records no soil climate, which the key reads for the Chernozemic order and the Gray Brown Luvisols: the 1,239 Chernozems are reported apart. 794 of them are provisional; the other 445 are decided outside the order, mostly because a measured property of the A fails the chernozemic A, the most frequent being base saturation (neutral salt) of 80 % or less. On the other pedons with a reference:

Level Pedons Agreement Decided Agreement when decided
Order 7,298 89.8% 6,524 90.5%
Great group 7,272 70.7% 5,327 82.1%
Subgroup 4,041 56.3% 2,587 71.3%

Most disagreements come with a provisional result, where the records lack what the key reads: the mean annual soil temperature of the Gray Brown Luvisols (all 265 are undecided), the pH in CaCl2 of the Brunisols’ B, the organic C of the Humic Gleysols. Among the decided ones, the largest group is the gleying of the Gleysolic order: Luvisols and Brunisols with a g horizon within 50 cm, which the key places in the Gleysolic order and the survey did not.

soilKey 0.9.272 (2026-10-21)

The Canadian orders and great groups: open bottoms, other notations, climate (experimental)

classify_cssc3() reads, at the order and great-group levels, what the subgroups already read since 0.9.271:

In about 3,000 test profiles, 88 change order or great group: 82 described in another notation with a Bt, now a provisional Luvisol or Luvic Gleysol instead of a Regosol or Gleysol, and 6 whose designated Bt shows no clay increase over the eluvial horizon above, now ruled out by that measured clay. In Canadian-notation profiles the subgroups and great groups can also change where clay films are recorded as absent, where clay was given on an organic layer, or where the eluvial horizon has no clay recorded (the designation then decides). WRB, SiBCS and USDA results do not change.

soilKey 0.9.271 (2026-10-21)

The Canadian subgroups: Solonetzic, Chernozemic and Luvisolic (experimental)

classify_cssc3() now keys the subgroups of the last three orders of the Canadian System of Soil Classification, 3rd edition (Key to Soil Subgroups, Ch 3, pp. 42-49), 101 more, so all 231 subgroups are keyed and the name goes down to the subgroup in every order (“Dark Gray Solod”, “Calcareous Black Chernozem”, “Gleyed Brunisolic Gray Luvisol”). The subgroups read, as before, measured properties first and the Canadian designations second:

The Solonetzic great groups have no residual subgroup in the key, so a Solonetzic soil without an A stops at the great group; where an LFH lies directly over an Ae, the Gray subgroups read the Ae, as Ch 12 words them. The colour of the A is read over the whole A: a horizon with no value leaves the class undecided when it could change it. The readings where the book is silent are added to inst/rules/cssc3/readings.yaml (now 57). The Solonetzic example of make_cssc3_example() gains a dry colour and a pH, so it keys to a Dark Brown Solonetz.

Two changes reach the subgroups keyed since 0.9.269: a horizon with no bottom depth (the deepest one, which may go on) no longer counts as 0 cm when horizons are added up towards a thickness, so the Rego and Eluviated subgroups are undecided instead of decided on it; and a buried Aeb is no longer the Ae of the Eluviated Brunisols. Orders and great groups do not change, and WRB, SiBCS and USDA results do not change.

soilKey 0.9.270 (2026-10-21)

The Canadian subgroups: Podzolic, Gleysolic, Brunisolic and Regosolic (experimental)

classify_cssc3() now keys the subgroups of four more orders of the Canadian System of Soil Classification, 3rd edition (Key to Soil Subgroups, Ch 3, pp. 40-51), 67 more, 130 of the 231 in all, so the name goes down to the subgroup in seven orders (“Ortstein Humo-Ferric Podzol”, “Fera Humic Gleysol”, “Gleyed Eluviated Dystric Brunisol”, “Cumulic Regosol”); the Solonetzic, Chernozemic and Luvisolic orders still stop at the great group. The subgroups read, as before, measured properties first and the Canadian designations second:

The readings where the book is silent are added to inst/rules/cssc3/readings.yaml (now 54). The Vertic Solonetz great group now reads its slickenside horizon horizon by horizon, as the Vertic Gleysol subgroups do: a horizon with no designation and no slickenside record is undecided instead of ‘none’, and a designation in the FAO or USDA notation is read (an ss counts, a designation without ss fails). The surface A of the great groups no longer takes in a buried A (b) under it, so an Ah over an Ahb is measured by the Ah alone. WRB, SiBCS and USDA results do not change.

soilKey 0.9.269 (2026-10-21)

The Canadian subgroups: Cryosolic, Organic and Vertisolic (experimental)

classify_cssc3() now keys the subgroups of three orders of the Canadian System of Soil Classification, 3rd edition (Key to Soil Subgroups, Ch 3, pp. 37-40), 63 of the 231, so the name goes down to the subgroup there (“Terric Humic Mesisol”, “Brunisolic Dystric Turbic Cryosol”, “Gleyed Vertisol”); the other orders still stop at the great group. The subgroups read, as the orders and great groups do, measured properties first and the Canadian designations second:

The readings where the book is silent are added to inst/rules/cssc3/readings.yaml (now 46). The Cryosolic example pedon gains pH values. WRB, SiBCS and USDA results do not change.

Fixes to the orders and great groups of 0.9.267 and 0.9.268:

soilKey 0.9.268 (2026-10-21)

The Canadian great groups (experimental)

classify_cssc3() now keys the 31 great groups of the Canadian System of Soil Classification, 3rd edition (Key to Soil Great Groups, Ch 3, pp. 35-36), under the ten orders of 0.9.267, so the name is the great group (“Humo-Ferric Podzol”, “Dark Brown Chernozem”) and the order is in rsg_or_order. The great groups read, as the orders do, measured properties first and the Canadian designations second:

The last great group of each order is the key’s “other soils”. The readings where the book is silent are added to inst/rules/cssc3/readings.yaml (now 33). The per-layer readings of podzolic B chemistry and of gley colours are factored out of the order diagnostics without changing them. The example pedons now reach a great group each. WRB, SiBCS and USDA results do not change.

Fixes to the 0.9.267 order key, all in the Organic order:

soilKey 0.9.267 (2026-10-20)

The Canadian System of Soil Classification, to the order (experimental)

The first national system on the registry: classify_cssc3() keys a profile through the Key to Soil Orders of the Canadian System of Soil Classification, 3rd edition (Soil Classification Working Group 1998, Ch 3, pp. 33-34), from Cryosolic to Regosolic. Great groups and subgroups follow in later releases, so the name is the order. The system is experimental and opt-in: classify_all() and the Pro app keep running WRB, SiBCS and USDA by default; classify_all(systems = c("wrb2022", "sibcs5", "usda", "cssc3")) runs it beside them, and classify_cssc3() alone.

The Canadian keys are written largely in terms of horizon designations, which Chapter 2 defines partly by measurable properties. Each diagnostic reads the measured properties first (podzolic B chemistry, the Bt clay increase with clay films, the solonetzic B Ca/Na ratio, the chernozemic A, the gley colours) and the designations second, in the Canadian notation, where f is an illuvial Fe-Al-organic accumulation, m a slightly altered B, v a vertic horizon, ss slickensides, y cryoturbation, z permafrost and j a weak expression of the suffix before it. Measured properties decide whenever they can, pass or fail; designations decide only what they leave open, and only when the profile’s notation is Canadian (declared in site$designation_system, a Canadian site, or no sign of the FAO/USDA notation), because the same letters mean other things there. The trace records which route decided, and a warning says when the order rests on designations alone. The chernozemic A includes a soil-climate criterion (mean annual soil temperature at least 0 C, moisture subclass drier than humid), read from the new site fields mean_annual_soil_temp_C and soil_moisture_subclass or approximated from the USDA regimes; without it, the orders keyed after Chernozemic are reported as provisional. The choices where the book is silent are listed in inst/rules/cssc3/readings.yaml.

Three horizon attributes are added for the Canadian key and read by no other: fe_pyro_pct and al_pyro_pct (sodium-pyrophosphate-extractable Fe and Al) and mottle_contrast (faint, distinct, prominent). make_cssc3_example() builds one example profile per order. WRB, SiBCS and USDA results do not change: the 44 canonical fixtures are identical.

soilKey 0.9.266 (2026-10-20)

One file of metadata for the horizon attributes

The section, unit and description of each of the 112 canonical horizon columns now live in inst/schemas/horizon-attributes.yaml, and the new horizon_attribute_spec() returns them as a table with each column’s type and accepted aliases. The file also has room for what the national systems will need: the keys that read an attribute, the values of a categorical one and the range of a numeric one. The attribute reference inst/ATTRIBUTES.md is generated from it (before, the generator parsed the comments of R/utils.R and kept its own table of units), and a test fails when the file and the reference fall out of step. The reference’s tables are unchanged. No classification changes.

soilKey 0.9.265 (2026-10-20)

A generic classifier for ordered keys

Most of the national systems on the roadmap (Canada, Australia, New Zealand, Japan, Hungary, China) are ordered keys of the USDA kind: at each level the first class whose tests pass is assigned. Their classifiers will be thin wrappers around a new internal engine, classify_hierarchical(), that walks the levels named in the system’s registry entry. Two rules differ from the three older keys, on purpose: a class is assigned only when its tests pass (a default: true entry passes by definition), so a level where nothing passes stays unassigned instead of falling back to the last class of its list (with a warning saying where the name stopped); and a class that could not be decided for lack of data, tested before the one assigned, makes the assignment provisional. Run on the USDA rules, it gives the same name, order and evidence grade as classify_usda() for all 44 canonical fixtures.

ClassificationResult gains three fields: system_id (the registry id; WRB, SiBCS, USDA and SmartSolos results now carry it), levels (the class assigned at each level) and provisional_because. Its print() counts the classes actually tested (for SiBCS and USDA it counted the phases of the nested trace) and calls them RSGs only for WRB. No classification changes.

soilKey 0.9.264 (2026-10-20)

The rule engine reads nested blocks and none_of

National keys say things such as “other soils that have A, and B or C, and not D”. The rule engine now reads that in YAML: an entry of an all_of, any_of or none_of list may itself be one of these blocks, and none_of (no test may pass) joins all_of and any_of, with the same three-valued logic (an undecided test leaves the block undecided unless the outcome is already settled). A nested block appears in the key trace as a test of its own, with its sub-results as evidence.

The lower levels of a key are now read from the folders that the system’s registry entry names (great_groups from great-groups/), not from a fixed list of six folder names. The rule validator also reports blocks that name more than one combinator (the engine reads only one of them), combinators written as a mapping instead of a list, class codes and names that are not quoted strings (YAML reads an unquoted N as a logical and 11 as a number), codes listed twice in one list or one level, and, for systems added after the registry, predicates without the system’s suffix, so that a Canadian Chernozemic gate can never be WRB’s chernozem(). The helpers that every key shares (evidence grade, ambiguities, missing attributes) move from R/key-wrb2022.R to R/key-common.R, unchanged.

No result changes: the 44 canonical fixtures give identical names, key traces, evidence grades and warnings, and no rule of the three systems nests, mixes combinators or uses none_of.

soilKey 0.9.263 (2026-10-20)

A registry of classification systems

Each classification system is now a folder inst/rules/<id>/ holding its key and a system.yaml entry: id, aliases, classifier, levels, display names, edition, citation and status. load_rules(), classify_all() and the rule validator read that registry instead of repeating the three ids, and the new soilkey_systems() lists it. This is the first step towards the national systems (Canada, Australia, New Zealand and others): a new system will be added by adding its folder.

Nothing else changes. The 44 canonical fixtures give the same names, key traces, evidence grades and warnings as in 0.9.262, and every id or alias accepted so far still works, including the partial ones such as "wrb". classify_all(systems = "sibcs5") is now accepted as well as "sibcs". load_rules() now writes its default as "wrb2022"; it was the vector of the three ids, of which the first was used.

soilKey 0.9.262 (2026-10-15)

The WRB 2022 reference points to the 2022 edition

The README and the Portuguese getting-started vignette gave, for WRB 2022 (IUSS Working Group WRB, 4th edition), an FAO OpenKnowledge PDF that is the 2014 edition: its own title reads “World reference base for soil resources 2014”. Both now give the 2022 edition at ISRIC, https://files.isric.org/public/documents/WRB_fourth_edition_2022-12-18.pdf. The classification keys do not change.

soilKey 0.9.261 (2026-10-14)

The footer of the hosted app (soilkeypro.com) says, in one line, how many people are on the site now, how many have visited and from how many countries; a click on the countries opens a map of them above the footer. Asked for by the maintainer.

New files: R/utils_visitors.R and R/mod_visitors.R in the app, its country table data/countries.csv (built by data-raw/visitor_countries.R; see inst/DATA-PROVENANCE.md), the image step in deploy/fly/Dockerfile, and eight strings in each language. The classification keys do not change.

soilKey 0.9.260 (2026-10-14)

Pro app: the light base map is Esri’s; CARTO’s asks for a key

CARTO’s base maps now answer a request without an API key with a tile that says “API KEY REQUIRED”. The app used CARTO’s light map, “Positron”, as the base of the Batch and Grid maps and as the “Light” choice of the Map tab, so those showed the notice in place of a map. The checks of each release counted the tiles that loaded, not what they showed, and did not see it.

The light map is now Esri’s light gray canvas (Esri.WorldGrayCanvas), with its attribution, in the three places and in the list the app registers its map scripts from. The Map tab’s choice reads “Light (Esri)”. Nothing else changes.

soilKey 0.9.259 (2026-10-14)

Tests: the slow ones run off CRAN

The CRAN pre-test of 0.9.258 (2026-10-14) did not pass automatically on r-devel-windows-x86_64: “Overall checktime 14 min > 10 min”, mainly from the tests, 461 s on Windows (158 s on Debian). The CRAN team asked to reduce the test timings, among other ways by running less important tests only off CRAN.

Every test that took more than 0.03 s on CRAN’s terms (NOT_CRAN unset, the installed package) on a fast machine now starts with skip_on_cran(): 457 tests in 137 files. They run as before with devtools::test() and wherever NOT_CRAN=true. The core of the three keys stays on CRAN, slow as it is: the tests that the canonical profiles classify to their WRB Reference Soil Group, to their SiBCS order, and to their USDA order.

before now
tests run on CRAN 1,821 1,354
time of the tests on CRAN’s terms, this machine 87 s 21 s
the same, the whole test process 98 s 28 s

Windows ran the tests of 0.9.258 about five times slower than this machine; by that ratio they take about 150 s there now.

The check of this version found the three addresses of Embrapa’s AgroAPI (www.agroapi.cnptia.embrapa.br) out of reach: the server did not answer in 60 s, and the incoming check waited for it. The addresses stay, written as text and no longer as links: in the NEWS entry of 0.9.237, in the README, and in inst/CITATION, where the entry of the SmartSolos Expert article loses its url and keeps its DOI. As for the data servers in 0.9.155.

No code changes; the classification of every profile is the same.