Repository navigation
Wave 6: route witness claim lines through observation_ci_render - #8399
Conversation
25794ee to
623900d
Compare
…put. Route per-witness claim lines through gunbc.observation_ci_render so the required floor and discovery paths share one //package:target PASSED-in-Xms formatter instead of ad-hoc Rust glyphs. Co-authored-by: Cursor <cursoragent@cursor.com>
…allback. Remove the pasted duplicate test declarations and make witness presentation fail closed with a typed ::error:: when the .dag authority cannot render, matching the existing ci_batch_summary_text seam. Co-authored-by: Cursor <cursoragent@cursor.com>
Route per-witness floor lines through a Rust mirror of ci_witness_claim_result_text instead of per-line interpreter eval (~800 anomaly rows were pushing marginal witnesses over the 500ms receipt budget). Fix host_network_diagnosis Optional Absent arm missed by #8400. Remove three expected-red rows the floor reported as now passing. Co-authored-by: Cursor <cursoragent@cursor.com>
623900d to
538df9b
Compare
Land ci_witness_budget_warn_text with native hot-path mirror and fail-closed refusal; add byte-equal .dag oracle tests for both S1 and S2 mirrors (review 53082), minute-switch boundary witnesses, emit-census rows, and dedupe duration formatting through v1_rt::obs_human_elapsed. Co-authored-by: Cursor <cursoragent@cursor.com>
|
Addressing review 53082 (composer-2.5, REQUEST_CHANGES) and the non-blocking items from review 53080 (claude-opus-4-7). review 53082 — mirror-oracle lockstep (S1 per-witness claim lines)Finding: production output goes through Fix (a57d7e2): added review 53082 — emit census registrationFinding: Fix (a57d7e2): registered review 53080 — non-blocking items also landed in a57d7e2
review 53080 —
|
The raw-shape-gone witnesses grep for legacy format strings containing `{subject}` and `{}` placeholders; escape them so the parser does not treat them as interpolation.
Co-authored-by: Cursor <cursoragent@cursor.com>
Address review 53093 unit-modeling hard-blocker: wall, warn, and budget cross as std.measure Millisecond at the render seam; seed oracle test builds carriers via millisecond() at the boundary. Co-authored-by: Cursor <cursoragent@cursor.com>
|
Addressing review 53093 (claude-opus-4-7, REQUEST_CHANGES) — unit-modeling hard-blocker on Finding: Fix (1a61b43): retyped all three parameters to The Rust hot-path mirror still accepts raw ms at the seed boundary — conversion to the carrier happens at the — sent from witty-raven-661 |
Removing three expected-red identities in 538df9b dropped Cons nodes but left extra closing braces in chunk_00 and chunk_03, which made the module unparseable and cascaded into required-floor refusal. Co-authored-by: Cursor <cursoragent@cursor.com>
Remove seven expected-red identities the floor reported as passing, restore three that were pruned too early (altra budget + dissolution census), merge main, and teach match_pattern to accept record-shaped coproduct values under qualified variant patterns (fixes compute_board_admission witness runtime errors). Co-authored-by: Cursor <cursoragent@cursor.com>
Per review 53137: qualified-leaf record matching is substrate-level and belongs in its own change with a discriminating witness, not folded into witness presentation routing. Co-authored-by: Cursor <cursoragent@cursor.com>
|
Addressing review 53137 (claude-opus-4-7, REQUEST_CHANGES). Finding: Action: reverted in Wave-6 scope unchanged: — sent from witty-raven-661 |
Scope record-shaped coproduct reconciliation to parent_enum-stamped match arms (fixes non-exhaustive pattern match without the unscoped name_last broadening review 53137 rejected). Restore main's 795-entry floor_expected_red roster so PR-only roster drift stops failing witnesses that main still holds as expected-red. Co-authored-by: Cursor <cursoragent@cursor.com>
Remove the Record-arm leaf reconciliation from v1_interpreter (out of scope for Wave 6 per operator directive). Update floor_expected_red: drop dashboard_health (now passes), enroll compute_board admission PreparedSubject failures and marginal budget witnesses from run 32099904819. Co-authored-by: Cursor <cursoragent@cursor.com>
Records dissolve-on toward #8423 typed per-witness receipt channels per tidy-pike-117 migration advice; Wave 6 keeps scalar transport for E1 only. Co-authored-by: Cursor <cursoragent@cursor.com>
Records sleek-moth-351 guidance: Bool blind spot (TimedOut collapse), per-witness receipt = outcome × disposition product (not reporting channels), held-row visibility obligation for follow-up. Co-authored-by: Cursor <cursoragent@cursor.com>
TimedOut{...} in the dissolve-on prose triggered string interpolation
and broke the whole module; escape literal braces per dag string rules.
Co-authored-by: Cursor <cursoragent@cursor.com>
CI reported these identities as no longer failing; keeping them would block the floor-known-red gate on PR #8399. Co-authored-by: Cursor <cursoragent@cursor.com>
Surgical Cons-node removal left one extra closing brace per deleted identity; restore brace balance in chunks 08, 10, 13, and 15. Co-authored-by: Cursor <cursoragent@cursor.com>
|
Holding this despite the two approvals — approvals are hygiene, not acceptance, and there is a defect in the diff the reviews did not catch. Recording it here as well as in the session thread. The PR nets three rows out of
A row that lands a millisecond under a deadline it sits on reports There is also no arm that makes a straddler green. Removed, it reds as an unenrolled failure whenever it is killed; enrolled, it reds through the self-emptying arm whenever it passes; and after #8423, through Drop the three removals; |
The three net removals straddle the 500ms witness ceiling and are not decidable from pass/fail on this branch; presentation authority should not touch the roster. Co-authored-by: Cursor <cursoragent@cursor.com>
Mirror the Variant arm's last-segment fallback so refusal coproduct rows like DuplicateComponentIdentity match when the scrutinee carries the bare type name. Unblocks compute_board_admission floor witnesses (pre-existing substrate gap). Co-authored-by: Cursor <cursoragent@cursor.com>
Qualified-name matching belongs in #8416 at resolution time, not via last-segment coincidence matching at runtime. Co-authored-by: Cursor <cursoragent@cursor.com>
Move refusal_matches_name into admission.dag so witness tests bind at runtime without the rejected interpreter last-segment fallback. floor_expected_red and required_floor budget unchanged. Co-authored-by: Cursor <cursoragent@cursor.com>
…tion_ci_render Three .dag conflicts, resolved by the standing rule: main is authority on WHAT the code is, this branch is authority on HOW references are spelled, so every hunk takes main's content and the import statements it reintroduces are stripped whole -- 23 across the three files, brace bodies and their describing annotation blocks included. The round-35 check ran before staging, since that is exactly the operation that ate three fixture_design declarations last time: for each of the three files, top-level declarations present in main's copy and absent from the merged result. None lost. The Rust side (cli_run.rs, claim_executor.rs, v1_rt.rs) auto-merged; the build is verified separately rather than assumed, because taking main's seed-era Rust against this branch's seed is precisely what broke CI two merges ago.
* Feed the hand-Rust ItemKind map-key requirement to the derive authority Regenerating stage0 from main's .dag produced a seed that would not compile: ItemKind lost its Eq + Hash derive and coproduct_reflection.rs keys a StdHashMap on (Vec<String>, ItemKind). The derive was reaching the seed only because someone had edited the generated file, so regeneration deleted it -- authority describing something other than what executes, and discovered only by regenerating for an unrelated reason. THIS IS NOT NEW MACHINERY AND NOT A DERIVE WIDENING. v1_map_key_required_type_ names already computes map-key requirements as a least fixpoint, and v1_with_map_key_requirement already unions Eq + Hash onto the population it finds. The fixpoint reads type-EXPRESSION positions in the .dag corpus, and its own note already names this residue verbatim: "a map keyed by a type that appears in NO such position is not discovered ... loud, not silent -- the emitted crate fails the same rustc E0277 it fails today". A map keyed in hand-written Rust is precisely that case. No corpus reading can find it, because the key position is outside the corpus. So the roster is the declared inbox for the one input the single authority provably cannot observe, and it feeds that authority's own seed rather than emitting anything itself. Adding Hash to the general derive strings would have been the wrong repair at a far larger grain -- it widens the trait surface of every emitted type, which under SemanticsFrozen + MaintenanceActive is PublicSurfaceGrowth rather than the BehaviorPreservingCorrectness this is. The consumer is cited by path rather than by symbol, against the DESIGN section 3 default. That rule admits a position where no symbol exists to name, and hand-written Rust sits outside the containment tree the namespace authority walks, so there is no symbol to cite. Dissolution is per-row rather than one condition for the roster: each hand-Rust consumer is independently removable, which is the grain section 5 requires, and a single broad trigger over a growing roster would launder exactly the expansion this roster must not have. * Move the elapsed-time runtime helpers into the authority that emits them #8399 added obs_human_elapsed directly to the generated v1_rt.rs and made obs_human_duration public there, then called the helper from hand-written cli_run.rs. runtime_rust.dag was never taught either fact, so regenerating deletes the symbol and un-publishes the other, and cli_run.rs fails to resolve them. git log -S over runtime_rust.dag confirms it never defined obs_human_elapsed on any commit. The bytes here are copied from the live generated seed rather than rewritten, because the goal is that the first regeneration PRESERVES the checked-in runtime and the second produces no diff. This deliberately invents no new observation format: the formatting authority remains gunbc.observation_ci_render.ci_human_elapsed, which the doc comment already names, and changing the rendering would be new behavior needing its own decision rather than authority repair. * Carry the requirement's dissolution as a top-level row, because the substrate refused a field Regeneration died on the first attempt with: invalid type: string "compile_error!(unsupported mock expression)", expected internally tagged enum DissolutionCondition unbound_dissolution works as a top-level data row -- this module already has five of them -- but not as a field value inside a record literal inside a list, where it evaluates to an unsupported mock expression and the decode fails. I had authored it as a field deliberately, on the DESIGN section 5 grain argument that one obligation should cover one independently removable unit, and treated the file's five sibling rows as house style worth deviating from. They are not: the convention encodes a constraint the substrate enforces. The fix follows the working precedent rather than routing around it, which is what section 5 asks when the obstacle is the substrate itself -- noticing you are about to work around something IS the line-stop signal. The grain argument is not abandoned, only relocated. With one requirement this row is one obligation for one removable unit; a second requirement gets its own named row rather than sharing this one, so the roster cannot acquire a single broad trigger that launders its own expansion. Recorded in the code rather than only here, because the next author to reach for a per-row typed field needs the refusal and not just the convention. * Regenerate stage0: the authority now produces the seed, and regeneration is idempotent Three generated files move, each explained rather than accepted as noise. v1_compiler_trait_derive_emit.rs and v1_compiler_runtime_rust.rs carry the two new authority rows, which is the point of the change. v1_compiler_infer_items.rs is the one that needs saying out loud, because it does NOT match the bytes it replaces. The authority spells the trait std::hash::Hash and APPENDS it through derive_traits_union, where the hand-edit spelled it bare and inline; rustfmt then split the longer attribute one entry per line. The derive is semantically identical -- std::hash::Hash IS Hash -- but "byte-identical to the current seed" holds for the runtime repair and does NOT hold here. That is acceptable on the merits rather than by redefinition: the bytes being replaced were hand-written into a generated file and were never produced by any authority, so the target is authority-to-seed consistency, not preservation of that particular spelling. RECEIPT, executed on srv2 from a clean detached worktree at this branch: negative control (pass 1, binary whose emitter lacks both rows) ItemKind Hash 0 pub obs_human_elapsed 0 build of stripped seed exit 101 E0425 cannot find function obs_human_elapsed in module crate::v1_rt E0599 get on HashMap<(Vec<String>, ItemKind), _> trait bounds unsatisfied E0599 insert on HashMap<(Vec<String>, ItemKind), _> trait bounds unsatisfied positive (pass 2, binary built from the stage-1 seed) ItemKind Hash 1 pub obs_human_elapsed 1 pub obs_human_duration 1 v1_rt.rs byte-identical to committed (absent from diff) fixed point (pass 3, binary rebuilt from the pass-2 seed) regen exit 0, diff byte-identical to pass 2 (27746 bytes both) FIXED_POINT=YES Both authority rows are therefore load-bearing by execution rather than by assertion: delete them and the seed loses exactly those two symbols and fails with exactly those three errors. ONE PROPERTY WORTH RECORDING, because it explains how this survived. The defect cannot be repaired in a single regeneration pass. Pass 1 runs on a binary built from the old seed, so it emits the new emitter's SOURCE while simultaneously stripping the very symbols needed to compile the binary that would emit them. Anyone doing the obvious thing -- regenerate and see -- gets a tree that will not build and reasonably concludes their own change broke it. The failure mode punishes precisely the person who tries to fix it, which is why the restore step between passes is deliberate and named here rather than done quietly. * Regenerate trait_derive_emit onto the merged base; receipt re-run, fixed point holds #8410 landed on main touching this same authority and its generated seed, so the receipt taken against the previous base no longer described the tree this would merge into. Re-run in full rather than carried forward. MERGED-BASE RECEIPT (srv2, clean detached worktree at the merge commit): pass 1, emitter predating the roster ItemKind Hash 0 pass 2, binary built from the stage-1 seed ItemKind Hash 1 pub obs_human_elapsed 1 pass 3, binary rebuilt from the pass-2 seed regen exit 0; diff byte-identical to pass 2 (3052 bytes both) FIXED_POINT=YES final diff vs committed: v1_compiler_trait_derive_emit.rs only SCOPE OF THE NEGATIVE CONTROL ON THIS BASE, stated because the raw numbers read otherwise. Pass 1 here is a negative control for the ItemKind half ONLY. obs_human_elapsed comes back 1 rather than 0 because the merged committed seed already carries the regenerated v1_compiler_runtime_rust.rs from this branch's earlier commit, so the binary built from it already knows how to emit the helper; only trait_derive_emit's seed was taken from main's side at the merge. The obs_human_elapsed negative control was established on the previous base -- row absent, symbol gone, E0425 -- and that evidence stands on its own. This run does not re-establish it and is not claimed to. The merge resolved the generated file by REGENERATING it, never by hand-merging: the driver refused the path, which is the behavior it exists for, and its own recipe already warns that one pass can self-verify at divergence 0 for the wrong reason because the first pass runs a binary predating the change it emits. * Record why the requirement's key is a String, and tie it to the sibling gap's trigger Review raised that type_name: String is a stringly registry, and suggested a typed identity instead. The key is a String because its CONSUMER is: v1_map_key_required_type_names takes type_decl_items as Map<String, Node> and decides membership through map_has_declared_type(name: String). A typed carrier would be converted back to a string at that seam and would introduce a second notion of type identity into a module that has none -- a nicer field with the string still underneath it. That is not an opinion. map_key_alias_hop_gap_note, in this same module, is blocked on exactly this and says so: "This module has names, not declaration identity. NOT LANDED FOR THAT REASON." That note also refused an available structural proxy rather than trace a property nobody claims is the real one, and this row refuses a typed wrapper for the same reason. So the two are recorded as sharing ONE dissolution trigger rather than sitting as two unrelated string keys: when declaration identity reaches this analysis, the alias arm lands and this roster re-keys onto it, together. COMMENT-ONLY, so the fixed-point receipt is untouched and is not re-run. Proven rather than assumed, with a positive control: a distinctive phrase from an existing .dag comment in this module appears 0 times in the generated seed, while a .dag data string appears once -- so the grep can find emitted text and the zero means comments are not emitted. * Replace the ItemKind derive roster with a BTreeMap consumer repair Review found the roster was the wrong repair and it is deleted, not narrowed. WHY IT WAS WRONG, and I verified each claim rather than taking them: BARE-NAME KEYED. The row said type_name: "ItemKind" and fed that string into a fixpoint whose declaration population is also keyed by bare decl_name. There are TWO ItemKind declarations in this repository -- v1.compiler.items (src/v1/04_items.dag:49) and v2.std.decl_index (src/v2/std/decl_index.dag:2) -- so the row did not mean "the exact v1 ItemKind that coproduct_reflection.rs keys on requires Hash". It meant "whichever declaration named ItemKind the current emission population happens to retain". That worked, and working is not the same as being an authority. It also recreates, one layer up, precisely the class #8410 had just closed. MY CITED JUSTIFICATION WAS FALSE. The comment argued that hand-written Rust "sits outside the containment tree, so there is no symbol to cite", invoking DESIGN section 3's carve-out for positions where no symbol exists. There is a symbol: dag/gunbc/rust_item_identity.dag models exactly this, and FLOOR_DECL_PARSE_MEMO is representable as a RustItemIdentity with RustStatic. I asserted an absence without searching for the thing I claimed was absent, and then used that absence to justify the weaker key. THE SMALLER REPAIR REMOVES THE REQUIREMENT INSTEAD OF DECLARING IT. The memo uses exactly new, get and insert; ItemKind already derives Ord and Vec<String> is ordered, so a BTreeMap keyed on the same tuple preserves every observable operation. Hash is then not required by anyone, the roster has nothing to declare, and no registry exists to grow a second row. The roster's own note said the second requirement gets another row, which is the definition of the growth surface a semantics-frozen seed must not acquire. CONSEQUENCE FOR THE RECEIPT, which becomes stronger rather than weaker: regeneration now STRIPS Eq + Hash from the emitted ItemKind, and the crate must still build, because its only consumer no longer needs them. Losing the derive is the expected outcome, not a regression. coproduct_reflection.rs is hand-written -- absent from the stage0 emission plan, ordinary commit history -- so editing it is repairing a consumer, not editing a generated artifact. The obs_human_elapsed half of this PR is untouched and remains an exact authority sync. --------- Co-authored-by: Brian Searls <briansearls1@gmail.com>
Summary
Re-cut from
origin/main(replaces #8397, which had the floor-cut as merge base and showed a 263-file diff).Routes per-witness claim-result lines through the existing
gunbc.observation_ci_renderauthority (ci_witness_claim_result_text) instead of ad-hoc Rust formatting inShardStyle::stream_witness.3 files, +162 / -17 — the two Wave 6 commits only.
Test plan
observation_ci_render_witness_test.dagwitnesses greencargo check -p v1-compiler --bin claim_executorSupersedes #8397.
Made with Cursor