Skip to content

docs(findings): verify the choreography fixtures; record the --emit-core-ast verdict drift - #25

Merged
Ch4s3 merged 1 commit into
mainfrom
claude/mirror-choreography-fixtures
Sep 21, 2026
Merged

Ch4s3 merged 1 commit into
mainfrom
claude/mirror-choreography-fixtures

Conversation

@Ch4s3

@Ch4s3 Ch4s3 commented Sep 21, 2026

Copy link
Copy Markdown
Contributor

What this is

Docs only. No ledger change, no checker change.

I set out to mirror march's new choreography/endpoints fixtures into
scripts/expected-skips.txt. They cannot be added yet, for a reason this repo
already documented and PR #24 already hit: conformance.yml pins march
(binary and corpus) at 6867c783 (2026-08-08, now 1057 commits back), and
none of these files exist in that checkout, so a ledger entry for any of them
is a stale-entry SKIP-LEDGER MISMATCH against CI's actual corpus.

So instead of a ledger edit that would turn CI red, this records the
verification and the measured cost of the pin bump that would let it land.

Fixtures verified (march main HEAD 3ebe6c17, march-lean-check at this repo's HEAD)

Every one SKIPs cleanly. None is a MISMATCH; none needs a
known-limitations.txt entry.

fixture why it skips
accept/t270_endpoints_labelled_steps out-of-fragment construct in a declaration
accept/t273_crash_branches_logging out-of-fragment construct in a declaration
reject/t271_endpoints_label_on_branch_head out-of-fragment construct in a declaration
reject/t272_endpoints_label_msg_prefix out-of-fragment construct in a declaration
reject/t274_crash_receive_without_branch out-of-fragment construct in a declaration
reject/t275_crash_branch_on_reliable_sender out-of-fragment construct in a declaration
reject/t276_crashed_role_in_own_crash_branch out-of-fragment construct in a declaration
reject/t277_crash_third_party_not_told out-of-fragment construct in a declaration
reject/t278_crash_choose_two_detectors out-of-fragment construct in a declaration
reject/t279_may_crash_unknown_role out-of-fragment construct in a declaration
reject/t263_endpoints_payload_without_json_codec out-of-fragment construct in a declaration
grammar/parse/p38_protocol_labelled_message_step out-of-fragment construct in a declaration
grammar/reject/r17_protocol_label_after_arrow no module (parse failure)

There is no accept/t263_… payload-codec fixture — accept-side t263 is
t263_linear_opt_in_second_param, unrelated. The payload-codec fixture is the
reject-side one above.

The ledger lines are recorded verbatim in specs/march-findings.md, padded to
the file's column, ready to paste when the pin bumps.

New march-is-wrong finding: --emit-core-ast's verdict disagrees with --check

bin/main.ml binds has_user_errors from the diagnostic set and hands it to
Emit_core_ast.run as ~rejected: before the --check path lowers to TIR
to judge cap no_alloc allocation contracts and the stdlib-mediated
capability-ceiling checks. Three reject fixtures therefore emit
"verdict": "accept" while march --check on the same file errors out:

$ march --check specs/lang/types/reject/t43_cap_no_alloc_tuple.march
-- ERROR -- `make_pair` is in `cap no_alloc` module `NoAllocPair` but allocates.
$ march --emit-core-ast specs/lang/types/reject/t43_cap_no_alloc_tuple.march | jq -r .verdict
accept

Also reject/t180_ceiling_stdlib_mediated_under_check and
reject/t182_ceiling_module_let_stdlib_mediated. The hoist comment at that
binding claims it is "the same accept/reject condition --check uses below";
for these three it is not. The harness's step-4 self-consistency cross-check
is precisely what caught it — it reports MARCH_SELF_INCONSISTENT, a hard
failure with no ledger to absorb it. Not yet reported upstream.

Measured cost of a pin bump to HEAD

Full run, --corpus-dir + --lang-dir at march main 3ebe6c17:

total files 498 | MATCH 97 | MISMATCH 1 | ERROR 0 | SKIP 396 (accept 189, reject 207)
KNOWN_LIMITATION 3 | MARCH_SELF_INCONSISTENT 3 | CORPUS_VIOLATION 0
SKIP-LEDGER delta: +125 newly skipping, 1 stale

The single stale entry is accept/t77_refine_hof_bypass_limitation.march,
which march renamed to accept/t77_refine_hof_pass_site_rejected.march.

Two blockers beyond the ledger:

  1. reject/t262_toplevel_let_annotation_mismatch — hard MISMATCH. march now
    checks a module-level let's annotation against its RHS
    (let x : Int = "hello"); this checker's inference does not. The
    annotation is present in the Core AST, so it is not a
    known-limitations.txt candidate (that file is gated to rejections erased
    from the Core AST) — it is a real checker gap to fix.
  2. The three MARCH_SELF_INCONSISTENT files above. No ledger category exists
    for them and the cause is march-side, so nothing in this repo clears them.

A green bump therefore needs a checker fix for (1) and an upstream fix for
(2). Both are out of scope here.

CI

Docs-only diff, so the gate runs against the unchanged pin and stays green.

…ct drift

A full conformance run against march main HEAD (3ebe6c17) while mirroring the
new choreography/endpoints corpus fixtures turned up two things.

1. march's --emit-core-ast computes its JSON "verdict" field before the
   --check path lowers to TIR for `cap no_alloc` and stdlib-mediated ceiling
   checks, so three reject fixtures emit verdict=accept while --check rejects
   them. That is MARCH_SELF_INCONSISTENT, a hard harness failure with no
   ledger to absorb it. Recorded as a march-is-wrong finding.

2. The choreography fixtures (t270, t273, t271/t272, t274-t279, t263 reject,
   p38, r17) all SKIP cleanly -- no MISMATCH, no known-limitation needed --
   but cannot be added to scripts/expected-skips.txt yet: conformance.yml
   still pins march at 6867c783, which predates all of them, so an entry for
   any of them is a stale-entry SKIP-LEDGER MISMATCH (the same trap PR #24
   hit). The verified ledger lines are recorded verbatim for the pin bump,
   along with the measured cost of that bump (+125 skips, 1 stale rename) and
   its two blockers: the t262 module-level-let-annotation MISMATCH (a real
   checker gap, not a known-limitation candidate) and the three files in (1).

Ledgers unchanged; no behavior change.
@Ch4s3
Ch4s3 merged commit 751e10b into main Sep 21, 2026
1 check passed
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