HKUDS/DeepTutor · error · ValueError
preferences.md is not audited automatically
Error message
preferences.md is not audited automatically
What it means
The audit mode mirrors the consolidator: the preferences.md L3 document is maintained by hand and is never auto-audited. _run_audit_l3 raises immediately when slot == 'preferences', before touching the file.
Source
Thrown at deeptutor/services/memory/consolidator/modes/audit.py:278
edits_rejected=edits_rejected,
)
# ── L3 ──────────────────────────────────────────────────────────────────
async def _run_audit_l3(
slot: L3Slot,
*,
language: str,
user_label: str,
budget: int,
llm_selection: dict | None,
on_event: OnEvent | None,
settings,
) -> AuditResult:
if slot == "preferences":
raise ValueError("preferences.md is not audited automatically")
l3_path = paths.l3_file(slot)
if not l3_path.exists():
await emit(on_event, {"stage": "done", "no_doc": True})
return AuditResult(layer="L3", key=slot, chunks_processed=0, no_doc=True)
doc = load_doc(l3_path, default_title=f"{slot} memory")
l2_lookup = _build_l2_entry_lookup()
prompt = load_prompt("audit_l3", language)
focus, _sections = slot_focus(language, slot)
annotated_text, _ranges = _build_annotated_l3(doc, l2_lookup)
chunks = chunk_with_boundary(
annotated_text,
budget=budget,
overlap_ratio=settings.chunking.overlap_ratio,
min_chunk_chars=settings.chunking.min_chunk_chars,
max_chunk_chars=settings.chunking.max_chunk_chars,View on GitHub (pinned to 3e82f13042)
Solutions
- Exclude 'preferences' from L3 audit sweeps
- Audit preferences.md manually (read and edit the file) if review is needed
- Centralize the exclusion in a helper like is_auto_managed(slot) so consolidator and audit stay in sync
Example fix
# before
for slot in l3_slots:
await run_audit("L3", slot, ...)
# after
for slot in l3_slots:
if slot != "preferences":
await run_audit("L3", slot, ...) Defensive patterns
Strategy: validation
Validate before calling
if slot == "preferences":
skip("preferences.md is maintained manually")
else:
await run_audit("L3", slot, ...) Type guard
def is_auditable(slot: str) -> bool:
return slot != "preferences" Try / catch
try:
await run_audit("L3", slot)
except ValueError as e:
if "not audited automatically" in str(e):
continue
raise Prevention
- Reuse the same preferences exclusion across consolidate and audit sweeps
When it happens
Trigger: Calling run_audit(layer="L3", key="preferences") (directly or through a batch driver like go()) — the guard fires before the l3_file existence check.
Common situations: Running an audit sweep over every L3 slot and forgetting to exclude preferences; porting a consolidation loop to the audit API without carrying over the same exclusion.
Related errors
- preferences.md is not auto-consolidated
- unknown layer {layer!r}
- preferences.md is not auto-consolidated
- {exc}
- unknown run_id
AI-assisted analysis of HKUDS/DeepTutor@3e82f13042 (2026-08-27).
Data as JSON: /api/errors/adeb58e1a45e04e8.
Report an issue: GitHub.