You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
XMSS: an index never signs twice.capsule_sign() signed two messages at index 0 when called twice with the same key object (the key is an R value, so it cannot advance the caller's copy), and the help said it refused. It now remembers, for the session, the highest index each key has signed with and refuses that index or an earlier one (one key object signed twice, or a stale copy), retiring the index before the signature exists (RFC 8391; NIST SP 800-208). A damaged next_index (NA, negative, fractional) is refused in words. Across sessions, save the latest key_state after every signature.
Hawkes processes: events at the same instant no longer excite each other. The intensity sums over strictly earlier events, as the definition of a Hawkes process (a simple point process) has it; the exponential recursion, the sum-of-exponentials recursion and the exponential and Lomax densities counted a tie as an excitation at lag 0. core_hawkes_fit() warns when times are tied, and core_hawkes_jitter() spreads times recorded to a resolution (daily dates) uniformly across their interval, as Filimonov & Sornette (2015) recommend, with the splitmix64 uniforms rmorie and morie use for the TPS fits (the same numbers on daily data). The goodness-of-fit KS test uses the exact distribution only without tied residuals (the exact computation with ties ran for minutes and exhausted memory).
core_hawkes_fit() is fast for the Lomax kernel: the projected BFGS now restarts its curvature estimate when a parameter reaches or leaves its bound (as L-BFGS-B does). A Lomax fit to exponential-like data drifts to the bound on alpha (its exponential limit), and the matrix learned with alpha free mis-scaled the remaining steps: 1,164 iterations and 196 s on 9,839 events, now 64 iterations and 3 s to the same optimum. The same restart ends the gamma kernel's stall on its sum-of- exponentials and truncated likelihoods (2,000 iterations to a worse optimum on 2,118 tied events; now 2.8 s to the exact route's maximum), so "auto" keeps "soe" for gamma. core_hawkes_fit() also returns at_bound, the parameters whose estimate lies on the box: converged alone did not show that day-dated times had driven a shape to its wall. A fit whose event rate n / horizon lies outside what the bounded baseline can reach (e^-15 to 100 e^15 per unit time; horizon = 1e308) is refused with a message to express the times in another unit, instead of returning its start.
core_hawkes_nll() is the likelihood core_hawkes_fit() maximises, on the same parameters: its Lomax was a power law with exponent alpha (a Lomax of shape alpha - 1), so its values and a fit of it disagreed with the fit and with the documented density; it now uses the shared core for every kernel, keeping its documented sentinel outside the feasible region. A non-finite horizon is refused by every Hawkes function (Inf returned a list that looked like a fit).
SIU reports: counts in every layout. Investigators, forensic investigators, subject and witness officials and civilian witnesses are read from 2020-on English pages ("Witness Officials ( WO )", the singular "Civilian Witness ( CW )"), French pages ("Agents témoins ( AT )", numbered "AT no 1" or "AT n o 1", "Nombre d'enquêteurs de l'UES assignés : 3") and the legacy (2005-2011) layouts ("Witness Officer #2", "Three SIU investigators and two forensic investigators", "l'agent témoin n o 1", "Cinq enquêteurs"); "No civilian witnesses were identified" is 0, and with no subject-official section the resolver's rules decide (a bare "SO" no longer counts as one). Checked against the reviewed corpus on the 29 pages of the round-8 test: witness officials 27 of 29 (16 before), civilian witnesses 24 of 25 (14), investigators 29 of 29 (20), subject officials 20 of 20 (17).
SIU police_service: a service named as the one that notified the SIU ("the OPS contacted the SIU to report that police officers with the VPD ...") is passed over for the subject officials' service (drid 2010: Vancouver Police Department, not Ottawa); the OPP has one French name ("la Police provinciale", a legacy header's detachment) and one English name ("OPP Sioux Lookout").
SIU dates: a notification that dates the incident relative to itself ("during his arrest two hours prior", "the day before", "deux heures plus tôt", "la veille") gives the incident date (drid 648: 2019-09-12, not an earlier break-in); legacy headers ("Incident date:", "Date de l'incident :") are read; the French narrative's "du 9 février 2022" is read and interview and team dates are passed over. Legacy pages are recognised by language. French abbreviated months ("5 janv. 2023"), upper-case accented months ("3 AOÛT 2017") and "March 3 , 2020" are read.
SIU dates: the incident date is the first dated sentence of the narrative that is not the notification or the SIU's own work (drid 670: "... contacted the SIU to report a serious injury. On July 8, 2019 at about 3:50 p.m., CKLPS were called" is 2019-07-08), "of " counts ("Just before 4:00 a.m. of January 7, 2020"), and a narrative without a date gives way to the director's analysis ("On December 4, 2020, the Complainant rolled his SUV"); drids 670, 820, 1200 and 4600 were empty. "The SIU was notified of the incident by ... on October 27, 2017" dates the notification, and French "1 er septembre 2016" and "L'UES a été avisée ... le" are read.
SIU fields: specific_injuries comes from the investigation, never from the mandate's definition of a serious injury, with whole words ("stab" is not "constables", "arm" not "firearm"), more body parts, and French injuries ("fracture de l'épaule droite"); French charges_recommended and relevant_legislation ("Code criminel") are read. À, «, »,   and the other capital and French entities decode.
bricklayer_siu_resolve_so(): the spelled-out plural ("Two subject officials were designated"), "no official was a subject official" and witness officials with no subject official named resolve, as the help describes.
bricklayer_siu_resolve_so() reads French reports: the "Agent(s) impliqué(s)" roster ("AI no 1", a lone "AI"), legacy ordinals ("agent impliqué n o 3", "l'agent(e) impliqué(e) n o 1"), "aucun agent impliqué" and witness officials (AT) alone; the privacy, definition and legal paragraphs ("des agents impliqués et témoins", "les agents impliqués sont invités ...") are not read as cues. It returned NA on every French page. bricklayer_parse_siu() falls back to these rules for a French report with no roster, as it does for an English one (drid 3658: 9, as its English twin).
Inputs: kem_keygen(512.5), kem_keygen(c(512, 768)), pqc_keygen(2.5) and every other whole-number argument refuse a fractional value instead of truncating it to another setting; bricklayer_fetch_siu(1.5) no longer fetches drid 1; bricklayer_parse_siu() refuses a path that does not exist (it parsed the string as an empty report); bricklayer_fetch_parse_siu(lang = "xx") is an argument error.
Argument errors in words where R's internals spoke: bricklayer_json_base64url_dec(character(0)) (now empty, as bricklayer_json_base64_dec()), bricklayer_json_unserialize() of a number, capsule_bundle(character(0)), yoy() of an infinite value, HyperLogLog registers beyond 64 (distinct_count(1e300)), and bricklayer_fetch_parse_siu() with an invalid drid, which is now an argument error before any network instead of a message and NULL.
core_hawkes_jitter(horizon = ) spreads each event over [t, min(t + resolution, horizon)], so a time dated on the horizon stays inside the window (it was pushed past it, and the fit then refused the times); the fit's refusal names the span and the remedy.
The ?mahalanobis_outliers example contradicted itself: its "ordinary on each variable" row had the largest weight, and its classical-versus-robust comparison printed FALSE. The row is now short and heavy within both ranges, and the comparison uses a cluster of bad rows.
A count argument refuses TRUE (it was read as 1: drbg_generate(d, TRUE) gave one byte), Inf and values beyond the integer range in words, with no coercion warning; hqc_sizes(Inf) no longer warns before refusing.
bricklayer_fetch() gives the HTTP status of a server that answered ("answered HTTP 404"; it said "could not reach"); friendly_download(attempt_wayback = FALSE) (or "") says the fallback is switched off instead of claiming the Wayback Machine has no snapshot.
data pull refuses an --out path it cannot write before downloading the table.
CLI exit codes: a bundle with no language-model route exits 1; an empty prompt or request, a malformed --email and an unknown option to help exit 2.
bricklayer_json_to_json() is byte-identical to jsonlite's toJSON() where jsonlite does not pass an option on: raw = "js" is written with jsonlite's defaults (new Uint8Array([35]), an array, even under auto_unbox, where it wrote the number 35), raw = "hex" is unpadded ("f"), a Date epoch never gets a decimal point, the mongo $date and $binary objects and keep_vec_names objects stay on one line under pretty, and keep_vec_names does not reach the columns of a data frame. 18,000 random objects now encode identically (30 in 3,000 differed).
bricklayer_json_serialize() is no longer called lossless: like jsonlite's serializeJSON() it rounds doubles to digits (8); digits = I(17) round-trips them exactly. ?bricklayer_llm_login says a token is checked with the gateway before it is stored.
CI checks on Intel macOS (macos-15-intel), where r-universe's check had failed.
hqc_compress_key() stores an HQC secret key as its seed alone: for v5 the specification's compressed format dk = seed_KEM (32 bytes), for round 4 the 96 to 112 bytes its key generation draws (round 4 defines no compressed format). hqc_decapsulate() takes such a key, re-derives the pair and refuses a seed that does not give the key's own public half.
The HQC documentation no longer calls FIPS 207 a draft: NIST has named the standard but had published neither it nor a draft by 2026-10-05.
core_hawkes_fit(method = "em") finishes with the projected BFGS on the exact likelihood from EM's point. EM converges linearly, so its steps shrink before it reaches the maximum: it stopped up to 1.5e-5 short of the direct fit in the negative log-likelihood (1.4e-5 on macOS x86_64, where r-universe's check failed); it now ends within 2e-8. converged reports whether that finish converged instead of always TRUE.
SIU police_service is now the service of the subject officials, read from the director's analysis: the first service named in a sentence that names a subject official (or the sentence before it), else the service the analysis names most. It was the force that notified the SIU, which is often a custody, requesting or neighbouring service -- on 93 French reports it disagreed with the reviewed English report. The case number's letter (T Toronto, P OPP, I First Nations, O any other service) rules out services of the wrong kind, and legacy reports' "Police service:" header decides for them. Checked against every reviewed report in the corpus: 2,147 of 2,163 French and 111 of 118 English agree; the French values the old rule wrote agreed on 2,097 of 2,191.
SIU reports name the same people "subject officers" (before the SIU Act, 2019), "subject officials" (after it) or "SO": the parser now writes the count as number_of_subject_officials, the corpus's and the SIU Act's term and the same form as number_of_witness_officials (it was number_of_subject_officers, so the parsed row and the shipped corpus disagreed on the column name). The section and ordinal matching already read all three spellings.
A deterministic random bit generator: drbg_new(), drbg_generate() and drbg_reseed() are the CTR_DRBG of NIST SP 800-90A with AES-256 and no derivation function, written here (AES computed in constant time, with AES-NI on x86-64). It reproduces all 720 AES-256 no-df vectors of NIST's DRBG validation suite (no reseed, reseed, prediction resistance) on both ciphers, and it is the randombytes() of NIST's rng.c: seeded with the bytes 0..47 it gives the seed of vector 0 of the post-quantum known-answer files written with it.
HQC in both revisions: hqc_keygen(version = "round4") adds the fourth-round submission of 2023-04-30 (HQC-128/192/256, the HQC of liboqs up to 0.12 and of PQClean) with its 64-byte shared secret, next to the default v5 (2025-08-22, 32 bytes). It shares v5's codes and parameters and reproduces all 300 of that revision's official known-answer vectors on both multipliers. Keys carry their version, hqc_encapsulate() / hqc_decapsulate() follow it, hqc_sizes() takes it, and a round-4 secret key whose public half is not the one its seed makes is refused. A level must be one whole number (c(1, 3) and 3.5 were read as 1 and 3).
Hawkes processes fitted fast and exactly: core_hawkes_fit() (constant or sinusoidal baseline; exponential, Weibull, gamma or Lomax kernel) maximises the likelihood with its analytic gradient by projected BFGS in C++, and core_hawkes_residuals() gives the time-rescaling residuals in O(n) or O(n w). Routes: "exact" (Ozaki's O(n) recursion for the exponential kernel; the Weibull and gamma double sums stop where the kernel underflows to 0, so they equal the full sums), "soe" (Lomax and gamma with shape < 1 as sums of exponentials with relative error eps, Beylkin & Monzon 2010), "truncate", "em" (Veen & Schoenberg 2008) and "inar" (Kirchner 2017). The code is shared with morie's Python arm, which calls the same routine, so the two return the same estimate (asserted on common data in both test suites). core_uniforms() exposes the splitmix64 stream both arms use where they must draw the same numbers. The default method = "auto" is exact for the exponential kernel, "truncate" for Weibull (whose exact window, where the kernel underflows, spans the whole record when the shape is below 1) and "soe" for Lomax and gamma; "soe" truncates a gamma kernel with shape >= 1 at eps.
HQC-KEM, the code-based key encapsulation NIST selected in March 2025 beside ML-KEM: hqc_keygen(), hqc_public_key(), hqc_encapsulate(), hqc_decapsulate() and hqc_sizes() at HQC-1, HQC-3 and HQC-5, implemented in the package. All 300 official known-answer vectors of the specification of 2025-08-22 (reference implementation v5.0.0) are reproduced byte for byte, on both the hardware (PCLMULQDQ / PMULL) and the portable carry-less product, and on big-endian machines. Secret-dependent work is branch-free with no secret-indexed memory or shift (checked with valgrind), secret intermediates are wiped, a ciphertext that fails the FO check yields the implicit-rejection key, and a decapsulation key whose seeds do not derive from each other is refused.
Fresh-user round 5: VERB --help prints the verb's usage under both names and never runs it (logout --help used to forget the key); messages name the command typed (rmbl or rmoriebricklayer); usage errors exit 2 and an unknown function in describe / examples exits 1; --version works. login --token asks the gateway before storing a key and refuses a rejected one; login --email checks the address and --code needs --email; the GitHub sign-in says it is still waiting every 30 s. A key the gateway rejects is reported as rejected (not "gateway not reachable"), the gateway's quote of the key and its hash is never printed, and models lists the models without the suggested jsonlite. agent_bundle() and doctor use the package's own hosted route only (backend is "auto" or "hosted").
bricklayer_fetch() says why a download failed (the HTTP status, a server never reached, no Wayback snapshot) and refuses a non-http(s) URL, an unwritable destination or a non-positive timeout before downloading; friendly_download() keeps R's url() warning out of the console, reports its status as the cause and says when the Wayback Machine has no copy; the Wayback lookup retries once. SIU: an impossible date ("February 30") is no date, day-first ordinals ("2nd February 2018", "22nd of March 2019") and abbreviated months read, the hex quotes and dashes decode as the decimal ones, report pages are read from their body rather than the table of contents (incident dates were empty), and the helpers take NA and several reports. yoy() compares a biennial series step to step (it found no comparisons) and labels an inserted year "no data"; report_analysis() prints years without a thousands separator and describes a percent analysis in percentage points; sha256_file() names a missing file.
The SIU parser reads ordinal dates ("August 3rd, 2017") as well as French months, and legislation such as the Police Services Act no longer outvotes the police service (17-OVI-201 reads Guelph Police Service, 2017-08-03). data --help exits 0 like every other help, and bricklayer_fetch() refuses an empty URL or path in words.
The command line answers to rmbl as well as rmoriebricklayer: install_cli() writes both launchers, pinned to the library they were installed from with .libPaths() inside R (an R_LIBS in the shell or ~/.Renviron cannot swap in another copy) and without the explicit --args that made R 4.6 report "unknown verb '--args'"; login --help prints the usage instead of starting the sign-in.
Fixes from the 1.4.0 stress test of the family: friendly_download() no longer fails inside its own Wayback fallback when the snapshot lookup returns nothing usable, and names a cause for an error it does not recognise; wayback_snapshot_url() returns NULL for a malformed answer; yoy() averages several rows of one period for continuous values and percentages (counts still add up; pass fun to choose); report_analysis() renders a percent analysis (its changes are percentage points); the SIU parser reads French dates ("3 ao\u00fbt 2017") and decodes accented named entities (ç, é, ...) and every numeric entity.