@@ -3279,6 +3279,60 @@ jobs:
32793279 fi
32803280 echo "OK: Tier B A/B — external event OWN050 (no ref) -> OWN001 (with --ref-dir)"
32813281
3282+ # P-010 pillar 9, first slice: C# state protocols over OwnIR v1 (`move`,
3283+ # `borrow_mut`). The Layer 2/3 ledgers freeze the FACTS the Roslyn lowering emits,
3284+ # and both engines replay them with zero dotnet — which proves the engines agree
3285+ # on those documents and nothing about where the documents came from. This job is
3286+ # the other half: the real extractor over the real C#, so a frozen fact cannot
3287+ # drift away from the program it claims to describe.
3288+ #
3289+ # It also carries what no frozen fact can: programs the extractor must REFUSE
3290+ # (code with no contract inside a region, a protocol with a public mutator, a
3291+ # token made by hand in the protocol's own assembly), programs the C# compiler
3292+ # must reject, and an ASP.NET Core + EF Core backend driven over real HTTP against
3293+ # a real SQLite file — the transition has to reach the instance EF tracks and the
3294+ # row it saves, not merely type-check.
3295+ #
3296+ # Both platforms: the fixtures carry repo-relative `file` paths, and a path that
3297+ # is only right with one separator is the kind of thing a single runner hides.
3298+ state-protocols :
3299+ name : state protocols (C# -> OwnIR v1, real ASP.NET Core + EF Core backend)
3300+ strategy :
3301+ fail-fast : false
3302+ matrix :
3303+ os : [ubuntu-latest, windows-latest]
3304+ runs-on : ${{ matrix.os }}
3305+ defaults :
3306+ run :
3307+ shell : bash
3308+ steps :
3309+ - uses : actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
3310+ - uses : actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5
3311+ with :
3312+ python-version : " 3.13"
3313+ - uses : actions/setup-dotnet@67a3573c9a986a3f9c594539f4ab511d57bb3ce9 # v4
3314+ with :
3315+ dotnet-version : " 8.0.x"
3316+ - uses : dtolnay/rust-toolchain@fa04a1451ff1842e2626ccb99004d0195b455a88 # master, 2026-07-10
3317+ with :
3318+ toolchain : stable
3319+ - name : Build own-cli (the second public engine)
3320+ if : matrix.os == 'ubuntu-latest'
3321+ working-directory : rust
3322+ run : cargo build -p own-cli
3323+ # One script, five questions; see its docstring.
3324+ - name : The protocol gate (cases, refusals, compiler rejections, one assembly, EF backend)
3325+ if : matrix.os != 'ubuntu-latest'
3326+ run : python scripts/protocol_gate.py
3327+ # On Linux it also compares the two PUBLIC CLIs on every C#-derived document:
3328+ # exit code, stdout and stderr, byte for byte. Linux only, for the reason
3329+ # #261 recorded: byte parity with the NATIVE-Windows Python reference is not
3330+ # claimed (it writes cp1252/CRLF), so that comparison would measure the
3331+ # console, not the engines.
3332+ - name : The protocol gate + both public CLIs on the C#-derived documents
3333+ if : matrix.os == 'ubuntu-latest'
3334+ run : python scripts/protocol_gate.py --rust "$PWD/rust/target/debug/own-cli"
3335+
32823336 # P-012 slice 1: score the checker against the labeled corpus on REAL C# — not
32833337 # just the .own reduction tests/test_corpus.py checks. Per case: the bug must be
32843338 # CAUGHT in before.cs (recall) and the fix must be SILENT in after.cs
0 commit comments