Skip to content

0.7.6: plates data refresh — France dimensioned + AD/DE/PT settlements - #2

Merged
rameerez merged 1 commit into
mainfrom
s5w/plates-0.7.6-fr-refresh
Aug 3, 2026
Merged

rameerez merged 1 commit into
mainfrom
s5w/plates-0.7.6-fr-refresh

Conversation

@rameerez

@rameerez rameerez commented Aug 3, 2026

Copy link
Copy Markdown
Collaborator

Data-only release via rake plates:refresh (PROVENANCE pinned to 1b5ffaa):

  • France (#287): annexe 1 bis transcribed — every plate dimension with statutory tolerances; design.plate on nine series, two-line car plate_variants; nine photographic settlements (bar tirets, no diplomatic euroband, art. 9 licence route).
  • Portugal (#284), Andorra (#285), Germany (#286): the post-0.7.4 settlement PRs reach consumers.

Gem suite: 190 runs, 0 failures.

🤖 Generated with Claude Code

…+ the AD/DE/PT settlements since 0.7.4 (#283-#286)
@rameerez
rameerez merged commit dc27ccb into main Aug 3, 2026
6 of 7 checks passed
@rameerez
rameerez deleted the s5w/plates-0.7.6-fr-refresh branch August 3, 2026 05:34
rameerez added a commit that referenced this pull request Oct 10, 2026
…'s own rank, dataset 2026.10.0 (#5)

* 0.7.8: typo-tolerant make lookup + top_models(country:) by the country's own rank + dataset 2026.10.0

- Vehicles.make / models / find: bounded Levenshtein fallback after exact,
  alias and slug matching (1 edit for 4-5 chars, 2 from 6, none under 4),
  unique-best only — two equally close makes return nil ("Acra": Acura/Acma).
  "marcedes" -> Mercedes-Benz, "volkswagon" -> Volkswagen. fuzzy: false opts
  out; both validators are exact-only. find runs its exact pass first, so no
  0.7.7 answer changes.
- Model#country_ranks / #rank_in; top_models(country:) sorts by that rank
  (unranked-there after, global order; data without the key = 0.7.7 order).
- Bundled snapshot 2026.07.4 -> 2026.10.0 via new rake "data:refresh[tag]",
  which merges country_ranks from the same tag's catalog/ (asserts equality
  once the projection ships the key natively — vehiclesdb-pipeline emit).

Co-Authored-By: Claude Opus 5.5 <[email protected]>

* Fuzzy make: reject out-of-budget distances; forward fuzzy: through models/model/model_options

Codex review findings (both P2, both applied):
- Fuzzy.unique_closest accepted a lone length-compatible key at limit + 1
  (`best` starts there): Vehicles.make("z" * 28) returned Saxas Nutzfahrzeuge
  Werdau. Now gated on the limit; regression test added.
- models / model / model_options changed behaviour through make() but could
  not take the exact-only opt-out; they now accept and forward fuzzy:.

Co-Authored-By: Claude Opus 5.5 <[email protected]>

* README: one parenthetical for the register list

Co-Authored-By: Claude Opus 5.5 <[email protected]>

* Fuzzy make: a candidate may not have fewer words than the query

Found by the DEVQ A1 resolver sweep: "volvo v" is two edits from "volvo",
so in find's fuzzy pass the make prefix swallowed the model's letter and
"Volvo V 60" resolved to Volvo "60" (same for "Mercedes-Benz B 180" ->
"180"). Word-deleting matches are now rejected; same-word-count typos
("marcedes benz") and fewer-words queries ("DeLorean" -> "De Lorean")
still resolve. Regression test added.

Co-Authored-By: Claude Opus 5.5 <[email protected]>

* Fuzzy make: every word keeps its first letter

Found by the DEVQ A1 parity run through the web resolver's longest-prefix
loop: "citroen e" is two edits from "citroen ds", so "Citroën e-C3" became
Citroën DS C3 (and "peugeot e"/"volkswagen e" pulled e-5008 / e-Up onto the
ICE ids before the word-count rule). Word-for-word initials must now agree.
Parity: 1,255 A1 sweep queries resolve identically to production 0.7.7.

Co-Authored-By: Claude Opus 5.5 <[email protected]>

* Apply Opus I-11 verifier findings (PASS-WITH-FIXES at d1263f9)

1 (P2) Fuzzy.distance is now optimal string alignment: an adjacent swap is
  one edit, so "telsa" ties Tesla/Temsa -> nil instead of confidently Temsa
  (also "seta" no longer -> Setra). Early exit checks two rows.
2 (P2) the configured other_label never fuzzy-matches ("Otra" -> Ora broke
  models(other_label, include_other: true)).
4 (P3) MCP top_models note describes the per-country order.
5 (P3) README rank_in example (the Corolla is gb #51; use the Golf, #2);
  remaining "14 countries" -> 15, South America added.
6 (P3) README: ranks are per kind; us/ca cars have no ranks (global order).
7 (P3) README + CHANGELOG document the word-count / first-letter / swap guards.
8 (P3) data:refresh accepts refs/tags only; array-form git calls.
3 (P2, web) is filed for the coordinator: resolver.rb rung 3 should run an
  exact pass (fuzzy: false) before a fuzzy one and label typo hits.

Co-Authored-By: Claude Opus 5.5 <[email protected]>

* README model count ~15k; data:refresh reads at the verified commit (verifier P3 nits)

Co-Authored-By: Claude Opus 5.5 <[email protected]>

* mass_decile reader + top_models(by:), never fuzz id/slug/path input, exact MCP tools, CI lint green

Coordinator additions (STRETCH 2026-10-10):
- Model#mass_decile (popularity.mass_decile, data 2026.10.1+, pipeline#255,
  ruling R3), nil-safe on the bundled 2026.10.0; top_models(by:
  :mass_decile) (unranked excluded; :global_decile stays the default);
  README separates the two questions.
- Web-session requirement (verifier-grade): fuzzy never fires on input
  containing "/" or slug-shaped ("marcedes-benz"): "marcedes-benz/c-class",
  "/makes/marcedes", "car/marcedes-benz/c-class" -> nil, as in 0.7.7.
  Human names ("Marcedes-Benz C-Class", "marcedes") still resolve. MCP tools
  (search_makes, get_model) exact-only. Tests pin every case.
- CI: Ruby 3.4/rails_8.0 Lint job failed on main too (111 inherited
  offenses); frozen in .rubocop_todo.yml (generated, no code change);
  lib/vehicles/plates/series.rb added to .rubocop.yml's own ClassLength
  Exclude (it overrides the todo). Ruby 3.3/rails_8.0 failure was a
  rubygems.org network error during bundle install (re-run).

Co-Authored-By: Claude Opus 5.5 <[email protected]>

* Delta verifier fixes (PASS-WITH-FIXES at c16818d): every machine shape stays exact

F1 (P2) Fuzzy.eligible_input? also rejects Symbols, any of / _ + \, leading/
  trailing/double hyphens and UPPER-case hyphenated slugs — each fuzzed for
  every typo (:marcedes_benz, "MARCEDES-BENZ", "marcedes+benz", …); 0.7.7
  returns nil for all. Mixed case ("Marcedes-Benz") and plain words still
  fuzz. Tests pin the verifier's full list.
F2 (P3) CHANGELOG upgrade note: single-word route params still fuzz.
F3 (P3) Model#mass_decile never raises on a non-Hash popularity.
F4 (P3) docs: by: with country (rank first), to_h :mass_decile, 110+1 frozen.
Manager re-check: 223 runs 0F/0E/0S; rubocop rc=0; 30,643 make+find queries
vs 0.7.7 code on the same 2026.10.0 data: 0 changed, 0 lost.

Co-Authored-By: Claude Opus 5.5 <[email protected]>

---------

Co-authored-by: Claude Opus 5.5 <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant