DUNIN7 · LOOMWORKS · RECORD
record.dunin7.com
Status Current
Path investigations/loomworks-upload-pathway-ground-truth-v0_1.md

Upload Pathway — Ground Truth (v0_1)

Version. 0.1 Date. 2026-07-01 Type. Investigation / grounding. Read-only ground truth for scoping a Room-1 completion effort: file / folder / image intake into Memory. No fixes, no design decisions — ground truth only. Base. engine main @ 2abcfd1 (post-CR-2026-129, Room 1 closed). Supersedes/extends. Reconciles against [[loomworks-upload-pathway-investigation-v0_1]] (architectural, 2026-05-08), [[loomworks-upload-vision-conversion-bug-diagnosis-v0_2]] (2026-06-02), the Phase 59 CR (CR-2026-092 v0.4), and queued-directions §15.3.


Target end state (what this grounds against)

Headline

There are two image rails. The old one drafted a Memory assertion; the current one doesn't. That split — not a broken vision skill — explains both the Operator's "it worked before" recollection and the live "0%, no description" symptom.

| | Rail A — Phase 16 /contributions (older) | Rail B — Phase 58/59 /uploads (current chat/composer) | |---|---|---| | Endpoint | POST /engagements/{id}/contributions (contributions.py) | POST /engagements/{id}/uploads (uploads.py:441) | | Image vision | describe_image_skill (skills/image_description.py) | image_vision_analysis (uploads/skills/, claude-sonnet-4-6) | | Lands in Memory? | YES — creates a held Assertion + lineage (contributions.py:280) | NO — assertions_drafted=[] hardcoded (uploads.py:661) | | Storage | local disk | MinIO / S3 object store |

The frontend chat/composer upload moved onto Rail B. Vision still fires, but its output stops at event grain and never becomes an assertion. This is a rail switch that dropped the Memory-landing — not a regression inside the vision code. Git history confirms image_vision_analysis was born complete (9405cb7), refined (516a005), and fixed not disabled (bd05d5c); no commit ever stubbed it or removed a key. A live upload on 2026-06-02 shows the vision call actually firing.


1. What works

2. What's broken (the 0% surface — not what it looks like)

The "image_metadata 0% / image_ocr 0% / image_vision_analysis 0%, no description" picker is not skill confidence — skills have no confidence field (they emit reliability ∈ succeeded/unreliable/failed). Those percentages are the executor's chain-disambiguation heuristic (per_candidate_scores):

Distinct from the key-gate: a missing Anthropic key would surface transformation_failed with an error message, not the 0% picker. Vision's key is DB-resolved via system_config.loomworks_llm_key / engagement key — not an env var (config.py has only openai_api_key).

Two independent problems: (a) multi-candidate image routing dead-ends at 0% before running anything; (b) even past that, vision needs a DB-stored loomworks_llm_key.

3. What's absent

4. Phase 59 reconciliation + prior findings


Salvageable vs net-new (for scoping)

Key code references

Read-only. Nothing was modified. This is grounding for scoping — no fixes, no design decisions.