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.