Skip to content

v2 credit-constant freeze evidence

The committed sweep evidence PROTOCOL.md §AC cites for freezing the credit constants (kCreditUnitMs, per-class budgets, kCreditMinDebitUnits, kCreditReoriginationFloorUnits, kCreditLbtPriorDeferrals, and the duty normalization shape). Every file is deterministic — no RNG, no clock — and byte-reproducible with the command shown; the tables are computed from the REAL shipped primitives (airtime_ms(), credit.h, the generated region table), not from design-doc estimates. Machine-checked twins of these numbers live in tests/test_credit.cpp, tests/test_sim_credit_sweep.cpp, and tests/test_sim_runner.cpp::runner_credit_depth_chains_match_airtime_math; tests/scenarios/credit_depth.scn gates CI on the real-traffic half.

File Axis Regenerate with Decision
unit_sweep.txt (a) kCreditUnitMs ∈ {25,50,100} ./build/lrcsim credit-evidence unit 50 ms. 25 ms puts a 6 s Chat budget at 240/255 = 94% of the u8 ceiling (no headroom above the workhorse class) and only spans 6.38 s total; 100 ms overprices fast lanes at the min-debit floor (BURST charged +1011% of its real airtime). 50 ms fits every class with ≥2× ceiling headroom, spans 12.75 s, and its worst floor overcharge (BURST +455%) is irrelevant in practice because the 4-bit gradient (15 hops/cell) binds long before 120 units do.
min_debit.txt (b) kCreditMinDebitUnits 1 vs 2 on BW500 ./build/lrcsim credit-evidence min-debit 1. Floor 2 halves legitimate TRUNK/BURST reach per unit of budget while adding no safety at realistic densities: the 255-relay pathological path requires a dedup false-negative chain AND rprog inflation, and the wire’s 4-bit ERB.rprog bounds any gradient-legal path to 15 relays per re-origination domain regardless (see credit_depth_trace.jsonl — real relay traffic stops at exactly 15).
duty_normalization.txt (c) absolute vs fraction-of-own-cap ./build/lrcsim credit-evidence duty Fraction-of-own-cap (this freeze CHANGED the shipped shape in credit.h). The absolute shape is a dead knob on every sub-band capped below ~7% duty — EU868 g/g1/g4 (1%), RU864/EU-g2 (0.1%), JP923’s duty rows pin to the floor across their entire utilization range, starving exactly the regions where spectrum discipline matters most. Fraction discriminates idle from choked on every row and coincides with absolute on unlimited rows. Legality is unaffected: AirtimeLedger::admit() enforces the cap per-TX regardless of credit.
lbt_prior.txt (d) kCreditLbtPriorDeferrals ∈ {4,16,64} ./build/lrcsim credit-evidence lbt 16. Prior 4 trusts a 10-sample window with >70% of the budget; prior 64 pins a recovered channel lean for whole sampling windows. 16 fails closed on cold start, reaches ~38% at 10 clean admits, ~80% at 64 — evidence-proportional without being sluggish.
credit_depth_trace.jsonl (e) per-class budgets, real-traffic validation ./build/lrcsim run tests/scenarios/credit_depth.scn --trace <f> then filter kind ∈ {credit_debit, sim_assert} Keep Discovery 100 / Chat 120 / Control 60 / Bulk 0. Real relay chains at the ~87-byte inject frame: ANCHOR debits 82/hop (1 relay, then exhaustion — the ladder’s whole point is that SF12 chains must not happen), REACH 9/hop (13 relays, budget binds mid-gradient), TRUNK 1/hop (all 15 gradient-legal relays, 105 units unspent). The class RATIOS (Discovery < Chat, Control = half Chat) are unchanged by any of this: within a cell the gradient binds fast lanes and the debit binds slow ones at every candidate value, so the least-risky move is keeping the CREDIT_ROUTING.md §3 table the wire shipped with.

Known limits of this evidence (recorded, not hidden)

Section titled “Known limits of this evidence (recorded, not hidden)”
  • Mode A cannot drive router re-origination end-to-end (no federation/ scope boundaries in-process), so axis (c) and the floor are frozen on pure-layer tables over the real region rows plus unit tests — not on a scenario that watches a router stamp budgets under live load. Mode B (or the bench) should revisit if reality disagrees.
  • Axis (d) has no live LBT scenario: the sim does not model a choked carrier at the CAD layer, so the prior is frozen on response-curve analysis, not on an end-to-end JP923/KR920 choke run. Same revisit rule.
  • CREDIT_ROUTING.md §3’s schematic table was wrong for ANCHOR (claimed 2 hops at 55 B; real airtime_ms() gives debit 71 → 1 relay). The committed tables supersede the schematic ones everywhere they disagree.