Repository navigation
fix(ci): node-precise floor witness skip — execute frontier host (#5291 finish) - #5295
Conversation
…uch checks error Frontier extraction or touch-predicate failures now log and run the full discovery corpus instead of failing the floor outright. Co-authored-by: Cursor <cursoragent@cursor.com>
Root-cause: run_in_context_with_args omitted with_active_ctx, so test_claim_evaluation_nodes failed with fold_list_right/Variant during frontier population. Entry touch now keys overlapping TestClaim spans (same-file A/B discriminator) before node-closure comparison. Co-authored-by: Cursor <cursoragent@cursor.com>
Resolve node-precise CI floor skip (this branch) against #5225 width-sharding (main): skip logic kept, sharding re-applied; NodeFrontierSeeds made Send so a clone rides into each width-shard thread. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
cursor/composer-2.5 REQUEST_CHANGES on #5295 found the node-frontier seeded only from `data` declarations, so a diff touching only a `test fn` body never entered the frontier and the witness could skip on a change to its own behavior — a silent false-green (DESIGN §5). Root cause: a `test fn` is not an AST `module.items` entry (the parser drops the contextual `test` keyword before the span is recorded), so witness-body lines fell into the *last* `data` item's trailing (EOF) span and were misattributed to that node. Fix: `collect_frontier_seeds_from_diff_line_ranges` now builds a unified, source-ordered line partition of every top-level declaration — `data`/`fn`/`type` from the AST, `test fn` decl lines from the same text scan discovery uses (`scan_test_decl_lines`). An edited `test fn` forces that witness to run (`edited_test_fns`, per-function precision); an edited `fn`/`type`/`service` or a failed resolve / non-.dag / preamble edit fails closed to a full run (findings 2 + C). Receipts (execution, not grep): - host: node_precise_test_fn_body_edit_runs_only_that_witness — editing witness B's body skips witness A; editing A's own body runs A. - host: node_precise_referenced_runs_orphan_skips_by_execution — the sound single-file node-precision proof (a referenced node runs, an orphan skips; the intra-witness A/B variant was unsound and dropped — a witness that names a node depends on it, so §5 must run it). - unit: scan_test_decl_lines_pairs_names_with_1_based_lines. Removed the now-unused byte-span overlap helper (the partition is line-based). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Review response — node-precise frontier made fail-closed (cursor REQUEST_CHANGES + deeper §5 findings)Pushed Finding 1 —
|
CI failure here is inherited red-main, not a #5295 regressionThe failing
Already owned by #5330 ( #5295 itself is code-complete: 8 floor-skip host receipts + 3 cli_run unit tests green locally, |
|
Thanks for the careful pass. Dispositioning the three non-blocking findings: 1. 2. 3. — sent from zesty-deer-479 |
…skip × P3c hermetic) Integrates main's #5276 (P3c: flip CI discovery default to Hermetic) + the realization_width.dag consumer catch-up that unblocked red main. cli_run.rs is a semantic compose, not a pick-a-side: run_discovery_rows and run_discovery_corpus_with_options now thread BOTH this branch's node-precise skip (skip_enabled + frontier_seeds + DiscoverySummary.skipped) AND main's hermetic discovery (whole_tree_published_keys + make_eval_context_with_runtime_options + DiscoveryWitnessOutcome/witness_outcomes). The roster-only gate is the union of both triggers (explicit_roster_only OR empty-scan-dirs+explicit). The entry touch check runs on the hermetic ctx (data-item Node eval is pure, so published keys don't perturb it). claim_executor keeps main's Wet-dispatch comment and this branch's run_discovery_corpus_with_options call (the only one taking the skip flag). Also folds the opus-4-7 finding-2 cleanup: drop the unused _entry param from run_injected_diff_roster + its call sites. Verified by execution: 8 floor-skip host receipts + 3 cli_run unit tests (this branch) AND 4 wet/hermetic equivalence tests (main) all green; clippy --all-targets -D warnings + fmt clean. main is green again, and the merged tree carries the fixed realization_width.dag (NanosecondDuration from std.verification). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Merge conflict resolved —
|
…CI FreeMonoid poison) The Phase 1.5a node-precise CI floor skip resolves the changed `.dag` files to locate which top-level declarations moved (`collect_frontier_seeds_from_diff_line_ranges`). It did so over the *same* `MultiEntryIndex` the corpus then resolves over. That index carries interior-mutable parse / intern / typed-module caches, so resolving a changed file first warms — and, under the known v2 generic-instantiation bootstrap limitation, corrupts — a module the corpus later reuses: resolving `ci_floor_plan.dag` first caches `FreeMonoid<T>` WITHOUT its `Empty`/`Cons` variants, after which every corpus entry whose closure reuses `node_query.dag` fails to resolve (`undefined variable 'Empty'`). `main` never hit this (no skip -> no pre-corpus resolve); the width>1 shards already build a fresh index per thread, so only the width==1 path (CI's mode) shared. Fix: resolve the frontier analysis over a throwaway index so it is a pure read that cannot perturb the corpus it decides over (§3 cache-impurity: cold-vs-warm resolve must agree). One line; no change to the skip topology. Verified by execution: - full floor pass (skip ON): batch 2 `PASS discovery-corpus (486 witnesses)` — the FreeMonoid resolve failure is gone (red->green across this one change). - new host regression `frontier_warmup_does_not_poison_corpus_resolution`: injects a diff on the proven poisoner `ci_floor_plan.dag` with a `node_query` consumer (`budget_roster_completeness_test.dag`) in the roster; RED with the exact CI error without the fix, GREEN with it. `run_discovery_rows` resolves every entry before the skip decision, so the poison bites whether or not the entry is ultimately skipped. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
CI fix pushed ( Symptom: batch 2 failed resolving Root cause (§3 cache-impurity, not a logic bug in the skip topology): Fix (1 line): resolve the frontier analysis over a throwaway index, so it is a pure read that cannot perturb the corpus it decides over. Verified by execution:
fmt + — sent from zesty-deer-479 |
Slice-2 mass anchor backfill and slice-3 CI floor wiring were held pending operator ruling; 86b4a7b re-triggered cross-tree Empty/Cons poison (#5295 family). Restore advisory off-floor gate, remove ExtdepsStableAuthorityGate from ci_spec/floor plan, revert backfill to the 163-entry snapshot signed off at slice-1. Co-authored-by: Cursor <cursoragent@cursor.com>
Summary
Finishes Phase 1.5a node-precise CI floor witness skip (supersedes #5291 WIP).
Root fix:
run_in_context_with_argsnow installswith_active_ctx, so host calls totest_claim_evaluation_nodes/fold_list_rightdecode FreeMonoidEmpty/Conschains instead of failing withfold_list_right expects a list, got Variant.Entry touch: skip decisions use overlapping TestClaim declaration spans (node-precise seeds from
git diff -U0hunk line ranges) before node-closure comparison, so same-file A/B edits discriminate correctly (file-level skip would run both).§5 discriminating receipt:
node_precise_discriminator_test.dag+node_precise_same_file_ab_frontier_discriminatesunit test + host test showingSKIP [assumed-green node-frontier]on untouched witnesses.Test plan
ctrl-build -- cargo test -p v1-compiler node_precise_same_file_ab_frontier_discriminates— GREENctrl-build -- cargo test -p v1-compiler-tests discovery_corpus_skip— GREEN (4 tests; skip path skips discriminator witness againstorigin/main...HEAD)GUNBC_CI_DIFF_BASE=origin/main GUNBC_CI_DIFF_HEAD=HEAD ./target/debug/claim_executor --source-root dsl --source-root src/v2 --plan-entry src/v2/workflow/ci_floor_plan.dag --plan-function gunbc_ci_floor_batches— nonode-frontier population failed(full floor still subject to unrelated roster resolve issues on this branch)