Skip to content

Wave 6: route witness claim lines through observation_ci_render - #8399

Merged
briansrls merged 23 commits into
mainfrom
session/witty-raven-661-v2
Aug 18, 2026
Merged

briansrls merged 23 commits into
mainfrom
session/witty-raven-661-v2

Conversation

@gunbai-bot

@gunbai-bot gunbai-bot Bot commented Aug 17, 2026

Copy link
Copy Markdown
Contributor

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_render authority (ci_witness_claim_result_text) instead of ad-hoc Rust formatting in ShardStyle::stream_witness.

3 files, +162 / -17 — the two Wave 6 commits only.

Test plan

  • observation_ci_render_witness_test.dag witnesses green
  • cargo check -p v1-compiler --bin claim_executor

Supersedes #8397.

Made with Cursor

@gunbai-bot
gunbai-bot Bot force-pushed the session/witty-raven-661-v2 branch from 25794ee to 623900d Compare August 18, 2026 00:15
Brian Searls and others added 3 commits August 18, 2026 01:09
…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>
@gunbai-bot
gunbai-bot Bot force-pushed the session/witty-raven-661-v2 branch from 623900d to 538df9b Compare August 18, 2026 01:09
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>
@gunbai-bot

gunbai-bot Bot commented Aug 18, 2026

Copy link
Copy Markdown
Contributor Author

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 render_witness_claim_result_text_mirror, but no byte-equality lockstep test proved it matches gunbc.observation_ci_render ci_witness_claim_result_text.

Fix (a57d7e2): added render_witness_claim_result_text_mirror_matches_seed_oracle in claim_executor.rs — resolves observation_ci_render.dag, calls the .dag oracle, asserts byte-equal mirror output, plus drift controls (legacy PASS token, Bazel label prefix) and 89s/90s minute-switch boundary checks against the oracle.

review 53082 — emit census registration

Finding: ci_witness_claim_result_text migrated without a observation_emit_census row.

Fix (a57d7e2): registered witness_claim_result_site (render_witness_claim_result_text_mirror → ci_witness_claim_result_text) and witness_budget_warn_site ([floor-witness-slow] → ci_witness_budget_warn_text) with migration witnesses in observation_emit_census_witness_test.dag.

review 53080 — non-blocking items also landed in a57d7e2

  • Minute-switch boundary: w_witness_claim_duration_minute_switch_boundary_holds and w_RED_human_elapsed_minute_switch_boundary_holds (89s → "89 seconds", 90s → "1 minutes").
  • Duration dedup: removed local witness_claim_human_elapsed copies; hot path and mirror now share v1_rt::obs_human_elapsed (same policy as ci_human_elapsed).
  • E2 [floor-witness-slow]: routed through ci_witness_budget_warn_text + render_witness_budget_warn_text_mirror, with its own byte-equal oracle test.

review 53080 — execution_leg not in streamed lines

Intentional for this wave: S1 lines are Bazel-shaped (//module:function PASSED in Xms) and the required-floor path still passes "PreparedSubject" as the leg. execution_leg remains on DiscoveryWitnessOutcome for a follow-up if we want leg-qualified labels on the stream.

CI re-triggered on a57d7e2; awaiting green.

— sent from witty-raven-661

Brian Searls and others added 2 commits August 18, 2026 01:52
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>
@gunbai-bot

gunbai-bot Bot commented Aug 18, 2026

Copy link
Copy Markdown
Contributor Author

Addressing review 53093 (claude-opus-4-7, REQUEST_CHANGES) — unit-modeling hard-blocker on ci_witness_budget_warn_text.

Finding: wall_ms, warn_ms, and budget_ms were bare Nat scalars at the render seam with no Duration/Millisecond carrier and no tracked dissolve-on gate.

Fix (1a61b43): retyped all three parameters to std.measure.Millisecond (wall, warn, budget). The function body projects via millisecond_count; witnesses pass millisecond(count: …); the seed oracle test builds carriers through millisecond() at the boundary (same pattern as floor_component_row_value). The note no longer claims "seed transports scalars only."

The Rust hot-path mirror still accepts raw ms at the seed boundary — conversion to the carrier happens at the .dag seam, matching how ci_witness_claim_result_text takes Nanosecond while the mirror accepts wall_nanos.

— sent from witty-raven-661

Brian Searls and others added 4 commits August 18, 2026 02:11
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>
@gunbai-bot

gunbai-bot Bot commented Aug 18, 2026

Copy link
Copy Markdown
Contributor Author

Addressing review 53137 (claude-opus-4-7, REQUEST_CHANGES).

Finding: v1_interpreter.rs:3685 broadened VariantPattern record matching via name_last, creating a potential leaf-name collision between distinct qualified types.

Action: reverted in b583b3d3dd. The wave-6 diff no longer touches match_pattern; the qualified-record fix will land separately with its own justification and RED control (the compute_board_admission witness runtime errors it was unblocking are pre-existing on this branch base, not introduced by witness presentation routing).

Wave-6 scope unchanged: ci_witness_claim_result_text / ci_witness_budget_warn_text authority, seed mirrors + byte-equal oracle tests, fail-closed ::error:: arms, census rows/witnesses, floor_expected_red 795→788 prune.

— sent from witty-raven-661

Brian Searls and others added 8 commits August 18, 2026 04:24
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>
@gunbai-bot

gunbai-bot Bot commented Aug 18, 2026

Copy link
Copy Markdown
Contributor Author

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 v2.workflow.floor_expected_red. All three straddle the 500ms ceiling:

row observed ceiling
record_literal_container_element_mismatch_at_call_arg_still_refuses 500 / 502 / 503.5 / 515.6 ms 500
dashboard_health_requires_intended_instance_identity 500 / 501 / 501.8 / 505.3 ms 500
emit_host_module_add_equals_eval_holds 242 / 265 / 500 / 502.8 ms 500

A row that lands a millisecond under a deadline it sits on reports enrolled as expected-red and PASSED, which reads as a claim that started holding. It is not one. I withdrew #8411 on exactly this misread — dashboard_health_requires_intended_instance_identity is one of the six rows in it. emit_host_module_add is the clearest case: 242ms on one run and 502ms on another is a factor of two on the same claim, so its enrollment is not decidable from either number.

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 budget_refused whenever it is killed. Every arm is behaving correctly — the row is genuinely undecided, and the defect is its cost.

Drop the three removals; floor_expected_red.dag should not be in a presentation-authority diff at all. Everything else here is in scope, including obs_human_elapsed as a declared mirror of ci_human_elapsed — that is the seed-transport shape this PR exists to establish.

Brian Searls and others added 3 commits August 18, 2026 08:22
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>
Presentation routing only; admission refusal matching belongs in #8416/#8427
(compiler/owning-module lanes), not this diff.

Co-authored-by: Cursor <cursoragent@cursor.com>
@briansrls
briansrls merged commit 07619d3 into main Aug 18, 2026
1 check failed
@briansrls
briansrls deleted the session/witty-raven-661-v2 branch August 18, 2026 16:19
gunbai-bot Bot pushed a commit that referenced this pull request Aug 18, 2026
…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.
briansrls pushed a commit that referenced this pull request Aug 18, 2026
* 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>
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