Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
91 commits
Select commit Hold shift + click to select a range
05de2a3
Add a conformance suite for HermitCrab, with its adequacy argument
johnml1135 Sep 26, 2026
a8d403d
fix(hc): retain template trace failure reason
johnml1135 Sep 30, 2026
721a770
Add narrowing-rule unapplication regression fixtures to the conforman…
johnml1135 Oct 9, 2026
51c9e51
Leave the engine trace unchanged in the conformance suite
johnml1135 Oct 14, 2026
ddc479a
Fail the conformance coverage report on dead rules and gaps
johnml1135 Oct 14, 2026
5e8d5c5
Keep the main CI build unchanged by the conformance suite
johnml1135 Oct 14, 2026
a0c49b3
Record that #494 fixed the chained output-feature parse loss
johnml1135 Oct 14, 2026
29d29c0
Make local_check.sh run the conformance gates that can pass
johnml1135 Oct 14, 2026
afa6979
Read mutant outcomes as UTF-8 in the counterfactual sweep
johnml1135 Oct 14, 2026
c5baecc
Regenerate the conformance ledgers with mutant outcomes read as UTF-8
johnml1135 Oct 15, 2026
a4a7bd0
Cover #529's isCliticRule in the conformance suite
johnml1135 Oct 15, 2026
df491fd
Cap counterfactual mutant children at a 2 GB GC heap
johnml1135 Oct 16, 2026
188521f
Add a conformance fixture for #522's AnalysisMergeKey final-template-…
johnml1135 Oct 20, 2026
b08a816
Add a morpher: settings channel to words.yaml, and a DelReapps fixtur…
johnml1135 Oct 21, 2026
4e2f4ab
Apply CSharpier to the morpher: settings change
johnml1135 Oct 21, 2026
5abc18a
Tag deletion-reapplications' exercised construct and regenerate cover…
johnml1135 Oct 21, 2026
c4e1ffc
Replay named parser settings variants with complete oracle expectations
johnml1135 Oct 22, 2026
cdcd1bc
Tighten the conformance runner's crash and timeout handling
johnml1135 Oct 22, 2026
33a219a
Reject malformed fixture inputs instead of misreading them
johnml1135 Oct 22, 2026
0ecd0d4
Keep counterfactual verdicts honest about timeouts and load failures
johnml1135 Oct 22, 2026
1082438
Clean up batch, tool and test duplication
johnml1135 Oct 22, 2026
77f2d38
Wrap and de-point the new runner and gate comments
johnml1135 Oct 22, 2026
a7c6148
Format the merged runner
johnml1135 Oct 22, 2026
be07f8d
Expect kanmo to trace only mrSfxMo
johnml1135 Oct 22, 2026
868792e
Drop the conformance memoization switch and parse each word once
johnml1135 Oct 22, 2026
be5906d
Cover the runner timeout, batch resume and checklist gate fixes
johnml1135 Oct 22, 2026
04845ef
Count only a refused grammar as load-failure evidence
johnml1135 Oct 22, 2026
e0d3039
Regenerate the semantic-coverage ledgers under the exit-code contract
johnml1135 Oct 22, 2026
79cd438
Pick the expect-crash control from fixtures the run would execute
johnml1135 Oct 23, 2026
c9d2743
Delete the stale PR #494 review notes
johnml1135 Oct 23, 2026
194dca9
Reject an invalid batch --start with a message
johnml1135 Oct 23, 2026
0175d22
Propose expect_skip for a word the oracle skipped
johnml1135 Oct 23, 2026
b04c045
Write the mutant child's word list to the temp directory
johnml1135 Oct 23, 2026
64bff9a
Shorten the expect-crash control comment to the comment budget
johnml1135 Oct 23, 2026
52bdc14
Graduate shared PanGloss fixtures and preserve ambiguous rule traces
johnml1135 Oct 23, 2026
2943a7c
Check blocked_by labels against grammar rule ids; categorize ledger f…
johnml1135 Oct 23, 2026
f3f8780
Wrap an over-long doc comment line
johnml1135 Oct 23, 2026
09a2ee5
Format four files that csharpier check rejects at the branch base
johnml1135 Oct 23, 2026
cc65caa
Add braces the IDE0011 build rule requires in CoverageGapRatchetTests
johnml1135 Oct 23, 2026
68646e0
Add a conformance fixture showing a partial lexical entry cannot resc…
johnml1135 Oct 23, 2026
7460927
Update the pinned ledger counts for the regenerated conformance ledgers
johnml1135 Oct 23, 2026
4521033
Add complete truncation identity derivations to conformance fixtures
johnml1135 Oct 23, 2026
c9839d7
Add shared truncation identity companions
johnml1135 Oct 24, 2026
1085e34
Label rule-trace mismatch as declared N, traced M (F29)
johnml1135 Oct 26, 2026
dbcbd39
Drop undefined silent16 comment from corroboration pins (F30)
johnml1135 Oct 26, 2026
ba91331
State what each ledger pin measures, not corpus history (F31)
johnml1135 Oct 26, 2026
2904a71
Remove review-round SHA from truncate-morphotactic comment (F33)
johnml1135 Oct 26, 2026
6932cd6
Describe rule-order measurement as a recorded run, not scratch comman…
johnml1135 Oct 26, 2026
81a06d6
Regenerate conformance manifest after the truncate-morphotactic words…
johnml1135 Oct 26, 2026
03d1af2
Add five conformance fixtures pinning clitic designation and final-te…
johnml1135 Oct 26, 2026
4b4c99e
Evidence NonPartialRuleProhibitedAfterFinalTemplate by severing isCli…
johnml1135 Oct 26, 2026
d5672d7
Regenerate the conformance ledgers, manifest and pinned counts for th…
johnml1135 Oct 26, 2026
4270648
Shorten the gate-inventory isCliticRule comment to the comment budget
johnml1135 Oct 26, 2026
7050d24
Regenerate the deep-optional-affix-nesting FieldWorks witness with pr…
johnml1135 Oct 27, 2026
d5ac779
Compare bracketed shape classes as sets in the conformance runner
johnml1135 Oct 28, 2026
a985dbe
Refresh engine gate inventory after synthesis filtering
johnml1135 Oct 29, 2026
cf84539
Classify allomorph applicability in conformance ledgers
johnml1135 Oct 29, 2026
9b2ff58
Add PanGloss conformance fixtures
johnml1135 Oct 30, 2026
bdd369f
conformance: add rewrite-default-full-set (PanGloss#85, C#-verified)
johnml1135 Oct 31, 2026
49bbe7f
conformance: add ad hoc prohibition copy fixtures (PanGloss#99, #100;…
johnml1135 Oct 31, 2026
9fd3f8a
conformance: align semantic coverage evidence with the ad hoc fixtures
johnml1135 Oct 31, 2026
8b53838
Pin FLEx null affix environments in conformance
johnml1135 Oct 30, 2026
208f012
Record null affix fixture coverage evidence
johnml1135 Oct 30, 2026
f459717
Refresh interaction counts for null affix probe
johnml1135 Oct 30, 2026
eb184a4
conformance: add ad hoc prohibition enclitic and control fixtures (C#…
johnml1135 Nov 1, 2026
9d7963a
Regenerate the interface witness ledger so truncate-morphotactic rows…
johnml1135 Nov 1, 2026
19a2979
Drop clitic tags that the words do not show from clitic-stem-entry an…
johnml1135 Nov 1, 2026
b84c578
Compare rule traces on the same canonical bracket-class signature as …
johnml1135 Nov 1, 2026
d1f545c
State seven no-DTD-attribute gates and 24 failure reasons in the engi…
johnml1135 Nov 1, 2026
f0bcf29
Correct the frozen-ledger gate-arm figures in the conformance docs RE…
johnml1135 Nov 1, 2026
863d96c
Mark final-template-merge-key FieldWorks-producible, since its note n…
johnml1135 Nov 1, 2026
7d5087e
Make template-category-sharing, final-template-partial-root and final…
johnml1135 Nov 1, 2026
b5923ac
Make the three clitic layout fixtures FieldWorks-producible by droppi…
johnml1135 Nov 1, 2026
61f72ca
Convert chained-output-feature-override-loss to an unordered stratum,…
johnml1135 Nov 1, 2026
02fbdab
Convert suffixing-evidential-adjacency-chain to exclude-only co-occur…
johnml1135 Nov 1, 2026
15ff041
Drop the identity slot-rule outputPartOfSpeech from suffixing-evident…
johnml1135 Nov 1, 2026
e21aae4
Delete the 27 fixtures that still exercise a construct no FieldWorks …
johnml1135 Nov 1, 2026
de2eb6b
Every ledger, count pin, doc and evidence card now describes the 124-…
johnml1135 Nov 1, 2026
ec897fa
The six FieldWorks witness projects now carry only the writing-system…
johnml1135 Nov 1, 2026
6e1155f
The three witness projects added by the enclitic ad hoc prohibition f…
johnml1135 Nov 1, 2026
dc16ba2
The ledgers, count pins and evidence cards now describe the 127-fixtu…
johnml1135 Nov 1, 2026
2b9d855
The counterfactual freshness test and the --counterfactual report now…
johnml1135 Nov 1, 2026
6eac4fa
The stack-overflow classification of a mutant child is pinned by a un…
johnml1135 Nov 1, 2026
3098768
PROTOCOL section 9 now says an inflectional rule's subrules can carry…
johnml1135 Nov 1, 2026
3646d3f
The TraceFloor drop from 68 to 61 is explained by the two clitic and …
johnml1135 Nov 1, 2026
51b331f
Four fixtures' notes now say what their words pin: exclude semantics …
johnml1135 Nov 1, 2026
74a6330
Two comments that narrated a removed fixture now state only what is t…
johnml1135 Nov 1, 2026
d1b53a3
The not-in-signature fixture re-run is tested again, on synthetic fix…
johnml1135 Nov 1, 2026
e9569ec
The template-category-sharing doc now says its scratch mutation was r…
johnml1135 Nov 1, 2026
1358310
The conformance README now states the ledgers' current figures: 16 of…
johnml1135 Nov 1, 2026
6b36f45
The ad hoc prohibition fixtures credit the co-occurrence rule that bl…
johnml1135 Nov 1, 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
  •  
  •  
  •  
18 changes: 18 additions & 0 deletions .claude/skills/author-coverage-cell/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
---
name: author-coverage-cell
description: >-
Use when asked to cover, satisfy, witness, or close an obligation cell in the HermitCrab
conformance suite — anything of the form "cover cell X", "satisfy this dataflow obligation",
"add words so this chain is witnessed", "close a coverage gap", or when handed a cell id from
conformance/dataflow-obligations.tsv. Authors the minimal-pair words in an existing language
grammar and the claimed_cells entry that records the evidence, then verifies by severance rather
than by inspection. Does NOT author new grammars, new fixtures, or grammar.xml content — if the
construct is absent from every language grammar, this skill reports that and stops.
---

The authoritative instructions for this skill live with the fixtures, because they ship to whoever
receives `conformance/`. Read and follow:

`conformance/skills/author-coverage-cell/SKILL.md`

Do not follow a summary of it from memory; open the file.
16 changes: 16 additions & 0 deletions .claude/skills/measure-authoring-quality/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
---
name: measure-authoring-quality
description: >-
Use when asked to measure, score, or benchmark the conformance authoring harness — "how good is
the author skill", "what's our first-pass yield", "run the harness eval", "measure before and
after a skill revision". Runs a batch of obligation cells through author-coverage-cell without
intervention, scores first-pass yield against the production gate, and attributes every failure to
a class. Produces a run record; changes no skill and fixes no fixture.
---

The authoritative instructions for this skill live with the fixtures, because they ship to whoever
receives `conformance/`. Read and follow:

`conformance/skills/measure-authoring-quality/SKILL.md`

Do not follow a summary of it from memory; open the file.
16 changes: 16 additions & 0 deletions .claude/skills/review-coverage-claim/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
---
name: review-coverage-claim
description: >-
Use when asked to review, verify, certify, or check a coverage claim in the HermitCrab conformance
suite — "review this claimed_cells entry", "does this word really demonstrate that cell", "check
the role attribution", or when handed an evidence card from conformance/evidence-cards/. Judges
ONLY role attribution: whether the word occupies the cell it claims. Never sets a status, never
edits a claim, never edits a grammar or an expectation. Declining is a valid outcome.
---

The authoritative instructions for this skill live with the fixtures, because they ship to whoever
receives `conformance/`. Read and follow:

`conformance/skills/review-coverage-claim/SKILL.md`

Do not follow a summary of it from memory; open the file.
16 changes: 16 additions & 0 deletions .claude/skills/revise-coverage-harness/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
---
name: revise-coverage-harness
description: >-
Use when asked to improve, revise, or fix the conformance authoring harness after a measurement —
"first-pass yield is low, fix the skill", "most failures are not-minimal-pair, revise the
instructions", "improve the harness based on the run record". Consumes a measurement run record,
diagnoses which instruction produced the dominant failure class, and revises exactly one thing.
Never revises without a measurement, and never touches the golden set.
---

The authoritative instructions for this skill live with the fixtures, because they ship to whoever
receives `conformance/`. Read and follow:

`conformance/skills/revise-coverage-harness/SKILL.md`

Do not follow a summary of it from memory; open the file.
11 changes: 11 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,14 @@
*.yml eol=lf
*.cfg eol=lf
*.ipynb eol=lf

# Frozen bytes: conformance/*/fieldworks/project.fwdata's exact SHA-256 is pinned in that
# fixture's phonology-mutations.yaml (see FieldWorksWitnessDirectoriesAreShapedCorrectly). Without
# this, a platform/config-dependent CRLF checkout of an otherwise-text XML file makes the hash
# non-reproducible across machines.
*.fwdata binary

# Preserve the original bytes of these historical oracle captures and their input list.
conformance/edge-cases/simultaneous-subrule-genuine-overlap/hc_stderr.txt -text
conformance/edge-cases/simultaneous-subrule-genuine-overlap/output.tsv -text
conformance/edge-cases/simultaneous-subrule-genuine-overlap/words.txt -text
73 changes: 73 additions & 0 deletions .github/workflows/conformance.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
name: Conformance

on:
push:
branches:
- "**"
paths:
- "conformance/**"
- "src/SIL.Machine.Morphology.HermitCrab*/**"
- "src/SIL.Machine/**"
- "tests/SIL.Machine.Morphology.HermitCrab.Tests/**"
- ".github/workflows/conformance.yml"
pull_request:
paths:
- "conformance/**"
- "src/SIL.Machine.Morphology.HermitCrab*/**"
- "src/SIL.Machine/**"
- "tests/SIL.Machine.Morphology.HermitCrab.Tests/**"
- ".github/workflows/conformance.yml"

jobs:
conformance:
name: Conformance suite
runs-on: ubuntu-22.04

steps:
- uses: actions/checkout@v6

- name: Setup .NET
uses: actions/setup-dotnet@v5
with:
dotnet-version: |
10.0.303
10.0.x

- name: Restore dependencies
run: dotnet restore src/SIL.Machine.Morphology.HermitCrab.Conformance/SIL.Machine.Morphology.HermitCrab.Conformance.csproj

# Gate (a): every fixture's declared parses/rejections must match what the C# oracle
# actually produces (self-check mode runs the reference engine in-process against every
# words.yaml, including budget_ms pathological fixtures).
- name: Run conformance self-check
run: >-
dotnet run --no-restore --project src/SIL.Machine.Morphology.HermitCrab.Conformance --
--fixtures conformance --include-pathological

# Gate (b): --coverage-report (re)writes coverage.csv/rules.csv, which the next step checks for
# staleness, and exits 1 on an uncovered construct, on a dead rule (exercised by zero words)
# missing from conformance/dead-rules-allowed.tsv, or on an allowed rule some word now exercises.
# `if: always()` so it reports its own status even when the self-check step above failed.
- name: Run coverage report
if: always()
run: >-
dotnet run --no-restore --project src/SIL.Machine.Morphology.HermitCrab.Conformance --
--fixtures conformance --coverage-report

# Gate (c): the checked-in coverage.csv/rules.csv must already reflect the fixtures as they
# stand -- generated so nobody needs to remember to refresh them, but that only holds if
# forgetting to refresh them is a CI failure. Runs after the coverage-report step (which just
# regenerated both) and `if: always()` for the same reason as above: a dead rule and a stale
# index are two different failures and must not collapse into one.
#
# conformance/fixtures.csv is intentionally NOT checked here: on this branch nothing
# regenerates it (--coverage-report only writes coverage.csv/rules.csv), so a freshness check
# against it would never catch drift -- it is a one-time snapshot from when it was ported, not
# a generated artifact.
- name: Verify generated coverage files are fresh
if: always()
run: |
if ! git diff --exit-code -- conformance/coverage.csv conformance/rules.csv; then
echo "::error::conformance/coverage.csv or rules.csv is stale relative to the fixtures (diff above). Run 'dotnet run --project src/SIL.Machine.Morphology.HermitCrab.Conformance -- --fixtures conformance --coverage-report' locally and commit the result."
exit 1
fi
36 changes: 36 additions & 0 deletions .github/workflows/counterfactual-coverage.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
# The counterfactual sweep re-parses every conformance fixture once per grammar-observable surface with
# that surface neutralized, so it costs minutes rather than seconds. It runs on demand and weekly rather
# than per push; the cheap coverage ledger and fixture gates stay in the main CI job.
name: Counterfactual coverage

on:
workflow_dispatch:
schedule:
- cron: "0 6 * * 1"

jobs:
counterfactual:
name: Recompute counterfactual evidence
runs-on: ubuntu-22.04

steps:
- uses: actions/checkout@v6

- name: Setup .NET
uses: actions/setup-dotnet@v5
with:
dotnet-version: |
10.0.303
10.0.x

- name: Restore dependencies
run: dotnet restore

- name: Build
run: dotnet build --no-restore -c Release

- name: Recompute and compare the evidence ledger
run: dotnet run --no-build -c Release --project src/SIL.Machine.Morphology.HermitCrab.Conformance -- --counterfactual --repository-root .

- name: Run the explicit counterfactual tests
run: dotnet test tests/SIL.Machine.Morphology.HermitCrab.Tests/SIL.Machine.Morphology.HermitCrab.Tests.csproj -c Release --filter "TestCategory=Counterfactual"
6 changes: 6 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -56,5 +56,11 @@ tests/SIL.Machine.Tests/Corpora/TestData/project/*
tests/SIL.Machine.Tests/Corpora/TestData/pretranslations.json
.idea

# Claude Code conversation exports
/20??-??-??-*.txt

# Agent scratch: test result dumps, captured logs, throwaway SDK/CLI state
.tmp/

# Local, generated review summaries
.review/
7 changes: 7 additions & 0 deletions Machine.sln
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SIL.Machine.Tokenization.Se
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SIL.Machine.Tokenization.SentencePiece.Tests", "tests\SIL.Machine.Tokenization.SentencePiece.Tests\SIL.Machine.Tokenization.SentencePiece.Tests.csproj", "{AB5F75C1-64B7-4E0F-A4B5-B14EB16E6DDC}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SIL.Machine.Morphology.HermitCrab.Conformance", "src\SIL.Machine.Morphology.HermitCrab.Conformance\SIL.Machine.Morphology.HermitCrab.Conformance.csproj", "{8E40C2C5-F4C5-4A41-B78A-10A43FCF0CE3}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Expand Down Expand Up @@ -99,6 +101,10 @@ Global
{AB5F75C1-64B7-4E0F-A4B5-B14EB16E6DDC}.Debug|Any CPU.Build.0 = Debug|Any CPU
{AB5F75C1-64B7-4E0F-A4B5-B14EB16E6DDC}.Release|Any CPU.ActiveCfg = Release|Any CPU
{AB5F75C1-64B7-4E0F-A4B5-B14EB16E6DDC}.Release|Any CPU.Build.0 = Release|Any CPU
{8E40C2C5-F4C5-4A41-B78A-10A43FCF0CE3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{8E40C2C5-F4C5-4A41-B78A-10A43FCF0CE3}.Debug|Any CPU.Build.0 = Debug|Any CPU
{8E40C2C5-F4C5-4A41-B78A-10A43FCF0CE3}.Release|Any CPU.ActiveCfg = Release|Any CPU
{8E40C2C5-F4C5-4A41-B78A-10A43FCF0CE3}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
Expand All @@ -116,6 +122,7 @@ Global
{0BBEED18-3CC1-4BA6-8E11-603A5D2DEDC9} = {31B4F5EB-E148-4A51-84B5-B90BB8F38AD3}
{09135223-6285-4268-BFA3-147BDB5B663B} = {31B4F5EB-E148-4A51-84B5-B90BB8F38AD3}
{AB5F75C1-64B7-4E0F-A4B5-B14EB16E6DDC} = {66246A1C-8D45-40FB-A660-C58577122CA7}
{8E40C2C5-F4C5-4A41-B78A-10A43FCF0CE3} = {31B4F5EB-E148-4A51-84B5-B90BB8F38AD3}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {9F18C25E-E140-43C3-B177-D562E1628370}
Expand Down
Loading
Loading