# V334 — rotorsaksanalys och generell greppsolver

## Slutsats

Greppfelet berodde inte på en enskild vänster-/högerkonstant. V333 hade flera aktiva auktoriteter i olika koordinatrymder och en feldefinierad hudsensor. Det gjorde att en geometriskt rimlig kontakt kunde underkännas och därefter repareras av ännu en solver.

V334 löser greppet en gång, inne i samma slutskrivare som committar Nex. Den utgår från komplett källintention, neutral rigghand, två MCP-förankrade lokala palmhudytor och den verkliga skinnade ytan på angiven kroppsdel.

## Rotorsaker

### 1. Två greppsolvers skrev samma kedja

V333 körde först `gripV1ApplyPalmContract` i målrymden. `applyOneWriterCommit` committade sedan målpose, varefter `v330NeutralizeHands` nollställde handen. Därefter kördes `v324ActualCalfObjectMeetRestartSolve`, som i sin tur startade `v327ProximalPalmPatchCollisionSearchSolve` direkt på Nex-benen.

Konsekvensen var:

1. solver A skapade handmål,
2. neutraliseringen tog bort solver A:s handledsorientering,
3. solver B löste om hand/arm och kunde även lösa om benet,
4. senare gates blandade auditdata från båda lösningarna.

Det var patch-på-patch även om varje del lokalt kallades en enda auktoritet.

### 2. Palm-skin-gaten mätte fel yta

V333 valde palmvertices med:

- låg sammanlagd skin-weight-tröskel (`0.15`),
- en 70 mm sfär runt mitten mellan MCP-benen,
- vartannat vertex,
- stopp vid de första 650 träffarna i meshens indexordning,
- gemensam extrem-/supportmätning över ett brett axialt och tangentiellt område.

Det blandade lokal palm, handrygg, fingersidor och andra närliggande vertices. Vilka 650 som vann berodde dessutom på exportörens vertexordning. Ett långt bort beläget vertex kunde därför dominera ett globalt minimum.

Reproduktionen på den riktiga FBX-modellen visade motsägelsen tydligt: V333 vänster B hade 0,332 mm respektive 4,025 mm MCP-avstånd, men rapporterade samtidigt −75,476 mm palmgenomträngning. Den senare siffran var sensorartefakt, inte faktisk lokal kontakt.

### 3. Höger var implicit standard och vänster fick specialflöde

`gripV1SideFromSourceContact` föll tillbaka till `R` när data saknades eller parsing misslyckades. Samtidigt tvingades vänster genom en separat 180-graders reset. Det förhindrade en verkligt symmetrisk lösning och gjorde felaktig eller ofullständig kontaktdata farlig.

### 4. IK ändrades före greppet med högerkodade benpatchar

`solveRuntimeCase` körde `v169MoveRaisedLegTowardGluteOnly(..., 0.065)` och `v175AngleRaisedLegOutward(..., -10)` innan greppet. Båda var högerkodade. Därmed var inte längre knä-/fotpositionerna från normaliserad IK den rena ingången till Nex.

### 5. Interna etiketter dolde den aktiva kedjan

Kommentarer och auditnamn blandade 10 mm och 20 mm MCP-offset samt V314–V333-versioner. `failedSteps` klassade dessutom alla steg utan `ok=true` som misslyckade, även rena auditsteg. Det gav falskt negativ `oneWriter` trots att felet inte var ett skrivfel.

## V334-arkitektur

Den aktiva kedjan är nu:

1. Hämta canonical IK och normalisera mot Nex-längder.
2. Läs en komplett `nonFloorContact` med explicit `gripSide` och `cylinderAxis`.
3. Commit grundposen i `applyOneWriterCommit`.
4. Nollställ endast aktiv hand och dess fingerbarn till fångad rigg-rest.
5. Beräkna två anatomiska ankare från faktiska `Index1`/`Pinky1` MCP, 10 mm proximalt mot handleden i palmplanet.
6. Välj lokala palmhudvertices rumsligt runt respektive ankare och med relevant skin-weight.
7. Välj faktisk skinnad målyta från den kroppsdel/twistkedja som källregeln anger och filtrera den avsedda utsidan.
8. Sök hela handledsrullen −180°…180° från neutral, för både index- och pinky-först.
9. Lås första palmhudkontakten, lös armen, lås om första kontakten och bedöm andra kontakten.
10. Välj med faktisk tvåpunktskontakt, palmriktning, lokal signerad hudclearance och bevarad armbågspol.
11. Publicera ett enda auditobjekt. Efterföljande gate är read-only.

Det finns ingen övningsnamnsgren, ingen standardhöger, ingen tvingad A/B-kandidat, ingen post-commit omsolve och ingen ovillkorlig benförflyttning i den aktiva kedjan.

## Varför MCP fortfarande används

MCP-positionerna är anatomiska ankare, inte en låtsasyta. Ett benursprung ligger inne i handen och ska inte snappas direkt mot underbenets hud. V334 använder därför MCP10 för att välja rätt lokala palmområde och låter den verkliga, skinnade palmytan vara kontaktpunkten. Det behåller den anatomiska facitpunkten utan att skapa falsk penetration från handens tjocklek.

## Verifierade resultat

| Fall | Indexyta | Pinkyyta | Palm mot mål | Lokal hud q10/q90 | Armbågspol | Resultat |
|---|---:|---:|---:|---:|---:|---|
| Vänster hurdle | 5,603 mm | 2,812 mm | 0,218 | −2,963 / 2,027 mm | 0,911 | PASS |
| Höger hurdle | 8,665 mm | 2,366 mm | 0,274 | −2,270 / 6,872 mm | 0,986 | PASS |

Blockgränserna är 12 mm per ytkontakt, palm-dot minst 0,20, lokal q10 minst −4 mm, lokal q90 högst 20 mm och armbågspol-dot minst 0,50.

Regressionen kör även bodyweight squat och high knee vänster/höger. Alla tre bekräftar att greppsolvern förblir inaktiv när komplett greppintention saknas. Totalt: 5/5 PASS.

Två fulla omkörningar gav identisk SHA-256 för regressionsrapporten:

`a168e66498558881e313b46eb6655334fd424eebcaca1f943c8262f8f8e8c060`

## Visuell kontroll

`diagnostics/v334/V334_GENERIC_GRIP_ACTUAL_FBX_VISUAL_QA.png` är en deterministisk mjukvaruprojektion av den poserade riktiga FBX-riggen och dess skinnade vertices. Den visar helfigur framifrån/sidan samt närbilder på båda kontakterna. Den använder inga AI-genererade bilder och inga skärmrumsmarkörer som geometrisk auktoritet.

Kontrollen visar ingen 25–75 mm genomträngning. Hand och underben möts lokalt på avsedd sida, och armbågsböjen ligger kvar på samma sida som IK-ingången.

En slutlig interaktiv kontroll i den ordinarie WebGL-spelaren rekommenderas fortfarande före produktionsgodkännande. Den här exekveringsmiljön saknade Chromium/Playwright, så den skuggade WebGL-bilden kunde inte återrenderas här; all blockerande numerik och den visuella projektionen kommer dock från samma faktiska FBX-geometri.

## Fingerfas

V334 löser palm, handled och arm. Fingerfasen är medvetet kvar som ett separat barnkontrakt och får status `ready=true` efter palm-PASS. Palmsolvern verifierar att inga fingerlokaler ändras efter neutraliseringen. Nästa fingerintegration får endast rotera fingerben och måste återkontrollera lokal hudclearance; den får aldrig flytta hand, handled, arm, ben eller målobjekt för att rädda ett misslyckat grepp.
