Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
53 commits
Select commit Hold shift + click to select a range
ea30ae6
Add a conformance suite for HermitCrab, with its adequacy argument
johnml1135 Sep 26, 2026
6975a1b
fix(hc): retain template trace failure reason
johnml1135 Sep 30, 2026
eb27242
Add narrowing-rule unapplication regression fixtures to the conforman…
johnml1135 Oct 9, 2026
f475358
Leave the engine trace unchanged in the conformance suite
johnml1135 Oct 14, 2026
f15d2db
Fail the conformance coverage report on dead rules and gaps
johnml1135 Oct 14, 2026
5292cf0
Keep the main CI build unchanged by the conformance suite
johnml1135 Oct 14, 2026
3c7f018
Record that #494 fixed the chained output-feature parse loss
johnml1135 Oct 14, 2026
c942305
Make local_check.sh run the conformance gates that can pass
johnml1135 Oct 14, 2026
9d154e4
Read mutant outcomes as UTF-8 in the counterfactual sweep
johnml1135 Oct 14, 2026
53b7d33
Regenerate the conformance ledgers with mutant outcomes read as UTF-8
johnml1135 Oct 15, 2026
d83e09d
Cover #529's isCliticRule in the conformance suite
johnml1135 Oct 15, 2026
458f385
Cap counterfactual mutant children at a 2 GB GC heap
johnml1135 Oct 16, 2026
6b91438
Add a conformance fixture for #522's AnalysisMergeKey final-template-…
johnml1135 Oct 20, 2026
e0692cc
Add a morpher: settings channel to words.yaml, and a DelReapps fixtur…
johnml1135 Oct 21, 2026
48d8770
Apply CSharpier to the morpher: settings change
johnml1135 Oct 21, 2026
5ad964d
Tag deletion-reapplications' exercised construct and regenerate cover…
johnml1135 Oct 21, 2026
f43ef89
Replay named parser settings variants with complete oracle expectations
johnml1135 Oct 22, 2026
1ea5674
Tighten the conformance runner's crash and timeout handling
johnml1135 Oct 22, 2026
a2312dc
Reject malformed fixture inputs instead of misreading them
johnml1135 Oct 22, 2026
5fc425b
Keep counterfactual verdicts honest about timeouts and load failures
johnml1135 Oct 22, 2026
7a73526
Clean up batch, tool and test duplication
johnml1135 Oct 22, 2026
1a21869
Wrap and de-point the new runner and gate comments
johnml1135 Oct 22, 2026
afe41fa
Format the merged runner
johnml1135 Oct 22, 2026
354da31
Expect kanmo to trace only mrSfxMo
johnml1135 Oct 22, 2026
ba7d106
Drop the conformance memoization switch and parse each word once
johnml1135 Oct 22, 2026
c000ab3
Cover the runner timeout, batch resume and checklist gate fixes
johnml1135 Oct 22, 2026
ee19ef9
Count only a refused grammar as load-failure evidence
johnml1135 Oct 22, 2026
68984a0
Regenerate the semantic-coverage ledgers under the exit-code contract
johnml1135 Oct 22, 2026
dac6cac
Pick the expect-crash control from fixtures the run would execute
johnml1135 Oct 23, 2026
8c046d4
Delete the stale PR #494 review notes
johnml1135 Oct 23, 2026
5c26eae
Reject an invalid batch --start with a message
johnml1135 Oct 23, 2026
1e3350c
Propose expect_skip for a word the oracle skipped
johnml1135 Oct 23, 2026
f3a84fb
Write the mutant child's word list to the temp directory
johnml1135 Oct 23, 2026
65e1b2e
Shorten the expect-crash control comment to the comment budget
johnml1135 Oct 23, 2026
dda2848
Graduate shared PanGloss fixtures and preserve ambiguous rule traces
johnml1135 Oct 23, 2026
8458283
Check blocked_by labels against grammar rule ids; categorize ledger f…
johnml1135 Oct 23, 2026
0acdd8b
Wrap an over-long doc comment line
johnml1135 Oct 23, 2026
917ae86
Format four files that csharpier check rejects at the branch base
johnml1135 Oct 23, 2026
d60bf0a
Add braces the IDE0011 build rule requires in CoverageGapRatchetTests
johnml1135 Oct 23, 2026
292e66a
Add a conformance fixture showing a partial lexical entry cannot resc…
johnml1135 Oct 23, 2026
a83102e
Update the pinned ledger counts for the regenerated conformance ledgers
johnml1135 Oct 23, 2026
62ac6e0
Add complete truncation identity derivations to conformance fixtures
johnml1135 Oct 23, 2026
0fcc9cc
Add shared truncation identity companions
johnml1135 Oct 24, 2026
bb42ff4
Label rule-trace mismatch as declared N, traced M (F29)
johnml1135 Oct 26, 2026
f592706
Drop undefined silent16 comment from corroboration pins (F30)
johnml1135 Oct 26, 2026
6c6fbb3
State what each ledger pin measures, not corpus history (F31)
johnml1135 Oct 26, 2026
b9c7c8a
Remove review-round SHA from truncate-morphotactic comment (F33)
johnml1135 Oct 26, 2026
382168a
Describe rule-order measurement as a recorded run, not scratch comman…
johnml1135 Oct 26, 2026
ed5cf05
Regenerate conformance manifest after the truncate-morphotactic words…
johnml1135 Oct 26, 2026
68c3ee0
Add five conformance fixtures pinning clitic designation and final-te…
johnml1135 Oct 26, 2026
065a75a
Evidence NonPartialRuleProhibitedAfterFinalTemplate by severing isCli…
johnml1135 Oct 26, 2026
fcf66d3
Regenerate the conformance ledgers, manifest and pinned counts for th…
johnml1135 Oct 26, 2026
4a66977
Shorten the gate-inventory isCliticRule comment to the comment budget
johnml1135 Oct 26, 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