Historical field note
This record preserves prior investigation or planning evidence. It is not a current operating contract; use the numbered book and current runbooks for instructions.
Investigation: dream tool_or_skill_name (skill) finding — actionability & root signal¶
Parent task: task_ae123a32896b49b9b415b3395bee34a4 (deliverable absent; working
tree clean, so ground truth re-established here).
Scope: the skill / tool_or_skill_name dream finding surfaced by
src/mac/dream_scanner.py, classified low-confidence by
src/mac/dream_cycle_classifier.py, and filed as a follow-up by
src/mac/dream_repair_tasks.py (file_low_confidence_repair_tasks,
_task_description).
Investigated by: fleet worker (read-only analysis; no production code changed).
Verdict: not-actionable / evidence-gap¶
The tool_or_skill_name finding is not actionable as a skill defect. Its
sole signal is a name mention ("skill referenced: <name>"), not a failure. No
root failure signal is attached because the scanner never attaches one to this
kind. The correct remediation is a small classifier/repair-filing change so this
inventory-only kind stops minting low-confidence repair tasks; that is
actionable-plan-only and is scoped below.
Root signal behind the finding¶
src/mac/dream_scanner.py emits the tool_or_skill_name candidate kind purely
as a name inventory, always at severity="info", from six call sites
(src/mac/dream_scanner.py:240, :249, :258, :331, :430, :440).
- For a skill, the emit uses signature
skill:<name>, dimensionskill_name=<name>, and an excerpt built as"skill referenced: <name>"(src/mac/dream_scanner.py,_scan_hermes_messageand_emit_names_from_text). Skill names come from_extract_skill_names()scrapingskills/…,$name, orskill: nametokens out of message/event text. - The distinct root-cause kinds (
repeated_failure,tool_call_error,test_failure,model_provider_error) are emitted separately and carry the redacted failure excerpt and_failure_signature(text). Thetool_or_skill_namecandidate deliberately does not carry that failure text.
So the concrete "root signal" for this finding is: a skill name (e.g. codex)
was seen in some session/ledger text. There is no failure, traceback, exit
status, or provider error bound to it — by design.
Why it lands as a low-confidence repair task (the evidence gap)¶
Traced end-to-end against the bootstrapped .venv:
- Classifier sees no signal.
classify_candidate()builds its match text only fromsummary,kind,scope,observations,record_type_countskeys, andretrieval.query_terms(_combined_text,src/mac/dream_cycle_classifier.py). A scanner candidate carries the skill name insignature(skill:codex) anddimensions.skills, neither of which_combined_textreads. Result:areas == []andoverall_confidence == "low"(score 0.35). Reproduced directly:
classify_candidate({kind:"tool_or_skill_name", signature:"skill:codex",
dimensions:{skills:[{name:"codex",count:1}]}, evidence:[{excerpt:"skill referenced: codex"}]})
# -> overall_confidence="low" (0.35), areas=[]
-
Repair filing still fires.
file_low_confidence_repair_tasks()gates onoverall_confidence == "low"andany(affected.values())(src/mac/dream_repair_tasks.py)._affected_labels()recovers the skill a second way the classifier ignores: from thesignatureskill:prefix and fromdimensions.skills. Soaffected["skills"] == ["codex"]is non-empty and a follow-up task is minted — even though the classifier found zero areas. Reproduced:_affected_labels(...)->{"skills": ["codex"], ...},any(...) == True. -
The filed task has nothing to act on.
_task_description()prints the affected labels, the candidate summary, and the candidate evidence. For this kind the only evidence excerpt is"skill referenced: codex", so the generated acceptance criterion ("Confirm whether the finding is actionable from the attached evidence") resolves to not actionable: there is no failure to reproduce or repair.
This is a classifier ↔ repair-filing inconsistency: the classifier's
signal-detection intentionally ignores signature/dimensions, but the
repair-filing affected-label extraction reads exactly those fields, so an
inventory-only "name was mentioned" candidate slips through the low + affected
gate.
Exact files / behavior a fix would touch¶
The remediation is a filing-gate refinement, not a skill-behavior change:
src/mac/dream_repair_tasks.py—file_low_confidence_repair_tasks(): skip candidates whosekind == "tool_or_skill_name"(an info-severity name inventory), or, more generally, require at least one evidence record with a failure-style excerpt / a non-infoseverity before filing. This is the single smallest, most-targeted change and keeps the dedupe/fingerprint logic intact.- Optional companion in
src/mac/dream_cycle_classifier.py—_combined_text()could also fold insignatureanddimensions.skills/toolsso classifier area detection and repair-filing agree; but this would raise detected areas rather than suppress filing, so it must be paired with the gate above to avoid filing more inventory tasks.
src/mac/skill_auto_repair.py is not involved: it only engages at
overall_confidence == "high" and guards writes under skills/ /
deploy/skills/. A tool_or_skill_name finding is low by construction and
never reaches it.
Ground truth observed¶
Measured in the task-owned worktree with the bootstrapped .venv
(python3 scripts/bootstrap-project.py). All sources read, none modified.
.venv/bin/pytest tests/test_dream_scanner.py tests/test_dream_cycle_classifier.py
tests/test_dream_repair_tasks.py tests/test_skill_auto_repair.py
tests/test_fleet_skills.py -q → 127 passed.
The suites document the exact behavior above:
- tests/test_dream_scanner.py::test_scans_model_provider_errors_and_skill_tool_names
asserts a skill:codex tool_or_skill_name candidate with
dimensions.skills == [{"name": "codex", "count": 1}] and no failure text.
- tests/test_dream_cycle_classifier.py low-signal cases confirm a candidate with
no distinguishing summary text stays overall_confidence == "low" (0.35).
- tests/test_dream_repair_tasks.py::test_files_low_confidence_task_with_evidence_and_labels
confirms affected.skills is recovered and a task is filed for a low-confidence
candidate.
Determination¶
- Actionability: not-actionable / evidence-gap as a skill defect — the finding is a name mention with no root failure signal.
- Recommended remediation (actionable-plan-only): tighten
file_low_confidence_repair_tasks()insrc/mac/dream_repair_tasks.pyto not file repair tasks for the info-onlytool_or_skill_namekind (or require a failure-style evidence excerpt / non-infoseverity), closing the classifier↔filing inconsistency. No skill-module orskill_auto_repair.pychange is warranted.