# Deferred admin portal knobs Status: reference -- Tracker for knobs outside current admin gate This file tracks config knobs that are outside the admin portal's current gate. The coverage test in `tests/test_admin_knob_coverage.py` enforces that every knob in a section the portal reaches is either covered or excused with a reason. Sections the portal has not reached are out of scope for that test, but they still need a recorded home so the first control added under a section does not leave half its siblings orphaned. Rows use four columns: | Column | Meaning | |---|---| | Knob | Dotted config path in `config/config.yaml`. | | Section | Top-level config section. | | Disposition | `deferred` (future admin page) or `excused-with-reason` (deployment wiring or file path). | | Future Home | The page or surface that should own this knob when the portal reaches the section. | ## Outside-gate knobs These are `RouterConfig` scalars in sections the portal has not reached yet. They fall into two buckets: - Sections not yet reached: `context`, `database`, `dispatch_settings`, `escalation`, `exploration`, `freshness`, `iteration`, `local_energy`, `proficiency`, `tiering`. - Deployment wiring inside those sections: endpoints, model ids, credentials, filesystem paths, and device names. | Knob | Section | Disposition | Future Home | |---|---|---|---| | `context.default_output_reserve_tokens` | context | deferred | Context page | | `context.max_output_reserve_fraction` | context | deferred | Context page | | `context.safety_factor` | context | deferred | Context page | | `database.path` | database | excused-with-reason | N/A (file path) | | `dispatch_settings.default_provider` | dispatch_settings | deferred | Providers page | | `escalation.enabled` | escalation | deferred | Routing page | | `escalation.max_tier` | escalation | deferred | Routing page | | `escalation.min_confidence_before_bump` | escalation | deferred | Routing page | | `escalation.preemptive_on_low_confidence` | escalation | deferred | Routing page | | `exploration.enabled` | exploration | deferred | Routing page | | `exploration.epsilon` | exploration | deferred | Routing page | | `exploration.max_cost_ratio` | exploration | deferred | Routing page | | `exploration.max_tier` | exploration | deferred | Routing page | | `freshness.exclude_deprecated` | freshness | deferred | Catalog page | | `freshness.exclude_stale` | freshness | deferred | Catalog page | | `freshness.repoll_after_allowlist_change_seconds` | freshness | deferred | Catalog page | | `freshness.stale_after_days` | freshness | deferred | Catalog page | | `iteration.enabled` | iteration | deferred | Routing page | | `iteration.max_attempts_interactive` | iteration | deferred | Routing page | | `iteration.max_rebill_prompt_tokens` | iteration | deferred | Routing page | | `local_energy.enabled` | local_energy | deferred | Local Hardware page | | `local_energy.grid_intensity_g_per_kwh` | local_energy | deferred | Local Hardware page | | `local_energy.meter` | local_energy | excused-with-reason | N/A (deployment wiring) | | `local_energy.sample_interval_seconds` | local_energy | deferred | Local Hardware page | | `local_energy.tariff_usd_per_kwh` | local_energy | deferred | Local Hardware page | | `proficiency.leaderboard_weight` | proficiency | deferred | Proficiency page | | `proficiency.outcome_prior_strength` | proficiency | deferred | Proficiency page | | `proficiency.self_eval_min_samples` | proficiency | deferred | Proficiency page | | `proficiency.self_eval_weight` | proficiency | deferred | Proficiency page | | `tiering.cheap_completion_max` | tiering | deferred | Routing page | | `tiering.tier1_context_max` | tiering | deferred | Routing page | ## Objective warning knobs These 31 `objective.*` knobs are currently excused from the admin portal in `tests/test_admin_knob_coverage.py`. They tune `/metrics` warnings and report series rather than dispatch behavior. Their natural future home is a **Warnings page** that collects all alarm and report thresholds in one place. | Knob | Section | Disposition | Future Home | |---|---|---|---| | `objective.adoption_window_seconds` | objective | deferred | Warnings page | | `objective.assumed_cache_rate` | objective | deferred | Warnings page | | `objective.assumed_completion_tokens` | objective | deferred | Warnings page | | `objective.billing_reset_day` | objective | deferred | Warnings page | | `objective.cache_rate_warn_margin` | objective | deferred | Warnings page | | `objective.cache_rate_warn_min_observations` | objective | deferred | Warnings page | | `objective.cache_rate_window_hours` | objective | deferred | Warnings page | | `objective.cost_calibration_min_observations` | objective | deferred | Warnings page | | `objective.cost_calibration_window_hours` | objective | deferred | Warnings page | | `objective.credit_attenuation.enabled` | objective | deferred | Warnings page | | `objective.credit_attenuation.max_multiplier` | objective | deferred | Warnings page | | `objective.credit_attenuation.refresh_seconds` | objective | deferred | Warnings page | | `objective.credit_attenuation.soft_floor_usd` | objective | deferred | Warnings page | | `objective.credit_attenuation.zero_floor_usd` | objective | deferred | Warnings page | | `objective.cumulative_spend_warn_min_rows` | objective | deferred | Warnings page | | `objective.cumulative_spend_warn_usd` | objective | deferred | Warnings page | | `objective.incumbent_rate_min_observations` | objective | deferred | Warnings page | | `objective.incumbent_rate_refresh_seconds` | objective | deferred | Warnings page | | `objective.latency_min_observations` | objective | deferred | Warnings page | | `objective.latency_window_hours` | objective | deferred | Warnings page | | `objective.plan_pace_warn_ratio` | objective | deferred | Warnings page | | `objective.proficiency_depth_warn_min_rows` | objective | deferred | Warnings page | | `objective.proficiency_depth_warn_min_samples` | objective | deferred | Warnings page | | `objective.quota_burn_min_segment_hours` | objective | deferred | Warnings page | | `objective.quota_burn_min_segment_samples` | objective | deferred | Warnings page | | `objective.quota_burn_window_hours` | objective | deferred | Warnings page | | `objective.quota_runway_warning_hours` | objective | deferred | Warnings page | | `objective.rejection_warning_baseline_hours` | objective | deferred | Warnings page | | `objective.rejection_warning_min_count` | objective | deferred | Warnings page | | `objective.rejection_warning_window_hours` | objective | deferred | Warnings page | | `objective.selection_coverage_window_hours` | objective | deferred | Warnings page | ## Notes - A section moves from "outside gate" to "in scope" the moment the portal adds its first control there. At that point every scalar under it must be covered, excused, or removed from this tracker into `DELIBERATELY_NOT_IN_ADMIN`. - Deployment wiring (endpoints, model ids, credentials, paths, devices) is deliberately off the admin allowlist. Those knobs should stay `excused-with-reason` even after their section is reached. - The Warnings page is not built yet. When it is, these `objective.*` knobs should move from `DELIBERATELY_NOT_IN_ADMIN` into registry or allowlist entries, and this table should shrink.