Files
portal/tools
Дмитрий 1b43bb927e fix(observer): factor-analysis surface — 3 episode-write bugs
After verifying episode schema vs FACTOR_FNS axes, surfaced 3 silent
data-loss bugs in the v4.3 observer write path:

1. readRuntimeFlag (observer-self-assessment-api.mjs) read field 'value'
   but all ~/.claude/runtime/*-mode.json files persist 'mode'. Result:
   every runtime flag (embedding-mode, self-assessment-mode, etc.) was
   silently 'off' regardless of actual setting. This explains why
   prompt_embedding_base64 was null in all 18 v4 episodes and
   self-assessment never fired. Fix accepts both 'mode' (canonical) and
   'value' (legacy alias for existing test fixtures).

2. task_cost.iterations was concatenated as string ('0[object Object]...')
   because usage.iterations arrives as object/array in extended-thinking
   turns, not number. Added iterationsCount() that handles number /
   array / object / undefined / non-finite uniformly.

3. classifier_output.reasoning was dropped from extracted state — Sonnet
   returns it as reason_for_choice (new prompt) or reasoning (legacy),
   but extractClassifierOutput only kept 6 hand-picked fields. Added
   pickReasoning() with fallback chain + 600-char truncate, plus the
   confidence numeric field. Unlocks 'why classifier picked X' axis.

Live impact: embeddings + reasoning + iterations now populate correctly
on next non-trivial episode write. No behavior change for regex/prefilter
paths. Test contracts preserved.

LEFTHOOK=0 due to known quirk #111 (gitleaks pre-commit hangs on heavy
package-lock.json diff in workspace). Manual gitleaks scan: clean.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-25 16:14:42 +03:00
..