Closes#540.
Production audit on a 10,129-edge graph showed the INFERRED
confidence_score distribution is bimodal, not graded:
| Score bucket | Count | % of INFERRED |
|--------------|-------|---------------|
| <0.4 | 0 | 0% |
| 0.4-0.6 | 5,807 | 57% |
| 0.6-0.8 | 14 | 0.1% |
| 0.8+ | 4,308 | 42% |
Subagents collapse the continuous "0.4-0.9" guidance to a binary:
0.5 for "uncertain", 0.85+ for "confident", almost nothing in between.
Downstream filtering by confidence is therefore an on/off switch, not
the gradient the prompt promises.
Replace continuous ranges with a forced-rank discrete set:
0.95 direct structural evidence
0.85 strong inference
0.75 reasonable inference
0.65 weak inference
0.55 speculative but plausible
Models follow discrete rubrics far better than continuous ranges
(documented in calibration literature; same reason MCQ rubrics
outperform 0-100 scales). The set is anchored at non-round midpoints
to discourage 0.5 as a default.
Applied uniformly across all 10 skill-*.md files:
- 7 long-form (skill.md, skill-codex.md, skill-copilot.md,
skill-droid.md, skill-opencode.md, skill-windows.md, skill-trae.md):
full forced-rank table.
- 3 short-form (skill-claw.md, skill-aider.md, skill-kiro.md):
inline set notation INFERRED ∈ {0.55, 0.65, 0.75, 0.85, 0.95}.
Pure prompt edit — no code changes, no test impact. Effect is
observable only via re-extraction and inspection of the new
confidence_score distribution.
- #550: _file_stem() includes parent dir to prevent node ID collisions for same-named files
- #555: extract() relativizes source_file paths before returning for cross-machine portability
- #562: to_json() returns bool; _rebuild_code() writes report/html only if json succeeded
- #563: skill prompts store rationale as node attribute, not separate node; enforce calls direction
- #566: Show All / Hide All buttons added to HTML community panel
- #575: _import_js() resolves tsconfig.json compilerOptions.paths aliases before external fallback
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>