SIGN IN SIGN UP

feat: ranked alias retrieval and an append-only outcome ledger

Retrieval and outcome work:
- Replace the hardcoded English keyword map with `cad_knowledge/retrieval-index.json`:
  strong/supporting aliases, hard negatives, weighted scoring, deterministic ranking,
  and a per-group document budget. A Chinese request now reaches the same knowledge as
  its English equivalent, and `relevance` is a real 0-1 score instead of a constant 1.0.
- `detectPartFamily` falls back to the same alias table, so 手机支架 / 电子外壳 / 正齿轮
  select the right parameter schema. Hard negatives keep a planetary gearbox out of the
  spur-gear family instead of handing it the wrong schema.
- Add the append-only `JobOutcome` ledger plus `GET/POST /api/jobs/{id}/outcome`.
  `taskSucceeded` is true only when the most recent decision is `accepted`; edits and
  exports are process signals and never count as success. Pipeline state and outcome
  evidence stay separate, and nothing in `src/lib/outcome/` is imported by generation.
- Capture events from actions that already exist: parameter edits, SCAD apply, and real
  downloads (`?download=1`). Viewer loads and size probes are excluded so scrolling the
  job list cannot fabricate an export.
- Docs: README.md, README_CN.md, AGENTS.md, ARCHITECTURE.md, SKILLS.md, MEMORY.md.

Web research and intake hardening carried in the same working tree:
- `src/lib/research/`: keyed search backends (Tavily/Exa/Brave/Serper), opt-in keyless
  fallback, dimension extraction, and research evidence handed to the generator.
- Research-driven intent disambiguation, model-router and structured-output hardening,
  SCAD renderer and library-resolver updates, and additional validation evidence.
- `.env.example` documents the research backends and `AGENTSCAD_WEB_RESEARCH`.
K
Kevoyuan committed
2f9918ed8589bbeba4c7201bf7aa626a8a8c182d
Parent: 4364fee