Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
402 commits
Select commit Hold shift + click to select a range
cf7b470
docs: adjudicate cs locale findings
clairernovotny Mar 13, 2026
bd42998
docs: adjudicate mt locale findings
clairernovotny Mar 13, 2026
e607094
docs: adjudicate fr locale findings
clairernovotny Mar 13, 2026
2df11a8
docs: adjudicate lv locale findings
clairernovotny Mar 13, 2026
e9988d4
docs: adjudicate tr locale findings
clairernovotny Mar 13, 2026
b54174a
docs: adjudicate ms locale findings
clairernovotny Mar 13, 2026
67545df
docs: finalize locale second-pass review
clairernovotny Mar 13, 2026
9647c85
chore: add adjudicated locale fix helper
clairernovotny Mar 14, 2026
3579e2b
fix: apply adjudicated spanish locale fixes
clairernovotny Mar 14, 2026
3096162
fix: apply adjudicated locale fixes for ca th uz-cyrl zh-hant
clairernovotny Mar 14, 2026
ed78b2d
fix: apply adjudicated zh-hant locale fixes
clairernovotny Mar 14, 2026
6f1092b
fix: apply adjudicated locale fixes for af ar bg el fil he it pt-br
clairernovotny Mar 14, 2026
7201c5a
fix: apply adjudicated locale fixes for az bn fa hu is mt sv uz-latn
clairernovotny Mar 14, 2026
ce05596
fix: apply adjudicated locale fixes for cs fr hr hy id ko lv ms nb sr vi
clairernovotny Mar 14, 2026
314dcbb
docs: finalize locale fix resolution
clairernovotny Mar 14, 2026
07a4643
chore: remove review artifacts from pr
clairernovotny Mar 15, 2026
3b11c2e
feat: complete localization subsystem coverage
clairernovotny Mar 15, 2026
6350a33
fix: remediate localization review findings
clairernovotny Mar 15, 2026
a432655
fix: expand localized words-to-number support
clairernovotny Mar 16, 2026
57fa328
fix: localize generic date and time fallbacks
clairernovotny Mar 16, 2026
c6a95c9
fix: complete localization review remediation
clairernovotny Mar 16, 2026
ec8b285
fix: sync locale resources and tests
clairernovotny Mar 16, 2026
5bfe1ac
feat: complete locale resource parity
clairernovotny Mar 16, 2026
6c74a94
feat: add locale feature verification baseline
clairernovotny Mar 17, 2026
0cf4520
feat: expand localized collection formatter coverage
clairernovotny Mar 17, 2026
b41242d
feat: add german words-to-number support
clairernovotny Mar 17, 2026
9c8593f
feat: add locale collection formatters and german parser
clairernovotny Mar 17, 2026
9459833
feat: add german and catalan word parsing
clairernovotny Mar 17, 2026
aed06b4
feat: add french word parsing
clairernovotny Mar 17, 2026
bcb5261
feat: complete collection formatter registrations
clairernovotny Mar 17, 2026
4c1f848
feat: add romance word parsing
clairernovotny Mar 17, 2026
d10829a
test: strengthen italian words-to-number scenarios
clairernovotny Mar 17, 2026
1d583af
docs: plan Portuguese words-to-number
clairernovotny Mar 17, 2026
c5e3309
feat: add Danish and Slovak number to words
clairernovotny Mar 17, 2026
59e5ebe
feat: add locale number converter wave
clairernovotny Mar 17, 2026
35078ac
Align Tagalog number-to-words expectations
clairernovotny Mar 17, 2026
7f1b2c5
feat: add Spanish words to number support
clairernovotny Mar 17, 2026
ae08b5e
fix: stabilize locale word conversion tests
clairernovotny Mar 17, 2026
8e4d2f9
feat: add dutch word parsing
clairernovotny Mar 17, 2026
007be28
feat: add dutch and swedish word parsing
clairernovotny Mar 17, 2026
6974696
feat: add icelandic word parsing
clairernovotny Mar 17, 2026
11cbb27
feat: add nordic and malay word parsing
clairernovotny Mar 17, 2026
469540a
feat: add scandinavian and southeast asian word parsing
clairernovotny Mar 17, 2026
4f1b74d
feat: add chinese word parsing
clairernovotny Mar 17, 2026
fa5136c
feat: add uzbek word parsing
clairernovotny Mar 17, 2026
69fe720
feat: add turkic word parsing
clairernovotny Mar 17, 2026
d2e153f
Add Icelandic ordinal round-trip test
clairernovotny Mar 17, 2026
b9118f0
test: expand parser coverage
clairernovotny Mar 17, 2026
b5b99e8
feat: add vietnamese word parsing
clairernovotny Mar 17, 2026
87e5ad0
feat: add east asian word parsing
clairernovotny Mar 17, 2026
0f3f1e7
feat: expand locale word parsing coverage
clairernovotny Mar 18, 2026
78d992d
feat: add afrikaans word parsing
clairernovotny Mar 19, 2026
694a549
feat: add baltic and maltese word parsing
clairernovotny Mar 19, 2026
3eb76b1
feat: add nordic and hungarian word parsing
clairernovotny Mar 19, 2026
5bf6e68
feat: add semitic and greek word parsing
clairernovotny Mar 19, 2026
26bb1c3
feat: complete locale word parsing coverage
clairernovotny Mar 19, 2026
afa99b1
refactor: remove redundant default formatter registrations
clairernovotny Mar 19, 2026
3e5374d
feat: finish locale feature coverage
clairernovotny Mar 20, 2026
9ba57d6
test: finalize locale coverage matrix
clairernovotny Mar 20, 2026
4ad1862
fix: address locale PR review feedback
clairernovotny Mar 25, 2026
7a9ccde
fix: restore multi-target test compatibility
clairernovotny Mar 25, 2026
807315f
test: remove locale audit scaffolding
clairernovotny Mar 26, 2026
61cfbdb
refactor: centralize data unit resource keys
clairernovotny Mar 26, 2026
0d34d03
refactor: simplify locale registry wiring
clairernovotny Mar 26, 2026
4d00c99
perf: reduce collection formatter allocations
clairernovotny Mar 26, 2026
a5d4218
perf: reduce parser token allocations
clairernovotny Mar 26, 2026
b1d81b8
perf: stream token-based number parsers
clairernovotny Mar 26, 2026
0731ec3
refactor: share words-to-number token parsers
clairernovotny Mar 26, 2026
2453e62
build: generate locale metadata
clairernovotny Mar 26, 2026
555c371
refactor: generate locale profiles from data files
clairernovotny Mar 30, 2026
443a94f
fix: remediate locale refactor regressions
clairernovotny Mar 31, 2026
6dd5fd5
Merge remote-tracking branch 'origin/main' into codex/locale-translat…
clairernovotny Mar 31, 2026
c3de247
Refactor number-to-words converters for Malay, Portuguese, Scandinavi…
clairernovotny Mar 31, 2026
97b9c00
refactor: unify locale generation around yaml
clairernovotny Apr 1, 2026
fe51b12
docs: deepen localisation code documentation
clairernovotny Apr 1, 2026
4b8657f
refactor: replace resx locale resources with generated yaml data
clairernovotny Apr 1, 2026
9cadb54
chore: add Clairvoyance workspace knowledge to .gitignore
clairernovotny Apr 1, 2026
ba7618b
Rename converter field to Converter for naming consistency
clairernovotny Apr 1, 2026
8aa2191
fix: update ci packaging validation
clairernovotny Apr 1, 2026
5fc4e5d
test: cover english fallback for unknown cultures
clairernovotny Apr 1, 2026
c1e7658
test: sweep unknown culture fallback defaults
clairernovotny Apr 1, 2026
537f530
Bump version to 3.5.0-dev in version.json
clairernovotny Apr 1, 2026
1c3ef6a
refactor: clean up generated locale schema shapes
clairernovotny Apr 2, 2026
e078fcc
fix: align joined-scale generation with runtime
clairernovotny Apr 2, 2026
bbea058
fix: split azure ci test invocations
clairernovotny Apr 2, 2026
b088fd3
fix: align azure package output path
clairernovotny Apr 2, 2026
66eee1d
fix: reset analyzer verification exit code
clairernovotny Apr 2, 2026
846ad78
refactor: rename canonical locale schema surfaces
clairernovotny Apr 2, 2026
8e54a6d
Merge remote-tracking branch 'origin/main' into codex/locale-translat…
clairernovotny Apr 3, 2026
5fcbcaf
fix: align locale coverage with runtime behavior
clairernovotny Apr 3, 2026
e1cc56f
feat: add high-range locale number support
clairernovotny Apr 3, 2026
23746c8
fix: simplify words-to-number parsing api
clairernovotny Apr 4, 2026
1e0ed83
fix: complete remaining locale parity work
clairernovotny Apr 4, 2026
fe7da15
docs: enhance locale authoring guidance and clarify canonical structures
clairernovotny Apr 4, 2026
c1573ad
docs: add locale parity skill
clairernovotny Apr 5, 2026
f79860a
fix: update display name and description for add-locale skill
clairernovotny Apr 5, 2026
5c60687
docs: enhance localization documentation and clarify parity requirements
clairernovotny Apr 5, 2026
ca0efa1
Consolidate locale parity coverage and add audit
clairernovotny Apr 6, 2026
562d81e
chore: remove outdated locale parity audit and linguistic parity plan…
clairernovotny Apr 6, 2026
7fe9de1
feat: Add worker and workflow-scout agents for task implementation an…
clairernovotny Apr 6, 2026
590bc1b
chore: update .gitattributes for improved line ending handling and fi…
clairernovotny Apr 6, 2026
a99476b
Add YAML sections for ordinal.date and clock across various locales
clairernovotny Apr 6, 2026
f6bb8ae
Add Ralph Guard script and associated prompts for workflow enforcement
clairernovotny Apr 7, 2026
2735423
Update specs
clairernovotny Apr 7, 2026
f5e32e1
feat: Add support for non-Gregorian calendars in ordinal.date and clo…
clairernovotny Apr 7, 2026
2c6c25b
feat(clock): add phrase-clock engine and Germanic locale YAML
clairernovotny Apr 7, 2026
750784a
fix: address review feedback for phrase-clock engine
clairernovotny Apr 7, 2026
6cc38f1
fix: trim expanded templates to prevent trailing spaces on empty plac…
clairernovotny Apr 7, 2026
b2e885c
feat(clock): migrate all clock locales to unified phrase-clock engine
clairernovotny Apr 7, 2026
b906768
chore: update task spec after completion
clairernovotny Apr 7, 2026
55f0949
fix(sourcegen): handle cross-platform path separators in locale code …
clairernovotny Apr 8, 2026
021003d
feat(locales): add ordinal.date and clock YAML for Nordic and Romance…
clairernovotny Apr 8, 2026
072bf6f
fix(locales): add min0 templates and simplify nn.yml inheritance
clairernovotny Apr 8, 2026
3af7fdc
chore: update task spec for fn-1.3 in-progress status
clairernovotny Apr 8, 2026
eb7d605
chore: mark task fn-1.3 as done
clairernovotny Apr 8, 2026
470328b
fix(ro): replace English 'one' with Romanian 'o'/'un' in byteSize words
clairernovotny Apr 8, 2026
df406c1
feat(locales): add ordinal.date and clock YAML for West Slavic locales
clairernovotny Apr 8, 2026
e8f25ea
fix(locales): add Slavic paucal suffix support with West Slavic low-o…
clairernovotny Apr 8, 2026
0520068
feat(locales): add ordinal.date and clock YAML for East/South Slavic …
clairernovotny Apr 8, 2026
df2f179
fix(locales): address review feedback for East/South Slavic clock pro…
clairernovotny Apr 8, 2026
72496e6
fix(locales): add U+2019 ordinalMap variants and revert task .4 metadata
clairernovotny Apr 8, 2026
3e2ae19
fix(tests): align uk number word test expectations to use U+2019 apos…
clairernovotny Apr 8, 2026
e1b4966
chore: mark task fn-1.5 as done
clairernovotny Apr 8, 2026
fb67821
style: normalize line endings and whitespace to match .editorconfig
clairernovotny Apr 8, 2026
858897c
chore: mark task fn-1.5 as done (East/South Slavic locales)
clairernovotny Apr 8, 2026
82697e4
chore(flow): update task fn-1.5 metadata for re-run
clairernovotny Apr 8, 2026
a3268cd
chore: mark task fn-1.5 as done (East/South Slavic locales)
clairernovotny Apr 8, 2026
db42135
fix(sourcegen): separate ordinal date/dateOnly profile collections
clairernovotny Apr 8, 2026
024ae0c
fix(clock): resolve minute suffix based on template type not range
clairernovotny Apr 8, 2026
f37b0e5
chore(flow): update task fn-1.5 metadata and pitfalls
clairernovotny Apr 8, 2026
8a1a7db
chore: mark task fn-1.5 as done (East/South Slavic locales)
clairernovotny Apr 8, 2026
c536da6
fix(locales): add minuteGender to ru/uk clock profiles and gitignore …
clairernovotny Apr 8, 2026
4ca971d
feat(locales): add ordinal.date + clock YAML for Finno-Ugric, Turkic,…
clairernovotny Apr 8, 2026
52d6786
fix(locales): add min0 bucket template for az/el/hu/hy clock profiles
clairernovotny Apr 8, 2026
613061a
chore(meta): update setup version to 0.29.1 and setup date to 2026-04-08
clairernovotny Apr 8, 2026
fd01c7b
feat(locales): add clock YAML for Baltic and Indo-Iranian locales
clairernovotny Apr 8, 2026
22da334
fix(locales): eliminate double day-period bug in Kurdish clock profile
clairernovotny Apr 8, 2026
3876eca
fix(clock): use template-aware day-period resolution and {dayPeriod} …
clairernovotny Apr 8, 2026
be4f8a9
fix(meta): correct day-period pitfall to include {nextArticle} template
clairernovotny Apr 8, 2026
75190de
chore(flow): update task fn-1.7 metadata for in-progress status
clairernovotny Apr 8, 2026
2733df2
chore(flow): mark task fn-1.7 as done (Baltic/Indo-Iranian clock loca…
clairernovotny Apr 8, 2026
55ad5a5
feat(locales): add ordinal.date + clock YAML for East Asian locales
clairernovotny Apr 9, 2026
1cc7010
fix(locales): use distinct night day-period labels for East Asian loc…
clairernovotny Apr 9, 2026
3d6841f
fix(ordinal-date): use calendar-aware day in Native mode and normaliz…
clairernovotny Apr 9, 2026
725c86c
feat(locales): add ordinal.date + clock YAML for Austronesian, Semiti…
clairernovotny Apr 9, 2026
557ba27
fix: remove redundant using directives in EngineContractCatalog
clairernovotny Apr 9, 2026
dbac93b
feat(tests): add 3 missing registry completeness tests
clairernovotny Apr 9, 2026
36c17d3
docs(locales): update documentation for phrase-clock engine and local…
clairernovotny Apr 9, 2026
8f87a4c
fix(docs): correct hourWordsMap length description for h24/numeric modes
clairernovotny Apr 9, 2026
679679a
fix(docs): correct range-template boundaries and day-period shift sem…
clairernovotny Apr 9, 2026
2773f41
chore(flow): update task .10 spec and pitfalls memory
clairernovotny Apr 9, 2026
7d037d0
fix: reduce per-call allocations in PhraseClockNotationConverter and …
clairernovotny Apr 9, 2026
a462b73
fix: eliminate remaining string allocations and align reference docs
clairernovotny Apr 9, 2026
a60d8bd
fix(spec): clarify allocation acceptance criterion for phrase-clock c…
clairernovotny Apr 9, 2026
cecf216
Update locale translation epic status and review timestamps
clairernovotny Apr 9, 2026
f8b8ead
feat: add locale documentation updates and probe tool for accurate lo…
clairernovotny Apr 9, 2026
f68019b
fix: add missing using directive for System.Text.Json.Serialization i…
clairernovotny Apr 9, 2026
26bcabf
add mac
clairernovotny Apr 9, 2026
36978df
linux
clairernovotny Apr 9, 2026
3b7393b
feat: add locale probe tool for .NET Framework 4.8 with project and c…
clairernovotny Apr 9, 2026
1e30e5d
win10
clairernovotny Apr 9, 2026
12bd2b8
net38
clairernovotny Apr 9, 2026
8e8c715
feat(tests): delete pure ICU-snapshot tests with zero Humanizer coverage
clairernovotny Apr 9, 2026
d5cc87b
docs(locale): add decision document for locale override canonical values
clairernovotny Apr 9, 2026
29a942b
fix(locale-decisions): address review feedback for fa, he, ku overrides
clairernovotny Apr 9, 2026
bc0c032
fix(locale-decisions): tighten source citations, add governing princi…
clairernovotny Apr 9, 2026
721580a
fix(locale-decisions): concrete CLDR versions for all decisions, flag…
clairernovotny Apr 9, 2026
e086a25
chore: remove stray backtick file
clairernovotny Apr 9, 2026
745d5ba
feat(calendar): add calendar surface with months override and thread …
clairernovotny Apr 9, 2026
a39b274
fix(calendar): address review feedback for OrdinalDatePattern
clairernovotny Apr 9, 2026
81d7ba0
fix(calendar): fix SubstituteMonth first-match and punctuation adjacency
clairernovotny Apr 9, 2026
6231780
fix(calendar): enforce single MMMM in generator validation
clairernovotny Apr 9, 2026
6e727fd
feat(number): add number.formatting surface with decimalSeparator and…
clairernovotny Apr 9, 2026
a2e86e4
docs: document calendar and number.formatting surfaces, fix stale doc…
clairernovotny Apr 9, 2026
a50f11d
verify(locale): cross-platform consistency verification and signoff
clairernovotny Apr 9, 2026
fed49bc
fix: address review feedback for fn-3.6 verification gate
clairernovotny Apr 9, 2026
baeca85
Update epics and tasks for fn-3 and fn-4
clairernovotny Apr 9, 2026
8f00032
Update project metadata, remove pre-commit hook, and modify .gitignore
clairernovotny Apr 9, 2026
91d14f3
Add tasks for fn-5 locale parity sign-off: refresh skill and close fn…
clairernovotny Apr 9, 2026
831ae5f
fix(locale): reconcile calendar.months for ta and zu-ZA; fix ku decim…
clairernovotny Apr 9, 2026
7197b1d
fix: address review feedback for fn-5.1 calendar reconciliation
clairernovotny Apr 9, 2026
5a0e74e
fix: extend compare-probes.cs matrix to include raw month arrays; sof…
clairernovotny Apr 9, 2026
8b7c643
fix: address review feedback for fn-5.1 probe coverage and evidence c…
clairernovotny Apr 9, 2026
1726f6c
fix: clarify verification completeness and fix macOS version in signoff
clairernovotny Apr 9, 2026
e908527
fix: mark net8.0 acceptance as explicitly deferred in task spec and d…
clairernovotny Apr 9, 2026
b31ed4e
docs(agent): fix stale doc drift in CLAUDE.md and AGENTS.md
clairernovotny Apr 9, 2026
a972cd7
docs: update release notes, readme, and ARCHITECTURE.md for fn-3 deli…
clairernovotny Apr 10, 2026
abb4558
fix: enumerate canonical surface names explicitly in readme and ARCHI…
clairernovotny Apr 10, 2026
f1d5238
docs(skill): refresh add-locale skill for 8 canonical surfaces + nest…
clairernovotny Apr 10, 2026
40ce7ff
docs(audit): reconcile fn-3 historical spec/task drift against FinalO…
clairernovotny Apr 10, 2026
d825612
docs(audit): update fn-5.6 evidence with commit hash
clairernovotny Apr 10, 2026
c1bd879
fix(audit): sync fn-5.6 JSON status to done and clarify done summary …
clairernovotny Apr 10, 2026
3d0c0c0
docs(signoff): close fn-2 proxy, run scan battery, append final sign-…
clairernovotny Apr 10, 2026
adf314a
fix(signoff): address review feedback on fn-5.5 sign-off
clairernovotny Apr 10, 2026
482dbde
fix(signoff): update spec allowlists and gate-completeness for review
clairernovotny Apr 10, 2026
e6e018f
fix(signoff): sync fn-5 task JSON statuses and clarify summary
clairernovotny Apr 10, 2026
d40bbbe
fix(signoff): update epic spec to allow net8.0 CI deferral
clairernovotny Apr 10, 2026
320507b
fix(signoff): record final sign-off commit hash in artifacts
clairernovotny Apr 10, 2026
424ed0d
fix(tests): resolve net48 build break via #if guard for Enum.GetValue…
clairernovotny Apr 10, 2026
3f17c90
fix(docs): clarify AGENTS.md net48 platform guidance per review feedback
clairernovotny Apr 10, 2026
dd476b9
fix(signoff): run net8.0 tests locally and restore strict acceptance …
clairernovotny Apr 10, 2026
03688f8
fix: address review feedback — reconcile fn-5.7 task metadata and nar…
clairernovotny Apr 10, 2026
63b2912
fix: add evidence to fn-5.5 JSON and fill fn-5.8 task record
clairernovotny Apr 10, 2026
94cbc23
fix: add verbatim evidence, correction commit hashes, and reconcile f…
clairernovotny Apr 10, 2026
b1877b7
fix: tighten validate acceptance wording and refresh fn-5.5 updated_at
clairernovotny Apr 10, 2026
0534b2a
fix: address review round 5 — reconcile description scope and dedupli…
clairernovotny Apr 10, 2026
04d20ee
fix: mark fn-5.8 done — net8.0 + net10.0 tests verified locally, stri…
clairernovotny Apr 10, 2026
a5ff293
fix: sync task JSON metadata with markdown and address review feedback
clairernovotny Apr 10, 2026
db3bcd5
chore: add review export for fn-5.8 SHIP verdict
clairernovotny Apr 10, 2026
269460e
docs(signoff): reconcile sign-off doc, fix pitfall entries, close fn-…
clairernovotny Apr 10, 2026
b02481e
chore: add review receipt for fn-5.9 SHIP verdict
clairernovotny Apr 10, 2026
cecacea
chore: remove manually-written receipt for proper skill-based review
clairernovotny Apr 10, 2026
bafe909
fix: address review feedback — consistent cross-platform language, co…
clairernovotny Apr 10, 2026
1359b93
chore: add review receipt for fn-5.9 SHIP verdict
clairernovotny Apr 10, 2026
8a6db1b
fix: sync fn-5.9 task JSON status to done (was stale todo)
clairernovotny Apr 10, 2026
7c9030a
Update completion review status and timestamps for locale parity sign…
clairernovotny Apr 10, 2026
f05fa04
feat: implement number formatting overrides for negativeSign and grou…
clairernovotny Apr 10, 2026
86096be
feat(sr): add Cyrillic calendar month overrides to sr.yml
clairernovotny Apr 10, 2026
ba28e05
feat(number-formatting): extend source generator for negativeSign + g…
clairernovotny Apr 10, 2026
bddba38
fix: address review feedback for number formatting overrides
clairernovotny Apr 10, 2026
375e51a
fix: route double-based metric formatting through override-aware NFI
clairernovotny Apr 10, 2026
9bf5bbe
fix: route ByteSize.ToString() convenience overloads through CultureInfo
clairernovotny Apr 10, 2026
4ade7af
feat(locales): add negativeSign/groupSeparator YAML overrides and wir…
clairernovotny Apr 10, 2026
f27f1b4
fix: guard OrdinalizeExtensions culture-aware overloads against null …
clairernovotny Apr 10, 2026
de0d384
fix: extend override-aware formatting to string Ordinalize overloads
clairernovotny Apr 10, 2026
42585bf
fix: centralize override-aware parsing in string Ordinalize overloads
clairernovotny Apr 10, 2026
cc750b6
docs: document negativeSign and groupSeparator number.formatting fields
clairernovotny Apr 10, 2026
17c72d2
fix(docs): correct consumer list and parse/format boundary claims
clairernovotny Apr 10, 2026
edae073
fix(docs): widen consumer descriptions to feature families
clairernovotny Apr 10, 2026
2c7b3f6
fix(docs): align ARCHITECTURE.md and checklist with feature families
clairernovotny Apr 10, 2026
8e6b535
fix(docs): precise ByteSize.TryParse scope and ICU/NLS framing
clairernovotny Apr 10, 2026
1b25f2f
fix(docs): normalize ICU-only framing to platform globalization data
clairernovotny Apr 10, 2026
f733634
fix(docs): remove unsupported day names and normalize ICU-only headings
clairernovotny Apr 10, 2026
994cc83
fix(docs): add target framework variance to override trigger language
clairernovotny Apr 10, 2026
c594a78
fix(docs): broaden probe language and checklist for cross-TFM variance
clairernovotny Apr 10, 2026
c37cba7
fix(docs): narrow parse-path override claim to ByteSize.TryParse only
clairernovotny Apr 10, 2026
9591759
fix(docs): distinguish which overrides Ordinalize parsing actually uses
clairernovotny Apr 10, 2026
4f6f45b
fix: restore parse-path boundary in Ordinalize string overloads
clairernovotny Apr 10, 2026
966583c
fix(docs): correct override consumer claims for Ordinalize string ove…
clairernovotny Apr 10, 2026
c8e8a5e
Update completion review status and timestamps for fn-6-fix-45-failin…
clairernovotny Apr 10, 2026
e3ed413
feat: implement CI code coverage reporting for test failures
clairernovotny Apr 10, 2026
18e9424
fix(ci): ensure coverage reports are always generated and published
clairernovotny Apr 10, 2026
9146366
fix(ci): rename .devskim to .devskim.json to match workflow reference
clairernovotny Apr 10, 2026
3da2a38
fix(ci): remove invalid JSON comments from .devskim.json
clairernovotny Apr 10, 2026
934e170
fix(ci): update CI configuration to ensure coverage reports are gener…
clairernovotny Apr 10, 2026
ffad912
fix(ci): remove unnecessary results-directory argument from test comm…
clairernovotny Apr 10, 2026
140977c
fix(ci): simplify test commands to run all tests in a single step
clairernovotny Apr 10, 2026
0306229
fix(ci): update test command arguments to include portable debug type
clairernovotny Apr 10, 2026
65f4ce7
fix(ci): remove unnecessary debug type argument from test command
clairernovotny Apr 10, 2026
71a03c5
fix(ci): enhance code coverage configuration and build arguments for …
clairernovotny Apr 10, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
338 changes: 338 additions & 0 deletions .agents/skills/add-locale/SKILL.md

Large diffs are not rendered by default.

4 changes: 4 additions & 0 deletions .agents/skills/add-locale/agents/openai.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
interface:
display_name: "Add Humanizer Locale"
short_description: "Add a locale with full parity"
default_prompt: "Use $add-locale to add a new Humanizer locale or bring an existing one to full parity."
273 changes: 273 additions & 0 deletions .agents/skills/add-locale/references/parity-checklist.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,273 @@
# Humanizer Locale Parity Checklist

Use this file after reading `SKILL.md`. It is the detailed repo map for proving that locale work is actually complete.

## Surface Inventory

Treat these as the localized surfaces that must be intentionally accounted for when a shipped locale is added or brought to parity:

Canonical authoring surfaces under `surfaces` are exactly `list`, `formatter`, `phrases`, `number`, `ordinal`, `clock`, `compass`, and `calendar`. Canonical nested members are `number.words`, `number.parse`, `number.formatting`, `ordinal.numeric`, `ordinal.date`, `ordinal.dateOnly`, `calendar.months`, and `calendar.monthsGenitive`.

- `list`
Collection formatting and conjunction behavior.
- `formatter`
Formatter grammar/resources and formatter-side grammatical metadata.
- `phrases`
Relative date phrases, duration phrases, data-unit phrases, and time-unit phrases.
- `number`
Parent surface for `number.words`, `number.parse`, and `number.formatting`.
- `number.words` — Cardinal words, ordinal words, tuple conversion, and any grammar-sensitive number rendering.
- `number.parse` — Native words-to-number parsing for the locale's natural written forms.
- `number.formatting` — Decimal separator override for stable cross-platform numeric output. Only authored when the locale's ICU-supplied decimal separator differs across platforms.
- `ordinal`
Parent surface for `ordinal.numeric`, `ordinal.date`, and `ordinal.dateOnly`.
- `ordinal.numeric` — Numeric ordinalization for `Ordinalize`.
- `ordinal.date` — `DateTime.ToOrdinalWords`.
- `ordinal.dateOnly` — `DateOnly.ToOrdinalWords` on supported targets.
- `clock`
`TimeOnly.ToClockNotation` on supported targets.
- `compass`
Locale-owned compass directions if the locale surface exists or is being introduced.
- `calendar`
Month-name overrides (nominative and genitive) for stable cross-platform date output. Only authored when the locale's ICU-supplied month names differ across platforms.
- `calendar.months` — Exactly 12 nominative month-name entries when present.
- `calendar.monthsGenitive` — Exactly 12 genitive month-name entries when present.

There is no shipped-locale exemption list in this repo. If any canonical surface is unresolved, parity is incomplete.

Parity means each surface above is one of:

- locale-owned and tested
- intentionally inherited from a same-language parent and tested where inheritance matters

Parity does not allow:

- English fallback for shipped locales
- unsupported-locale exceptions for shipped locales
- "we only translated the YAML we already had"
- leaving a missing surface for a later pass

## Required Parity Map Artifact

Create and maintain a working artifact at:

`artifacts/YYYY-MM-DD-<locale>-parity-map.md`

This file is intentionally not source controlled. It is the working proof that the locale has been audited across all shipped localized surfaces.

Use this table shape:

| surface | ownership path | current state | target state | files to change | tests proving parity | proof file/assertion | verification command | verification exit status | verified at | status | term review status |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |

Use these state values only:

- `locale-owned`
- `same-language inherited`
- `missing`
- `english-fallback`
- `unsupported`

Use `term review status` values such as:

- `not-needed`
- `pending`
- `proposer-approved`
- `reviewer-rejected`
- `resolved`

Use `status` values such as:

- `not-started`
- `blocked`
- `in-progress`
- `proved`

`proof file/assertion` should name the concrete file and assertion or exact-output expectation that proves the surface.

`verification command` should be the command that exercises the proof, even if it is a focused test command used before the final full-suite run.

`verification exit status` should record the actual exit code.

`verified at` should record the local timestamp when the proof was run.

The artifact is not done until every shipped localized surface is present and no row remains at `missing`, `english-fallback`, or `unsupported`.

Below the table, add an `Effective Gap Summary` section listing any surfaces still unresolved for the locale after considering same-language inheritance. This should end empty.

Also include:

- a `Preflight Gap Report` section with one row per canonical surface marked `locale-owned`, `same-language inherited`, `missing`, `english-fallback`, `unsupported`, or `unknown`
- a `Before/After Parity Delta` section listing the initial unresolved surfaces and the final unresolved surfaces
- a `Surface Closeout` section with one line per canonical surface recording final ownership and proof

Required proof subrows:

- `phrases.relativeDate`
- `phrases.duration`
- `phrases.dataUnits`
- `phrases.timeUnits`
- `number.words.cardinal`
- `number.words.ordinal`
- `number.parse.cardinal`
- `number.parse.ordinal`
- `number.formatting.decimalSeparator` (only when the locale authors a `number.formatting` override; mark "inherited from parent" or "not applicable" otherwise)
- `calendar.months` (only when the locale authors a `calendar` override; mark "inherited from parent" or "not applicable" otherwise)
- `calendar.monthsGenitive` (only when the locale authors a `calendar` override with a genitive array; mark "inherited from parent" or "not applicable" otherwise)

Add more `number.words.*` and `number.parse.*` proof subrows whenever the selected engine owns additional meaningful branches such as tuple handling, gendered variants, abbreviation parsing, or special composition paths.

## Primary Repo Files

Start with these:

- `docs/adding-a-locale.md`
- `docs/locale-yaml-how-to.md`
- `docs/locale-yaml-reference.md`
- `src/Humanizer.SourceGenerators/Common/CanonicalLocaleAuthoring.cs`
- `src/Humanizer/Locales/<locale>.yml`
- parent locale YAML files when `variantOf` is involved

Inspect these when parity requires runtime or generator work:

- `src/Humanizer.SourceGenerators/Common/LocaleYamlCatalog.cs`
- `src/Humanizer.SourceGenerators/Common/EngineContractCatalog.cs`
- `src/Humanizer.SourceGenerators/Generators/ProfileCatalogs/*`
- `src/Humanizer.SourceGenerators/Generators/LocaleRegistryInput.cs`
- `src/Humanizer/Localisation/*`

Inspect these when proving parity:

- `tests/Humanizer.Tests/Localisation/LocaleCoverageData.cs`
- `tests/Humanizer.Tests/Localisation/LocaleFallbackSweepTests.cs`
- `tests/Humanizer.Tests/Localisation/LocaleRegistrySweepTests.cs`
- `tests/Humanizer.Tests/Localisation/GeneratedLocaleData/GeneratedFormatterRuntimeTests.cs`
- `tests/Humanizer.Tests/Localisation/ExactLocaleDateAndTimeRegistryTests.cs`
- `tests/Humanizer.Tests/Localisation/<culture>/*`
- `tests/Humanizer.SourceGenerators.Tests/*`

## Surface-To-Files Matrix

Use this as the default starting point for where each surface usually needs work:

| surface | primary locale source | likely runtime/generator touchpoints | likely tests |
| --- | --- | --- | --- |
| `list` | `src/Humanizer/Locales/<locale>.yml` | generated collection formatter wiring | `LocaleCoverageData`, `LocaleFallbackSweepTests`, locale-specific collection tests |
| `formatter` | `src/Humanizer/Locales/<locale>.yml` | formatter profile generation, formatter registries, shared formatter kernels, grammar extraction | `GeneratedFormatterRuntimeTests`, `LocaleCoverageData`, locale-specific formatter tests |
| `phrases` | `src/Humanizer/Locales/<locale>.yml` | phrase profile generation and generated phrase tables used by formatter/runtime paths | `GeneratedFormatterRuntimeTests`, `LocaleCoverageData`, locale-specific phrase and humanize tests |
| `number.words` | `src/Humanizer/Locales/<locale>.yml` | `EngineContractCatalog.cs`, number profile catalogs, number-to-words runtime kernels | `LocaleRegistrySweepTests`, locale-specific `NumberToWordsTests` |
| `number.parse` | `src/Humanizer/Locales/<locale>.yml` | parse profile catalogs, `WordsToNumberConverterRegistry`, words-to-number runtime kernels | `LocaleRegistrySweepTests`, `WordsToNumberTests`, locale-specific parsing tests |
| `ordinal.numeric` | `src/Humanizer/Locales/<locale>.yml` | ordinalizer registry/profile wiring or residual ordinalizer runtime | `LocaleRegistrySweepTests`, locale-specific `OrdinalizeTests` |
| `ordinal.date` | `src/Humanizer/Locales/<locale>.yml` | date-to-ordinal registries, ordinal date runtime patterns/kernels | `LocaleRegistrySweepTests`, `ExactLocaleDateAndTimeRegistryTests`, locale-specific date-ordinal tests |
| `ordinal.dateOnly` | `src/Humanizer/Locales/<locale>.yml` | date-only ordinal registries, shared ordinal date runtime paths | `LocaleRegistrySweepTests`, `ExactLocaleDateAndTimeRegistryTests`, locale-specific date-only tests |
| `clock` | `src/Humanizer/Locales/<locale>.yml` | clock notation registries, `src/Humanizer/Localisation/TimeToClockNotation/*` | `LocaleRegistrySweepTests`, `ExactLocaleDateAndTimeRegistryTests`, locale-specific clock tests |
| `compass` | `src/Humanizer/Locales/<locale>.yml` | generated compass/profile wiring and any compass-specific runtime support | locale-specific compass tests and any sweep coverage that exercises registry presence |
| `calendar` | `src/Humanizer/Locales/<locale>.yml` | `src/Humanizer.SourceGenerators/Generators/ProfileCatalogs/OrdinalDateProfileCatalogInput.cs`, calendar month-name override generation | `LocaleRegistrySweepTests`, locale-specific date-ordinal tests |
| `number.formatting` | `src/Humanizer/Locales/<locale>.yml` | `src/Humanizer.SourceGenerators/Generators/LocaleRegistryInput.cs`, decimal-separator override generation | `LocaleRegistrySweepTests`, locale-specific number-formatting tests |

## Implementation Decisions

Use this order:

1. Check whether the locale already works through explicit same-language inheritance.
2. Reuse an existing shared engine if the behavior is the same algorithm with different locale data.
3. Add or extend a shared structural engine if the rule family is reusable.
4. Keep or add a locale-specific runtime leaf only when the behavior is genuinely procedural.

If step 4 happens, justify it in code and tests. Do not quietly normalize a locale-specific leaf as if it were generic.

If inheritance is used, record the full chain to the terminal owner and add at least one locale-specific proving assertion for each inherited canonical surface.

## Term Authoring Review

When the work introduces new locale-owned wording, use two subagents before finalizing terms:

- a proposer subagent to generate the most language-appropriate terms for the target feature surface
- an independent reviewer subagent acting as a native speaker to review those terms for naturalness and correctness

The reviewer must actively look for:

- literal translations that miss how native speakers actually express the concept
- awkward register or phrasing
- incorrect grammar, gender, plurality, or inflection
- parser tokens or number terms that are technically understandable but not idiomatic

Do not accept locale-owned wording until both passes converge or the disagreement is resolved with a justified final choice.

If the work introduces new locale-owned wording, run the reviewer again on representative composed runtime outputs. Approving isolated terms is not enough if the final Humanizer sentences are awkward. If the reviewer cannot credibly claim native-level or near-native confidence for judging naturalness, completion is blocked.

Term acceptance rubric:

- the phrase is something native speakers would actually say in this product context
- grammar, gender, plurality, and inflection match the runtime usage
- parser tokens reflect natural written forms rather than dictionary glosses
- the phrase fits Humanizer semantics, not just literal translation of an English resource key
- rejected alternatives and final rationale are recorded in the parity map artifact
- reviewer confidence, reviewer limitations, and reviewed runtime outputs are recorded in the parity map artifact

## Test Expectations

Every parity change should leave behind both exact-output and sweep-style proof:

- culture-specific tests under `tests/Humanizer.Tests/Localisation/<culture>`
- registry and fallback sweep updates when the locale joins or changes a shipped surface
- source-generator tests when YAML schema, inheritance, profile generation, or registry wiring change

When auditing failures, distinguish:

- direct locale ownership
- acceptable same-language inheritance
- unresolved effective gaps after following `variantOf`

Useful checks already in the repo:

- formatter coverage and parent-inheritance expectations in `LocaleCoverageData`
- fallback sweep coverage in `LocaleFallbackSweepTests`
- number, ordinal, date, clock, and words-to-number registry coverage in `LocaleRegistrySweepTests`
- exact generated formatter behavior in `GeneratedFormatterRuntimeTests`
- exact locale-owned date and clock behavior in `ExactLocaleDateAndTimeRegistryTests`

Do not treat "the test suite passed" as proof by itself. Each canonical surface and required proof subrow needs an identifiable proving test, assertion, or exact-output expectation recorded in the parity artifact.

## Verification Commands

```
dotnet test tests/Humanizer.SourceGenerators.Tests/Humanizer.SourceGenerators.Tests.csproj --framework net10.0
dotnet test tests/Humanizer.Tests/Humanizer.Tests.csproj --framework net10.0
dotnet test tests/Humanizer.Tests/Humanizer.Tests.csproj --framework net8.0
dotnet pack src/Humanizer/Humanizer.csproj -c Release
```

Run narrower focused tests first if you are iterating, but do not claim parity until the full commands above pass.

## Explicit Stop Conditions

Stop and keep working if any of these remain true:

- a surface still depends on implicit fallback rather than intentional ownership
- the preflight gap report still has `unknown` entries
- a same-language parent output looks unnatural for the child locale
- the parity map does not match the canonical surface list in `CanonicalLocaleAuthoring.cs`
- the parity map has gaps or unresolved review states
- any surface row or required proof subrow lacks concrete proof or is not yet `proved`
- exact-output coverage is missing for grammar-sensitive behavior
- runtime or generator ownership is still unclear from the code paths you changed

## Final Question

Before marking the work complete, answer this literally:

"Can every shipped localized feature for this locale now execute through intentional locale ownership or intentional same-language inheritance, with no English fallback, no unsupported-locale gaps, and passing parity tests?"

If the answer is not an unqualified yes, keep working.

## Common Rationalizations To Reject

- "The parent locale probably covers that."
- "That surface was never implemented for this locale anyway."
- "The YAML shape is valid, so parity is basically done."
- "I only changed wording, so sweep coverage is unnecessary."
- "The output is understandable even if it is not what native speakers would say."
- "I can leave the remaining surfaces for a later locale pass."

All of these mean the locale is not yet at parity.
Loading
Loading