Repository navigation
Affected-set floor output: categorization, per-shard streaming, styled rollup - #6516
Merged
Merged
Conversation
… streaming, collapse skip spew The floor runner streamed one SKIP line per unaffected witness (~1.7k/run) plus a per-resolve binding-fork census, burying the real signal. Replace with: - one upfront [affected-set] categorization (total / unaffected-skipped / affected-closure) - a live per-shard streaming view of RUN witnesses (colored by shard, green/red glyph), so the previously-silent witness-eval phase is visible as it happens - skip/predict/ledger detail gated behind GUNBC_FLOOR_VERBOSE=1; counts unchanged on DiscoverySummary and the final [measurement] tally stays authoritative Reporting-only change in the v1 seed runner; no substrate/model change. Color auto-detects a terminal or GitHub Actions (NO_COLOR honored, GUNBC_FLOOR_COLOR=1 forces); GUNBC_FLOOR_QUIET=1 suppresses the stream. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…lup, §7 receipt
- Prefix the [affected-set] categorization and per-shard witness stream with a wall-clock
HH:MM:SS.mmm stamp so the stream reads as a timeline (floor_ts, dependency-free).
- Drop the 's{id}' shard tag when the run is single-shard (CI pins the corpus to width 1, so
the tag was noise there); it returns colored only when shards run wide, with a legend line.
- Slowest-witness rollup (dag/gunbc/ci_render.dag) now calls out the top-3 longest witnesses
with a fire glyph and a red timer, alongside the p50/p90/p95/p99/max percentile boxes already
rendered there. Red is emitted as gated raw ANSI at the box level (the SpanStyle SemanticColor
path does not serialize color in this eval); fire shows regardless of color, red only when color.
- Add the §7 hand-Rust dissolution receipt for the floor-observability helpers (addresses review):
no selection authority added; collapses into a v2 emit-host .dag floor-event carrier.
- New discriminating witness ci_render_slowest_hot_style_test: hot rows carry fire + red(38;5;196),
cold-control and no-color rows carry neither.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
gunbai-bot Bot
pushed a commit
that referenced
this pull request
Jul 12, 2026
…ShardStyle threading, categorization, fmt) The auto-WIP commits 081c00a/4cdaca3e captured the merge mid-resolution; this completes it: run_discovery_rows takes both fast_lane_eval_budget_ms (mine) and ShardStyle (main's #6516); Serial arm passes shard_id 0/count 1; adaptive workers get spawn-ordinal shard ids with spawn-time target width. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
briansrls
added a commit
that referenced
this pull request
Jul 13, 2026
… 5s rule, whole-corpus red burn-down (#6506) * WIP: CI debug * WIP: CI debug * WIP: CI debug * WIP: CI debug * WIP: CI debug * WIP: CI debug * WIP: CI debug * WIP: CI debug * WIP: CI debug * WIP: CI debug * Hermetic floor: pre-commit fmt hook (generated), execution-mode envelope on runnable profiles, checkout-read carve-out, bin-witness wet lane Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * WIP: CI debug * Adaptive AIMD memory governor replaces the pinned spawn-width constants (operator ruling 2026-07-12) The hand-edited width machinery — per-shard peak samples, executor base overhead, usable-fraction, memory-derived width folds, spawn_width_cap pins, and the per-plan *_plan_spawn_width fns the executor evaluated by name — is DELETED. Run-time concurrency is now governed adaptively (TCP-shaped): - v1_compiler::memory_governor: AIMD admission against the slot's OWN cgroup budget (memory.high > memory.max > MemTotal; GUNBC_MEMORY_BUDGET_BYTES override). Graceful hold on creep (memory.current past 4/5 high-water, PSI some avg10 > 10, swap growth per sample) — swap/reclaim buffer the overshoot so creep is not loss; multiplicative back-off (halve, floor 1) only on hard events (memory.events high/oom_kill deltas); additive re-growth on calm completions; active==0 always admits (progress floor, counted forced_serial). Every degradation is typed, counted, and surfaced in the [governor] receipt line (DESIGN §5: loud bounded degradation, never an absorbing widen). Pure decision core unit-tested without cgroups (12 tests). - cli_run: DiscoveryWidthPolicy { Serial, Adaptive } replaces parallel_width; adaptive pool drains entry-groups through lazily admitted workers (one whole-tree index per worker, amortized across pulled groups); workers retire between groups when the window halves; undrained-queue-without-error refuses. Serial keeps the width-1 closure-drift oracle. - claim_executor: plan-evaluated spawn width deleted (with the absent-width-fn FATAL wiring-gap class); gate resolve-groups draw AdmittedSlots from the same governor; cgroup sensor fns single-authority in the governor module; walk memo key becomes a typed (entry, ExecutionMode) tuple (review follow-up). - .dag: RunnableDiscoveryBatch loses spawn_width_cap; RunnableMemoryClass degrades to payload-less Negligible|Substantial markers (the predicted-peak bytes were the hack); gunbc.ci_floor_measurement keeps only INTER-run rows; width witness cluster deleted; gunbc_ci_adaptive_width_note carries the model story and the dissolve-on (graph-derived per-node demand). - regen: std_execution_mode.rs twin registered (latent gap from the ExecutionMode re-home — fresh self-compile emitted it unregistered, so the regen gate would have refused on first execution); stage0 + stage0_core rosters updated; regen_stage0 --verify green (divergence 0). Proofs by execution (release): adaptive smoke ramps 1→2 workers and passes 3/3; RED control (1MB budget) pins width 1 with forced_serial=1 counted and still completes; whole-tree compile-clean green through the new plan schema; witness files green (profile, measurement, width, floor plan, disposition lens); generated-artifact regen gate green with zero drift; fmt clean. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Governor slow-start overshoot fix: admission pacing on first-cost digestion + MemAvailable budget fallback CI run 29180195694 (first governor run): the uncapped runner cgroup fell the budget through to MemTotal, and additive increase ran at unit-completion speed (instant skip decisions) while each worker's real demand (whole-tree index build, 3-5GiB) lands 30-60s after admission — width blasted 1→16 before any build allocated, current hit physical RAM at pool+2min, swap filled, PSI 68, the runner agent starved and GitHub killed the job. Fix 1 — admission pacing: at most one admitted-but-undigested worker at a time; the digest point is the front-loaded cost landing (index build + runner resolve returned), not first unit completion, so a slow first eval cannot freeze the pump, and a worker that dies before digesting clears its debt on release. Ramp rate becomes the index-build rate — the demand-relevant clock — and overshoot is bounded to one worker's build. Typed hold reason (AwaitFirstCost), episode-counted in the receipt as pacing_holds. Fix 2 — budget fallback order gains /proc/meminfo MemAvailable before MemTotal: on uncapped hosts the kernel's availability estimate excludes the co-tenant baseline (the runner agent) instead of handing the floor the whole box. Proofs: 15/15 governor unit tests (pacing hold/unblock, dead-worker debt clear, meminfo exact-key parse); calm smoke 3/3 PASS ramping to width 2 with receipt; RED control (1MB budget) pins width 1, forced_serial=1, completes. The 4 cli_run lib test failures are pre-existing environmental (tmp-fixture vs workspace-root pin), identical at the pre-fix head. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Governor: budget-exceeded is a hard event (reachable multiplicative decrease on uncapped runners) Run 29181858455 (paced governor): admission pacing and the high-water hold worked — [governor] holding admissions at 43.5GiB — but in-flight workers' own growth (request-major re-resolves of heavy closures, multi-GB each) blew through the 20% buffer to 52.6GiB in seventy seconds with zero new admissions, and on a runner whose cgroup sets no memory.high/max the memory.events counters never move, so the multiplicative-decrease arm was unreachable: hold was the governor's strongest response, and hold cannot shed demand. The budget is the declaration, so crossing it IS a hard event: halve the window (episode-counted with hysteresis — one halving per crossing, re-armed only below high-water so oscillation at the line cannot halve per poll), and should_retire drains workers between units, freeing their indexes. Three declared zones: below high-water admit+grow; high-water to budget hold (the buffer absorbs); above budget halve+drain. No new constant: the zone edges are the declared budget and the existing policy fraction. Receipt gains budget_exceeded=N. Proofs: 16/16 governor unit tests (exceed halves once per episode, hysteresis re-arm below high-water, drain reachable); RED smoke (1MB budget) fires the arm live — hard_backoffs=1 budget_exceeded=1 forced_serial=1, run still completes 3/3; calm smoke unchanged (ramp to 2, budget_exceeded=0). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Governor: creep-episode edge is multiplicative decrease (ECN semantics, not stop-and-hope) Run 29182481051 proved hold-only creep handling cannot save the box: the pacing ramp was correct, the hold fired at 47.9GiB, the budget-exceed halve fired at 51.7GiB — and the box still died at 52.7GiB eighty seconds later, because already-admitted workers' residency grows ~1GiB/min each (request-major closure accumulation) and the exceed line sits one gigabyte from physical death: no margin for drain latency plus the allocator's freed-page plateau. Creep IS the early congestion signal — TCP's ECN mark, not its loss. The first hold of a creep episode (high-water, PSI, or swap growth) now halves the window too, so workers drain while the high-water→budget buffer still has ~10GiB of margin. One halving per episode, re-armed on the next admission; the budget-exceed halve stays as the backstop; the creep arm moves ahead of window-full so a full window cannot mask the edge, and completions observe the same edge (the only polls at a full window). graceful_holds renamed creep_backoffs — the receipt now says what the episode does. Proofs: 16/16 governor unit tests (edge halves once per episode, drain reachable, re-arm on admission); RED smoke fires creep back-off, budget exceed, and progress floor live and still completes 3/3; calm smoke unchanged (ramp to 2, creep_backoffs=0). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Governor: measured-share headroom gate (predictive admission) + budget-exceed collapses to width 1 Run 29183064852 was the decisive datapoint on reactive-only control: the creep back-off caught the high-water crossing within one poll (41.287 vs 41.286 GiB) and halved 16->7, the budget-exceed halve fired at 51.7 — and the box still died at 52.7 GiB, because ~14 admitted workers' residency was maturing at ~18GiB/min, drain latency is a group boundary away, and exited workers' pages never return within a run (allocator plateau). Reactive arms observe demand minutes after the admission that committed it; at that lag they are structurally too late. The predictive complement, with no authored constant: the run measures its own per-worker share — memory.current at the first poll is the pool baseline, and the first slot's digest fixes share = current - baseline — and admission then requires current + share <= high-water. The old 2h26m run that sat stable at width 7 / 38.5GiB is the existence proof that an equilibrium exists; this gate finds it from the run's own measurements instead of the deleted calibration constants. Typed episode-counted hold (InsufficientHeadroom, headroom_holds), window untouched (prediction is not a creep event). Budget-exceed escalates from halve to collapse-to-1: it is TCP's timeout, not its duplicate-ACK — when the crossing is discovered a gigabyte from death, every growing worker beyond the first must stop at its next group boundary. Proofs: 17/17 governor unit tests (gate predicts below high-water, episode edges, resume on settle; exceed collapse + hysteresis re-arm); calm smoke arms the gate ('measured worker share ... headroom gate armed') and still ramps to 2, 3/3 PASS; RED smoke fires creep back-off, exceed collapse, and progress floor, still completes. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Governor: admission ceiling at half the budget (the maturation reserve) + budget-chain doc sync Run 29183727188 exposed the last measurement lie: the headroom gate armed with a 0.48GiB share measured at the first worker's index-build digest, but the mature per-worker footprint is ~3.5GiB — admitted demand matures MINUTES after admission at ~7x its digest-time footprint, so any share measured at digest under-prices the future and the gate admitted the same fatal ramp (creep 16->7 at 41.2GiB, exceed collapse 7->1, dead at 52.5GiB, SIGTERM). The honest arm this yields is TCP's own ssthresh: admissions stop once memory.current crosses HALF the budget — the other half is the maturation reserve for in-flight growth the signals cannot see yet. Dimensionless policy fraction like the high-water line; no workload constant. On run 29183727188's curve this stops admission at ~25.7GiB / width ~8, and the 2h26m run that sat stable at width 7 / 38.5GiB is the existence proof that the resulting equilibrium fits. Typed episode-counted hold (AdmissionCeiling / ceiling_holds). Also syncs the budget-chain documentation cursor's review caught drifting (single-authority): gunbc_ci_adaptive_width_note and the module header now describe the implemented chain (memory.high > memory.max > MemAvailable > MemTotal) and the full controller (pacing, measured-share gate, ceiling, creep-edge halve, exceed collapse). Proofs: 18/18 governor unit tests (ceiling holds past budget/2 while calm, episode-counted, resumes below; window untouched); calm smoke ramps to 2 with ceiling_holds=0; RED smoke completes with every arm counted; whole-tree compile-clean green on the .dag note edit. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * githooks_pre_commit_emit: explicit dissolve-on for the concat-built shell (review follow-up) The pre-commit hook's shell-via-concat carried its medium-as-string debt implicitly through the pre-push sibling's roster; the note now cites its own dissolution trigger (grammar-path shell emission superseding the concat-built literals, one trigger for the hook-emit family). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Dissolve single-variant ExecutionMode predicates (review follow-up) execution_mode_is_record was dead on both surfaces (zero callers); execution_mode_is_hermetic was a single-variant Bool nickname over the coproduct. Effect-io host dispatch sites now read directionally through execution_mode_is_wet_dispatch (the semantically-real fact: Wet|Record dispatch to live transports, Hermetic replays fixtures); witness-test assertions go through execution_mode_eq against the expected variant. Seed regenerated via regen_stage0 (16-line drop mirrors the .dag). Proof: crate builds clean with the fns deleted (no Rust callers); effect_io_host_mode_test 4/4 PASS by execution (wet_does_not_replay + hermetic_write_fail_closed discriminate the arm-flip); profile and ci_floor_plan witness umbrellas PASS; zero residual references. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Resolve main merge conflicts (auto-WIP-commit swept the conflicted tree) ci_layer_roots: union — wet-exclusion entries + main's test/fixture/floor_skip/ dir-grain row. runnable_resource_profile_witness_test: union — execution_mode_eq import + main's #6479 live-tree disposition decl. ci_floor_measurement_per_shard_test: deletion stands — its witness subjects (pinned-width measurement rows) were retired by the governor; main's edit there was the mechanical disposition decl. Proven: profile/ci_floor umbrellas + drift gate PASS on the resolved tree. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * WIP: CI debug * WIP: CI debug * Fast-lane 5-second rule: cooperative eval deadline + long/ test home (operator ruling 2026-07-12) A witness whose own eval reaches 5s does not run in per-PR discovery. Three layers, one authority: - Authority: gunbc_ci_fast_lane_witness_eval_budget (Second, =5) + gunbc_ci_fast_lane_eval_budget_ms projection in v2.workflow.ci_floor_plan, with the rule note. claim_executor reads it fail-closed when a plan schedules a discovery batch (missing/mistyped row refuses the run; discovery-free plans never read it). - Enforcement: cooperative per-witness eval deadline in v1_interpreter (checked every 4096 eval dispatches; typed EvalBudgetExceeded unwinds from inside eval — in-process worker threads have no kill authority, the Phase A lesson). Armed in run_claim_measured from the ctx-level budget; resolve/index cost is infra and never counted (operator carve-out). claim_batch gains --eval-budget-ms for local audits. - Home: test/claim/long/ excluded from discovery at dir grain (ci_layer_roots + note). First receipted residents: s1_closure_receipt (90+min whole-closure re-parse, the run-29183446733 wedge) and self_host_module_emit_derisk (~31s/witness), modules renamed v2.test.manual.* -> v2.test.long.*. Proof by execution: RED control fires (1ms budget on a 19ms-eval witness -> typed FAIL naming it); calm control passes unbudgeted; the wedge witness dies in 10s total instead of 90+min (4s resolve uncounted, refusal at 5.002s eval); moved files resolve at their new home; drift gate PASS. This is the wedge tourniquet: the class that burned 243 of 270 billed minutes in silence now fails red in seconds, by name. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * WIP: CI debug * WIP: CI debug * WIP: CI debug * WIP: CI debug * WIP: CI debug * WIP: CI debug * WIP: CI debug * WIP: CI debug * WIP: CI debug * WIP: CI debug * Home #6512's classical_not equals_eval witness in the execution corpus The merge from main brought emit_host_classical_not_ingested_equals_eval_test.dag into test/claim/manual/ — the emit_host wet transport class (hermetic discovery refuses it: emit_host_run_transport, no mock arm). Moved to the execution corpus home (src/v2/test/claim/execution/, Wet-profiled explicit batch) beside its 12 siblings; proven wet at the new home incl. the swapped-refuses RED control. Other #6512 witness files pass hermetically in place (rust_test, match_infer_fail_open_audit; body_lowering_match carries no test fns). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * CI retrigger: supersede wedged queued run 29206348113 (cancel would not propagate) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * WIP: CI debug * Burn down run-29208529942's 11 floor failures (first full-floor receipt: 12min, typed per-witness list) Three classes, all addressed: Budget class (6 witnesses / 5 files at 5.0-6.4s on the runner): moved to long/ homes — the two dag-side files the first sweep missed (module_graph import_closure_live, reference_closure_equivalence; dag/test/claim/long/ now exists), dag_import_block_lexeme_stamp, syntactic_audit_witness, string_head_linear. Plus proactive moves of the audit's remaining >5s native-heavy witnesses that the stride blind spot had silently greened and this run's node-frontier selection happened to skip (derived_machinery_exempt_live 21.7s, inert_lens_hygiene 19.3s, shadow_mask_red / live_anchored_modules_clean 9.9s): latent reds under the completion-side check, moved before they fire. The local timing distribution is bimodal (>=5s or <3s; empty 3-5s band), so runner slowdown cannot create new stragglers from the passing set. IsExecutable class (3 witnesses / 2 files): double enrollment — parse_test floor/perf and dag_compile_clean_perturb_receipts were declared BOTH in bin_witness_wet_entries (the Wet bin lane) and as commit_workflow CorpusWitnessKind rows, so the corpus projection ran them a second time inside the hermetic discovery batch where run_witness_bin refuses. Deleted the commit_workflow rows (§3 one-fact-one-roster; the bin lane keeps per-PR coverage), recorded beside the deletion. Bare-false class (2): medium_structure exception-roster growth ratchet bumped 58 -> 59 for the justified pre-commit-emitter row (the ratchet doing its job); floor_diff_observe_witness moved to the execution corpus — it shells real git diff, which hermetic mode folds into its Fail arm, so its home is the Wet per-PR lane (green there incl. fail-closed arms). Named follow-on: a git read-only observation carve-out (diff between SHAs is commit-deterministic, same argument as the repo-tree read carve-out). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * WIP: CI debug * Resolve #6516 merge: governor pool keeps main's floor observability (ShardStyle threading, categorization, fmt) The auto-WIP commits 081c00a/4cdaca3e captured the merge mid-resolution; this completes it: run_discovery_rows takes both fast_lane_eval_budget_ms (mine) and ShardStyle (main's #6516); Serial arm passes shard_id 0/count 1; adaptive workers get spawn-ordinal shard ids with spawn-time target width. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * WIP: CI debug * Repoint 4 stale entry paths left by the long/ move round (caught: module_grain equivalence tests red) The dag-side/second-round long/ moves postdated the 12-min floor receipt and the 212/0 lib-suite run, so nothing had re-executed these references: - cli_run.rs module_grain sample entries (x2) -> dag/test/claim/long/ (both equivalence tests + wiring-perturbation control green locally, 162s) - extdeps_external_authority_transport ClaimRun rows (x2) -> src/v2/test/claim/long/ (both claims PASS by execution at new homes, 10.0s / 21.8s) - complexity_linearity_audit.rs diagnostic pointer Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * WIP: CI debug * WIP: CI debug * WIP: CI debug * WIP: CI debug * WIP: CI debug * WIP: CI debug * Fast-lane eval budget: denominate in thread CPU time, not wall (fix realization_vocab_clean_tree contention flake) Run 29215148169 red on realization_vocab_clean_tree_holds at 5004ms > 5000ms in the hermetic discovery batch. Its genuine eval is ~3.4s (measured local eval_self); the extra ~1.6s is cold-I/O (a ReadsLiveTree whole-corpus scan) plus governor time-slicing under the concurrent worker pool. By the operator 5s rule's own 'assuming the infra isn't the problem' clause, a 3.4s-compute witness must not be misclassified as a long/ resident because CI contention inflated its WALL time. Root fix: the fast-lane budget (both the cooperative stride-poll deadline and the completion-side check) now measures THREAD CPU TIME (CLOCK_THREAD_CPUTIME_ID), which advances only while the thread runs on a core. A genuine non-terminating eval burns CPU and is still caught; a bounded scan whose wall time was inflated by I/O waits or scheduler contention is not. Switching wall->CPU can only make witnesses pass more easily (CPU <= wall), so it introduces no new failures. Proven by execution: clean_tree --eval-budget-ms 5000 -> PASS (CPU < 5s); --eval-budget-ms 500 -> REFUSE at 503ms (deadline still fires accurately). budget_completion unit tests green; all-targets compile clean. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * WIP: CI debug * WIP: CI debug --------- Co-authored-by: Brian Searls <briansearls1@gmail.com> Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Affected-set floor output: clean categorization, live per-shard streaming, styled rollup
Reworks the floor runner's operator-facing output so a run reads as the affected set unrolling in real time instead of a wall of skip lines. Selection semantics are untouched — this is narration + rendering only.
Problem
An unaffected PR streamed ~1.7k
SKIP [assumed-green node-frontier]lines (one per skipped witness — the normal success path, parsed by nothing) plus a per-resolve[binding-fork-ledger]census. The real work — the witness-eval phase — was silent (seeci_workflow.dag:482: "1535 SKIP rows finished … then ~147m silent witness-execution phase"), and the useful tally was buried at the very end.What changed
[affected-set]line before anything runs:N witnesses across E entries · S unaffected (import-closure, skipped) · C in the affected closure. Off / predict-only get their own honest one-liners.SKIP/SKIP-RESOLVE/PREDICTand the per-resolve[binding-fork-ledger]are counted, not narrated; detail returns behindGUNBC_FLOOR_VERBOSE=1.DiscoverySummarycounts and the final[measurement]tally stay authoritative.12:35:41.204 ▎shard 2 ✓ fn (entry) 4.1ms). Green ✓ / red ✗ glyph; the shard label is dropped when the run is single-shard (the reasons0read as noise — CI pins the corpus to width 1) and returns, colored, only when shards run wide (local wide runs).dag/gunbc/ci_render.dagslowest-witness box now calls out the longest-running witnesses with a 🔥 glyph and a red timer, alongside the percentile boxes (p50/p90/p95/p99/max) already rendered there.Knobs
GUNBC_FLOOR_VERBOSE=1(per-row skip/ledger detail) ·GUNBC_FLOOR_QUIET=1(suppress the stream, counts only) · color auto-detects a terminal or GitHub Actions, honorsNO_COLOR,GUNBC_FLOOR_COLOR=1forces.Hand-Rust §7 receipt
The new floor-observability helpers in
cli_run.rs(floor_verbose/floor_ts/floor_stream_enabled/floor_color_enabled,ShardStyle,eprintln_affected_set_categorization) carry an in-code SCAFFOLD note (matchingphase_profile.rs) with a named dissolution trigger: they add no selection authority (the fail-closed decision + counts stay inrun_discovery_rows); they collapse when v2 emit-host owns floor observability via a.dagfloor-event carrier — the retirement event shared withphase_profile.rs(realization-measurement-loopPhase 0) and the fractal Gantt. Rendering itself lives in the substrate (ci_render.dag), not Rust. The instruction in the note: extend the.dagrender surface, don't accrete further floor logic incli_run.rs.Verification
cargo check+cargo fmt --checkclean; 14floor_skip_frontierlib tests + thefloor_skip_discovery_witnessharness pass (assert onDiscoverySummarycounts, preserved).ci_render_histogram_width_witnessesstill green (percentile-box widths unchanged).ci_render_slowest_hot_style_test.dag: hot rows contain 🔥 + red38;5;196; cold-control and no-color rows contain neither.s0tag), zero residual skip/ledger spew by default.No
.dagpipeline stage or substrate type touched; the.dagchange is confined to product-layer rendering (gunbc.ci_render).