#000037 §22: dry-run swap to sweep_weights() + §15.4 added

The dry-run was still using safe_weights(); Phase 1.c shipped
sweep_weights() (γ_5f=1.5, λ_capital_cost=0.25,
ν_witness_divergence=0.5) precisely for sleep-sweep economics. Swap
both call sites in prometheus_sigma_sweep_dryrun.py and label the
report Weight profile: sweep (§15.4).

§15.4 adds the sweep profile alongside §15.1 safe / §15.2
conservative / §15.3 exploratory so the named-profile registry has
a single doc source of truth and the dry-run report's §15.4
reference resolves.

§22 dry-run-runs table (3 rows: initial uniform-τ-1d under safe;
per-mode τ under safe; per-mode τ under sweep) replaces the prior
inline narrative count. Includes a Phase-3-design observation: the
sweep profile flattens the softmax (DEFERRED 271 → 369; REJECT
205 → 110; ACCEPT 1 → 0; MARGINAL 2 → 3) because reducing
λ_capital_cost + ν_witness_divergence shrinks the gap between
high-Δ5F and low-Δ5F branches, so fewer branches reach Kelly's
p_i > 0.5 floor. Falsification-fixture proposal count stayed flat
(447 → 449) — the §13 step 11 emission path is upstream of decision
labeling, so sweep mode preserves information-gathering value while
concentrating action-taking on the high-confidence tail. Phase 3
ticket #000045 §2 deliberately leaves softmax temperature un-pinned
because of this trade-off.
This commit is contained in:
russell@unturf.com 2026-05-10 19:22:03 -04:00
parent 4e41c73e44
commit 6734f8037f
No known key found for this signature in database
3 changed files with 78 additions and 39 deletions

View file

@ -1,6 +1,6 @@
# Prometheus-Σ Phase 3 sleep-sweep dry-run
Generated: 2026-05-10T22:33:37Z UTC
Generated: 2026-05-10T23:20:32Z UTC
Script: `bench/scripts/prometheus_sigma_sweep_dryrun.py`
Ticket: #000037 Phase 3 (read-only simulation)
@ -14,31 +14,30 @@ Ticket: #000037 Phase 3 (read-only simulation)
- UNGROUNDED: 7d (604800s)
- Target B sample/shard: 500
- Controller budget (Hermes concurrency): 4
- Weight profile: safe (§15.1)
- Weight profile: sweep (§15.4)
## Target A — providence_cache sweep candidates
- Total candidates (rows older than τ_qa): **1913**
- Sweep chunks (size 4): 479
- Controller runtime: 15.80 ms
- Total candidates (rows older than τ_qa): **1927**
- Sweep chunks (size 4): 482
- Controller runtime: 12.91 ms
### Audit-mode distribution of candidates
| audit_mode | count |
|---|---|
| STRICT | 720 |
| HYBRID | 713 |
| UNGROUNDED | 471 |
| STRICT | 724 |
| HYBRID | 720 |
| UNGROUNDED | 474 |
| CANONICAL_PROJECTION | 9 |
### Controller decision distribution (per chunk)
| label | chunks |
|---|---|
| DEFERRED | 271 |
| REJECT | 205 |
| MARGINAL | 2 |
| ACCEPT | 1 |
| DEFERRED | 369 |
| REJECT | 110 |
| MARGINAL | 3 |
### Veto kinds observed
@ -50,14 +49,14 @@ Ticket: #000037 Phase 3 (read-only simulation)
- MemoryRoot proposals: 0
- SelfModel proposals: 0
- FalsificationFixture proposals (§13 Step 11 — high-divergence → 5F-fixture funnel): **447**
- Advisory event entries (would write to `controller_events` under Phase 2): 895
- FalsificationFixture proposals (§13 Step 11 — high-divergence → 5F-fixture funnel): **449**
- Advisory event entries (would write to `controller_events` under Phase 2): 708
## Target B — document sweep sample
- Total sampled candidates: **2000**
- Sweep chunks (size 4): 500
- Controller runtime: 21.82 ms
- Controller runtime: 18.33 ms
### Canonical-shape regex prefilter hits
@ -91,9 +90,9 @@ Ticket: #000037 Phase 3 (read-only simulation)
## Total simulation cost
- Total branches scored: 3913
- Total controller runtime: 37.62 ms
- Mean per-branch latency: 9.61 µs
- Total branches scored: 3927
- Total controller runtime: 31.24 ms
- Mean per-branch latency: 7.96 µs
## Findings & fixes (dry-run iteration log)

View file

@ -66,7 +66,7 @@ from arborist.substrate.prometheus import (
ControllerDecision,
ControllerInput,
controller_decide,
safe_weights,
sweep_weights,
)
@ -337,7 +337,7 @@ def sweep_target_a(
thinly that Kelly's `p_i > 0.5` floor is never met (a finding from
dryrun iteration 1: chunk_size=64 100% DEFERRED).
"""
weights = safe_weights()
weights = sweep_weights()
label_counts: Counter[str] = Counter()
audit_mode_seen: Counter[str] = Counter()
@ -448,7 +448,7 @@ def sweep_target_b(shards_dir: Path, sample_per_shard: int, chunk_size: int = 4)
chunk_size matches Hermes concurrency budget §11 see
:func:`sweep_target_a` rationale.
"""
weights = safe_weights()
weights = sweep_weights()
label_counts: Counter[str] = Counter()
shape_counts: Counter[str] = Counter()
@ -570,7 +570,7 @@ def render_markdown(a_results: dict, b_results: dict, opts: dict) -> str:
lines.append(f"- Target B sample/shard: {opts['sample_b']}")
lines.append(f"- Controller budget (Hermes concurrency): "
f"{DEFAULT_BUDGET}")
lines.append(f"- Weight profile: safe (§15.1)")
lines.append(f"- Weight profile: sweep (§15.4)")
lines.append("")
lines.append("## Target A — providence_cache sweep candidates")
lines.append("")

View file

@ -918,6 +918,29 @@ Higher temperature widens the distribution; lower divergence
penalty admits speculative branches; lower cost penalty allows
more compute spend on exploration.
### 15.4 Sweep profile (sleep-sweep economics — landed Phase 1.c)
```json
{
"gamma_5f": 1.5,
"lambda_capital_cost": 0.25,
"nu_witness_divergence": 0.5
}
```
Tuned for the §22 dry-run economics. Sweep work *deliberately*
accepts capital cost in exchange for falsification discovery, so
λ_capital_cost drops to 0.25 (vs safe 1.0) and γ_5f bumps to 1.5
(vs safe 1.25) to reward falsification-rate improvement. Witness
divergence weight drops to 0.5 (vs safe 1.5) because high
divergence is *desirable* signal during sweep — it's what surfaces
fixture candidates (§13 step 11). Available as
``arborist.substrate.prometheus.sweep_weights()`` and registered
in ``WEIGHT_PROFILES["sweep"]``. The dry-run simulator
(``bench/scripts/prometheus_sigma_sweep_dryrun.py``) uses this
profile so the §22 numbers match what Phase 3 will see in
production.
---
## 16. Phase 1 implementation prerequisites
@ -1276,11 +1299,9 @@ mode `CASE` in `iter_target_a_candidates`: kernel-only modes (CP)
default to τ_qa=1d (cheap re-probe, high value when kernel-LLM
divergence surfaces); LLM-witness modes (STRICT/HYBRID/UNGROUNDED)
stay at τ_qa=7d. Tunable via `--tau-qa-cp-days` + `--tau-qa-days`
CLI flags + `PROMETHEUS_SWEEP_TAU_*` make-variables. Result with
defaults: 9 CP rows surface alongside the 1,904 LLM-witness
candidates → 1,913 total Target A candidates → 1 ACCEPT, 2 MARGINAL,
205 REJECT, 271 DEFERRED chunks (chunk_size=4). Phase 3 lifts the
per-mode τ table into governance parameters (cache-key hash inputs).
CLI flags + `PROMETHEUS_SWEEP_TAU_*` make-variables. Phase 3 lifts
the per-mode τ table into governance parameters (cache-key hash
inputs).
**Finding 4 — Target B canonical-shape detection is the real
headline.** 4.40% of sampled documents (n=2000) contain
@ -1301,21 +1322,40 @@ burst design.
path exercises end-to-end against real corpus data — no fixture-only
mocking.
Total dry-run cost (per-mode τ_qa, defaults CP=1d / LLM=7d, run
2026-05-10T22:33Z): **~37.6 ms** to score 3,913 branches across all
sweep targets and both shards' worth of providence_cache + a 2,000-
doc sample of documents — **9.6 µs per branch** at chunk_size=4 in
pure Python. (Prior run with uniform τ_qa=1d: ~55 ms / 4,379 branches
/ 12.5 µs per branch — fewer LLM-witness candidates surface under
the per-mode default, so the total branch count drops; the
per-branch latency delta is within measurement noise and not
attributable to a specific code change.) Phase 3 latency budget for
the controller itself remains non-binding; the witness fan-out
(Hermes calls) is the dominant cost.
**Dry-run runs over the §22 iterations (chunk_size=4, pure Python):**
| run (UTC) | weights | τ_qa policy | branches | runtime | µs/branch | ACCEPT | MARGINAL | REJECT | DEFERRED |
|---|---|---|---|---|---|---|---|---|---|
| 2026-05-10 (initial) | safe (§15.1) | uniform 1d | 4,379 | ~55 ms | 12.5 | n/a | 4 | n/a | n/a |
| 2026-05-10T22:33Z | safe (§15.1) | per-mode CP=1d / LLM=7d | 3,913 | 37.6 ms | 9.6 | 1 | 2 | 205 | 271 |
| 2026-05-10T23:20Z | sweep (§15.4) | per-mode CP=1d / LLM=7d | 3,927 | 31.2 ms | 7.9 | 0 | 3 | 110 | 369 |
Note on the sweep-vs-safe shift: dropping λ_capital_cost (1.0 →
0.25) and ν_witness_divergence (1.5 → 0.5) reduced cost-class
separation in the softmax, pulling chunks that previously hit
REJECT (negative selected_u) into DEFERRED (positive U but no
single branch with p_i > 0.5). The single ACCEPT chunk under safe
weights diffused into the DEFERRED pool. Net falsification-fixture
proposal count stayed flat (447 → 449) — the §13 step 11 emission
path is upstream of decision labeling, so the sweep's information-
gathering value preserves while the action-taking value
concentrates more aggressively on the high-confidence tail.
**Phase 3 implementation note (sweep-profile finding).** The
flatter softmax under sweep weights surfaces a Phase-3-design
question: pair `sweep_weights()` with a sharper `eta_softmax_temperature`
(currently default 1.0) so high-Δ5F branches reach the Kelly
floor more often, OR keep the current temperature and accept that
sweep-mode Phase 3 will write more advisory rows than it acts on
(DEFERRED is still informative — it's the chunks worth re-checking
next window, not chunks rejected). Phase 3 ticket #000045 §2 leaves
the temperature un-pinned for this reason.
Detailed numbers + iteration log per shard:
`bench/results/prometheus-sigma-sweep-dryrun-YYYY-MM-DD.md`
(regenerated by `make prometheus-sweep-dryrun`).
(regenerated by `make prometheus-sweep-dryrun`). Phase 3 latency
budget for the controller itself remains non-binding; the witness
fan-out (Hermes calls) is the dominant cost.
---