Skip to content

One boundary-width derivation: mark the throw payload, classify pointer-ness from the base (#1255, #1256, #1269) - #1273

Merged
aallan merged 5 commits into
release/v0.1.10from
fix/c7-widths
Aug 10, 2026
Merged

One boundary-width derivation: mark the throw payload, classify pointer-ness from the base (#1255, #1256, #1269)#1273
aallan merged 5 commits into
release/v0.1.10from
fix/c7-widths

Conversation

@aallan

@aallan aallan commented Aug 10, 2026

Copy link
Copy Markdown
Owner

Part of the #1213 burndown (PR C7) — the closure-boundary width-and-classification family. One commit.

Root-cause verdicts, which decided the tools

#1269 — the marking machinery, not the classification (f64def84). The Exn<E> tag was already declared at the payload's resolved i32 width; only the thrown literal defaulted to i64.const, because throw's payload had never been registered as a @Byte write boundary. throw now carries a CellNames beside its dispatch target — from both registration paths — and drives the same _mark_byte_write_value every other boundary drives; Exn.throw(v) delegates to the bare dispatcher exactly as State.put(v) does.

#1255 — the issue's 11-site count was wrong; five sites are the bug. Measured empirically: all six wasm/ sites receive names their producers already resolve (_element_wasm_type is handed Byte, not the alias), and each shares its name with the element size/load/store decisions beside it — so resolving one conjunct would desync layout from rooting, and they are deliberately untouched. The five genuinely syntactic sites (closures.py ×3, functions.py ×2) now classify through is_gc_pointer_base over a representation base. The gc_heap_start > 259 reliance is closed structurally: a build guard plus named GC_STACK_SIZE/GC_WORKLIST_SIZE constants — the margin is 80 KiB before the data section contributes, so the issue's "empty string pool" exposure was never real, and that fact is now a test rather than an assumption.

#1256 and #1269 share the mechanism, so they are single-sourced: WasmContext._boundary_base is one derivation consumed by the return boundary, the apply_fn argument, and the throw payload — the return boundary previously spelled its own different two hops.

The differential, with its sensitivity proof

Base → fixed over all 254 corpus programs: zero WAT movement — and that zero is a measurement, not a blind instrument: the mutant (dropping the scalar exclusion from the new classifier) moves 23 programs, enumerated in the review record.

Tests

tests/test_closure_boundary_widths_1255_1256_1269.py: 49 tests, 20 RED on the base. Rooting is proved by a base-vs-alias differential with the base count pinned beside it (the bodies must allocate, so an absolute count would measure its own intermediates), pointer controls at all four boundaries, and VERA_EAGER_GC=1 runs. The #1268 satisfying-literal test now runs as well as verifies. The two recorded smalls from PR #1250's closeout landed: the ancestry comment names the deeper rooting, and the daemon-thread question is decided (subprocess rework rejected, reasoning recorded in the harness docstring). A latent inference — "has a cell recorded" standing in for "is a State op", true only while State was the sole cell-carrying effect — was fixed and mutation-validated in passing, since this PR makes Exn the second cell-carrying effect.

Gates

pytest 9,926 passed / 131 skipped; mypy clean; ruff + --select S clean; conformance 206/206; examples 42/42; corpus canonical 254/254; doc counts (10,083 / 152), site assets, diagnostic fields, explicit encoding, limitations sync all green; full pre-commit chain on the commit.

Closes #1255.
Closes #1256.
Closes #1269.

(Keywords take effect at the release PR.)

Summary by CodeRabbit

  • Bug Fixes

    • Fixed exception payload handling across representation widths, including byte-sized payloads.
    • Improved closure calls so argument widths and signatures match declared parameters.
    • Corrected pointer classification for aliased and refined types.
    • Added safeguards for heap layout, qualified exception dispatch, and parameterised return guards.
  • Tests

    • Added regression coverage for closure boundaries, pointer classification, exception payloads, and return guards.
    • Test suite now records 10,138 tests across 157 files.
  • Documentation

    • Updated project status, roadmap, testing details, known issues, and module statistics.

@coderabbitai

coderabbitai Bot commented Aug 10, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 30449853-4a56-4a29-80d0-8cb62c130752

📥 Commits

Reviewing files that changed from the base of the PR and between 563cbe6 and 9fec373.

⛔ Files ignored due to path filters (1)
  • docs/llms-full.txt is excluded by !docs/**
📒 Files selected for processing (11)
  • CHANGELOG.md
  • FAQ.md
  • KNOWN_ISSUES.md
  • README.md
  • ROADMAP.md
  • TESTING.md
  • tests/test_codegen_nat_guards.py
  • vera/README.md
  • vera/codegen/functions.py
  • vera/wasm/calls.py
  • vera/wasm/calls_handlers.py
🔗 Linked repositories identified

CodeRabbit considers these linked repositories for cross-repo context during reviews:

  • aallan/vera-bench (manual)

📝 Walkthrough

Walkthrough

Vera now resolves aliases and refinements for GC-pointer classification and write-boundary widths. Closure indirect calls use declared formal widths. Exception dispatch preserves cell metadata and applies payload-width handling. Regression tests and project metrics were updated.

Changes

Boundary correctness

Layer / File(s) Summary
Representation resolution and heap layout
vera/wasm/inference.py, vera/wasm/helpers.py, vera/codegen/assembly.py
Added shared boundary-base resolution, representation-based pointer classification, GC size constants, and a heap-start invariant.
Alias-aware GC root classification
vera/codegen/closures.py, vera/codegen/functions.py
GC rooting now uses resolved representation bases for closure parameters, returns, captures, function parameters, and function returns.
Alias-aware return guards
vera/codegen/functions.py, tests/test_codegen_nat_guards.py
Return guards now resolve parameterised aliases, nested type applications, and refinements for Nat and Int boundaries.
Closure boundary signatures
vera/wasm/closures.py, tests/test_closure_boundary_widths_1255_1256_1269.py
apply_fn derives indirect-call signatures from declared closure formals and marks byte-boundary arguments before translation.
Exception payload dispatch
vera/codegen/functions.py, vera/wasm/calls.py, vera/wasm/calls_handlers.py, tests/test_closure_boundary_widths_1255_1256_1269.py, tests/test_exn_throw_payload_1268.py
throw retains canonical cell metadata, applies payload-width handling, and supports qualified dispatch.
Regression validation and project records
tests/test_closure_boundary_widths_1255_1256_1269.py, tests/test_closure_lift_boundaries_1234_1235_1245.py, TESTING.md, CHANGELOG.md, README.md, FAQ.md, ROADMAP.md, KNOWN_ISSUES.md, vera/README.md
Added regression coverage and updated test totals, changelog entries, project metrics, and known issues.

Estimated code review effort: 4 (Complex) | ~45 minutes

Possibly related issues

  • aallan/vera#1255 — The changes directly address alias- and refinement-based GC-pointer classification and the heap-start invariant.

Possibly related PRs

Suggested labels: compiler, tests, docs

🚥 Pre-merge checks | ✅ 8
✅ Passed checks (8 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly identifies the main boundary-width and GC pointer-classification fixes addressed by the pull request.
Docstring Coverage ✅ Passed Docstring coverage is 95.24% which is sufficient. The required threshold is 80.00%.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Changelog Covers Public-Surface Changes ✅ Passed The PR changes none of vera/cli.py, vera/errors.py, spec/, vera/lsp/, or vera/codegen/api.py; CHANGELOG.md describes the alias guards, Byte throw payloads, apply_fn signatures, and GC changes.
Spec And Implementation Move Together ✅ Passed The backend changes have no spec diff, but they restore behaviour already required by spec: alias guards, Byte=i32, closure apply_fn signatures, and Exn typing are defined in spec/02, spec/07 an...
Diagnostics Carry An Error Code ✅ Passed The PR adds no Diagnostic, _error, or _warning emission; the repository checker also reports all existing diagnostics fully tagged and registered.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/c7-widths

Comment @coderabbitai help to get the list of available commands.

@codecov

codecov Bot commented Aug 10, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 94.04%. Comparing base (9d83df1) to head (9fec373).

Additional details and impacted files
@@                 Coverage Diff                 @@
##           release/v0.1.10    #1273      +/-   ##
===================================================
- Coverage            94.05%   94.04%   -0.01%     
===================================================
  Files                  100      100              
  Lines                35594    35616      +22     
  Branches               458      458              
===================================================
+ Hits                 33477    33496      +19     
- Misses                2104     2107       +3     
  Partials                13       13              
Flag Coverage Δ
javascript 78.61% <ø> (ø)
python 95.68% <100.00%> (-0.01%) ⬇️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@TESTING.md`:
- Line 77: Fix the Markdown table row containing
test_closure_boundary_widths_1255_1256_1269.py so embedded refinement separators
are escaped or isolated and markdownlint parses exactly four cells. Preserve the
spacing required by scripts/check_doc_counts.py, and verify all documented
validation scripts continue to pass.

In `@vera/wasm/inference.py`:
- Around line 2237-2257: Update _translate_handle_exn in calls_handlers.py to
obtain family_base through self._boundary_base(type_arg) instead of
independently composing _family_base and _resolve_base_type_name. Preserve the
existing family assignment and all other exception-translation behavior.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 898da56f-779e-413a-8d5e-7ca57587269f

📥 Commits

Reviewing files that changed from the base of the PR and between ef7c04c and f64def8.

⛔ Files ignored due to path filters (1)
  • docs/llms-full.txt is excluded by !docs/**
📒 Files selected for processing (18)
  • CHANGELOG.md
  • FAQ.md
  • KNOWN_ISSUES.md
  • README.md
  • ROADMAP.md
  • TESTING.md
  • tests/test_closure_boundary_widths_1255_1256_1269.py
  • tests/test_closure_lift_boundaries_1234_1235_1245.py
  • tests/test_exn_throw_payload_1268.py
  • vera/README.md
  • vera/codegen/assembly.py
  • vera/codegen/closures.py
  • vera/codegen/functions.py
  • vera/wasm/calls.py
  • vera/wasm/calls_handlers.py
  • vera/wasm/closures.py
  • vera/wasm/helpers.py
  • vera/wasm/inference.py
🔗 Linked repositories identified

CodeRabbit considers these linked repositories for cross-repo context during reviews:

  • aallan/vera-bench (manual)
💤 Files with no reviewable changes (1)
  • KNOWN_ISSUES.md

Comment thread TESTING.md Outdated
Comment thread vera/wasm/inference.py
@aallan

aallan commented Aug 10, 2026

Copy link
Copy Markdown
Owner Author

Adversarial review record — round 1 (f64def84)

The substantive claims hold; every headline measurement reproduced independently; no regression on any surface. Highlights: Exn-as-second-cell-effect survived both nesting orders, two distinct refined families in one module, and REGISTRATION PARITY — the declared-row and handle-injection paths emit byte-identical throw sequences across alias-of-refined, refined-of-alias, and 3-hop chains (all six programs invalid at base, green at HEAD); the _STATE_OP_NAMES guard is load-bearing (the mutant reds five existing tests) and correctly scoped; the five-site classification swap is the PR's strongest evidence — per-site revert mutations each red exactly their own two parametrized cases; the deliberate non-fix of the six wasm/ sites is EMPIRICALLY justified (instrumented: every site receives already-resolved names); the zero-mover differential reproduced exactly with the 23-mover mutant confirmed as additions-only shadow-push sequences; and an extra check the PR didn't claim — the #1256 fix does not reintroduce its own disease (the two width walkers agree at every closure formal over the whole corpus and suite).

Findings, fix round in flight:

  1. MUST-FIX: the new TESTING.md row's unescaped pipes (measured: the one 8-cell row in a 154-row table) — CodeRabbit flagged the same line.
  2. _boundary_base is not yet the one derivation, and the stragglers measurably diverge. The throw payload hand-spells the equivalent two hops at three sites (verified idempotent — CodeRabbit's _translate_handle_exn finding is this family); more consequentially, two consumers IN THE SAME EDITED FUNCTION — the narrowing and widening guard gates — still use the old spelling, and the derivations diverge on 2 corpus programs plus constructed shapes: an alias-of-Int return gets NO widen guard (widen_alias emits no comparison where widen_plain does). Pre-existing, but it is exactly the fact the new derivation answers correctly three lines away — folding in, with the guard-gain measured as a wanted movement.
  3. is_gc_pointer_base's None branch is unreachable by construction (Codecov's one missing line) — parameter narrowed to str.
  4. The build guard's no-cover pragma is false (the monkeypatched-constants test reaches it) — corrected.
  5. One comment names a function its line no longer consults — lockstep fix.
  6. NEW pre-existing bug unmasked, filed as #1276: a handle[Exn] whose clause body and handled body both diverge emits a result-less block — check-green invalid WASM, loud, identical at base; the A @Byte-payload Exn emits invalid WASM: i64 into the i32 payload slot at handle #1269 fix removed the outer symptom and revealed it.
  7. The review's named not-probed axis — cross-module Exn<Small> registration parity through the two alias-env objects — gains a test in the fix round.

One PR-body accuracy note applied with the round: the desync justification for the six untouched sites was over-argued — the operative fact is their names arrive already resolved. Dispositions will be appended.

@aallan

aallan commented Aug 10, 2026

Copy link
Copy Markdown
Owner Author

Round-1 dispositions (4d9b91b2 + 563cbe67)

The one-derivation completion turned up a real bug, exactly as the review's divergence measurement predicted: the old name-only chase drops a type application's arguments — answering bare Box where Box<Int> resolves to Int — so an alias-of-@Int return emitted NO widen guard and an alias-of-@Nat return let a negative through unguarded. Both return gates now consume _boundary_base; seven new cases with three RED on the round-0 head, each parameterised case paired with its unparameterised twin as oracle plus the refinement-over-application control. The escape hatch was NOT needed: the == "Nat" gate's refinement exclusion is a separate conjunct, untouched by the base swap — verified by reading before changing. The two corpus divergences the review measured were re-measured independently and are both inert, each for a stated reason. The refactor half: the State-cell and Exn-tag sites fold onto _boundary_base byte-identically; the bare-dispatch site deliberately does not — its registry carries a resolved name, the composition's first hop already happened at registration, and that reasoning now lives at the site instead of being papered over.

The rest: pipes escaped with a programmatic 152-row sweep; is_gc_pointer_base narrowed to str with the totality reason recorded; the false pragma deleted; the Unit-arm comment rewritten to the chain it actually consults; the cross-module parity test added WITH a can-go-red companion (the library's payload swapped to Int flips the tag to i64, proving the i32 assertions discriminate); #1276's row added (loud-at-load, pre-existing, unmasked-not-caused, sizing owed); the CHANGELOG's over-argued desync clause replaced by the operative fact.

Mover table: base→HEAD 0 of 254; round0→HEAD 0; widen-gate-forced-on mutant 16; scalar-exclusion-dropped mutant 23 — the zeros are measurements, not a blind instrument.

Gate at 563cbe67: pytest 9,936 / 131; conformance 206; examples 42; corpus canonical 254; doc counts (10,093/152); mypy, ruff incl. S, full battery green. CI re-arming; the round-1 reviewer verifies the widen-gate behavior change next.

@aallan

aallan commented Aug 10, 2026

Copy link
Copy Markdown
Owner Author

Verify pass (independent, 563cbe67) — five verdicts

1. The behavior change — PASS, and worth MORE than claimed: calling the public function directly removes the caller-side guard that masked the original probes, so the old behavior was a silent wrong value out of a @Nat slot (narrow(-5) returned -5; now traps) — not a missing optimization. The fixed $widen_alias and $narrow are byte-identical to their plain twins; the three RED-on-round-0 tests are exactly these shapes.

2. The refinement-conjunct reading — PASS on the code (_refinement_guard_parts receives the return type unstripped — genuinely a separate conjunct, and load-bearing: dropping it reds a pre-existing #983 test). But the new control test does not discriminate — a @Nat body into a @Nat base is never a narrowing leaf, so it is green with or without the conjunct. The one-word fix (parameter @Int) is measured to discriminate and lands in the closing micro-commit.

3. The two corpus divergences — PASS, per-gate instrumented: zero WAT movers on both differentials; the retired spelling recomputed at all three gates is verdict-identical everywhere it still differs textually; both stated inertness reasons hold exactly. And only ONE derivation remains in the tree — grep finds no retired spelling; all six _boundary_base consumers enumerated.

4. The calls.py:513 non-fold — PASS, both documented halves true (no WasmContext in scope at the producer; both handle sites now store an already-chased base; idempotence confirmed). Caveat recorded: the residue chase is true-but-untested — dispositioned in the micro-commit.

5. The cross-module parity test — PASS, proved against the real regression: the can-go-red companion flips the tag to i64, and a stronger check the companion cannot make — neutering _module_alias_scope entirely — reds both parity assertions with the exact diff. The class catches the provenance regression it exists for.

Pointer-mutant sensitivity re-measured at the new head: still 23 movers — the #1255 classifier untouched by the round. Closing micro-commit in flight; merge follows it plus CI (after #1272).

aallan and others added 5 commits August 10, 2026 15:51
Three burndown defects of one seam: a boundary asks what a declared
type IS and answers from something other than that type.

refinement or alias over Byte/Bool was rooted on the shadow stack at
the closure parameter, return and capture and at the two named-function
twins.  The issue counted eleven sites; six of them, all in vera/wasm/,
are measured to receive names their producers already resolve, and each
shares its name with the element size/load/store decisions beside it —
resolving one conjunct there would desync the layout from the rooting,
so those six are left alone deliberately.  The five genuinely syntactic
sites now ask `is_gc_pointer_base`, which states the rule once and
requires a representation base.  The heap-layout invariant the defect
was inert behind is enforced at build rather than assumed, and the two
constants that create its margin are named where the layout is computed.

width from the ARGUMENT while the lifted closure's own signature took
it from the declared formal, so a @byte formal fed an int literal
registered two incompatible closure_sig types and trapped.  The
parameters now come from the closure type, through the same walker the
result has used since #630; the argument coerces at the boundary
instead of dictating it.

resolved i32 width, so the width derivation was never wrong; the thrown
literal simply defaulted to i64.const because throw's payload was not
registered as a @byte write boundary.  It is one now, through the same
marking every other boundary drives.  The #1268 runtime guard on that
payload is a separate obligation and is not in this change.

Every #1212 boundary holding a type expression resolves its
representation base through one derivation (`WasmContext._boundary_base`)
rather than each composing its own two hops.

Proof: 20 of the new suite's cases are RED on the base commit and all
49 green here; all 254 corpus programs emit byte-identical WAT, against
a differential shown to move 23 of them when the pointer rule is
mutated.  test_exn_throw_payload_1268's satisfying-literal case, static
only because of #1269, now runs.

Closes #1255
Closes #1256
Closes #1269

Co-Authored-By: Claude <noreply@anthropic.invalid>
Adversarial round 1 found _boundary_base had two consumers where the
thesis claims one.  Five sites still spelled the composition themselves.

Three were refactor-only (calls_handlers' State-cell and Exn-tag bases;
the throw payload's call-site hop, which cannot call the named helper
because the registry carries a name rather than a type expression, and
now says so).

Two MEASURABLY DIVERGED and are a behaviour change.  The @int->@nat
narrowing gate and the @Nat->@int widening gate chased the return
alias by NAME, which drops an application's type arguments: under
`type Ident<T> = T; type Count = Ident<Nat>;` both answered the bare
head `Ident`, neither gate fired, and `f(0 - 5)` returned -5 through
the @nat slot — #983's silent negative one spelling over.  Both now ask
_boundary_base, which resolves the type expression.  The refinement
exclusion beside the narrowing gate is a separate conjunct and is
untouched, so an alias to a refinement keeps its single boundary guard.

Reproduced independently before fixing: widen_alias emitted no guard
where widen_plain did, and the narrow twin let -5 into a @nat slot.
7 new cases in test_codegen_nat_guards, 3 RED on the previous commit,
each parameterised case paired with its unparameterised twin as the
oracle plus the refinement-over-application control.

Corpus: 0 movers against both the base commit and the previous one, and
the 2 programs whose base SPELLING moves are inert for stated reasons
(ch02_refinement_base_param_alias's `T`->`Nat` is excluded by the
refinement conjunct; scoreboard's `Map`->`Map<String, Int>` is neither
gate's value).  The harness is shown to reach the gates: forcing the
widen gate on moves 16 corpus programs.

Also from the round: the cross-module registration-parity test the
reviewer named as unprobed (a refined-Byte payload declared and used in
a library, with a decoy alias of the same name over a different base in
the importer, plus a companion proving the width assertion can go red);
TESTING.md pipe escaping; is_gc_pointer_base narrowed to str, the
unreachable None branch deleted; the false no-cover pragma on the
heap-layout guard removed; the apply_fn Unit-arm comment rewritten to
the chain it now consults; and a KNOWN_ISSUES row for #1276, which this
work unmasked but does not fix.

Co-Authored-By: Claude <noreply@anthropic.invalid>
The #1255 CHANGELOG bullet argued a hypothetical alongside the
measurement: that resolving one conjunct at the six already-resolved
wasm/ sites would desync layout from rooting.  The operative fact is
simply that those sites receive names their producers have already
resolved — the array-element deciders are handed `Byte`, never the
alias — so there is nothing there to fix.  Recorded from adversarial
round 1.

Skip-changelog: reworded an existing [Unreleased] bullet, no behaviour change

Co-Authored-By: Claude <noreply@anthropic.invalid>
The verify pass found TestParameterisedAliasReturnGuard1256's
_REFINED_OVER_APPLICATION did not discriminate the conjunct it names.
Reproduced: with `_refinement_guard_parts` dropped from the narrowing
gate the control still passed, because a @nat body into a @Nat-based
return is no narrowing leaf at all — the leaf collector returns empty
and the absence of `i64.lt_s` holds either way.

The parameter is now @int with `requires(@Int.0 >= 18)` and an @Int.0
body, so the body genuinely narrows and the exclusion has something to
exclude.  Re-measured over the whole suite with the conjunct dropped:
this control goes red, together with #983's unparameterised twin, and
those two alone — so the exclusion is now tested at both spellings and
by nothing incidental.

Also from the pass:

The #1256 CHANGELOG bullet states the severity plainly.  Verified end
to end rather than asserted: on the previous commit's gates
`vera run --fn f -- -5` on an `Ident<Nat>` return prints -5, with no
trap and no diagnostic; here it traps, and 7 still returns 7.  A
caller-side guard in front of such a function was masking, not
preventing.

The calls.py residue chase is recorded as untested — deleting it stays
green because `family_base_name` already answers `Byte` for every
refinement and alias reachable today, so no producer stores a base that
still needs chasing.  The comment says what a fixture would need.

Skip-changelog: test fixture correction plus comment and severity wording; no behaviour change

Co-Authored-By: Claude <noreply@anthropic.invalid>
Rebased onto 9d83df1 (PR #1272).  Only doc and count files conflicted;
vera/codegen/functions.py and vera/wasm/calls_handlers.py — the two
sources both PRs touch — auto-merged, and the boundary suite, the
cross-module parity test and the nat-guard suite all stay green, so the
_boundary_base consumers and the CellNames threading survive C1's
monomorphization and routing work intact.

Conflict resolutions, all mechanical:

  CHANGELOG [Unreleased] — union.  C1's five bullets and this branch's
  four, none dropped, none reworded.  The last hunk was NOT a union: it
  carried C1's five plus a STALE copy of this branch's own bullet
  against the updated copy, so a blind union would have duplicated it;
  resolved to C1's five plus the updated one, verified single.

  KNOWN_ISSUES — both sides' row operations applied by ROW ID, never by
  position.  C1 deleted #1207/#1223/#1241/#1243/#1244/#1253 and added
  #1271/#1274; this branch deleted #1255/#1256/#1269 and adds #1276.
  Verified by set comparison over the whole file: every deletion absent,
  every addition present, no duplicates.

  Count-bearing prose — structure from upstream (it carries C1's 207
  conformance programs and 157 test files), every NUMBER re-derived by
  scripts/check_doc_counts.py against the merged tree rather than
  merged from either side: 10,138 tests across 157 files, 9,980 passed
  + 26 stress + 132 skipped.

  docs/* — regenerated by build_site.py, never hand-merged.

Content integrity: the diff over vera/ and tests/ (excluding the
count-bearing vera/README.md paragraph) is identical before and after
the rebase, modulo hunk offsets.

Full manual gate re-run, hooks not having fired on rebase --continue:
pytest 9,980 passed / 132 skipped, mypy clean, ruff and ruff --select S
clean, 207 conformance, 42 examples, 255 corpus programs canonical, doc
counts consistent, site assets coherent, diagnostic fields, limitations
sync and explicit encoding all OK.

Skip-changelog: rebase conflict resolution over count-bearing prose; no behaviour change

Co-Authored-By: Claude <noreply@anthropic.invalid>
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